15 #include "absl/random/internal/explicit_seed_seq.h"
21 #include "gmock/gmock.h"
22 #include "gtest/gtest.h"
23 #include "absl/random/seed_sequences.h"
27 using ::absl::random_internal::ExplicitSeedSeq;
29 template <
typename Sseq>
30 bool ConformsToInterface() {
32 { Sseq default_constructed_seq; }
35 uint32_t init_array[] = {1, 3, 5, 7, 9};
36 Sseq iterator_constructed_seq(init_array, &init_array[5]);
39 { Sseq list_constructed_seq = {1, 3, 5, 7, 9, 11, 13}; }
42 uint32_t init_array[] = {1, 2, 3, 4, 5};
47 seq.param(state_array);
64 TEST(SeedSequences, CheckInterfaces) {
69 EXPECT_TRUE(ConformsToInterface<ExplicitSeedSeq>());
72 TEST(ExplicitSeedSeq, DefaultConstructorGeneratesZeros) {
73 const size_t kNumBlocks = 128;
77 seq.generate(outputs, &outputs[kNumBlocks]);
84 TEST(ExplicitSeeqSeq, SeedMaterialIsForwardedIdentically) {
85 const size_t kNumBlocks = 128;
88 std::random_device urandom{
"/dev/urandom"};
92 ExplicitSeedSeq seq(seed_material, &seed_material[kNumBlocks]);
96 const size_t kNumGenerated = kNumBlocks / 2;
98 seq.generate(outputs, &outputs[kNumGenerated]);
99 for (
size_t i = 0;
i < kNumGenerated;
i++) {
107 const size_t kNumGenerated = kNumBlocks;
109 seq.generate(outputs, &outputs[kNumGenerated]);
110 for (
size_t i = 0;
i < kNumGenerated;
i++) {
117 const size_t kNumGenerated = kNumBlocks * 2;
119 seq.generate(outputs, &outputs[kNumGenerated]);
120 for (
size_t i = 0;
i < kNumGenerated;
i++) {
121 EXPECT_EQ(outputs[
i], seed_material[
i % kNumBlocks]);
126 TEST(ExplicitSeedSeq, CopyAndMoveConstructors) {
133 std::random_device urandom(
"/dev/urandom");
140 ExplicitSeedSeq seq_copy(seq_from_entropy);
141 EXPECT_EQ(seq_copy.size(), seq_from_entropy.size());
143 std::vector<uint32_t> seeds_1(1000, 0);
144 std::vector<uint32_t> seeds_2(1000, 1);
146 seq_from_entropy.generate(seeds_1.begin(), seeds_1.end());
147 seq_copy.generate(seeds_2.begin(), seeds_2.end());
158 std::vector<uint32_t> seeds_1(1000, 0);
159 std::vector<uint32_t> seeds_2(1000, 0);
161 seq_from_entropy.generate(seeds_1.begin(), seeds_1.end());
162 another_seq.generate(seeds_2.begin(), seeds_2.end());
169 #if ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(12, 0)
170 #pragma GCC diagnostic push
171 #pragma GCC diagnostic ignored "-Wstringop-overflow"
173 another_seq = seq_from_entropy;
174 #if ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(12, 0)
175 #pragma GCC diagnostic pop
179 seq_from_entropy.generate(seeds_1.begin(), seeds_1.end());
180 another_seq.generate(seeds_2.begin(), seeds_2.end());
188 std::vector<uint32_t> seeds_1(1000, 0);
189 seq_from_entropy.generate(seeds_1.begin(), seeds_1.end());
194 std::vector<uint32_t> seeds_2(1000, 1);
195 moved_seq.
generate(seeds_2.begin(), seeds_2.end());
202 seq_from_entropy.generate(seeds_1.begin(), seeds_1.end());
207 TEST(ExplicitSeedSeq, StdURBGGoldenTests) {
211 ExplicitSeedSeq seed_sequence{12, 34, 56};
212 std::minstd_rand rng(seed_sequence);
220 ExplicitSeedSeq seed_sequence{12, 34, 56};
221 std::mt19937 rng(seed_sequence);
229 ExplicitSeedSeq seed_sequence{12, 34, 56};
230 std::mt19937_64 rng(seed_sequence);
235 18054685302720800, 19738651785169348));