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

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

// Test that any member access/call on the wrapper object is equal to
// an expected access on the wrapped object.
// This is implemented by capturing accesses using noSuchMethod and comparing
// them to expected accesses captured previously.

// Compare two Invocations for having equal type and arguments.
void testInvocations(Invocation i1, Invocation i2) {
  String name = "${i1.memberName}";
  expect(i1.isGetter, equals(i2.isGetter), reason: name);
  expect(i1.isSetter, equals(i2.isSetter), reason: name);
  expect(i1.memberName, equals(i2.memberName), reason: name);
  expect(i1.positionalArguments, equals(i2.positionalArguments), reason: name);
  expect(i1.namedArguments, equals(i2.namedArguments), reason: name);
}

/// Utility class to record a member access and a member access on a wrapped
/// object, and compare them for equality.
abstract class Expector {
  getWrappedObject(action(Invocation i));
  // Hack to test assignment ([]=) because it doesn't return the result
  // of the member call. Instead use (expect..[4]=5).equal[4]=5  where
  // you would normally use expect[4].equals[4] for non-assignments.
  var equals;

  noSuchMethod(Invocation m) => new _Equals(equals = getWrappedObject((m2) {
        testInvocations(m, m2);
      }));

  // dartanalyzer complains if this method is named `toString()`, since, if it
  // truly overrides Object's `toString()`, it should return a String.
  asString() => new _Equals(equals = getWrappedObject((m2) {
        testInvocations(TO_STRING_INVOCATION, m2);
      }));
}

// An object with a field called "equals", only introduced into the
// flow to allow writing expect.xxx.equals.xxx.
class _Equals {
  final equals;
  _Equals(this.equals);
}

class SyntheticInvocation implements Invocation {
  static const int METHOD = 0x00;
  static const int GETTER = 0x01;
  static const int SETTER = 0x02;
  final Symbol memberName;
  final List positionalArguments;
  final Map<Symbol, dynamic> namedArguments;
  final int _type;
  const SyntheticInvocation(this.memberName, this.positionalArguments,
      this.namedArguments, this._type);

  List<Type> get typeArguments => const <Type>[];

  bool get isMethod => _type == METHOD;

  bool get isGetter => _type == GETTER;

  bool get isSetter => _type == SETTER;

  bool get isAccessor => isGetter || isSetter;
}

// Parameterization of noSuchMethod.
class NSM {
  Function _action;
  NSM(this._action);
  noSuchMethod(Invocation i) => _action(i);
}

