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

import 'dart:async';

import 'package:scheduled_test/scheduled_test.dart';

import 'metatest.dart';
import 'utils.dart';

void main() {
  setUpTimeout();

  expectTestsPass("expect(..., completes) with a completing future should pass",
      () {
    test('test', () {
      expect(pumpEventQueue(), completes);
    });
  });

  expectTestsPass("expect(..., completes) with a failing future should signal "
      "an out-of-band error", () {
    var errors;
    test('test 1', () {
      currentSchedule.onException.schedule(() {
        errors = currentSchedule.errors;
      });

      expect(pumpEventQueue().then((_) {
        throw 'error';
      }), completes);
    });

    test('test 2', () {
      expect(errors, everyElement(new isInstanceOf<ScheduleError>()));
      expect(errors.map((e) => e.error), equals(['error']));
    });
  }, passing: ['test 2']);

  expectTestsPass("expect(..., completion(...)) with a matching future should "
      "pass", () {
    test('test', () {
      expect(pumpEventQueue().then((_) => 'foo'), completion(equals('foo')));
    });
  });

  expectTestsPass("expect(..., completion(...)) with a non-matching future "
      "should signal an out-of-band error", () {
    var errors;
    test('test 1', () {
      currentSchedule.onException.schedule(() {
        errors = currentSchedule.errors;
      });

      expect(pumpEventQueue().then((_) => 'foo'), completion(equals('bar')));
    });

    test('test 2', () {
      expect(errors, everyElement(new isInstanceOf<ScheduleError>()));
      expect(errors.length, equals(1));
      expect(errors.first.error, new isInstanceOf<TestFailure>());
    });
  }, passing: ['test 2']);

  expectTestsPass("expect(..., completion(...)) with a failing future should "
      "signal an out-of-band error", () {
    var errors;
    test('test 1', () {
      currentSchedule.onException.schedule(() {
        errors = currentSchedule.errors;
      });

      expect(pumpEventQueue().then((_) {
        throw 'error';
      }), completion(equals('bar')));
    });

    test('test 2', () {
      expect(errors, everyElement(new isInstanceOf<ScheduleError>()));
      expect(errors.map((e) => e.error), equals(['error']));
    });
  }, passing: ['test 2']);
}
