// 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:unittest/unittest.dart';

import 'test_utils.dart';

void main() {

  initUtils();

  // Core matchers

  group('Core matchers', () {

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

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

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

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

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

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

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

    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");
    });

    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'"));
    });

    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'"));
    });


    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));
    });

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

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

    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]");
    });

    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);
    });
  });

  group('Numeric Matchers', () {

    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>");
    });

    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>");
    });

    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));
    });

    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>");
    });

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

    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);
    });

    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);
    });

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

    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");
    });

    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");
    });

    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>");
    });

    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>");
    });

    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>");
    });

    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));
    });

    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>");
    });
  });

  group('String Matchers', () {

    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'");
    });

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

    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");
    });

    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'");
    });

    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'");
    });

    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'");
    });

    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'");
    });

    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'");
    });
  });

  group('Iterable Matchers', () {

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

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

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

    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));
    });

    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");
    });

    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]");
    });

    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]");
    });

    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 element <3> at index 0");
    });

    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");
    });
  });

  group('Map Matchers', () {

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

    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'");
    });

    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'");
    });

    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");
    });

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

    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'");
    });

    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>");
    });
  });

  group('Operator Matchers', () {

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

    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>");
    });
  });

  group('Future Matchers', () {

    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);
    });

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

    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);
    });

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

    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');
    });

    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);
    });

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

    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);
    });
  });

  group('Predicate Matchers', () {
    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"));
    });
  });

  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.
    skip_test('throwsCyclicInitializationError', () {
      expect(() => new Bicycle(), throwsCyclicInitializationError);
    });

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

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

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

    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();
}