const TO_STRING_INVOCATION = const SyntheticInvocation(
    #toString, const [], const {}, SyntheticInvocation.METHOD);

// LikeNSM, but has types Iterable, Set and List to allow it as
// argument to DelegatingIterable/Set/List.
class IterableNSM extends NSM implements Iterable, Set, List, Queue {
  IterableNSM(action(Invocation i)) : super(action);
  toString() => super.noSuchMethod(TO_STRING_INVOCATION) as String;

  Null cast<T>();
  Null retype<T>();
}

// Expector that wraps in DelegatingIterable.
class IterableExpector extends Expector {
  getWrappedObject(void action(Invocation i)) {
    return new DelegatingIterable(new IterableNSM(action));
  }
}

// Expector that wraps in DelegatingList.
class ListExpector extends Expector {
  getWrappedObject(void action(Invocation i)) {
    return new DelegatingList(new IterableNSM(action));
  }
}

// Expector that wraps in DelegatingSet.
class SetExpector extends Expector {
  getWrappedObject(void action(Invocation i)) {
    return new DelegatingSet(new IterableNSM(action));
  }
}

// Expector that wraps in DelegatingSet.
class QueueExpector extends Expector {
  getWrappedObject(void action(Invocation i)) {
    return new DelegatingQueue(new IterableNSM(action));
  }
}

// Like NSM but implements Map to allow as argument for DelegatingMap.
class MapNSM extends NSM implements Map {
  MapNSM(action(Invocation i)) : super(action);
  toString() => super.noSuchMethod(TO_STRING_INVOCATION) as String;
}

// Expector that wraps in DelegatingMap.
class MapExpector extends Expector {
  getWrappedObject(void action(Invocation i)) {
    return new DelegatingMap(new MapNSM(action));
  }
}

// Utility values to use as arguments in calls.
func0() {}
func1(x) {}
func2(x, y) {}
var val = new Object();

void main() {
  testIterable(var expect) {
    expect.any(func1).equals.any(func1);
    expect.contains(val).equals.contains(val);
    expect.elementAt(0).equals.elementAt(0);
    expect.every(func1).equals.every(func1);
    expect.expand(func1).equals.expand(func1);
    expect.first.equals.first;
    // Default values of the Iterable interface will be added in the
    // second call to firstWhere, so we must record them in our
    // expectation (which doesn't have the interface implemented or
    // its default values).
    expect.firstWhere(func1, orElse: null).equals.firstWhere(func1);
    expect
        .firstWhere(func1, orElse: func0)
        .equals
        .firstWhere(func1, orElse: func0);
    expect.fold(null, func2).equals.fold(null, func2);
    expect.forEach(func1).equals.forEach(func1);
    expect.isEmpty.equals.isEmpty;
    expect.isNotEmpty.equals.isNotEmpty;
    expect.iterator.equals.iterator;
    expect.join('').equals.join();
    expect.join("X").equals.join("X");
    expect.last.equals.last;
    expect.lastWhere(func1, orElse: null).equals.lastWhere(func1);
    expect
        .lastWhere(func1, orElse: func0)
        .equals
        .lastWhere(func1, orElse: func0);
    expect.length.equals.length;
    expect.map(func1).equals.map(func1);
    expect.reduce(func2).equals.reduce(func2);
    expect.single.equals.single;

    // TODO: This currently fails because of the named parameter.
    // expect.singleWhere(func1).equals.singleWhere(func1);

    expect.skip(5).equals.skip(5);
    expect.skipWhile(func1).equals.skipWhile(func1);
    expect.take(5).equals.take(5);
    expect.takeWhile(func1).equals.takeWhile(func1);
    expect.toList(growable: true).equals.toList();
    expect.toList(growable: true).equals.toList(growable: true);
    expect.toList(growable: false).equals.toList(growable: false);
    expect.toSet().equals.toSet();
    expect.asString().equals.toString();
    expect.where(func1).equals.where(func1);
  }

  void testList(var expect) {
    testIterable(expect);

    expect[4].equals[4];
    (expect..[4] = 5).equals[4] = 5;

    expect.add(val).equals.add(val);
    expect.addAll([val]).equals.addAll([val]);
    expect.asMap().equals.asMap();
    expect.clear().equals.clear();
    expect.fillRange(4, 5, null).equals.fillRange(4, 5);
    expect.fillRange(4, 5, val).equals.fillRange(4, 5, val);
    expect.getRange(4, 5).equals.getRange(4, 5);
    expect.indexOf(val, 0).equals.indexOf(val);
    expect.indexOf(val, 4).equals.indexOf(val, 4);
    expect.insert(4, val).equals.insert(4, val);
    expect.insertAll(4, [val]).equals.insertAll(4, [val]);
    expect.lastIndexOf(val, null).equals.lastIndexOf(val);
    expect.lastIndexOf(val, 4).equals.lastIndexOf(val, 4);
    (expect..length = 4).equals.length = 4;
    expect.remove(val).equals.remove(val);
    expect.removeAt(4).equals.removeAt(4);
    expect.removeLast().equals.removeLast();
    expect.removeRange(4, 5).equals.removeRange(4, 5);
    expect.removeWhere(func1).equals.removeWhere(func1);
    expect.replaceRange(4, 5, [val]).equals.replaceRange(4, 5, [val]);
    expect.retainWhere(func1).equals.retainWhere(func1);
    expect.reversed.equals.reversed;
    expect.setAll(4, [val]).equals.setAll(4, [val]);
    expect.setRange(4, 5, [val], 0).equals.setRange(4, 5, [val]);
    expect.setRange(4, 5, [val], 3).equals.setRange(4, 5, [val], 3);
    expect.sort(null).equals.sort();
    expect.sort(func2).equals.sort(func2);
    expect.sublist(4, null).equals.sublist(4);
    expect.sublist(4, 5).equals.sublist(4, 5);
  }

  void testSet(var expect) {
    testIterable(expect);
    Set set = new Set();
    expect.add(val).equals.add(val);
    expect.addAll([val]).equals.addAll([val]);
    expect.clear().equals.clear();
    expect.containsAll([val]).equals.containsAll([val]);
    expect.difference(set).equals.difference(set);
    expect.intersection(set).equals.intersection(set);
    expect.remove(val).equals.remove(val);
    expect.removeAll([val]).equals.removeAll([val]);
    expect.removeWhere(func1).equals.removeWhere(func1);
    expect.retainAll([val]).equals.retainAll([val]);
    expect.retainWhere(func1).equals.retainWhere(func1);
    expect.union(set).equals.union(set);
  }

  void testQueue(var expect) {
    testIterable(expect);
    expect.add(val).equals.add(val);
    expect.addAll([val]).equals.addAll([val]);
    expect.addFirst(val).equals.addFirst(val);
    expect.addLast(val).equals.addLast(val);
    expect.clear().equals.clear();
    expect.remove(val).equals.remove(val);
    expect.removeFirst().equals.removeFirst();
    expect.removeLast().equals.removeLast();
  }

  void testMap(var expect) {
    Map map = new Map();
    expect[val].equals[val];
    (expect..[val] = val).equals[val] = val;
    expect.addAll(map).equals.addAll(map);
    expect.clear().equals.clear();
    expect.containsKey(val).equals.containsKey(val);
    expect.containsValue(val).equals.containsValue(val);
    expect.forEach(func2).equals.forEach(func2);
    expect.isEmpty.equals.isEmpty;
    expect.isNotEmpty.equals.isNotEmpty;
    expect.keys.equals.keys;
    expect.length.equals.length;
    expect.putIfAbsent(val, func0).equals.putIfAbsent(val, func0);
    expect.remove(val).equals.remove(val);
    expect.values.equals.values;
    expect.asString().equals.toString();
  }

  // Runs tests of Set behavior.
  //
  // [setUpSet] should return a set with two elements: "foo" and "bar".
  void testTwoElementSet(Set<String> setUpSet()) {
    group("with two elements", () {
      var set;
      setUp(() => set = setUpSet());

      test(".any", () {
        expect(set.any((element) => element == "foo"), isTrue);
        expect(set.any((element) => element == "baz"), isFalse);
      });

      test(".elementAt", () {
        expect(set.elementAt(0), equals("foo"));
        expect(set.elementAt(1), equals("bar"));
        expect(() => set.elementAt(2), throwsRangeError);
      });

      test(".every", () {
        expect(set.every((element) => element == "foo"), isFalse);
        expect(set.every((element) => element is String), isTrue);
      });

      test(".expand", () {
        expect(set.expand((element) {
          return [element.substring(0, 1), element.substring(1)];
        }), equals(["f", "oo", "b", "ar"]));
      });

      test(".first", () {
        expect(set.first, equals("foo"));
      });

      test(".firstWhere", () {
        expect(set.firstWhere((element) => element is String), equals("foo"));
        expect(set.firstWhere((element) => element.startsWith("b")),
            equals("bar"));
        expect(() => set.firstWhere((element) => element is int),
            throwsStateError);
        expect(set.firstWhere((element) => element is int, orElse: () => "baz"),
            equals("baz"));
      });

      test(".fold", () {
        expect(set.fold("start", (previous, element) => previous + element),
            equals("startfoobar"));
      });

      test(".forEach", () {
        var values = [];
        set.forEach(values.add);
        expect(values, equals(["foo", "bar"]));
      });

      test(".iterator", () {
        var values = [];
        for (var element in set) {
          values.add(element);
        }
        expect(values, equals(["foo", "bar"]));
      });

      test(".join", () {
        expect(set.join(", "), equals("foo, bar"));
      });

      test(".last", () {
        expect(set.last, equals("bar"));
      });

      test(".lastWhere", () {
        expect(set.lastWhere((element) => element is String), equals("bar"));
        expect(
            set.lastWhere((element) => element.startsWith("f")), equals("foo"));
        expect(
            () => set.lastWhere((element) => element is int), throwsStateError);
        expect(set.lastWhere((element) => element is int, orElse: () => "baz"),
            equals("baz"));
      });

      test(".map", () {
        expect(
            set.map((element) => element.substring(1)), equals(["oo", "ar"]));
      });

      test(".reduce", () {
        expect(set.reduce((previous, element) => previous + element),
            equals("foobar"));
      });

      test(".singleWhere", () {
        expect(() => set.singleWhere((element) => element == "baz"),
            throwsStateError);
        expect(set.singleWhere((element) => element == "foo"), "foo");
        expect(() => set.singleWhere((element) => element is String),
            throwsStateError);
      });

      test(".skip", () {
        expect(set.skip(0), equals(["foo", "bar"]));
        expect(set.skip(1), equals(["bar"]));
        expect(set.skip(2), equals([]));
      });

      test(".skipWhile", () {
        expect(set.skipWhile((element) => element.startsWith("f")),
            equals(["bar"]));
        expect(set.skipWhile((element) => element.startsWith("z")),
            equals(["foo", "bar"]));
        expect(set.skipWhile((element) => element is String), equals([]));
      });

      test(".take", () {
        expect(set.take(0), equals([]));
        expect(set.take(1), equals(["foo"]));
        expect(set.take(2), equals(["foo", "bar"]));
      });

      test(".takeWhile", () {
        expect(set.takeWhile((element) => element.startsWith("f")),
            equals(["foo"]));
        expect(set.takeWhile((element) => element.startsWith("z")), equals([]));
        expect(set.takeWhile((element) => element is String),
            equals(["foo", "bar"]));
      });

      test(".toList", () {
        expect(set.toList(), equals(["foo", "bar"]));
        expect(() => set.toList(growable: false).add("baz"),
            throwsUnsupportedError);
        expect(set.toList()..add("baz"), equals(["foo", "bar", "baz"]));
      });

      test(".toSet", () {
        expect(set.toSet(), equals(new Set.from(["foo", "bar"])));
      });

      test(".where", () {
        expect(
            set.where((element) => element.startsWith("f")), equals(["foo"]));
        expect(set.where((element) => element.startsWith("z")), equals([]));
        expect(
            set.where((element) => element is String), equals(["foo", "bar"]));
      });

      test(".containsAll", () {
        expect(set.containsAll(["foo", "bar"]), isTrue);
        expect(set.containsAll(["foo"]), isTrue);
        expect(set.containsAll(["foo", "bar", "qux"]), isFalse);
      });

      test(".difference", () {
        expect(set.difference(new Set.from(["foo", "baz"])),
            equals(new Set.from(["bar"])));
      });

      test(".intersection", () {
        expect(set.intersection(new Set.from(["foo", "baz"])),
            equals(new Set.from(["foo"])));
      });

      test(".union", () {
        expect(set.union(new Set.from(["foo", "baz"])),
            equals(new Set.from(["foo", "bar", "baz"])));
      });
    });
  }

  test("Iterable", () {
    testIterable(new IterableExpector());
  });

  test("List", () {
    testList(new ListExpector());
  });

  test("Set", () {
    testSet(new SetExpector());
  });

  test("Queue", () {
    testQueue(new QueueExpector());
  });

  test("Map", () {
    testMap(new MapExpector());
  });

  group("MapKeySet", () {
    Map<String, dynamic> map;
    Set<String> set;

    setUp(() {
      map = new Map<String, int>();
      set = new MapKeySet<String>(map);
    });

    testTwoElementSet(() {
      map["foo"] = 1;
      map["bar"] = 2;
      return set;
    });

    test(".single", () {
      expect(() => set.single, throwsStateError);
      map["foo"] = 1;
      expect(set.single, equals("foo"));
      map["bar"] = 1;
      expect(() => set.single, throwsStateError);
    });

    test(".toString", () {
      expect(set.toString(), equals("{}"));
      map["foo"] = 1;
      map["bar"] = 2;
      expect(set.toString(), equals("{foo, bar}"));
    });

    test(".contains", () {
      expect(set.contains("foo"), isFalse);
      map["foo"] = 1;
      expect(set.contains("foo"), isTrue);
    });

    test(".isEmpty", () {
      expect(set.isEmpty, isTrue);
      map["foo"] = 1;
      expect(set.isEmpty, isFalse);
    });

    test(".isNotEmpty", () {
      expect(set.isNotEmpty, isFalse);
      map["foo"] = 1;
      expect(set.isNotEmpty, isTrue);
    });

    test(".length", () {
      expect(set, hasLength(0));
      map["foo"] = 1;
      expect(set, hasLength(1));
      map["bar"] = 2;
      expect(set, hasLength(2));
    });

    test("is unmodifiable", () {
      expect(() => set.add("baz"), throwsUnsupportedError);
      expect(() => set.addAll(["baz", "bang"]), throwsUnsupportedError);
      expect(() => set.remove("foo"), throwsUnsupportedError);
      expect(() => set.removeAll(["baz", "bang"]), throwsUnsupportedError);
      expect(() => set.retainAll(["foo"]), throwsUnsupportedError);
      expect(() => set.removeWhere((_) => true), throwsUnsupportedError);
      expect(() => set.retainWhere((_) => true), throwsUnsupportedError);
      expect(() => set.clear(), throwsUnsupportedError);
    });
  });

  group("MapValueSet", () {
    Map<String, String> map;
    Set<String> set;

    setUp(() {
      map = new Map<String, String>();
      set = new MapValueSet<String, String>(
          map, (string) => string.substring(0, 1));
    });

    testTwoElementSet(() {
      map["f"] = "foo";
      map["b"] = "bar";
      return set;
    });

    test(".single", () {
      expect(() => set.single, throwsStateError);
      map["f"] = "foo";
      expect(set.single, equals("foo"));
      map["b"] = "bar";
      expect(() => set.single, throwsStateError);
    });

    test(".toString", () {
      expect(set.toString(), equals("{}"));
      map["f"] = "foo";
      map["b"] = "bar";
      expect(set.toString(), equals("{foo, bar}"));
    });

    test(".contains", () {
      expect(set.contains("foo"), isFalse);
      map["f"] = "foo";
      expect(set.contains("foo"), isTrue);
      expect(set.contains("fblthp"), isTrue);
    });

    test(".isEmpty", () {
      expect(set.isEmpty, isTrue);
      map["f"] = "foo";
      expect(set.isEmpty, isFalse);
    });

    test(".isNotEmpty", () {
      expect(set.isNotEmpty, isFalse);
      map["f"] = "foo";
      expect(set.isNotEmpty, isTrue);
    });

    test(".length", () {
      expect(set, hasLength(0));
      map["f"] = "foo";
      expect(set, hasLength(1));
      map["b"] = "bar";
      expect(set, hasLength(2));
    });

    test(".lookup", () {
      map["f"] = "foo";
      expect(set.lookup("fblthp"), equals("foo"));
      expect(set.lookup("bar"), isNull);
    });

    test(".add", () {
      set.add("foo");
      set.add("bar");
      expect(map, equals({"f": "foo", "b": "bar"}));
    });

    test(".addAll", () {
      set.addAll(["foo", "bar"]);
      expect(map, equals({"f": "foo", "b": "bar"}));
    });

    test(".clear", () {
      map["f"] = "foo";
      map["b"] = "bar";
      set.clear();
      expect(map, isEmpty);
    });

    test(".remove", () {
      map["f"] = "foo";
      map["b"] = "bar";
      set.remove("fblthp");
      expect(map, equals({"b": "bar"}));
    });

    test(".removeAll", () {
      map["f"] = "foo";
      map["b"] = "bar";
      map["q"] = "qux";
      set.removeAll(["fblthp", "qux"]);
      expect(map, equals({"b": "bar"}));
    });

    test(".removeWhere", () {
      map["f"] = "foo";
      map["b"] = "bar";
      map["q"] = "qoo";
      set.removeWhere((element) => element.endsWith("o"));
      expect(map, equals({"b": "bar"}));
    });

    test(".retainAll", () {
      map["f"] = "foo";
      map["b"] = "bar";
      map["q"] = "qux";
      set.retainAll(["fblthp", "qux"]);
      expect(map, equals({"f": "foo", "q": "qux"}));
    });

    test(".retainAll respects an unusual notion of equality", () {
      map = new HashMap<String, String>(
          equals: (value1, value2) =>
              value1.toLowerCase() == value2.toLowerCase(),
          hashCode: (value) => value.toLowerCase().hashCode);
      set = new MapValueSet<String, String>(
          map, (string) => string.substring(0, 1));

      map["f"] = "foo";
      map["B"] = "bar";
      map["Q"] = "qux";
      set.retainAll(["fblthp", "qux"]);
      expect(map, equals({"f": "foo", "Q": "qux"}));
    });

    test(".retainWhere", () {
      map["f"] = "foo";
      map["b"] = "bar";
      map["q"] = "qoo";
      set.retainWhere((element) => element.endsWith("o"));
      expect(map, equals({"f": "foo", "q": "qoo"}));
    });
  });
}
