| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 import 'dart:async'; | 5 import 'dart:async'; |
| 6 | 6 |
| 7 import 'package:async/async.dart'; | 7 import 'package:async/async.dart'; |
| 8 import 'package:test/test.dart'; | 8 import 'package:test/test.dart'; |
| 9 | 9 |
| 10 import 'utils.dart'; | 10 import 'utils.dart'; |
| 11 | 11 |
| 12 void main() { | 12 void main() { |
| 13 group("without being canceled", () { | 13 group("without being canceled", () { |
| 14 var completer; | 14 var completer; |
| 15 setUp(() { | 15 setUp(() { |
| 16 completer = new CancelableCompleter( | 16 completer = |
| 17 onCancel: expectAsync(() {}, count: 0)); | 17 new CancelableCompleter(onCancel: expectAsync0(() {}, count: 0)); |
| 18 }); | 18 }); |
| 19 | 19 |
| 20 test("sends values to the future", () { | 20 test("sends values to the future", () { |
| 21 expect(completer.operation.value, completion(equals(1))); | 21 expect(completer.operation.value, completion(equals(1))); |
| 22 expect(completer.isCompleted, isFalse); | 22 expect(completer.isCompleted, isFalse); |
| 23 completer.complete(1); | 23 completer.complete(1); |
| 24 expect(completer.isCompleted, isTrue); | 24 expect(completer.isCompleted, isTrue); |
| 25 }); | 25 }); |
| 26 | 26 |
| 27 test("sends errors to the future", () { | 27 test("sends errors to the future", () { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 38 expect(completer.isCompleted, isTrue); | 38 expect(completer.isCompleted, isTrue); |
| 39 }); | 39 }); |
| 40 | 40 |
| 41 test("sends errors in a future to the future", () { | 41 test("sends errors in a future to the future", () { |
| 42 expect(completer.operation.value, throwsA("error")); | 42 expect(completer.operation.value, throwsA("error")); |
| 43 expect(completer.isCompleted, isFalse); | 43 expect(completer.isCompleted, isFalse); |
| 44 completer.complete(new Future.error("error")); | 44 completer.complete(new Future.error("error")); |
| 45 expect(completer.isCompleted, isTrue); | 45 expect(completer.isCompleted, isTrue); |
| 46 }); | 46 }); |
| 47 | 47 |
| 48 test("sends values to valueOrCancellation", () { |
| 49 expect(completer.operation.valueOrCancellation(), completion(equals(1))); |
| 50 completer.complete(1); |
| 51 }); |
| 52 |
| 53 test("sends errors to valueOrCancellation", () { |
| 54 expect(completer.operation.valueOrCancellation(), throwsA("error")); |
| 55 completer.completeError("error"); |
| 56 }); |
| 57 |
| 48 group("throws a StateError if completed", () { | 58 group("throws a StateError if completed", () { |
| 49 test("successfully twice", () { | 59 test("successfully twice", () { |
| 50 completer.complete(1); | 60 completer.complete(1); |
| 51 expect(() => completer.complete(1), throwsStateError); | 61 expect(() => completer.complete(1), throwsStateError); |
| 52 }); | 62 }); |
| 53 | 63 |
| 54 test("successfully then unsuccessfully", () { | 64 test("successfully then unsuccessfully", () { |
| 55 completer.complete(1); | 65 completer.complete(1); |
| 56 expect(() => completer.completeError("error"), throwsStateError); | 66 expect(() => completer.completeError("error"), throwsStateError); |
| 57 }); | 67 }); |
| 58 | 68 |
| 59 test("unsuccessfully twice", () { | 69 test("unsuccessfully twice", () { |
| 60 expect(completer.operation.value, throwsA("error")); | 70 expect(completer.operation.value, throwsA("error")); |
| 61 completer.completeError("error"); | 71 completer.completeError("error"); |
| 62 expect(() => completer.completeError("error"), throwsStateError); | 72 expect(() => completer.completeError("error"), throwsStateError); |
| 63 }); | 73 }); |
| 64 | 74 |
| 65 test("successfully then with a future", () { | 75 test("successfully then with a future", () { |
| 66 completer.complete(1); | 76 completer.complete(1); |
| 67 expect(() => completer.complete(new Completer().future), | 77 expect( |
| 68 throwsStateError); | 78 () => completer.complete(new Completer().future), throwsStateError); |
| 69 }); | 79 }); |
| 70 | 80 |
| 71 test("with a future then successfully", () { | 81 test("with a future then successfully", () { |
| 72 completer.complete(new Completer().future); | 82 completer.complete(new Completer().future); |
| 73 expect(() => completer.complete(1), throwsStateError); | 83 expect(() => completer.complete(1), throwsStateError); |
| 74 }); | 84 }); |
| 75 | 85 |
| 76 test("with a future twice", () { | 86 test("with a future twice", () { |
| 77 completer.complete(new Completer().future); | 87 completer.complete(new Completer().future); |
| 78 expect(() => completer.complete(new Completer().future), | 88 expect( |
| 79 throwsStateError); | 89 () => completer.complete(new Completer().future), throwsStateError); |
| 80 }); | 90 }); |
| 81 }); | 91 }); |
| 82 | 92 |
| 83 group("CancelableOperation.fromFuture", () { | 93 group("CancelableOperation.fromFuture", () { |
| 84 test("forwards values", () { | 94 test("forwards values", () { |
| 85 var operation = new CancelableOperation.fromFuture(new Future.value(1)); | 95 var operation = new CancelableOperation.fromFuture(new Future.value(1)); |
| 86 expect(operation.value, completion(equals(1))); | 96 expect(operation.value, completion(equals(1))); |
| 87 }); | 97 }); |
| 88 | 98 |
| 89 test("forwards errors", () { | 99 test("forwards errors", () { |
| 90 var operation = new CancelableOperation.fromFuture( | 100 var operation = |
| 91 new Future.error("error")); | 101 new CancelableOperation.fromFuture(new Future.error("error")); |
| 92 expect(operation.value, throwsA("error")); | 102 expect(operation.value, throwsA("error")); |
| 93 }); | 103 }); |
| 94 }); | 104 }); |
| 95 }); | 105 }); |
| 96 | 106 |
| 97 group("when canceled", () { | 107 group("when canceled", () { |
| 98 test("causes the future never to fire", () async { | 108 test("causes the future never to fire", () async { |
| 99 var completer = new CancelableCompleter(); | 109 var completer = new CancelableCompleter(); |
| 100 completer.operation.value.whenComplete(expectAsync(() {}, count: 0)); | 110 completer.operation.value.whenComplete(expectAsync0(() {}, count: 0)); |
| 101 completer.operation.cancel(); | 111 completer.operation.cancel(); |
| 102 | 112 |
| 103 // Give the future plenty of time to fire if it's going to. | 113 // Give the future plenty of time to fire if it's going to. |
| 104 await flushMicrotasks(); | 114 await flushMicrotasks(); |
| 105 completer.complete(); | 115 completer.complete(); |
| 106 await flushMicrotasks(); | 116 await flushMicrotasks(); |
| 107 }); | 117 }); |
| 108 | 118 |
| 109 test("fires onCancel", () { | 119 test("fires onCancel", () { |
| 110 var canceled = false; | 120 var canceled = false; |
| 111 var completer; | 121 var completer; |
| 112 completer = new CancelableCompleter(onCancel: expectAsync(() { | 122 completer = new CancelableCompleter(onCancel: expectAsync0(() { |
| 113 expect(completer.isCanceled, isTrue); | 123 expect(completer.isCanceled, isTrue); |
| 114 canceled = true; | 124 canceled = true; |
| 115 })); | 125 })); |
| 116 | 126 |
| 117 expect(canceled, isFalse); | 127 expect(canceled, isFalse); |
| 118 expect(completer.isCanceled, isFalse); | 128 expect(completer.isCanceled, isFalse); |
| 119 expect(completer.isCompleted, isFalse); | 129 expect(completer.isCompleted, isFalse); |
| 120 completer.operation.cancel(); | 130 completer.operation.cancel(); |
| 121 expect(canceled, isTrue); | 131 expect(canceled, isTrue); |
| 122 expect(completer.isCanceled, isTrue); | 132 expect(completer.isCanceled, isTrue); |
| 123 expect(completer.isCompleted, isFalse); | 133 expect(completer.isCompleted, isFalse); |
| 124 }); | 134 }); |
| 125 | 135 |
| 126 test("returns the onCancel future each time cancel is called", () { | 136 test("returns the onCancel future each time cancel is called", () { |
| 127 var completer = new CancelableCompleter(onCancel: expectAsync(() { | 137 var completer = new CancelableCompleter(onCancel: expectAsync0(() { |
| 128 return new Future.value(1); | 138 return new Future.value(1); |
| 129 })); | 139 })); |
| 130 expect(completer.operation.cancel(), completion(equals(1))); | 140 expect(completer.operation.cancel(), completion(equals(1))); |
| 131 expect(completer.operation.cancel(), completion(equals(1))); | 141 expect(completer.operation.cancel(), completion(equals(1))); |
| 132 expect(completer.operation.cancel(), completion(equals(1))); | 142 expect(completer.operation.cancel(), completion(equals(1))); |
| 133 }); | 143 }); |
| 134 | 144 |
| 135 test("returns a future even if onCancel doesn't", () { | 145 test("returns a future even if onCancel doesn't", () { |
| 136 var completer = new CancelableCompleter(onCancel: expectAsync(() {})); | 146 var completer = new CancelableCompleter(onCancel: expectAsync0(() {})); |
| 137 expect(completer.operation.cancel(), completes); | 147 expect(completer.operation.cancel(), completes); |
| 138 }); | 148 }); |
| 139 | 149 |
| 140 test("doesn't call onCancel if the completer has completed", () { | 150 test("doesn't call onCancel if the completer has completed", () { |
| 141 var completer = new CancelableCompleter( | 151 var completer = |
| 142 onCancel: expectAsync(() {}, count: 0)); | 152 new CancelableCompleter(onCancel: expectAsync0(() {}, count: 0)); |
| 143 completer.complete(1); | 153 completer.complete(1); |
| 144 expect(completer.operation.value, completion(equals(1))); | 154 expect(completer.operation.value, completion(equals(1))); |
| 145 expect(completer.operation.cancel(), completes); | 155 expect(completer.operation.cancel(), completes); |
| 146 }); | 156 }); |
| 147 | 157 |
| 148 test("does call onCancel if the completer has completed to an unfired " | 158 test( |
| 159 "does call onCancel if the completer has completed to an unfired " |
| 149 "Future", () { | 160 "Future", () { |
| 150 var completer = new CancelableCompleter(onCancel: expectAsync(() {})); | 161 var completer = new CancelableCompleter(onCancel: expectAsync0(() {})); |
| 151 completer.complete(new Completer().future); | 162 completer.complete(new Completer().future); |
| 152 expect(completer.operation.cancel(), completes); | 163 expect(completer.operation.cancel(), completes); |
| 153 }); | 164 }); |
| 154 | 165 |
| 155 test("doesn't call onCancel if the completer has completed to a fired " | 166 test( |
| 167 "doesn't call onCancel if the completer has completed to a fired " |
| 156 "Future", () async { | 168 "Future", () async { |
| 157 var completer = new CancelableCompleter( | 169 var completer = |
| 158 onCancel: expectAsync(() {}, count: 0)); | 170 new CancelableCompleter(onCancel: expectAsync0(() {}, count: 0)); |
| 159 completer.complete(new Future.value(1)); | 171 completer.complete(new Future.value(1)); |
| 160 await completer.operation.value; | 172 await completer.operation.value; |
| 161 expect(completer.operation.cancel(), completes); | 173 expect(completer.operation.cancel(), completes); |
| 162 }); | 174 }); |
| 163 | 175 |
| 164 test("can be completed once after being canceled", () async { | 176 test("can be completed once after being canceled", () async { |
| 165 var completer = new CancelableCompleter(); | 177 var completer = new CancelableCompleter(); |
| 166 completer.operation.value.whenComplete(expectAsync(() {}, count: 0)); | 178 completer.operation.value.whenComplete(expectAsync0(() {}, count: 0)); |
| 167 await completer.operation.cancel(); | 179 await completer.operation.cancel(); |
| 168 completer.complete(1); | 180 completer.complete(1); |
| 169 expect(() => completer.complete(1), throwsStateError); | 181 expect(() => completer.complete(1), throwsStateError); |
| 170 }); | 182 }); |
| 183 |
| 184 test("fires valueOrCancellation with the given value", () { |
| 185 var completer = new CancelableCompleter(); |
| 186 expect(completer.operation.valueOrCancellation(1), completion(equals(1))); |
| 187 completer.operation.cancel(); |
| 188 }); |
| 189 |
| 190 test("pipes an error through valueOrCancellation", () { |
| 191 var completer = new CancelableCompleter(onCancel: () { |
| 192 throw "error"; |
| 193 }); |
| 194 expect(completer.operation.valueOrCancellation(1), throwsA("error")); |
| 195 completer.operation.cancel(); |
| 196 }); |
| 197 |
| 198 test("valueOrCancellation waits on the onCancel future", () async { |
| 199 var innerCompleter = new Completer(); |
| 200 var completer = |
| 201 new CancelableCompleter(onCancel: () => innerCompleter.future); |
| 202 |
| 203 var fired = false; |
| 204 completer.operation.valueOrCancellation().then((_) { |
| 205 fired = true; |
| 206 }); |
| 207 |
| 208 completer.operation.cancel(); |
| 209 await flushMicrotasks(); |
| 210 expect(fired, isFalse); |
| 211 |
| 212 innerCompleter.complete(); |
| 213 await flushMicrotasks(); |
| 214 expect(fired, isTrue); |
| 215 }); |
| 171 }); | 216 }); |
| 172 | 217 |
| 173 group("asStream()", () { | 218 group("asStream()", () { |
| 174 test("emits a value and then closes", () { | 219 test("emits a value and then closes", () { |
| 175 var completer = new CancelableCompleter(); | 220 var completer = new CancelableCompleter(); |
| 176 expect(completer.operation.asStream().toList(), completion(equals([1]))); | 221 expect(completer.operation.asStream().toList(), completion(equals([1]))); |
| 177 completer.complete(1); | 222 completer.complete(1); |
| 178 }); | 223 }); |
| 179 | 224 |
| 180 test("emits an error and then closes", () { | 225 test("emits an error and then closes", () { |
| 181 var completer = new CancelableCompleter(); | 226 var completer = new CancelableCompleter(); |
| 182 var queue = new StreamQueue(completer.operation.asStream()); | 227 var queue = new StreamQueue(completer.operation.asStream()); |
| 183 expect(queue.next, throwsA("error")); | 228 expect(queue.next, throwsA("error")); |
| 184 expect(queue.hasNext, completion(isFalse)); | 229 expect(queue.hasNext, completion(isFalse)); |
| 185 completer.completeError("error"); | 230 completer.completeError("error"); |
| 186 }); | 231 }); |
| 187 | 232 |
| 188 test("cancels the completer when the subscription is canceled", () { | 233 test("cancels the completer when the subscription is canceled", () { |
| 189 var completer = new CancelableCompleter(onCancel: expectAsync(() {})); | 234 var completer = new CancelableCompleter(onCancel: expectAsync0(() {})); |
| 190 var sub = completer.operation.asStream() | 235 var sub = |
| 191 .listen(expectAsync((_) {}, count: 0)); | 236 completer.operation.asStream().listen(expectAsync1((_) {}, count: 0)); |
| 192 completer.operation.value.whenComplete(expectAsync(() {}, count: 0)); | 237 completer.operation.value.whenComplete(expectAsync0(() {}, count: 0)); |
| 193 sub.cancel(); | 238 sub.cancel(); |
| 194 expect(completer.isCanceled, isTrue); | 239 expect(completer.isCanceled, isTrue); |
| 195 }); | 240 }); |
| 196 }); | 241 }); |
| 197 } | 242 } |
| OLD | NEW |