// Copyright (c) 2011, 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.

// @dart = 2.9

// Dart test for List.shuffle.
library shuffle_test;

import "dart:typed_data";
import "dart:math" show Random;
import "package:expect/expect.dart";

main() {
  for (int size in [0, 1, 2, 3, 7, 15, 99, 1023]) {
    var numbers = new List<int>.generate(size, (x) => x);
    testShuffle(numbers.toList(growable: true));
    testShuffle(numbers.toList(growable: false));
    testShuffle(new Uint32List(size)..setAll(0, numbers));
    testShuffle(new Int32List(size)..setAll(0, numbers));
    testShuffle(new Uint16List(size)..setAll(0, numbers));
    testShuffle(new Int16List(size)..setAll(0, numbers));
    // Some numbers will be truncated in the following two.
    testShuffle(new Uint8List(size)..setAll(0, numbers));
    testShuffle(new Int8List(size)..setAll(0, numbers));
    //testShuffle(numbers.map((x) => "$x").toList());
  }

  // Check that it actually can keep the same list (regression test).
  List l = [1, 2];
  success:
  {
    for (int i = 0; i < 266; i++) {
      int first = l.first;
      l.shuffle();
      if (l.first == first) break success; // List didn't change.
    }
    // Chance of changing 266 times in a row should be < 1:1e80.
    Expect.fail("List changes every time.");
  }

  testRandom();
}

void testShuffle(list) {
  List copy = list.toList();
  list.shuffle();
  if (list.length < 2) {
    Expect.listEquals(copy, list);
    return;
  }
  // Test that the list after shuffling has the same elements as before,
  // without considering order.
  Map seen = {};
  for (var e in list) {
    seen[e] = seen.putIfAbsent(e, () => 0) + 1;
  }
  for (var e in copy) {
    int remaining = seen[e];
    remaining -= 1; // Throws if e was not in map at all.
    if (remaining == 0) {
      seen.remove(e);
    } else {
      seen[e] = remaining;
    }
  }
  Expect.isTrue(seen.isEmpty);
  // Test that shuffle actually does make a change. Repeat until the probability
  // of a proper shuffling hitting the same list again is less than 10^80
  // (arbitrary bignum - approx. number of atoms in the universe).
  //
  // The probability of shuffling a list of length n into the same list is
  // 1/n!. If one shuffle didn't change the list, repeat shuffling until
  // probability of randomly hitting the same list every time is less than
  // 1/1e80.

  bool listsDifferent() {
    for (int i = 0; i < list.length; i++) {
      if (list[i] != copy[i]) return true;
    }
    return false;
  }

  if (list.length < 59) {
    // 59! > 1e80.
    double limit = 1e80;
    double fact = 1.0;
    for (int i = 2; i < list.length; i++) fact *= i;
    double combos = fact;

    while (!listsDifferent() && combos < limit) {
      list.shuffle();
      combos *= fact;
    }
  }
  if (!listsDifferent()) {
    Expect.fail("Didn't shuffle at all, p < 1:1e80: $list");
  }
}

// Checks that the "random" argument to shuffle is used.
testRandom() {
  List<int> randomNums = [37, 87, 42, 157, 252, 17];
  List numbers = new List.generate(25, (x) => x);
  List l1 = numbers.toList()..shuffle(new MockRandom(randomNums));
  for (int i = 0; i < 50; i++) {
    // With same random sequence, we get the same shuffling each time.
    List l2 = numbers.toList()..shuffle(new MockRandom(randomNums));
    Expect.listEquals(l1, l2);
  }
}

class MockRandom implements Random {
  final List<int> _values;
  int index = 0;
  MockRandom(this._values);

  int get _next {
    int next = _values[index];
    index = (index + 1) % _values.length;
    return next;
  }

  int nextInt(int limit) => _next % limit;

  double nextDouble() => _next / 256.0;

  bool nextBool() => _next.isEven;
}
