OLD | NEW |
(Empty) | |
| 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 |
| 3 // BSD-style license that can be found in the LICENSE file. |
| 4 |
| 5 import 'dart:async'; |
| 6 |
| 7 import 'package:async/async.dart'; |
| 8 import 'package:test/src/util/cancelable_future.dart'; |
| 9 import 'package:test/test.dart'; |
| 10 |
| 11 void main() { |
| 12 group("without being canceled", () { |
| 13 var completer; |
| 14 setUp(() { |
| 15 completer = new CancelableCompleter(expectAsync(() {}, count: 0)); |
| 16 }); |
| 17 |
| 18 test("sends values to the future", () { |
| 19 expect(completer.future, completion(equals(1))); |
| 20 expect(completer.isCompleted, isFalse); |
| 21 completer.complete(1); |
| 22 expect(completer.isCompleted, isTrue); |
| 23 }); |
| 24 |
| 25 test("sends errors to the future", () { |
| 26 expect(completer.future, throwsA("error")); |
| 27 expect(completer.isCompleted, isFalse); |
| 28 completer.completeError("error"); |
| 29 expect(completer.isCompleted, isTrue); |
| 30 }); |
| 31 |
| 32 test("sends values in a future to the future", () { |
| 33 expect(completer.future, completion(equals(1))); |
| 34 expect(completer.isCompleted, isFalse); |
| 35 completer.complete(new Future.value(1)); |
| 36 expect(completer.isCompleted, isTrue); |
| 37 }); |
| 38 |
| 39 test("sends errors in a future to the future", () { |
| 40 expect(completer.future, throwsA("error")); |
| 41 expect(completer.isCompleted, isFalse); |
| 42 completer.complete(new Future.error("error")); |
| 43 expect(completer.isCompleted, isTrue); |
| 44 }); |
| 45 |
| 46 group("throws a StateError if completed", () { |
| 47 test("successfully twice", () { |
| 48 completer.complete(1); |
| 49 expect(() => completer.complete(1), throwsStateError); |
| 50 }); |
| 51 |
| 52 test("successfully then unsuccessfully", () { |
| 53 completer.complete(1); |
| 54 expect(() => completer.completeError("error"), throwsStateError); |
| 55 }); |
| 56 |
| 57 test("unsuccessfully twice", () { |
| 58 expect(completer.future, throwsA("error")); |
| 59 completer.completeError("error"); |
| 60 expect(() => completer.completeError("error"), throwsStateError); |
| 61 }); |
| 62 |
| 63 test("successfully then with a future", () { |
| 64 completer.complete(1); |
| 65 expect(() => completer.complete(new Completer().future), |
| 66 throwsStateError); |
| 67 }); |
| 68 |
| 69 test("with a future then successfully", () { |
| 70 completer.complete(new Completer().future); |
| 71 expect(() => completer.complete(1), throwsStateError); |
| 72 }); |
| 73 |
| 74 test("with a future twice", () { |
| 75 completer.complete(new Completer().future); |
| 76 expect(() => completer.complete(new Completer().future), |
| 77 throwsStateError); |
| 78 }); |
| 79 }); |
| 80 |
| 81 group("CancelableFuture.fromFuture", () { |
| 82 test("forwards values", () { |
| 83 expect(new CancelableFuture.fromFuture(new Future.value(1)), |
| 84 completion(equals(1))); |
| 85 }); |
| 86 |
| 87 test("forwards errors", () { |
| 88 expect(new CancelableFuture.fromFuture(new Future.error("error")), |
| 89 throwsA("error")); |
| 90 }); |
| 91 }); |
| 92 }); |
| 93 |
| 94 group("when canceled", () { |
| 95 test("causes the future never to fire", () async { |
| 96 var completer = new CancelableCompleter(); |
| 97 completer.future.whenComplete(expectAsync(() {}, count: 0)); |
| 98 completer.future.cancel(); |
| 99 |
| 100 // Give the future plenty of time to fire if it's going to. |
| 101 await flushMicrotasks(); |
| 102 completer.complete(); |
| 103 await flushMicrotasks(); |
| 104 }); |
| 105 |
| 106 test("fires onCancel", () { |
| 107 var canceled = false; |
| 108 var completer; |
| 109 completer = new CancelableCompleter(expectAsync(() { |
| 110 expect(completer.isCanceled, isTrue); |
| 111 canceled = true; |
| 112 })); |
| 113 |
| 114 expect(canceled, isFalse); |
| 115 expect(completer.isCanceled, isFalse); |
| 116 expect(completer.isCompleted, isFalse); |
| 117 completer.future.cancel(); |
| 118 expect(canceled, isTrue); |
| 119 expect(completer.isCanceled, isTrue); |
| 120 expect(completer.isCompleted, isFalse); |
| 121 }); |
| 122 |
| 123 test("returns the onCancel future each time cancel is called", () { |
| 124 var completer = new CancelableCompleter(expectAsync(() { |
| 125 return new Future.value(1); |
| 126 })); |
| 127 expect(completer.future.cancel(), completion(equals(1))); |
| 128 expect(completer.future.cancel(), completion(equals(1))); |
| 129 expect(completer.future.cancel(), completion(equals(1))); |
| 130 }); |
| 131 |
| 132 test("returns a future even if onCancel doesn't", () { |
| 133 var completer = new CancelableCompleter(expectAsync(() {})); |
| 134 expect(completer.future.cancel(), completes); |
| 135 }); |
| 136 |
| 137 test("doesn't call onCancel if the completer has completed", () { |
| 138 var completer = new CancelableCompleter(expectAsync(() {}, count: 0)); |
| 139 completer.complete(1); |
| 140 completer.future.whenComplete(expectAsync(() {}, count: 0)); |
| 141 expect(completer.future.cancel(), completes); |
| 142 }); |
| 143 |
| 144 test("does call onCancel if the completer has completed to an unfired " |
| 145 "Future", () { |
| 146 var completer = new CancelableCompleter(expectAsync(() {})); |
| 147 completer.complete(new Completer().future); |
| 148 expect(completer.future.cancel(), completes); |
| 149 }); |
| 150 |
| 151 test("doesn't call onCancel if the completer has completed to a fired " |
| 152 "Future", () async { |
| 153 var completer = new CancelableCompleter(expectAsync(() {}, count: 0)); |
| 154 completer.complete(new Future.value(1)); |
| 155 await completer.future; |
| 156 expect(completer.future.cancel(), completes); |
| 157 }); |
| 158 |
| 159 test("can be completed once after being canceled", () async { |
| 160 var completer = new CancelableCompleter(); |
| 161 completer.future.whenComplete(expectAsync(() {}, count: 0)); |
| 162 await completer.future.cancel(); |
| 163 completer.complete(1); |
| 164 expect(() => completer.complete(1), throwsStateError); |
| 165 }); |
| 166 |
| 167 test("throws a CancelException along non-canceled branches", () { |
| 168 var completer = new CancelableCompleter(); |
| 169 expect(completer.future.then((_) {}), throwsCancelException); |
| 170 completer.future.then((_) {}).cancel(); |
| 171 }); |
| 172 |
| 173 test("doesn't throw a CancelException further along the canceled chain", |
| 174 () async { |
| 175 var completer = new CancelableCompleter(); |
| 176 completer.future.then((_) {}).whenComplete(expectAsync((_) {}, count: 0)); |
| 177 completer.future.cancel(); |
| 178 await flushMicrotasks(); |
| 179 }); |
| 180 }); |
| 181 |
| 182 group("asStream()", () { |
| 183 test("emits a value and then closes", () { |
| 184 var completer = new CancelableCompleter(); |
| 185 expect(completer.future.asStream().toList(), completion(equals([1]))); |
| 186 completer.complete(1); |
| 187 }); |
| 188 |
| 189 test("emits an error and then closes", () { |
| 190 var completer = new CancelableCompleter(); |
| 191 var queue = new StreamQueue(completer.future.asStream()); |
| 192 expect(queue.next, throwsA("error")); |
| 193 expect(queue.hasNext, completion(isFalse)); |
| 194 completer.completeError("error"); |
| 195 }); |
| 196 |
| 197 test("cancels the completer when the subscription is canceled", () { |
| 198 var completer = new CancelableCompleter(expectAsync(() {})); |
| 199 var sub = completer.future.asStream() |
| 200 .listen(expectAsync((_) {}, count: 0)); |
| 201 expect(completer.future, throwsCancelException); |
| 202 sub.cancel(); |
| 203 expect(completer.isCanceled, isTrue); |
| 204 }); |
| 205 }); |
| 206 |
| 207 group("timeout()", () { |
| 208 test("emits a value if one arrives before timeout", () { |
| 209 var completer = new CancelableCompleter(); |
| 210 expect( |
| 211 completer.future.timeout( |
| 212 new Duration(hours: 1), |
| 213 onTimeout: expectAsync(() {}, count: 0)), |
| 214 completion(equals(1))); |
| 215 completer.complete(1); |
| 216 }); |
| 217 |
| 218 test("emits an error if one arrives before timeout", () { |
| 219 var completer = new CancelableCompleter(); |
| 220 expect( |
| 221 completer.future.timeout( |
| 222 new Duration(hours: 1), |
| 223 onTimeout: expectAsync(() {}, count: 0)), |
| 224 throwsA("error")); |
| 225 completer.completeError("error"); |
| 226 }); |
| 227 |
| 228 test("cancels the completer when the future times out", () async { |
| 229 var completer = new CancelableCompleter(expectAsync(() {})); |
| 230 expect(completer.future.timeout(Duration.ZERO), |
| 231 throwsA(new isInstanceOf<TimeoutException>())); |
| 232 expect(completer.future, throwsCancelException); |
| 233 await flushMicrotasks(); |
| 234 expect(completer.isCanceled, isTrue); |
| 235 }); |
| 236 |
| 237 test("runs the user's onTimeout function when the future times out", |
| 238 () async { |
| 239 var completer = new CancelableCompleter(expectAsync(() {})); |
| 240 expect( |
| 241 completer.future.timeout( |
| 242 Duration.ZERO, |
| 243 onTimeout: expectAsync(() => 1)), |
| 244 completion(equals(1))); |
| 245 expect(completer.future, throwsCancelException); |
| 246 await flushMicrotasks(); |
| 247 expect(completer.isCanceled, isTrue); |
| 248 }); |
| 249 }); |
| 250 } |
| 251 |
| 252 const Matcher throwsCancelException = |
| 253 const Throws(const isInstanceOf<CancelException>()); |
| 254 |
| 255 Future flushMicrotasks() => new Future.delayed(Duration.ZERO); |
OLD | NEW |