// Copyright (c) 2015, 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:test/test.dart'; import 'package:test_api/hooks_testing.dart'; import '../utils_new.dart'; void main() { group('[doesNotComplete]', () { test('fails when provided a non future', () async { var monitor = await TestCaseMonitor.run(() { expect(10, doesNotComplete); }); expectTestFailed(monitor, contains('10 is not a Future')); }); test('succeeds when a future does not complete', () { var completer = Completer(); expect(completer.future, doesNotComplete); }); test('fails when a future does complete', () async { var monitor = await TestCaseMonitor.run(() { var completer = Completer(); completer.complete(null); expect(completer.future, doesNotComplete); }); expectTestFailed( monitor, 'Future was not expected to complete but completed with a value of' ' null', ); }); test('fails when a future completes after the expect', () async { var monitor = await TestCaseMonitor.run(() { var completer = Completer(); expect(completer.future, doesNotComplete); completer.complete(null); }); expectTestFailed( monitor, 'Future was not expected to complete but completed with a value of' ' null', ); }); test('fails when a future eventually completes', () async { var monitor = await TestCaseMonitor.run(() { var completer = Completer(); expect(completer.future, doesNotComplete); Future(() async { await pumpEventQueue(times: 10); }).then(completer.complete); }); expectTestFailed( monitor, 'Future was not expected to complete but completed with a value of' ' null', ); }); }); group('[completes]', () { test('blocks the test until the Future completes', () async { final completer = Completer(); final monitor = TestCaseMonitor.start(() { expect(completer.future, completes); }); await pumpEventQueue(); expect(monitor.state, State.running); completer.complete(); await monitor.onDone; expectTestPassed(monitor); }); test('with an error', () async { var monitor = await TestCaseMonitor.run(() { expect(Future.error('X'), completes); }); expect(monitor.state, equals(State.failed)); expect(monitor.errors, [isAsyncError(equals('X'))]); }); test('with a failure', () async { var monitor = await TestCaseMonitor.run(() { expect(Future.error(TestFailure('oh no')), completes); }); expectTestFailed(monitor, 'oh no'); }); test('with a non-future', () async { var monitor = await TestCaseMonitor.run(() { expect(10, completes); }); expectTestFailed( monitor, 'Expected: completes successfully\n' ' Actual: <10>\n' ' Which: was not a Future\n', ); }); test('with a successful future', () { expect(Future.value('1'), completes); }); }); group('[completion]', () { test('blocks the test until the Future completes', () async { final completer = Completer(); final monitor = TestCaseMonitor.start(() { expect(completer.future, completion(isNull)); }); await pumpEventQueue(); expect(monitor.state, State.running); completer.complete(null); await monitor.onDone; expectTestPassed(monitor); }); test('with an error', () async { var monitor = await TestCaseMonitor.run(() { expect(Future.error('X'), completion(isNull)); }); expect(monitor.state, equals(State.failed)); expect(monitor.errors, [isAsyncError(equals('X'))]); }); test('with a failure', () async { var monitor = await TestCaseMonitor.run(() { expect(Future.error(TestFailure('oh no')), completion(isNull)); }); expectTestFailed(monitor, 'oh no'); }); test('with a non-future', () async { var monitor = await TestCaseMonitor.run(() { expect(10, completion(equals(10))); }); expectTestFailed( monitor, 'Expected: completes to a value that <10>\n' ' Actual: <10>\n' ' Which: was not a Future\n', ); }); test('with an incorrect value', () async { var monitor = await TestCaseMonitor.run(() { expect(Future.value('a'), completion(equals('b'))); }); expectTestFailed( monitor, allOf([ startsWith( "Expected: completes to a value that 'b'\n" ' Actual: <', ), endsWith( '>\n' " Which: emitted 'a'\n" ' which is different.\n' ' Expected: b\n' ' Actual: a\n' ' ^\n' ' Differ at offset 0\n', ), ]), ); }); test("blocks expectLater's Future", () async { var completer = Completer(); var fired = false; unawaited( expectLater(completer.future, completion(equals(1))).then((_) { fired = true; }), ); await pumpEventQueue(); expect(fired, isFalse); completer.complete(1); await pumpEventQueue(); expect(fired, isTrue); }); }); }