// Copyright (c) 2013, 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 rnd.nextInt with a seed generates the same sequence each time.

// Library tag to allow Dartium to run the test.
library random_test;

import "package:expect/expect.dart";
import 'dart:math';

main() {
  checkSequence();
  checkSeed();
}

void checkSequence() {
  // Check the sequence of numbers generated by the random generator for a seed
  // doesn't change unintendedly, and it agrees between implementations.
  var rnd = new Random(20130307);
  // Make sure we do not break the random number generation.
  // If the random algorithm changes, make sure both the VM and dart2js
  // generate the same new sequence.
  var i = 1;
  Expect.equals(0, rnd.nextInt(i *= 2));
  Expect.equals(3, rnd.nextInt(i *= 2));
  Expect.equals(7, rnd.nextInt(i *= 2));
  Expect.equals(5, rnd.nextInt(i *= 2));
  Expect.equals(29, rnd.nextInt(i *= 2));
  Expect.equals(17, rnd.nextInt(i *= 2));
  Expect.equals(104, rnd.nextInt(i *= 2));
  Expect.equals(199, rnd.nextInt(i *= 2));
  Expect.equals(408, rnd.nextInt(i *= 2));
  Expect.equals(362, rnd.nextInt(i *= 2));
  Expect.equals(995, rnd.nextInt(i *= 2));
  Expect.equals(2561, rnd.nextInt(i *= 2));
  Expect.equals(2548, rnd.nextInt(i *= 2));
  Expect.equals(9553, rnd.nextInt(i *= 2));
  Expect.equals(2628, rnd.nextInt(i *= 2));
  Expect.equals(42376, rnd.nextInt(i *= 2));
  Expect.equals(101848, rnd.nextInt(i *= 2));
  Expect.equals(85153, rnd.nextInt(i *= 2));
  Expect.equals(495595, rnd.nextInt(i *= 2));
  Expect.equals(647122, rnd.nextInt(i *= 2));
  Expect.equals(793546, rnd.nextInt(i *= 2));
  Expect.equals(1073343, rnd.nextInt(i *= 2));
  Expect.equals(4479969, rnd.nextInt(i *= 2));
  Expect.equals(9680425, rnd.nextInt(i *= 2));
  Expect.equals(28460171, rnd.nextInt(i *= 2));
  Expect.equals(49481738, rnd.nextInt(i *= 2));
  Expect.equals(9878974, rnd.nextInt(i *= 2));
  Expect.equals(132552472, rnd.nextInt(i *= 2));
  Expect.equals(210267283, rnd.nextInt(i *= 2));
  Expect.equals(125422442, rnd.nextInt(i *= 2));
  Expect.equals(226275094, rnd.nextInt(i *= 2));
  Expect.equals(1639629168, rnd.nextInt(i *= 2));
  Expect.equals(0x100000000, i);
  // If max is too large expect an ArgumentError.
  Expect.throws(() => rnd.nextInt(i + 1), (e) => e is ArgumentError);

  rnd = new Random(6790);
  Expect.approxEquals(0.1202733131, rnd.nextDouble());
  Expect.approxEquals(0.5554054805, rnd.nextDouble());
  Expect.approxEquals(0.0385160727, rnd.nextDouble());
  Expect.approxEquals(0.2836345217, rnd.nextDouble());
}

void checkSeed() {
  // Check that various seeds generate the expected first values.
  // 53 significant bits, so the number is representable in JS.
  var rawSeed = 0x19a32c640e1d71;
  var expectations = [
    26007,
    43006,
    46458,
    18610,
    16413,
    50455,
    2164,
    47399,
    8859,
    9732,
    20367,
    33935,
    54549,
    54913,
    4819,
    24198,
    49353,
    22277,
    51852,
    35959,
    45347,
    12100,
    10136,
    22372,
    15293,
    20066,
    1351,
    49030,
    64845,
    12793,
    50916,
    55784,
    43170,
    27653,
    34696,
    1492,
    50255,
    9597,
    45929,
    2874,
    27629,
    53084,
    36064,
    42140,
    32016,
    41751,
    13967,
    20516,
    578,
    16773,
    53064,
    14814,
    22737,
    48846,
    45147,
    10205,
    56584,
    63711,
    44128,
    21099,
    47966,
    35471,
    39576,
    1141,
    45716,
    54940,
    57406,
    15437,
    31721,
    35044,
    28136,
    39797,
    50801,
    22184,
    58686
  ];
  var negative_seed_expectations = [
    12170,
    42844,
    39228,
    64032,
    29046,
    57572,
    8453,
    52224,
    27060,
    28454,
    20510,
    28804,
    59221,
    53422,
    11047,
    50864,
    33997,
    19611,
    1250,
    65088,
    19690,
    11396,
    20,
    48867,
    44862,
    47129,
    58724,
    13325,
    50005,
    33320,
    16523,
    4740,
    63721,
    63272,
    30545,
    51403,
    35845,
    3943,
    31850,
    23148,
    26307,
    1724,
    29281,
    39988,
    43653,
    48012,
    43810,
    16755,
    13105,
    25325,
    32648,
    19958,
    38838,
    8322,
    3421,
    28624,
    17269,
    45385,
    50680,
    1696,
    26088,
    2787,
    48566,
    34357,
    27731,
    51764,
    8455,
    16498,
    59721,
    59568,
    46333,
    7935,
    51459,
    36766,
    50711
  ];
  for (var i = 0, m = 1; i < 75; i++) {
    Expect.equals(expectations[i], new Random(rawSeed * m).nextInt(65536));
    Expect.equals(
        negative_seed_expectations[i], new Random(rawSeed * -m).nextInt(65536));
    m *= 2;
  }
  // And test zero seed too.
  Expect.equals(21391, new Random(0).nextInt(65536));
}
