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

import 'dart:async';
import 'dart:collection';

import 'package:matcher/matcher.dart';
import 'package:unittest/unittest.dart' as ut;

import 'test_utils.dart';

void main() {

  initUtils();

  // Core matchers

  ut.group('Core matchers', () {

    ut.test('isTrue', () {
      shouldPass(true, isTrue);
      shouldFail(false, isTrue, "Expected: true Actual: <false>");
    });

    ut.test('isFalse', () {
      shouldPass(false, isFalse);
      shouldFail(10, isFalse, "Expected: false Actual: <10>");
      shouldFail(true, isFalse, "Expected: false Actual: <true>");
    });

    ut.test('isNull', () {
      shouldPass(null, isNull);
      shouldFail(false, isNull, "Expected: null Actual: <false>");
    });

    ut.test('isNotNull', () {
      shouldPass(false, isNotNull);
      shouldFail(null, isNotNull, "Expected: not null Actual: <null>");
    });

    ut.test('same', () {
      var a = new Map();
      var b = new Map();
      shouldPass(a, same(a));
      shouldFail(b, same(a), "Expected: same instance as {} Actual: {}");
    });

    ut.test('equals', () {
      var a = new Map();
      var b = new Map();
      shouldPass(a, equals(a));
      shouldPass(a, equals(b));
    });

    ut.test('anything', () {
      var a = new Map();
      shouldPass(0, anything);
      shouldPass(null, anything);
      shouldPass(a, anything);
      shouldFail(a, isNot(anything), "Expected: not anything Actual: {}");
    });

    ut.test('throws', () {
      shouldFail(doesNotThrow, throws,
          matches(
              r"Expected: throws"
              r"  Actual: <Closure(: \(\) => dynamic "
              r"from Function 'doesNotThrow': static\.)?>"
              r"   Which: did not throw"));
      shouldPass(doesThrow, throws);
      shouldFail(true, throws,
          "Expected: throws"
          "  Actual: <true>"
          "   Which: is not a Function or Future");
    });

    ut.test('throwsA', () {
      shouldPass(doesThrow, throwsA(equals('X')));
      shouldFail(doesThrow, throwsA(equals('Y')),
          matches(
              r"Expected: throws 'Y'"
              r"  Actual: <Closure(: \(\) => dynamic "
              r"from Function 'doesThrow': static\.)?>"
              r"   Which: threw 'X'"));
    });

    ut.test('returnsNormally', () {
      shouldPass(doesNotThrow, returnsNormally);
      shouldFail(doesThrow, returnsNormally,
          matches(
              r"Expected: return normally"
              r"  Actual: <Closure(: \(\) => dynamic "
              r"from Function 'doesThrow': static\.)?>"
              r"   Which: threw 'X'"));
    });


    ut.test('hasLength', () {
      var a = new Map();
      var b = new List();
      shouldPass(a, hasLength(0));
      shouldPass(b, hasLength(0));
      shouldPass('a', hasLength(1));
      shouldFail(0, hasLength(0), new PrefixMatcher(
          "Expected: an object with length of <0> "
          "Actual: <0> "
          "Which: has no length property"));

      b.add(0);
      shouldPass(b, hasLength(1));
      shouldFail(b, hasLength(2),
          "Expected: an object with length of <2> "
          "Actual: [0] "
          "Which: has length of <1>");

      b.add(0);
      shouldFail(b, hasLength(1),
          "Expected: an object with length of <1> "
          "Actual: [0, 0] "
          "Which: has length of <2>");
      shouldPass(b, hasLength(2));
    });

    ut.test('scalar type mismatch', () {
      shouldFail('error', equals(5.1),
          "Expected: <5.1> "
          "Actual: 'error'");
    });

    ut.test('nested type mismatch', () {
      shouldFail(['error'], equals([5.1]),
          "Expected: [5.1] "
          "Actual: ['error'] "
          "Which: was 'error' instead of <5.1> at location [0]");
    });

    ut.test('doubly-nested type mismatch', () {
      shouldFail([['error']], equals([[5.1]]),
          "Expected: [[5.1]] "
          "Actual: [['error']] "
          "Which: was 'error' instead of <5.1> at location [0][0]");
    });

    ut.test('doubly nested inequality', () {
      var actual1 = [['foo', 'bar'], ['foo'], 3, []];
      var expected1 = [['foo', 'bar'], ['foo'], 4, []];
      var reason1 = "Expected: [['foo', 'bar'], ['foo'], 4, []] "
          "Actual: [['foo', 'bar'], ['foo'], 3, []] "
          "Which: was <3> instead of <4> at location [2]";

      var actual2 = [['foo', 'barry'], ['foo'], 4, []];
      var expected2 = [['foo', 'bar'], ['foo'], 4, []];
      var reason2 = "Expected: [['foo', 'bar'], ['foo'], 4, []] "
          "Actual: [['foo', 'barry'], ['foo'], 4, []] "
          "Which: was 'barry' instead of 'bar' at location [0][1]";

      var actual3 = [['foo', 'bar'], ['foo'], 4, {'foo':'bar'}];
      var expected3 = [['foo', 'bar'], ['foo'], 4, {'foo':'barry'}];
      var reason3 = "Expected: [['foo', 'bar'], ['foo'], 4, {'foo': 'barry'}] "
          "Actual: [['foo', 'bar'], ['foo'], 4, {'foo': 'bar'}] "
          "Which: was 'bar' instead of 'barry' at location [3]['foo']";

      shouldFail(actual1, equals(expected1), reason1);
      shouldFail(actual2, equals(expected2), reason2);
      shouldFail(actual3, equals(expected3), reason3);
    });
  });

  ut.group('Numeric Matchers', () {

    ut.test('greaterThan', () {
      shouldPass(10, greaterThan(9));
      shouldFail(9, greaterThan(10),
        "Expected: a value greater than <10> "
        "Actual: <9> "
        "Which: is not a value greater than <10>");
    });

    ut.test('greaterThanOrEqualTo', () {
      shouldPass(10, greaterThanOrEqualTo(10));
      shouldFail(9, greaterThanOrEqualTo(10),
        "Expected: a value greater than or equal to <10> "
        "Actual: <9> "
        "Which: is not a value greater than or equal to <10>");
    });

    ut.test('lessThan', () {
      shouldFail(10, lessThan(9),
          "Expected: a value less than <9> "
          "Actual: <10> "
          "Which: is not a value less than <9>");
      shouldPass(9, lessThan(10));
    });

    ut.test('lessThanOrEqualTo', () {
      shouldPass(10, lessThanOrEqualTo(10));
      shouldFail(11, lessThanOrEqualTo(10),
        "Expected: a value less than or equal to <10> "
        "Actual: <11> "
        "Which: is not a value less than or equal to <10>");
    });

    ut.test('isZero', () {
      shouldPass(0, isZero);
      shouldFail(1, isZero,
          "Expected: a value equal to <0> "
          "Actual: <1> "
          "Which: is not a value equal to <0>");
    });

    ut.test('isNonZero', () {
      shouldFail(0, isNonZero,
          "Expected: a value not equal to <0> "
          "Actual: <0> "
          "Which: is not a value not equal to <0>");
      shouldPass(1, isNonZero);
    });

    ut.test('isPositive', () {
      shouldFail(-1, isPositive,
          "Expected: a positive value "
          "Actual: <-1> "
          "Which: is not a positive value");
      shouldFail(0, isPositive,
          "Expected: a positive value "
          "Actual: <0> "
          "Which: is not a positive value");
      shouldPass(1, isPositive);
    });

    ut.test('isNegative', () {
      shouldPass(-1, isNegative);
      shouldFail(0, isNegative,
          "Expected: a negative value "
          "Actual: <0> "
          "Which: is not a negative value");
    });

    ut.test('isNonPositive', () {
      shouldPass(-1, isNonPositive);
      shouldPass(0, isNonPositive);
      shouldFail(1, isNonPositive,
          "Expected: a non-positive value "
          "Actual: <1> "
          "Which: is not a non-positive value");
    });

    ut.test('isNonNegative', () {
      shouldPass(1, isNonNegative);
      shouldPass(0, isNonNegative);
      shouldFail(-1, isNonNegative,
        "Expected: a non-negative value "
        "Actual: <-1> "
        "Which: is not a non-negative value");
    });

    ut.test('closeTo', () {
      shouldPass(0, closeTo(0, 1));
      shouldPass(-1, closeTo(0, 1));
      shouldPass(1, closeTo(0, 1));
      shouldFail(1.001, closeTo(0, 1),
          "Expected: a numeric value within <1> of <0> "
          "Actual: <1.001> "
          "Which: differs by <1.001>");
      shouldFail(-1.001, closeTo(0, 1),
          "Expected: a numeric value within <1> of <0> "
          "Actual: <-1.001> "
          "Which: differs by <1.001>");
    });

    ut.test('inInclusiveRange', () {
      shouldFail(-1, inInclusiveRange(0,2),
          "Expected: be in range from 0 (inclusive) to 2 (inclusive) "
          "Actual: <-1>");
      shouldPass(0, inInclusiveRange(0,2));
      shouldPass(1, inInclusiveRange(0,2));
      shouldPass(2, inInclusiveRange(0,2));
      shouldFail(3, inInclusiveRange(0,2),
          "Expected: be in range from 0 (inclusive) to 2 (inclusive) "
          "Actual: <3>");
    });

    ut.test('inExclusiveRange', () {
      shouldFail(0, inExclusiveRange(0,2),
          "Expected: be in range from 0 (exclusive) to 2 (exclusive) "
          "Actual: <0>");
      shouldPass(1, inExclusiveRange(0,2));
      shouldFail(2, inExclusiveRange(0,2),
          "Expected: be in range from 0 (exclusive) to 2 (exclusive) "
          "Actual: <2>");
    });

    ut.test('inOpenClosedRange', () {
      shouldFail(0, inOpenClosedRange(0,2),
          "Expected: be in range from 0 (exclusive) to 2 (inclusive) "
          "Actual: <0>");
      shouldPass(1, inOpenClosedRange(0,2));
      shouldPass(2, inOpenClosedRange(0,2));
    });

    ut.test('inClosedOpenRange', () {
      shouldPass(0, inClosedOpenRange(0,2));
      shouldPass(1, inClosedOpenRange(0,2));
      shouldFail(2, inClosedOpenRange(0,2),
          "Expected: be in range from 0 (inclusive) to 2 (exclusive) "
          "Actual: <2>");
    });
  });

  ut.group('String Matchers', () {

    ut.test('isEmpty', () {
      shouldPass('', isEmpty);
      shouldFail(null, isEmpty,
          "Expected: empty Actual: <null>");
      shouldFail(0, isEmpty,
          "Expected: empty Actual: <0>");
      shouldFail('a', isEmpty, "Expected: empty Actual: 'a'");
    });

    ut.test('equalsIgnoringCase', () {
      shouldPass('hello', equalsIgnoringCase('HELLO'));
      shouldFail('hi', equalsIgnoringCase('HELLO'),
          "Expected: 'HELLO' ignoring case Actual: 'hi'");
    });

    ut.test('equalsIgnoringWhitespace', () {
      shouldPass(' hello   world  ', equalsIgnoringWhitespace('hello world'));
      shouldFail(' helloworld  ', equalsIgnoringWhitespace('hello world'),
          "Expected: 'hello world' ignoring whitespace "
          "Actual: ' helloworld ' "
          "Which: is 'helloworld' with whitespace compressed");
    });

    ut.test('startsWith', () {
      shouldPass('hello', startsWith(''));
      shouldPass('hello', startsWith('hell'));
      shouldPass('hello', startsWith('hello'));
      shouldFail('hello', startsWith('hello '),
          "Expected: a string starting with 'hello ' "
          "Actual: 'hello'");
    });

    ut.test('endsWith', () {
      shouldPass('hello', endsWith(''));
      shouldPass('hello', endsWith('lo'));
      shouldPass('hello', endsWith('hello'));
      shouldFail('hello', endsWith(' hello'),
          "Expected: a string ending with ' hello' "
          "Actual: 'hello'");
    });

    ut.test('contains', () {
      shouldPass('hello', contains(''));
      shouldPass('hello', contains('h'));
      shouldPass('hello', contains('o'));
      shouldPass('hello', contains('hell'));
      shouldPass('hello', contains('hello'));
      shouldFail('hello', contains(' '),
          "Expected: contains ' ' Actual: 'hello'");
    });

    ut.test('stringContainsInOrder', () {
      shouldPass('goodbye cruel world', stringContainsInOrder(['']));
      shouldPass('goodbye cruel world', stringContainsInOrder(['goodbye']));
      shouldPass('goodbye cruel world', stringContainsInOrder(['cruel']));
      shouldPass('goodbye cruel world', stringContainsInOrder(['world']));
      shouldPass('goodbye cruel world',
                 stringContainsInOrder(['good', 'bye', 'world']));
      shouldPass('goodbye cruel world',
                 stringContainsInOrder(['goodbye', 'cruel']));
      shouldPass('goodbye cruel world',
                 stringContainsInOrder(['cruel', 'world']));
      shouldPass('goodbye cruel world',
        stringContainsInOrder(['goodbye', 'cruel', 'world']));
      shouldFail('goodbye cruel world',
        stringContainsInOrder(['goo', 'cruel', 'bye']),
        "Expected: a string containing 'goo', 'cruel', 'bye' in order "
        "Actual: 'goodbye cruel world'");
    });

    ut.test('matches', () {
      shouldPass('c0d', matches('[a-z][0-9][a-z]'));
      shouldPass('c0d', matches(new RegExp('[a-z][0-9][a-z]')));
      shouldFail('cOd', matches('[a-z][0-9][a-z]'),
          "Expected: match '[a-z][0-9][a-z]' Actual: 'cOd'");
    });
  });

  ut.group('Iterable Matchers', () {

    ut.test('isEmpty', () {
      shouldPass([], isEmpty);
      shouldFail([1], isEmpty, "Expected: empty Actual: [1]");
    });

    ut.test('contains', () {
      var d = [1, 2];
      shouldPass(d, contains(1));
      shouldFail(d, contains(0), "Expected: contains <0> "
          "Actual: [1, 2]");
    });

    ut.test('equals with matcher element', () {
      var d = ['foo', 'bar'];
      shouldPass(d, equals(['foo', startsWith('ba')]));
      shouldFail(d, equals(['foo', endsWith('ba')]),
          "Expected: ['foo', <a string ending with 'ba'>] "
          "Actual: ['foo', 'bar'] "
          "Which: does not match a string ending with 'ba' at location [1]");
    });

    ut.test('isIn', () {
      var d = [1, 2];
      shouldPass(1, isIn(d));
      shouldFail(0, isIn(d), "Expected: is in [1, 2] Actual: <0>");
    });

    ut.test('everyElement', () {
      var d = [1, 2];
      var e = [1, 1, 1];
      shouldFail(d, everyElement(1),
          "Expected: every element(<1>) "
          "Actual: [1, 2] "
          "Which: has value <2> which doesn't match <1> at index 1");
      shouldPass(e, everyElement(1));
    });

    ut.test('nested everyElement', () {
      var d = [['foo', 'bar'], ['foo'], []];
      var e = [['foo', 'bar'], ['foo'], 3, []];
      shouldPass(d, everyElement(anyOf(isEmpty, contains('foo'))));
      shouldFail(d, everyElement(everyElement(equals('foo'))),
          "Expected: every element(every element('foo')) "
          "Actual: [['foo', 'bar'], ['foo'], []] "
          "Which: has value ['foo', 'bar'] which has value 'bar' "
          "which is different. Expected: foo Actual: bar ^ "
          "Differ at offset 0 at index 1 at index 0");
      shouldFail(d, everyElement(allOf(hasLength(greaterThan(0)),
          contains('foo'))),
           "Expected: every element((an object with length of a value "
           "greater than <0> and contains 'foo')) "
           "Actual: [['foo', 'bar'], ['foo'], []] "
           "Which: has value [] which has length of <0> at index 2");
      shouldFail(d, everyElement(allOf(contains('foo'),
          hasLength(greaterThan(0)))),
          "Expected: every element((contains 'foo' and "
          "an object with length of a value greater than <0>)) "
          "Actual: [['foo', 'bar'], ['foo'], []] "
          "Which: has value [] which doesn't match (contains 'foo' and "
          "an object with length of a value greater than <0>) at index 2");
      shouldFail(e, everyElement(allOf(contains('foo'),
          hasLength(greaterThan(0)))),
          "Expected: every element((contains 'foo' and an object with "
          "length of a value greater than <0>)) "
          "Actual: [['foo', 'bar'], ['foo'], 3, []] "
          "Which: has value <3> which is not a string, map or iterable "
          "at index 2");
    });

    ut.test('anyElement', () {
      var d = [1, 2];
      var e = [1, 1, 1];
      shouldPass(d, anyElement(2));
      shouldFail(e, anyElement(2),
          "Expected: some element <2> Actual: [1, 1, 1]");
    });

    ut.test('orderedEquals', () {
      shouldPass([null], orderedEquals([null]));
      var d = [1, 2];
      shouldPass(d, orderedEquals([1, 2]));
      shouldFail(d, orderedEquals([2, 1]),
          "Expected: equals [2, 1] ordered "
          "Actual: [1, 2] "
          "Which: was <1> instead of <2> at location [0]");
    });

    ut.test('unorderedEquals', () {
      var d = [1, 2];
      shouldPass(d, unorderedEquals([2, 1]));
      shouldFail(d, unorderedEquals([1]),
          "Expected: equals [1] unordered "
          "Actual: [1, 2] "
          "Which: has too many elements (2 > 1)");
      shouldFail(d, unorderedEquals([3, 2, 1]),
          "Expected: equals [3, 2, 1] unordered "
          "Actual: [1, 2] "
          "Which: has too few elements (2 < 3)");
      shouldFail(d, unorderedEquals([3, 1]),
          "Expected: equals [3, 1] unordered "
          "Actual: [1, 2] "
          "Which: has no match for <3> at index 0");
    });

    ut.test('unorderedMatchess', () {
      var d = [1, 2];
      shouldPass(d, unorderedMatches([2, 1]));
      shouldPass(d, unorderedMatches([greaterThan(1), greaterThan(0)]));
      shouldFail(d, unorderedMatches([greaterThan(0)]),
          "Expected: matches [a value greater than <0>] unordered "
          "Actual: [1, 2] "
          "Which: has too many elements (2 > 1)");
      shouldFail(d, unorderedMatches([3, 2, 1]),
          "Expected: matches [<3>, <2>, <1>] unordered "
          "Actual: [1, 2] "
          "Which: has too few elements (2 < 3)");
      shouldFail(d, unorderedMatches([3, 1]),
          "Expected: matches [<3>, <1>] unordered "
          "Actual: [1, 2] "
          "Which: has no match for <3> at index 0");
      shouldFail(d, unorderedMatches([greaterThan(3), greaterThan(0)]),
          "Expected: matches [a value greater than <3>, a value greater than "
              "<0>] unordered "
          "Actual: [1, 2] "
          "Which: has no match for a value greater than <3> at index 0");
    });

    ut.test('pairwise compare', () {
      var c = [1, 2];
      var d = [1, 2, 3];
      var e = [1, 4, 9];
      shouldFail('x', pairwiseCompare(e, (e,a) => a <= e,
          "less than or equal"),
          "Expected: pairwise less than or equal [1, 4, 9] "
          "Actual: 'x' "
          "Which: is not an Iterable");
      shouldFail(c, pairwiseCompare(e, (e,a) => a <= e, "less than or equal"),
          "Expected: pairwise less than or equal [1, 4, 9] "
          "Actual: [1, 2] "
          "Which: has length 2 instead of 3");
      shouldPass(d, pairwiseCompare(e, (e,a) => a <= e, "less than or equal"));
      shouldFail(d, pairwiseCompare(e, (e,a) => a < e, "less than"),
          "Expected: pairwise less than [1, 4, 9] "
          "Actual: [1, 2, 3] "
          "Which: has <1> which is not less than <1> at index 0");
      shouldPass(d, pairwiseCompare(e, (e,a) => a * a == e, "square root of"));
      shouldFail(d, pairwiseCompare(e, (e,a) => a + a == e, "double"),
          "Expected: pairwise double [1, 4, 9] "
          "Actual: [1, 2, 3] "
          "Which: has <1> which is not double <1> at index 0");
    });
  });

  ut.group('Map Matchers', () {

    ut.test('isEmpty', () {
      var a = new Map();
      shouldPass({}, isEmpty);
      shouldPass(a, isEmpty);
      a['foo'] = 'bar';
      shouldFail(a, isEmpty, "Expected: empty "
          "Actual: {'foo': 'bar'}");
    });

    ut.test('equals', () {
      var a = new Map();
      a['foo'] = 'bar';
      var b = new Map();
      b['foo'] = 'bar';
      var c = new Map();
      c['bar'] = 'foo';
      shouldPass(a, equals(b));
      shouldFail(b, equals(c),
          "Expected: {'bar': 'foo'} "
          "Actual: {'foo': 'bar'} "
          "Which: is missing map key 'bar'");
    });

    ut.test('equals with different lengths', () {
      var a = new LinkedHashMap();
      a['foo'] = 'bar';
      var b = new LinkedHashMap();
      b['foo'] = 'bar';
      b['bar'] = 'foo';
      var c = new LinkedHashMap();
      c['bar'] = 'foo';
      c['barrista'] = 'caffeine';
      shouldFail(a, equals(b),
          "Expected: {'foo': 'bar', 'bar': 'foo'} "
          "Actual: {'foo': 'bar'} "
          "Which: has different length and is missing map key 'bar'");
      shouldFail(b, equals(a),
          "Expected: {'foo': 'bar'} "
          "Actual: {'foo': 'bar', 'bar': 'foo'} "
          "Which: has different length and has extra map key 'bar'");
      shouldFail(b, equals(c),
          "Expected: {'bar': 'foo', 'barrista': 'caffeine'} "
          "Actual: {'foo': 'bar', 'bar': 'foo'} "
          "Which: is missing map key 'barrista'");
      shouldFail(c, equals(b),
          "Expected: {'foo': 'bar', 'bar': 'foo'} "
          "Actual: {'bar': 'foo', 'barrista': 'caffeine'} "
          "Which: is missing map key 'foo'");
      shouldFail(a, equals(c),
          "Expected: {'bar': 'foo', 'barrista': 'caffeine'} "
          "Actual: {'foo': 'bar'} "
          "Which: has different length and is missing map key 'bar'");
      shouldFail(c, equals(a),
          "Expected: {'foo': 'bar'} "
          "Actual: {'bar': 'foo', 'barrista': 'caffeine'} "
          "Which: has different length and is missing map key 'foo'");
    });

    ut.test('equals with matcher value', () {
      var a = new Map();
      a['foo'] = 'bar';
      shouldPass(a, equals({'foo': startsWith('ba')}));
      shouldFail(a, equals({'foo': endsWith('ba')}),
          "Expected: {'foo': <a string ending with 'ba'>} "
          "Actual: {'foo': 'bar'} "
          "Which: does not match a string ending with 'ba' "
              "at location ['foo']");
    });

    ut.test('contains', () {
      var a = new Map();
      a['foo'] = 'bar';
      var b = new Map();
      shouldPass(a, contains('foo'));
      shouldFail(b, contains('foo'),
          "Expected: contains 'foo' Actual: {}");
      shouldFail(10, contains('foo'),
          "Expected: contains 'foo' Actual: <10> "
          "Which: is not a string, map or iterable");
    });

    ut.test('containsValue', () {
      var a = new Map();
      a['foo'] = 'bar';
      shouldPass(a, containsValue('bar'));
      shouldFail(a, containsValue('ba'),
          "Expected: contains value 'ba' "
          "Actual: {'foo': 'bar'}");
    });

    ut.test('containsPair', () {
      var a = new Map();
      a['foo'] = 'bar';
      shouldPass(a, containsPair('foo', 'bar'));
      shouldFail(a, containsPair('foo', 'ba'),
          "Expected: contains pair 'foo' => 'ba' "
          "Actual: {'foo': 'bar'} "
          "Which: is different. Both strings start the same, but "
          "the given value also has the following trailing characters: r");
      shouldFail(a, containsPair('fo', 'bar'),
          "Expected: contains pair 'fo' => 'bar' "
          "Actual: {'foo': 'bar'} "
          "Which: doesn't contain key 'fo'");
    });

    ut.test('hasLength', () {
      var a = new Map();
      a['foo'] = 'bar';
      var b = new Map();
      shouldPass(a, hasLength(1));
      shouldFail(b, hasLength(1),
          "Expected: an object with length of <1> "
          "Actual: {} "
          "Which: has length of <0>");
    });
  });

  ut.group('Operator Matchers', () {

    ut.test('anyOf', () {
      shouldFail(0, anyOf([equals(1), equals(2)]),
          "Expected: (<1> or <2>) Actual: <0>");
      shouldPass(1, anyOf([equals(1), equals(2)]));
    });

    ut.test('allOf', () {
      shouldPass(1, allOf([lessThan(10), greaterThan(0)]));
      shouldFail(-1, allOf([lessThan(10), greaterThan(0)]),
          "Expected: (a value less than <10> and a value greater than <0>) "
          "Actual: <-1> "
          "Which: is not a value greater than <0>");
    });
  });

  ut.group('Future Matchers', () {

    ut.test('completes - unexpected error', () {
      var completer = new Completer();
      completer.completeError('X');
      shouldFail(completer.future, completes,
          contains('Expected future to complete successfully, '
                   'but it failed with X'),
          isAsync: true);
    });

    ut.test('completes - successfully', () {
      var completer = new Completer();
      completer.complete('1');
      shouldPass(completer.future, completes, isAsync: true);
    });

    ut.test('throws - unexpected to see normal completion', () {
      var completer = new Completer();
      completer.complete('1');
      shouldFail(completer.future, throws,
        contains("Expected future to fail, but succeeded with '1'"),
        isAsync: true);
    });

    ut.test('throws - expected to see exception', () {
      var completer = new Completer();
      completer.completeError('X');
      shouldPass(completer.future, throws, isAsync: true);
    });

    ut.test('throws - expected to see exception thrown later on', () {
      var completer = new Completer();
      var chained = completer.future.then((_) { throw 'X'; });
      shouldPass(chained, throws, isAsync: true);
      completer.complete('1');
    });

    ut.test('throwsA - unexpected normal completion', () {
      var completer = new Completer();
      completer.complete('1');
      shouldFail(completer.future, throwsA(equals('X')),
        contains("Expected future to fail, but succeeded with '1'"),
        isAsync: true);
    });

    ut.test('throwsA - correct error', () {
      var completer = new Completer();
      completer.completeError('X');
      shouldPass(completer.future, throwsA(equals('X')), isAsync: true);
    });

    ut.test('throwsA - wrong error', () {
      var completer = new Completer();
      completer.completeError('X');
      shouldFail(completer.future, throwsA(equals('Y')),
          "Expected: 'Y' Actual: 'X' "
          "Which: is different. "
          "Expected: Y Actual: X ^ Differ at offset 0",
          isAsync: true);
    });
  });

  ut.group('Predicate Matchers', () {
    ut.test('isInstanceOf', () {
      shouldFail(0, predicate((x) => x is String, "an instance of String"),
          "Expected: an instance of String Actual: <0>");
      shouldPass('cow', predicate((x) => x is String, "an instance of String"));
    });
  });

  ut.group('exception/error matchers', () {
    // TODO(gram): extend this to more types; for now this is just
    // the types being added in this CL.

    // TODO: enable this test when it works.
    // See issue 12052.
    ut.skip_test('throwsCyclicInitializationError', () {
      expect(() => new Bicycle(), throwsCyclicInitializationError);
    });

    ut.test('throwsAbstractClassInstantiationError', () {
      expect(() => new Abstraction(), throwsAbstractClassInstantiationError);
    });

    ut.test('throwsConcurrentModificationError', () {
      expect(() {
        var a = { 'foo': 'bar' };
        for (var k in a.keys) {
          a.remove(k);
        }
      }, throwsConcurrentModificationError);
      });

    ut.test('throwsNullThrownError', () {
      expect(() => throw null, throwsNullThrownError);
    });

    ut.test('throwsFallThroughError', () {
      expect(() {
        var a = 0;
        switch (a) {
          case 0:
            a += 1;
          case 1:
            return;
        }
      }, throwsFallThroughError);
    });
  });
}

class Bicycle {
  static var foo = bar();

  static bar() {
    return foo + 1;
  }

  X() {
    print(foo);
  }
}

abstract class Abstraction {
  void norealization();
}

