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 |