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

library mock_test;
import 'package:unittest/unittest.dart';
import 'package:unittest/mock.dart';

class MockList extends Mock implements List {
  dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}

class Foo {
  sum(a, b, c) => a + b + c;
}

class FooSpy extends Mock implements Foo {
  Foo real;
  FooSpy() {
    real = new Foo();
    this.when(callsTo('sum')).alwaysCall(real.sum);
  }

  dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}

makeTestLogEntry(String methodName, List args, int time,
                 [String mockName]) {
  LogEntry e = new LogEntry(mockName, methodName, args, Action.IGNORE);
  e.time = new DateTime.fromMillisecondsSinceEpoch(time, isUtc: true);
  return e;
}

makeTestLog() {
  LogEntryList logList = new LogEntryList('test');
  List args = new List();
  logList.add(makeTestLogEntry('a', args, 1000));
  logList.add(makeTestLogEntry('b', args, 2000));
  logList.add(makeTestLogEntry('c', args, 3000));
  return logList;
}

main() {
  test('Mocking: Basics', () {
    var m = new Mock();
    print(m.length);
    m.getLogs(callsTo('get length')).verify(happenedOnce);

    m.when(callsTo('foo', 1, 2)).thenReturn('A').thenReturn('B');
    m.when(callsTo('foo', 1, 1)).thenReturn('C');
    m.when(callsTo('foo', 9, anything)).thenReturn('D');
    m.when(callsTo('bar', anything, anything)).thenReturn('E');
    m.when(callsTo('foobar')).thenReturn('F');

    var s = '${m.foo(1,2)}${m.foo(1,1)}${m.foo(9,10)}'
        '${m.bar(1,1)}${m.foo(1,2)}';
    m.getLogs(callsTo('foo', anything, anything)).
        verify(happenedExactly(4));
    m.getLogs(callsTo('foo', 1, anything)).verify(happenedExactly(3));
    m.getLogs(callsTo('foo', 9, anything)).verify(happenedOnce);
    m.getLogs(callsTo('foo', anything, 2)).verify(happenedExactly(2));
    m.getLogs(callsTo('foobar')).verify(neverHappened);
    m.getLogs(callsTo('foo', 10, anything)).verify(neverHappened);
    m.getLogs(callsTo('foo'), returning(anyOf('A', 'C'))).
        verify(happenedExactly(2));
    expect(s, 'ACDEB');
  });

  test('Mocking: getters/setters', () {
    var m = new Mock();
    var x = 0;
    m.when(callsTo('get foo')).alwaysReturn(3);
    m.when(callsTo('set foo')).alwaysCall((v) { x = v; });
    m.when(callsTo('get bar')).alwaysReturn(5);
    m.when(callsTo('set bar')).alwaysCall((v) { x = 2 * v; });
    expect(m.foo, 3);
    expect(m.bar, 5);
    m.foo = 10;
    expect(x, 10);
    m.bar = 8;
    expect(x, 16);
  });

  test('Mocking: Mock List', () {
    var l = new MockList();
    l.when(callsTo('get length')).thenReturn(1);
    l.when(callsTo('add', anything)).alwaysReturn(0);
    l.add('foo');
    expect(l.length, 1);

    var m = new MockList();
    m.when(callsTo('add', anything)).alwaysReturn(0);

    m.add('foo');
    m.add('bar');

    m.getLogs(callsTo('add')).verify(happenedExactly(2));
    m.getLogs(callsTo('add', 'foo')).verify(happenedOnce);
  });

  test('Mocking: Spy', () {
    var p = new FooSpy();
    p.sum(1, 2, 3);
    p.getLogs(callsTo('sum')).verify(happenedOnce);
    p.sum(2, 2, 2);
    p.getLogs(callsTo('sum')).verify(happenedExactly(2));
    p.getLogs(callsTo('sum')).verify(sometimeReturned(6));
    p.getLogs(callsTo('sum')).verify(alwaysReturned(6));
    p.getLogs(callsTo('sum')).verify(neverReturned(5));
    p.sum(2, 2, 1);
    p.getLogs(callsTo('sum')).verify(sometimeReturned(5));
  });

  test('Mocking: Excess Calls', () {
    var m = new Mock();
    m.when(callsTo('foo')).alwaysReturn(null);
    expect(() { m.foo(); }, returnsNormally);
    expect(() { m.foo(); }, returnsNormally);
    expect(
        () {
          m.getLogs(callsTo('foo')).verify(happenedOnce);
        },
      throwsA(
        (e) =>
          collapseWhitespace(e.toString()) ==
            "Expected foo() to be called 1 times but:"
                   " was called 2 times.")
    );
  });

  test('Mocking: No action', () {
    var m = new Mock();
    m.when(callsTo('foo')).thenReturn(null);
    expect(() => m.foo(), returnsNormally);
    expect(() => m.foo(), throwsA((e) =>
        e.toString() == 'Exception: No more actions for method foo.'));
  });

  test('Mocking: No matching return', () {
    var p = new FooSpy();
    p.sum(1, 2, 3);
    expect(() => p.getLogs(callsTo('sum')).verify(sometimeReturned(0)),
      throwsA((e) => collapseWhitespace(e.toString()) ==
          "Expected sum() to sometimes return <0> but: never did.")
    );
  });

  test('Mocking: No behavior', () {
    var m = new Mock.custom(throwIfNoBehavior:true);
    m.when(callsTo('foo')).thenReturn(null);
    expect(() => m.foo(), returnsNormally);
    expect(() => m.bar(), throwsA((e) => e.toString() ==
        'Exception: No behavior specified for method bar.'));
  });

  test('Mocking: Shared logList', () {
    var logList = new LogEntryList();
    var m1 = new Mock.custom(name:'m1', log:logList);
    var m2 = new Mock.custom(name:'m2', log:logList);
    m1.foo();
    m2.foo();
    m1.bar();
    m2.bar();
    expect(logList.logs.length, 4);
    logList.getMatches(anything, callsTo('foo')).verify(happenedExactly(2));
    logList.getMatches('m1', callsTo('foo')).verify(happenedOnce);
    logList.getMatches('m1', callsTo('bar')).verify(happenedOnce);
    m2.getLogs(callsTo('foo')).verify(happenedOnce);
    m2.getLogs(callsTo('bar')).verify(happenedOnce);
  });

  test('Mocking: Null CallMatcher', () {
    var m = new Mock();
    m.when(callsTo(null, 1)).alwaysReturn(2);
    m.when(callsTo(null, 2)).alwaysReturn(4);
    expect(m.foo(1), 2);
    expect(m.foo(2), 4);
    expect(m.bar(1), 2);
    expect(m.bar(2), 4);
    m.getLogs(callsTo()).verify(happenedExactly(4));
    m.getLogs(callsTo(null, 1)).verify(happenedExactly(2));
    m.getLogs(callsTo(null, 2)).verify(happenedExactly(2));
    m.getLogs(null, returning(1)).verify(neverHappened);
    m.getLogs(null, returning(2)).verify(happenedExactly(2));
    m.getLogs(null, returning(4)).verify(happenedExactly(2));
  });

  test('Mocking: RegExp CallMatcher good', () {
    var m = new Mock();
    m.when(callsTo(matches('^[A-Z]'))).
           alwaysThrow('Method names must start with lower case.');
    m.test();
  });

  test('Mocking: No logging', () {
    var m = new Mock.custom(enableLogging: false);
    m.Test();
    expect(() => m.getLogs(callsTo('Test')), throwsA((e) => e.toString() ==
        "Exception: Can't retrieve logs when logging was never enabled."));
  });

  test('Mocking: Find logList entry', () {
    LogEntryList logList = makeTestLog();
    // Basic behavior, with call matcher.
    expect(logList.findLogEntry(callsTo('a')), 0);
    expect(logList.findLogEntry(callsTo('b')), 1);
    expect(logList.findLogEntry(callsTo('c')), 2);
    expect(logList.findLogEntry(callsTo('d')), -1);
    // Find using predicate.
    expect(logList.findLogEntry((le) => le.methodName == 'a'), 0);
    expect(logList.findLogEntry((le) => le.methodName == 'b'), 1);
    expect(logList.findLogEntry((le) => le.methodName == 'c'), 2);
    // Test explicit return value.
    expect(logList.findLogEntry((le) => le.methodName == 'd', 0, 3), 3);
    // Find from start of logList.
    expect(logList.findLogEntry(callsTo('a'), 0), 0);
    expect(logList.findLogEntry(callsTo('b'), 0), 1);
    expect(logList.findLogEntry(callsTo('c'), 0), 2);
    // Find from second entry in logList.
    expect(logList.findLogEntry(callsTo('a'), 1), -1);
    expect(logList.findLogEntry(callsTo('b'), 1), 1);
    expect(logList.findLogEntry(callsTo('c'), 1), 2);
    // Find from last entry in logList.
    expect(logList.findLogEntry(callsTo('a'), 2), -1);
    expect(logList.findLogEntry(callsTo('b'), 2), -1);
    expect(logList.findLogEntry(callsTo('c'), 2), 2);
    // Find from start position passed end of logList.
    expect(logList.findLogEntry(callsTo('a'), 3), -1);
    expect(logList.findLogEntry(callsTo('b'), 3), -1);
    expect(logList.findLogEntry(callsTo('c'), 3), -1);
    // No restriction on entry.
    expect(logList.findLogEntry(null, 0), 0);
    expect(logList.findLogEntry(null, 1), 1);
    expect(logList.findLogEntry(null, 2), 2);
    expect(logList.findLogEntry(null, 3), -1);
  });

  test('Mocking: from,after,before,until', () {
    LogEntryList logList = makeTestLog();
    LogEntryList log2;
    DateTime t0 = new DateTime.fromMillisecondsSinceEpoch(0, isUtc: true);
    DateTime t1000 = new DateTime.fromMillisecondsSinceEpoch(1000, isUtc: true);
    DateTime t2000 = new DateTime.fromMillisecondsSinceEpoch(2000, isUtc: true);
    DateTime t3000 = new DateTime.fromMillisecondsSinceEpoch(3000, isUtc: true);
    DateTime t4000 = new DateTime.fromMillisecondsSinceEpoch(4000, isUtc: true);

    log2 = logList.before(t0);
    expect(log2.logs, hasLength(0));
    expect(log2.filter, 'test before 1970-01-01 00:00:00.000Z');
    log2 = logList.until(t0);
    expect(log2.logs, hasLength(0));
    expect(log2.filter, 'test until 1970-01-01 00:00:00.000Z');
    log2 = logList.from(t0);
    expect(log2.logs, hasLength(3));
    expect(log2.first.methodName, 'a');
    expect(log2.last.methodName, 'c');
    expect(log2.filter, 'test from 1970-01-01 00:00:00.000Z');
    log2 = logList.after(t0);
    expect(log2.logs, hasLength(3));
    expect(log2.first.methodName, 'a');
    expect(log2.last.methodName, 'c');
    expect(log2.filter, 'test after 1970-01-01 00:00:00.000Z');

    log2 = logList.before(t1000);
    expect(log2.logs, hasLength(0));
    log2 = logList.until(t1000);
    expect(log2.logs, hasLength(1));
    expect(log2.first.methodName, 'a');
    expect(log2.last.methodName, 'a');
    log2 = logList.from(t1000);
    expect(log2.logs, hasLength(3));
    expect(log2.first.methodName, 'a');
    expect(log2.last.methodName, 'c');
    log2 = logList.after(t1000);
    expect(log2.logs, hasLength(2));
    expect(log2.first.methodName, 'b');
    expect(log2.last.methodName, 'c');

    log2 = logList.before(t2000);
    expect(log2.logs, hasLength(1));
    expect(log2.first.methodName, 'a');
    expect(log2.last.methodName, 'a');
    log2 = logList.until(t2000);
    expect(log2.logs, hasLength(2));
    expect(log2.first.methodName, 'a');
    expect(log2.last.methodName, 'b');
    log2 = logList.from(t2000);
    expect(log2.logs, hasLength(2));
    expect(log2.first.methodName, 'b');
    expect(log2.last.methodName, 'c');
    log2 = logList.after(t2000);
    expect(log2.logs, hasLength(1));
    expect(log2.first.methodName, 'c');
    expect(log2.last.methodName, 'c');

    log2 = logList.before(t3000);
    expect(log2.logs, hasLength(2));
    expect(log2.first.methodName, 'a');
    expect(log2.last.methodName, 'b');
    log2 = logList.until(t3000);
    expect(log2.logs, hasLength(3));
    expect(log2.first.methodName, 'a');
    expect(log2.last.methodName, 'c');

    log2 = logList.from(t3000);
    expect(log2.logs, hasLength(1));
    expect(log2.first.methodName, 'c');
    expect(log2.last.methodName, 'c');
    log2 = logList.after(t3000);
    expect(log2.logs, hasLength(0));

    log2 = logList.before(t4000);
    expect(log2.logs, hasLength(3));
    expect(log2.first.methodName, 'a');
    expect(log2.last.methodName, 'c');
    log2 = logList.until(t4000);
    expect(log2.logs, hasLength(3));
    expect(log2.first.methodName, 'a');
    expect(log2.last.methodName, 'c');
    log2 = logList.from(t4000);
    expect(log2.logs, hasLength(0));
    log2 = logList.after(t4000);
    expect(log2.logs, hasLength(0));
  });

  test('Mocking: inplace from,after,before,until', () {
    DateTime t0 = new DateTime.fromMillisecondsSinceEpoch(0, isUtc: true);
    DateTime t1000 = new DateTime.fromMillisecondsSinceEpoch(1000, isUtc: true);
    DateTime t2000 = new DateTime.fromMillisecondsSinceEpoch(2000, isUtc: true);
    DateTime t3000 = new DateTime.fromMillisecondsSinceEpoch(3000, isUtc: true);
    DateTime t4000 = new DateTime.fromMillisecondsSinceEpoch(4000, isUtc: true);

    LogEntryList logList = makeTestLog().before(t0, true);
    expect(logList.logs, hasLength(0));
    expect(logList.filter, 'test before 1970-01-01 00:00:00.000Z');
    logList = makeTestLog().until(t0, true);
    expect(logList.logs, hasLength(0));
    expect(logList.filter, 'test until 1970-01-01 00:00:00.000Z');
    logList = makeTestLog().from(t0, true);
    expect(logList.logs, hasLength(3));
    expect(logList.first.methodName, 'a');
    expect(logList.last.methodName, 'c');
    expect(logList.filter, 'test from 1970-01-01 00:00:00.000Z');
    logList = makeTestLog().after(t0, true);
    expect(logList.logs, hasLength(3));
    expect(logList.first.methodName, 'a');
    expect(logList.last.methodName, 'c');
    expect(logList.filter, 'test after 1970-01-01 00:00:00.000Z');

    logList = makeTestLog().before(t1000, true);
    expect(logList.logs, hasLength(0));
    logList = makeTestLog().until(t1000, true);
    expect(logList.logs, hasLength(1));
    expect(logList.first.methodName, 'a');
    expect(logList.last.methodName, 'a');
    logList = makeTestLog().from(t1000, true);
    expect(logList.logs, hasLength(3));
    expect(logList.first.methodName, 'a');
    expect(logList.last.methodName, 'c');
    logList = makeTestLog().after(t1000, true);
    expect(logList.logs, hasLength(2));
    expect(logList.first.methodName, 'b');
    expect(logList.last.methodName, 'c');

    logList = makeTestLog().before(t2000, true);
    expect(logList.logs, hasLength(1));
    expect(logList.first.methodName, 'a');
    expect(logList.last.methodName, 'a');
    logList = makeTestLog().until(t2000, true);
    expect(logList.logs, hasLength(2));
    expect(logList.first.methodName, 'a');
    expect(logList.last.methodName, 'b');
    logList = makeTestLog().from(t2000, true);
    expect(logList.logs, hasLength(2));
    expect(logList.first.methodName, 'b');
    expect(logList.last.methodName, 'c');
    logList = makeTestLog().after(t2000, true);
    expect(logList.logs, hasLength(1));
    expect(logList.first.methodName, 'c');
    expect(logList.last.methodName, 'c');

    logList = makeTestLog().before(t3000, true);
    expect(logList.logs, hasLength(2));
    expect(logList.first.methodName, 'a');
    expect(logList.last.methodName, 'b');
    logList = makeTestLog().until(t3000, true);
    expect(logList.logs, hasLength(3));
    expect(logList.first.methodName, 'a');
    expect(logList.last.methodName, 'c');
    logList = makeTestLog().from(t3000, true);
    expect(logList.logs, hasLength(1));
    expect(logList.first.methodName, 'c');
    expect(logList.last.methodName, 'c');
    logList = makeTestLog().after(t3000);
    expect(logList.logs, hasLength(0));

    logList = makeTestLog().before(t4000, true);
    expect(logList.logs, hasLength(3));
    expect(logList.first.methodName, 'a');
    expect(logList.last.methodName, 'c');
    logList = makeTestLog().until(t4000, true);
    expect(logList.logs, hasLength(3));
    expect(logList.first.methodName, 'a');
    expect(logList.last.methodName, 'c');
    logList = makeTestLog().from(t4000, true);
    expect(logList.logs, hasLength(0));
    logList = makeTestLog().after(t4000, true);
    expect(logList.logs, hasLength(0));
  });

  test('Mocking: Neighbors', () {
    LogEntryList logList = new LogEntryList('test');
    List args0 = new List();
    List args1 = new List();
    args1.add('test');
    LogEntry e0 = makeTestLogEntry('foo', args0, 1000);
    logList.add(e0);
    LogEntry e1 = makeTestLogEntry('bar1', args0, 2000, 'a');
    logList.add(e1);
    LogEntry e2 = makeTestLogEntry('bar1', args1, 3000, 'b');
    logList.add(e2);
    LogEntry e3 = makeTestLogEntry('foo', args0, 4000);
    logList.add(e3);
    LogEntry e4 = makeTestLogEntry('hello', args0, 4500);
    logList.add(e4);
    LogEntry e5 = makeTestLogEntry('bar2', args0, 5000, 'a');
    logList.add(e5);
    LogEntry e6 = makeTestLogEntry('bar2', args1, 6000, 'b');
    logList.add(e6);
    LogEntry e7 = makeTestLogEntry('foo', args0, 7000);
    logList.add(e7);
    LogEntry e8 = makeTestLogEntry('bar3', args0, 8000, 'a');
    logList.add(e8);
    LogEntry e9 = makeTestLogEntry('bar3', args1, 9000, 'b');
    logList.add(e9);
    LogEntry e10 = makeTestLogEntry('foo', args0, 10000);
    logList.add(e10);

    LogEntryList keyList = new LogEntryList('keys');

    // Test with empty key list.

    LogEntryList result;
    result = logList.preceding(keyList);
    expect(result.logs, hasLength(0));

    result = logList.preceding(keyList, includeKeys:true);
    expect(result.logs, hasLength(0));

    // Single key, distance 1, no restrictions.

    keyList.add(e3);
    result = logList.preceding(keyList);
    expect(result.logs, orderedEquals([e2]));

    result = logList.following(keyList);
    expect(result.logs, orderedEquals([e4]));

    // Single key, distance 2, no restrictions.

    result = logList.preceding(keyList, distance:2);
    expect(result.logs, orderedEquals([e1, e2]));

    result = logList.following(keyList, distance:2);
    expect(result.logs, orderedEquals([e4, e5]));

    // Single key, distance 3, no restrictions.

    result = logList.preceding(keyList, distance:3);
    expect(result.logs, orderedEquals([e0, e1, e2]));

    result = logList.following(keyList, distance:3);
    expect(result.logs, orderedEquals([e4, e5, e6]));

    // Include keys in result

    result = logList.preceding(keyList, distance:3, includeKeys:true);
    expect(result.logs, orderedEquals([e0, e1, e2, e3]));

    result = logList.following(keyList, distance:3, includeKeys:true);
    expect(result.logs, orderedEquals([e3, e4, e5, e6]));

    // Restrict the matches

    result = logList.preceding(keyList, logFilter:callsTo(startsWith('bar')),
      distance:3);
    expect(result.logs, orderedEquals([e1, e2]));

    result = logList.preceding(keyList, logFilter:callsTo(startsWith('bar')),
        distance:3, includeKeys:true);
    expect(result.logs, orderedEquals([e1, e2, e3]));

    result = logList.preceding(keyList, mockNameFilter: equals('a'),
        logFilter: callsTo(startsWith('bar')), distance:3);
    expect(result.logs, orderedEquals([e1]));

    result = logList.preceding(keyList, mockNameFilter: equals('a'),
        logFilter: callsTo(startsWith('bar')), distance:3, includeKeys:true);
    expect(result.logs, orderedEquals([e1, e3]));

    keyList.logs.clear();
    keyList.add(e0);
    keyList.add(e3);
    keyList.add(e7);

    result = logList.preceding(keyList);
    expect(result.logs, orderedEquals([e2, e6]));

    result = logList.following(keyList);
    expect(result.logs, orderedEquals([e1, e4, e8]));

    result = logList.preceding(keyList, includeKeys:true);
    expect(result.logs, orderedEquals([e0, e2, e3, e6, e7]));

    result = logList.following(keyList, includeKeys:true);
    expect(result.logs, orderedEquals([e0, e1, e3, e4, e7, e8]));

    keyList.logs.clear();
    keyList.add(e3);
    keyList.add(e7);
    keyList.add(e10);

    result = logList.preceding(keyList);
    expect(result.logs, orderedEquals([e2, e6, e9]));

    result = logList.following(keyList);
    expect(result.logs, orderedEquals([e4, e8]));

    result = logList.preceding(keyList, includeKeys:true);
    expect(result.logs, orderedEquals([e2, e3, e6, e7, e9, e10]));

    result = logList.following(keyList, includeKeys:true);
    expect(result.logs, orderedEquals([e3, e4, e7, e8, e10]));

    keyList.logs.clear();
    keyList.add(e0);
    keyList.add(e3);
    keyList.add(e7);
    keyList.add(e10);

    result = logList.preceding(keyList);
    expect(result.logs, orderedEquals([e2, e6, e9]));

    result = logList.following(keyList);
    expect(result.logs, orderedEquals([e1, e4, e8]));

    result = logList.preceding(keyList, includeKeys:true);
    expect(result.logs, orderedEquals([e0, e2, e3, e6, e7, e9, e10]));

    result = logList.following(keyList, includeKeys:true);
    expect(result.logs, orderedEquals([e0, e1, e3, e4, e7, e8, e10]));

    keyList.logs.clear();
    keyList.add(e0);
    keyList.add(e3);
    keyList.add(e7);

    result = logList.preceding(keyList, distance:3);
    expect(result.logs, orderedEquals([e1, e2, e4, e5, e6]));

    result = logList.following(keyList, distance:3);
    expect(result.logs, orderedEquals([e1, e2, e4, e5, e6, e8, e9, e10]));

    result = logList.preceding(keyList, distance:3, includeKeys:true);
    expect(result.logs, orderedEquals([e0, e1, e2, e3, e4, e5, e6, e7]));

    result = logList.following(keyList, distance:3, includeKeys:true);
    expect(result.logs, orderedEquals([e0, e1, e2, e3, e4, e5, e6,
                                       e7, e8, e9, e10]));

    keyList.logs.clear();
    keyList.add(e3);
    keyList.add(e7);
    keyList.add(e10);

    result = logList.preceding(keyList, distance:3);
    expect(result.logs, orderedEquals([e0, e1, e2, e4, e5, e6, e8, e9]));

    result = logList.following(keyList, distance:3);
    expect(result.logs, orderedEquals([e4, e5, e6, e8, e9]));

    result = logList.preceding(keyList, distance:3, includeKeys:true);
    expect(result.logs, orderedEquals([e0, e1, e2, e3, e4, e5, e6,
                                       e7, e8, e9, e10]));

    result = logList.following(keyList, distance:3, includeKeys:true);
    expect(result.logs, orderedEquals([e3, e4, e5, e6, e7, e8, e9, e10]));

    keyList.logs.clear();
    keyList.add(e0);
    keyList.add(e3);
    keyList.add(e7);
    keyList.add(e10);

    result = logList.preceding(keyList, distance:3);
    expect(result.logs, orderedEquals([e1, e2, e4, e5, e6, e8, e9]));

    result = logList.following(keyList, distance:3);
    expect(result.logs, orderedEquals([e1, e2, e4, e5, e6, e8, e9]));

    result = logList.preceding(keyList, distance:3, includeKeys:true);
    expect(result.logs, orderedEquals([e0, e1, e2, e3, e4, e5, e6,
                                       e7, e8, e9, e10]));

    result = logList.following(keyList, distance:3, includeKeys:true);
    expect(result.logs, orderedEquals([e0, e1, e2, e3, e4, e5, e6,
                                       e7, e8, e9, e10]));
  });

  test('Mocking: stepwiseValidate', () {
    LogEntryList logList = new LogEntryList('test');
    for (var i = 0; i < 10; i++) {
      LogEntry e = new LogEntry(null, 'foo', [i], Action.IGNORE);
      logList.add(e);
    }
    int total = 0;
    logList.stepwiseValidate((log, pos) {
        total += log[pos].args[0] * log[pos + 1].args[0];
        expect(log[pos + 1].args[0] - log[pos].args[0], equals(1));
        return 2;
    });
    expect(total, equals((0 * 1) + (2 * 3) + (4 * 5) + (6 * 7) + (8 * 9)));
  });

  test('Mocking: clearLogs', () {
    var m = new Mock();
    m.foo();
    m.foo();
    m.foo();
    expect(m.log.logs, hasLength(3));
    m.clearLogs();
    expect(m.log.logs, hasLength(0));
    LogEntryList log = new LogEntryList();
    var m1 = new Mock.custom(name: 'm1', log: log);
    var m2 = new Mock.custom(name: 'm2', log: log);
    var m3 = new Mock.custom(name: 'm3', log: log);
    for (var i = 0; i < 3; i++) {
      m1.foo();
      m2.bar();
      m3.pow();
    }
    expect(log.logs, hasLength(9));
    m1.clearLogs();
    expect(log.logs, hasLength(6));
    m1.clearLogs();
    expect(log.logs, hasLength(6));
    expect(log.logs.every((e) => e.mockName == 'm2' || e.mockName == 'm3'),
        isTrue);
    m2.clearLogs();
    expect(log.logs, hasLength(3));
    expect(log.logs.every((e) => e.mockName =='m3'), isTrue);
    m3.clearLogs();
    expect(log.logs, hasLength(0));
  });

  test("Mocking: instances", () {
    var alice = new Object();
    var bob = new Object();
    var m = new Mock();
    m.when(callsTo("foo", alice)).alwaysReturn(true);
    m.when(callsTo("foo", bob)).alwaysReturn(false);
    expect(m.foo(alice), true);
    expect(m.foo(bob), false);
    expect(m.foo(alice), true);
    expect(m.foo(bob), false);
  });

  test("Behavior ordering", () {
    // This is distinct from value ordering, i.e.
    //
    // m.when(...).thenReturn(1).thenReturn(2)
    //
    // Here we want to test using distinct matchers being
    // applied in order, so we have a single call that
    // matches 3 different behaviors, and test that
    // the behaviors are applied in the order they are
    // defined.
    var m = new Mock();
    m.when(callsTo("foo")).thenReturn("A");
    m.when(callsTo("foo", "bar")).thenReturn("B");
    m.when(callsTo("foo", "bar", "mock")).alwaysReturn("C");
    expect(m.foo("bar", "mock"), "A");
    expect(m.foo("bar", "mock"), "B");
    expect(m.foo("bar", "mock"), "C");
    expect(m.foo("bar", "mock"), "C");
    m.resetBehavior();

    m.when(callsTo("foo")).thenReturn("A");
    m.when(callsTo("foo", "bar", "mock")).alwaysReturn("C");
    m.when(callsTo("foo", "bar")).thenReturn("B");
    expect(m.foo("bar", "mock"), "A");
    expect(m.foo("bar", "mock"), "C");
    expect(m.foo("bar", "mock"), "C");
    expect(m.foo("bar", "mock"), "C");
    m.resetBehavior();

    m.when(callsTo("foo", "bar")).thenReturn("B");
    m.when(callsTo("foo")).thenReturn("A");
    m.when(callsTo("foo", "bar", "mock")).alwaysReturn("C");
    expect(m.foo("bar", "mock"), "B");
    expect(m.foo("bar", "mock"), "A");
    expect(m.foo("bar", "mock"), "C");
    expect(m.foo("bar", "mock"), "C");
    m.resetBehavior();

    m.when(callsTo("foo", "bar")).thenReturn("B");
    m.when(callsTo("foo", "bar", "mock")).alwaysReturn("C");
    m.when(callsTo("foo")).thenReturn("A");
    expect(m.foo("bar", "mock"), "B");
    expect(m.foo("bar", "mock"), "C");
    expect(m.foo("bar", "mock"), "C");
    expect(m.foo("bar", "mock"), "C");
    m.resetBehavior();

    m.when(callsTo("foo", "bar", "mock")).alwaysReturn("C");
    m.when(callsTo("foo")).thenReturn("A");
    m.when(callsTo("foo", "bar")).thenReturn("B");
    expect(m.foo("bar", "mock"), "C");
    expect(m.foo("bar", "mock"), "C");
    expect(m.foo("bar", "mock"), "C");
    expect(m.foo("bar", "mock"), "C");
    m.resetBehavior();
  });

  solo_test('Spys', () {
    var real = new Foo();
    var spy = new Mock.spy(real);
    var sum = spy.sum(1, 2, 3);
    expect(sum, 6);
    expect(() => spy.total(1, 2, 3), throwsNoSuchMethodError);
    spy.getLogs(callsTo('sum')).verify(happenedExactly(1));
    spy.getLogs(callsTo('total')).verify(happenedExactly(1));
  });
}

