// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. // Test that the secure random generator does not systematically generates // duplicates. Note that this test is flaky by definition, since duplicates // can occur. They should be extremely rare, though. import "package:expect/expect.dart"; import 'dart:math'; main() { var results; var rng0; var rng1; var checkInt = (max) { var intVal0 = rng0.nextInt(max); var intVal1 = rng1.nextInt(max); if (max > (1 << 28)) { Expect.isFalse(results.contains(intVal0)); results.add(intVal0); Expect.isFalse(results.contains(intVal1)); results.add(intVal1); } }; results = []; rng0 = new Random.secure(); for (var i = 0; i <= 32; i++) { rng1 = new Random.secure(); checkInt(pow(2, 32)); checkInt(pow(2, 32 - i)); checkInt(1000000000); } var checkDouble = () { var doubleVal0 = rng0.nextDouble(); var doubleVal1 = rng1.nextDouble(); Expect.isFalse(results.contains(doubleVal0)); results.add(doubleVal0); Expect.isFalse(results.contains(doubleVal1)); results.add(doubleVal1); }; results = []; rng0 = new Random.secure(); for (var i = 0; i < 32; i++) { rng1 = new Random.secure(); checkDouble(); } var cnt0 = 0; var cnt1 = 0; rng0 = new Random.secure(); for (var i = 0; i < 32; i++) { rng1 = new Random.secure(); cnt0 += rng0.nextBool() ? 1 : 0; cnt1 += rng1.nextBool() ? 1 : 0; } Expect.isTrue((cnt0 > 0) && (cnt0 < 32)); Expect.isTrue((cnt1 > 0) && (cnt1 < 32)); }