blob: 3d730cd4e0395f84ee2140d04e84d2d55a0170c3 [file] [log] [blame]
// 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.
library value_future_test;
import 'dart:async';
import 'package:scheduled_test/src/value_future.dart';
import 'package:unittest/unittest.dart';
void main() {
group('works like a normal Future for', () {
var completer;
var future;
setUp(() {
completer = new Completer();
future = new ValueFuture(completer.future);
});
test('.asStream on success', () {
expect(future.asStream().toList(), completion(equals(['success'])));
completer.complete('success');
});
test('.asStream on error', () {
expect(future.asStream().toList(), throwsA(equals('error')));
completer.completeError('error');
});
test('.then and .catchError on success', () {
expect(future.then((v) => "transformed $v")
.catchError((error) => "caught ${error}"),
completion(equals('transformed success')));
completer.complete('success');
});
test('.then and .catchError on error', () {
expect(future.then((v) => "transformed $v")
.catchError((error) => "caught ${error}"),
completion(equals('caught error')));
completer.completeError('error');
});
test('.then with onError on success', () {
expect(future.then((v) => "transformed $v",
onError: (error) => "caught ${error}"),
completion(equals('transformed success')));
completer.complete('success');
});
test('.then with onError on error', () {
expect(future.then((v) => "transformed $v",
onError: (error) => "caught ${error}"),
completion(equals('caught error')));
completer.completeError('error');
});
test('.whenComplete on success', () {
expect(future.whenComplete(() {
throw 'whenComplete';
}), throwsA(equals('whenComplete')));
completer.complete('success');
});
test('.whenComplete on error', () {
expect(future.whenComplete(() {
throw 'whenComplete';
}), throwsA(equals('whenComplete')));
completer.completeError('error');
});
});
group('before completion', () {
var future;
setUp(() {
future = new ValueFuture(new Completer().future);
});
test('.value is null', () {
expect(future.value, isNull);
});
test('.hasValue is false', () {
expect(future.hasValue, isFalse);
});
});
group('after successful completion', () {
var future;
setUp(() {
var completer = new Completer();
future = new ValueFuture(completer.future);
completer.complete(12);
});
test('.value is the result of the future', () {
// The completer calls its listeners asynchronously. We have to wait
// before we can access the value of the ValueFuture.
expect(future.then((_) => future.value), completion(equals(12)));
});
test('.hasValue is true', () {
// The completer calls its listeners asynchronously. We have to wait
// before we can access the value of the ValueFuture.
expect(future.then((_) => future.hasValue), completion(isTrue));
});
});
group('after an error completion', () {
var future;
// Since the completer completes asynchronously we need to wait before the
// ValueFuture has a value. The safeFuture will execute its callback when
// this is the case.
var safeFuture;
setUp(() {
var completer = new Completer();
future = new ValueFuture(completer.future);
safeFuture = future.catchError((e) {});
completer.completeError('bad');
});
test('.value is null', () {
expect(safeFuture.then((_) => future.value), completion(isNull));
});
test('.hasValue is false', () {
expect(safeFuture.then((_) => future.hasValue), completion(isFalse));
});
});
}