Changeset View
Changeset View
Standalone View
Standalone View
libcxx/test/std/numerics/rand/rand.device/ctor.pass.cpp
Show All 12 Lines | |||||
// XFAIL: with_system_cxx_lib=macosx10.9 | // XFAIL: with_system_cxx_lib=macosx10.9 | ||||
// UNSUPPORTED: libcpp-has-no-random-device | // UNSUPPORTED: libcpp-has-no-random-device | ||||
// <random> | // <random> | ||||
// class random_device; | // class random_device; | ||||
// explicit random_device(const string& token = implementation-defined); | // explicit random_device(const string& token = implementation-defined); // before C++20 | ||||
// random_device() : random_device(implementation-defined) {} // C++20 | |||||
// explicit random_device(const string& token); // C++20 | |||||
// For the following ctors, the standard states: "The semantics and default | // For the following ctors, the standard states: "The semantics and default | ||||
// value of the token parameter are implementation-defined". Implementations | // value of the token parameter are implementation-defined". Implementations | ||||
// therefore aren't required to accept any string, but the default shouldn't | // therefore aren't required to accept any string, but the default shouldn't | ||||
// throw. | // throw. | ||||
#include <random> | #include <random> | ||||
#include <system_error> | #include <system_error> | ||||
#include <cassert> | #include <cassert> | ||||
#if !defined(_WIN32) | #if !defined(_WIN32) | ||||
#include <unistd.h> | #include <unistd.h> | ||||
#endif | #endif | ||||
#include "test_macros.h" | #include "test_macros.h" | ||||
#if TEST_STD_VER >= 11 | |||||
#include "test_convertible.h" | |||||
#endif | |||||
bool is_valid_random_device(const std::string &token) { | bool is_valid_random_device(const std::string &token) { | ||||
#if defined(_LIBCPP_USING_DEV_RANDOM) | #if defined(_LIBCPP_USING_DEV_RANDOM) | ||||
// Not an exhaustive list: they're the only tokens that are tested below. | // Not an exhaustive list: they're the only tokens that are tested below. | ||||
return token == "/dev/urandom" || token == "/dev/random"; | return token == "/dev/urandom" || token == "/dev/random"; | ||||
#else | #else | ||||
return token == "/dev/urandom"; | return token == "/dev/urandom"; | ||||
#endif | #endif | ||||
Show All 10 Lines | try { | ||||
LIBCPP_ASSERT(false); | LIBCPP_ASSERT(false); | ||||
} catch (const std::system_error&) { | } catch (const std::system_error&) { | ||||
} | } | ||||
#else | #else | ||||
((void)token); | ((void)token); | ||||
#endif | #endif | ||||
} | } | ||||
int main(int, char**) { | int main(int, char**) { | ||||
{ | { | ||||
std::random_device r; | std::random_device r; | ||||
} | } | ||||
{ | { | ||||
std::string token = "wrong file"; | std::string token = "wrong file"; | ||||
check_random_device_invalid(token); | check_random_device_invalid(token); | ||||
} | } | ||||
Show All 22 Lines | // streams so that the descriptor '0' is available. | ||||
ec = close(STDOUT_FILENO); | ec = close(STDOUT_FILENO); | ||||
assert(!ec); | assert(!ec); | ||||
ec = close(STDERR_FILENO); | ec = close(STDERR_FILENO); | ||||
assert(!ec); | assert(!ec); | ||||
std::random_device r; | std::random_device r; | ||||
} | } | ||||
#endif // !defined(_WIN32) | #endif // !defined(_WIN32) | ||||
#if TEST_STD_VER >= 11 | |||||
#if TEST_STD_VER > 17 | |||||
static_assert(test_convertible<std::random_device>(), ""); | |||||
#else | |||||
static_assert(!test_convertible<std::random_device>(), ""); | |||||
#endif | |||||
#endif | |||||
return 0; | return 0; | ||||
} | } |