// 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.

/// Tests algorithm utilities.

import "package:collection/collection.dart";
import "package:test/test.dart";
import 'dart:math';

void main() {
  void testShuffle(List list) {
    List copy = list.toList();
    shuffle(list);
    expect(new UnorderedIterableEquality().equals(list, copy), isTrue);
  }

  test("Shuffle 0", () {
    testShuffle([]);
  });
  test("Shuffle 1", () {
    testShuffle([1]);
  });
  test("Shuffle 3", () {
    testShuffle([1, 2, 3]);
  });
  test("Shuffle 10", () {
    testShuffle([1, 2, 3, 4, 5, 1, 3, 5, 7, 9]);
  });
  test("Shuffle shuffles", () {
    List l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
    List c = l.toList();
    int count = 0;
    do {
      shuffle(l);
      if (!const ListEquality().equals(c, l)) return;
      // Odds of not changing the order should be one in ~ 16! ~= 2e+13.
      // Repeat this 10 times, and the odds of accidentally shuffling to the
      // same result every time is disappearingly tiny.
      count++;
      // If this happens even once, it's ok to report it.
      print("Failed shuffle $count times");
      if (count == 10) fail("Shuffle didn't change order.");
    } while (true);
  });
  test("Shuffle sublist", (){
    List l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
    List c = l.toList();
    shuffle(l, 4, 12);
    expect(const IterableEquality().equals(l.getRange(0, 4),
                                           c.getRange(0, 4)), isTrue);
    expect(const IterableEquality().equals(l.getRange(12, 16),
                                           c.getRange(12, 16)), isTrue);
    expect(const UnorderedIterableEquality().equals(l.getRange(4, 12),
                                                    c.getRange(4, 12)),
           isTrue);

  });

  test("binsearch0", () {
    expect(binarySearch([], 2), equals(-1));
  });

  test("binsearch1", () {
    expect(binarySearch([5], 2), equals(-1));
    expect(binarySearch([5], 5), equals(0));
    expect(binarySearch([5], 7), equals(-1));
  });

  test("binsearch3", () {
    expect(binarySearch([0, 5, 10], -1), equals(-1));
    expect(binarySearch([0, 5, 10], 0), equals(0));
    expect(binarySearch([0, 5, 10], 2), equals(-1));
    expect(binarySearch([0, 5, 10], 5), equals(1));
    expect(binarySearch([0, 5, 10], 7), equals(-1));
    expect(binarySearch([0, 5, 10], 10), equals(2));
    expect(binarySearch([0, 5, 10], 12), equals(-1));
  });

  test("binsearchCompare0", () {
    expect(binarySearch(<C>[], new C(2), compare: compareC), equals(-1));
  });

  test("binsearchCompare1", () {
    var l1 = [new C(5)];
    expect(binarySearch(l1, new C(2), compare: compareC), equals(-1));
    expect(binarySearch(l1, new C(5), compare: compareC), equals(0));
    expect(binarySearch(l1, new C(7), compare: compareC), equals(-1));
  });

  test("binsearchCompare3", () {
    var l3 = [new C(0), new C(5), new C(10)];
    expect(binarySearch(l3, new C(-1), compare: compareC), equals(-1));
    expect(binarySearch(l3, new C(0), compare: compareC), equals(0));
    expect(binarySearch(l3, new C(2), compare: compareC), equals(-1));
    expect(binarySearch(l3, new C(5), compare: compareC), equals(1));
    expect(binarySearch(l3, new C(7), compare: compareC), equals(-1));
    expect(binarySearch(l3, new C(10), compare: compareC), equals(2));
    expect(binarySearch(l3, new C(12), compare: compareC), equals(-1));
  });

  test("lowerbound0", () {
    expect(lowerBound([], 2), equals(0));
  });

  test("lowerbound1", () {
    expect(lowerBound([5], 2), equals(0));
    expect(lowerBound([5], 5), equals(0));
    expect(lowerBound([5], 7), equals(1));
  });

  test("lowerbound3", () {
    expect(lowerBound([0, 5, 10], -1), equals(0));
    expect(lowerBound([0, 5, 10], 0), equals(0));
    expect(lowerBound([0, 5, 10], 2), equals(1));
    expect(lowerBound([0, 5, 10], 5), equals(1));
    expect(lowerBound([0, 5, 10], 7), equals(2));
    expect(lowerBound([0, 5, 10], 10), equals(2));
    expect(lowerBound([0, 5, 10], 12), equals(3));
  });

  test("lowerboundRepeat", () {
    expect(lowerBound([5, 5, 5], 5), equals(0));
    expect(lowerBound([0, 5, 5, 5, 10], 5), equals(1));
  });

  test("lowerboundCompare0", () {
    expect(lowerBound(<C>[], new C(2), compare: compareC), equals(0));
  });

  test("lowerboundCompare1", () {
    var l1 = [new C(5)];
    expect(lowerBound(l1, new C(2), compare: compareC), equals(0));
    expect(lowerBound(l1, new C(5), compare: compareC), equals(0));
    expect(lowerBound(l1, new C(7), compare: compareC), equals(1));
  });

  test("lowerboundCompare3", () {
    var l3 = [new C(0), new C(5), new C(10)];
    expect(lowerBound(l3, new C(-1), compare: compareC), equals(0));
    expect(lowerBound(l3, new C(0), compare: compareC), equals(0));
    expect(lowerBound(l3, new C(2), compare: compareC), equals(1));
    expect(lowerBound(l3, new C(5), compare: compareC), equals(1));
    expect(lowerBound(l3, new C(7), compare: compareC), equals(2));
    expect(lowerBound(l3, new C(10), compare: compareC), equals(2));
    expect(lowerBound(l3, new C(12), compare: compareC), equals(3));
  });

  test("lowerboundCompareRepeat", () {
    var l1 = [new C(5), new C(5), new C(5)];
    var l2 = [new C(0), new C(5), new C(5), new C(5), new C(10)];
    expect(lowerBound(l1, new C(5), compare: compareC), equals(0));
    expect(lowerBound(l2, new C(5), compare: compareC), equals(1));
  });

  test("insertionSortRandom", () {
    Random random = new Random();
    for (int i = 0; i < 25; i++) {
      List list = new List(i);
      for (int j = 0; j < i; j++) {
        list[j] = random.nextInt(25);  // Expect some equal elements.
      }
      insertionSort(list);
      for (int j = 1; j < i; j++) {
        expect(list[j - 1], lessThanOrEqualTo(list[j]));
      }
    }
  });

  test("insertionSortSubRanges", () {
    List l = [6, 5, 4, 3, 2, 1];
    insertionSort(l, start: 2, end: 4);
    expect(l, equals([6, 5, 3, 4, 2, 1]));
    insertionSort(l, start: 1, end: 1);
    expect(l, equals([6, 5, 3, 4, 2, 1]));
    insertionSort(l, start: 4, end: 6);
    expect(l, equals([6, 5, 3, 4, 1, 2]));
    insertionSort(l, start: 0, end: 2);
    expect(l, equals([5, 6, 3, 4, 1, 2]));
    insertionSort(l, start: 0, end: 6);
    expect(l, equals([1, 2, 3, 4, 5, 6]));
  });

  test("insertionSortSpecialCases", () {
    List l = [6, 6, 6, 6, 6, 6];
    insertionSort(l);
    expect(l, equals([6, 6, 6, 6, 6, 6]));

    l = [6, 6, 3, 3, 0, 0];
    insertionSort(l);
    expect(l, equals([0, 0, 3, 3, 6, 6]));
  });

  test("MergeSortRandom", () {
    Random random = new Random();
    for (int i = 0; i < 250; i += 1) {
      List list = new List(i);
      for (int j = 0; j < i; j++) {
        list[j] = random.nextInt(i);  // Expect some equal elements.
      }
      mergeSort(list);
      for (int j = 1; j < i; j++) {
        expect(list[j - 1], lessThanOrEqualTo(list[j]));
      }
    }
  });

  test("MergeSortPreservesOrder", () {
    Random random = new Random();
    // Small case where only insertion call is called,
    // larger case where the internal moving insertion sort is used
    // larger cases with multiple splittings, numbers just around a power of 2.
    for (int size in [8, 50, 511, 512, 513]) {
      List list = new List(size);
      // Class OC compares using id.
      // With size elements with id's in the range 0..size/4, a number of
      // collisions are guaranteed. These should be sorted so that the "order"
      // part of the objects are still in order.
      for (int i = 0; i < size; i++) {
        list[i] = new OC(random.nextInt(size >> 2), i);
      }
      mergeSort(list);
      OC prev = list[0];
      for (int i = 1; i < size; i++) {
        OC next = list[i];
        expect(prev.id, lessThanOrEqualTo(next.id));
        if (next.id == prev.id) {
          expect(prev.order, lessThanOrEqualTo(next.order));
        }
        prev = next;
      }
      // Reverse compare on part of list.
      List copy = list.toList();
      int min = size >> 2;
      int max = size - min;
      mergeSort(list, start: min, end: max, compare: (a, b) => b.compareTo(a));
      prev = list[min];
      for (int i = min + 1; i < max; i++) {
        OC next = list[i];
        expect(prev.id, greaterThanOrEqualTo(next.id));
        if (next.id == prev.id) {
          expect(prev.order, lessThanOrEqualTo(next.order));
        }
        prev = next;
      }
      // Equals on OC objects is identity, so this means the parts before min,
      // and the parts after max, didn't change at all.
      expect(list.sublist(0, min), equals(copy.sublist(0, min)));
      expect(list.sublist(max), equals(copy.sublist(max)));
    }
  });

  test("MergeSortSpecialCases", () {
    for (int size in [511, 512, 513]) {
      // All equal.
      List list = new List(size);
      for (int i = 0; i < size; i++) {
        list[i] = new OC(0, i);
      }
      mergeSort(list);
      for (int i = 0; i < size; i++) {
        expect(list[i].order, equals(i));
      }
      // All but one equal, first.
      list[0] = new OC(1, 0);
      for (int i = 1; i < size; i++) {
        list[i] = new OC(0, i);
      }
      mergeSort(list);
      for (int i = 0; i < size - 1; i++) {
        expect(list[i].order, equals(i + 1));
      }
      expect(list[size - 1].order, equals(0));

      // All but one equal, last.
      for (int i = 0; i < size - 1; i++) {
        list[i] = new OC(0, i);
      }
      list[size - 1] = new OC(-1, size - 1);
      mergeSort(list);
      expect(list[0].order, equals(size - 1));
      for (int i = 1; i < size; i++) {
        expect(list[i].order, equals(i - 1));
      }

      // Reversed.
      for (int i = 0; i < size; i++) {
        list[i] = new OC(size - 1 - i, i);
      }
      mergeSort(list);
      for (int i = 0; i < size; i++) {
        expect(list[i].id, equals(i));
        expect(list[i].order, equals(size - 1 - i));
      }
    }
  });

  test("Reverse", () {
    List l = [6, 5, 4, 3, 2, 1];
    reverse(l, 2, 4);
    expect(l, equals([6, 5, 3, 4, 2, 1]));
    reverse(l, 1, 1);
    expect(l, equals([6, 5, 3, 4, 2, 1]));
    reverse(l, 4, 6);
    expect(l, equals([6, 5, 3, 4, 1, 2]));
    reverse(l, 0, 2);
    expect(l, equals([5, 6, 3, 4, 1, 2]));
    reverse(l, 0, 6);
    expect(l, equals([2, 1, 4, 3, 6, 5]));
  });
}

class C {
  final int id;
  C(this.id);
}
int compareC(C one, C other) => one.id - other.id;

class OC implements Comparable<OC> {
  final int id;
  final int order;
  OC(this.id, this.order);
  int compareTo(OC other) => id - other.id;
  String toString() => "OC[$id,$order]";
}
