Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1057)

Unified Diff: test/cancelable_operation_test.dart

Issue 1266603005: Add a CancelableFuture class. (Closed) Base URL: git@github.com:dart-lang/async.git@master
Patch Set: Code review changes Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « lib/src/cancelable_operation.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/cancelable_operation_test.dart
diff --git a/test/cancelable_operation_test.dart b/test/cancelable_operation_test.dart
new file mode 100644
index 0000000000000000000000000000000000000000..189c0738967e109e603f3e6ba0650a60803f3fb2
--- /dev/null
+++ b/test/cancelable_operation_test.dart
@@ -0,0 +1,197 @@
+// 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:async/async.dart';
+import 'package:test/test.dart';
+
+import 'utils.dart';
+
+void main() {
+ group("without being canceled", () {
+ var completer;
+ setUp(() {
+ completer = new CancelableCompleter(
+ onCancel: expectAsync(() {}, count: 0));
+ });
+
+ test("sends values to the future", () {
+ expect(completer.operation.value, completion(equals(1)));
+ expect(completer.isCompleted, isFalse);
+ completer.complete(1);
+ expect(completer.isCompleted, isTrue);
+ });
+
+ test("sends errors to the future", () {
+ expect(completer.operation.value, throwsA("error"));
+ expect(completer.isCompleted, isFalse);
+ completer.completeError("error");
+ expect(completer.isCompleted, isTrue);
+ });
+
+ test("sends values in a future to the future", () {
+ expect(completer.operation.value, completion(equals(1)));
+ expect(completer.isCompleted, isFalse);
+ completer.complete(new Future.value(1));
+ expect(completer.isCompleted, isTrue);
+ });
+
+ test("sends errors in a future to the future", () {
+ expect(completer.operation.value, throwsA("error"));
+ expect(completer.isCompleted, isFalse);
+ completer.complete(new Future.error("error"));
+ expect(completer.isCompleted, isTrue);
+ });
+
+ group("throws a StateError if completed", () {
+ test("successfully twice", () {
+ completer.complete(1);
+ expect(() => completer.complete(1), throwsStateError);
+ });
+
+ test("successfully then unsuccessfully", () {
+ completer.complete(1);
+ expect(() => completer.completeError("error"), throwsStateError);
+ });
+
+ test("unsuccessfully twice", () {
+ expect(completer.operation.value, throwsA("error"));
+ completer.completeError("error");
+ expect(() => completer.completeError("error"), throwsStateError);
+ });
+
+ test("successfully then with a future", () {
+ completer.complete(1);
+ expect(() => completer.complete(new Completer().future),
+ throwsStateError);
+ });
+
+ test("with a future then successfully", () {
+ completer.complete(new Completer().future);
+ expect(() => completer.complete(1), throwsStateError);
+ });
+
+ test("with a future twice", () {
+ completer.complete(new Completer().future);
+ expect(() => completer.complete(new Completer().future),
+ throwsStateError);
+ });
+ });
+
+ group("CancelableOperation.fromFuture", () {
+ test("forwards values", () {
+ var operation = new CancelableOperation.fromFuture(new Future.value(1));
+ expect(operation.value, completion(equals(1)));
+ });
+
+ test("forwards errors", () {
+ var operation = new CancelableOperation.fromFuture(
+ new Future.error("error"));
+ expect(operation.value, throwsA("error"));
+ });
+ });
+ });
+
+ group("when canceled", () {
+ test("causes the future never to fire", () async {
+ var completer = new CancelableCompleter();
+ completer.operation.value.whenComplete(expectAsync(() {}, count: 0));
+ completer.operation.cancel();
+
+ // Give the future plenty of time to fire if it's going to.
+ await flushMicrotasks();
+ completer.complete();
+ await flushMicrotasks();
+ });
+
+ test("fires onCancel", () {
+ var canceled = false;
+ var completer;
+ completer = new CancelableCompleter(onCancel: expectAsync(() {
+ expect(completer.isCanceled, isTrue);
+ canceled = true;
+ }));
+
+ expect(canceled, isFalse);
+ expect(completer.isCanceled, isFalse);
+ expect(completer.isCompleted, isFalse);
+ completer.operation.cancel();
+ expect(canceled, isTrue);
+ expect(completer.isCanceled, isTrue);
+ expect(completer.isCompleted, isFalse);
+ });
+
+ test("returns the onCancel future each time cancel is called", () {
+ var completer = new CancelableCompleter(onCancel: expectAsync(() {
+ return new Future.value(1);
+ }));
+ expect(completer.operation.cancel(), completion(equals(1)));
+ expect(completer.operation.cancel(), completion(equals(1)));
+ expect(completer.operation.cancel(), completion(equals(1)));
+ });
+
+ test("returns a future even if onCancel doesn't", () {
+ var completer = new CancelableCompleter(onCancel: expectAsync(() {}));
+ expect(completer.operation.cancel(), completes);
+ });
+
+ test("doesn't call onCancel if the completer has completed", () {
+ var completer = new CancelableCompleter(
+ onCancel: expectAsync(() {}, count: 0));
+ completer.complete(1);
+ expect(completer.operation.value, completion(equals(1)));
+ expect(completer.operation.cancel(), completes);
+ });
+
+ test("does call onCancel if the completer has completed to an unfired "
+ "Future", () {
+ var completer = new CancelableCompleter(onCancel: expectAsync(() {}));
+ completer.complete(new Completer().future);
+ expect(completer.operation.cancel(), completes);
+ });
+
+ test("doesn't call onCancel if the completer has completed to a fired "
+ "Future", () async {
+ var completer = new CancelableCompleter(
+ onCancel: expectAsync(() {}, count: 0));
+ completer.complete(new Future.value(1));
+ await completer.operation.value;
+ expect(completer.operation.cancel(), completes);
+ });
+
+ test("can be completed once after being canceled", () async {
+ var completer = new CancelableCompleter();
+ completer.operation.value.whenComplete(expectAsync(() {}, count: 0));
+ await completer.operation.cancel();
+ completer.complete(1);
+ expect(() => completer.complete(1), throwsStateError);
+ });
+ });
+
+ group("asStream()", () {
+ test("emits a value and then closes", () {
+ var completer = new CancelableCompleter();
+ expect(completer.operation.asStream().toList(), completion(equals([1])));
+ completer.complete(1);
+ });
+
+ test("emits an error and then closes", () {
+ var completer = new CancelableCompleter();
+ var queue = new StreamQueue(completer.operation.asStream());
+ expect(queue.next, throwsA("error"));
+ expect(queue.hasNext, completion(isFalse));
+ completer.completeError("error");
+ });
+
+ test("cancels the completer when the subscription is canceled", () {
+ var completer = new CancelableCompleter(onCancel: expectAsync(() {}));
+ var sub = completer.operation.asStream()
+ .listen(expectAsync((_) {}, count: 0));
+ completer.operation.value.whenComplete(expectAsync(() {}, count: 0));
+ sub.cancel();
+ expect(completer.isCanceled, isTrue);
+ });
+ });
+}
« no previous file with comments | « lib/src/cancelable_operation.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698