| OLD | NEW |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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 library futures_test; | 5 library futures_test; |
| 6 | 6 |
| 7 import 'package:async_helper/async_helper.dart'; | 7 import 'package:async_helper/async_helper.dart'; |
| 8 import "package:expect/expect.dart"; | 8 import "package:expect/expect.dart"; |
| 9 import 'dart:async'; | 9 import 'dart:async'; |
| 10 | 10 |
| 11 Future testWaitEmpty() { | 11 Future testWaitEmpty() { |
| 12 List<Future> futures = new List<Future>(); | 12 final futures = new List<Future>(); |
| 13 return Future.wait(futures); | 13 return Future.wait(futures); |
| 14 } | 14 } |
| 15 | 15 |
| 16 Future testCompleteAfterWait() { | 16 Future testCompleteAfterWait() { |
| 17 List<Future> futures = new List<Future>(); | 17 final futures = new List<Future>(); |
| 18 Completer<Object> c = new Completer<Object>(); | 18 final c = new Completer<Object>(); |
| 19 futures.add(c.future); | 19 futures.add(c.future); |
| 20 Future future = Future.wait(futures); | 20 Future future = Future.wait(futures); |
| 21 c.complete(null); | 21 c.complete(null); |
| 22 return future; | 22 return future; |
| 23 } | 23 } |
| 24 | 24 |
| 25 Future testCompleteBeforeWait() { | 25 Future testCompleteBeforeWait() { |
| 26 List<Future> futures = new List<Future>(); | 26 final futures = new List<Future>(); |
| 27 Completer c = new Completer(); | 27 final c = new Completer(); |
| 28 futures.add(c.future); | 28 futures.add(c.future); |
| 29 c.complete(null); | 29 c.complete(null); |
| 30 return Future.wait(futures); | 30 return Future.wait(futures); |
| 31 } | 31 } |
| 32 | 32 |
| 33 Future testWaitWithMultipleValues() { | 33 Future testWaitWithMultipleValues() { |
| 34 List<Future> futures = new List<Future>(); | 34 final futures = new List<Future>(); |
| 35 Completer c1 = new Completer(); | 35 final c1 = new Completer(); |
| 36 Completer c2 = new Completer(); | 36 final c2 = new Completer(); |
| 37 futures.add(c1.future); | 37 futures.add(c1.future); |
| 38 futures.add(c2.future); | 38 futures.add(c2.future); |
| 39 c1.complete(1); | 39 c1.complete(1); |
| 40 c2.complete(2); | 40 c2.complete(2); |
| 41 return Future.wait(futures).then((values) { | 41 return Future.wait(futures).then((values) { |
| 42 Expect.listEquals([1, 2], values); | 42 Expect.listEquals([1, 2], values); |
| 43 }); | 43 }); |
| 44 } | 44 } |
| 45 | 45 |
| 46 Future testWaitWithSingleError() { | 46 Future testWaitWithSingleError() { |
| 47 List<Future> futures = new List<Future>(); | 47 final futures = new List<Future>(); |
| 48 Completer c1 = new Completer(); | 48 final c1 = new Completer(); |
| 49 Completer c2 = new Completer(); | 49 final c2 = new Completer(); |
| 50 futures.add(c1.future); | 50 futures.add(c1.future); |
| 51 futures.add(c2.future); | 51 futures.add(c2.future); |
| 52 c1.complete(); | 52 c1.complete(); |
| 53 c2.completeError('correct error'); | 53 c2.completeError('correct error'); |
| 54 | 54 |
| 55 return Future.wait(futures).then((_) { | 55 return Future.wait(futures).then((_) { |
| 56 throw 'incorrect error'; | 56 throw 'incorrect error'; |
| 57 }).catchError((error, stackTrace) { | 57 }).catchError((error, stackTrace) { |
| 58 Expect.equals('correct error', error); | 58 Expect.equals('correct error', error); |
| 59 Expect.isNull(stackTrace); | 59 Expect.isNull(stackTrace); |
| 60 }); | 60 }); |
| 61 } | 61 } |
| 62 | 62 |
| 63 Future testWaitWithMultipleErrors() { | 63 Future testWaitWithMultipleErrors() { |
| 64 List<Future> futures = new List<Future>(); | 64 final futures = new List<Future>(); |
| 65 Completer c1 = new Completer(); | 65 final c1 = new Completer(); |
| 66 Completer c2 = new Completer(); | 66 final c2 = new Completer(); |
| 67 futures.add(c1.future); | 67 futures.add(c1.future); |
| 68 futures.add(c2.future); | 68 futures.add(c2.future); |
| 69 c1.completeError('correct error'); | 69 c1.completeError('correct error'); |
| 70 c2.completeError('incorrect error 1'); | 70 c2.completeError('incorrect error 1'); |
| 71 | 71 |
| 72 return Future.wait(futures).then((_) { | 72 return Future.wait(futures).then((_) { |
| 73 throw 'incorrect error 2'; | 73 throw 'incorrect error 2'; |
| 74 }).catchError((error, stackTrace) { | 74 }).catchError((error, stackTrace) { |
| 75 Expect.equals('correct error', error); | 75 Expect.equals('correct error', error); |
| 76 Expect.isNull(stackTrace); | 76 Expect.isNull(stackTrace); |
| 77 }); | 77 }); |
| 78 } | 78 } |
| 79 | 79 |
| 80 Future testWaitWithMultipleErrorsEager() { | 80 Future testWaitWithMultipleErrorsEager() { |
| 81 List<Future> futures = new List<Future>(); | 81 final futures = new List<Future>(); |
| 82 Completer c1 = new Completer(); | 82 final c1 = new Completer(); |
| 83 Completer c2 = new Completer(); | 83 final c2 = new Completer(); |
| 84 futures.add(c1.future); | 84 futures.add(c1.future); |
| 85 futures.add(c2.future); | 85 futures.add(c2.future); |
| 86 c1.completeError('correct error'); | 86 c1.completeError('correct error'); |
| 87 c2.completeError('incorrect error 1'); | 87 c2.completeError('incorrect error 1'); |
| 88 | 88 |
| 89 return Future.wait(futures, eagerError: true).then((_) { | 89 return Future.wait(futures, eagerError: true).then((_) { |
| 90 throw 'incorrect error 2'; | 90 throw 'incorrect error 2'; |
| 91 }).catchError((error, stackTrace) { | 91 }).catchError((error, stackTrace) { |
| 92 Expect.equals('correct error', error); | 92 Expect.equals('correct error', error); |
| 93 Expect.isNull(stackTrace); | 93 Expect.isNull(stackTrace); |
| 94 }); | 94 }); |
| 95 } | 95 } |
| 96 | 96 |
| 97 StackTrace get currentStackTrace { | 97 StackTrace get currentStackTrace { |
| 98 try { | 98 try { |
| 99 throw 0; | 99 throw 0; |
| 100 } catch (e, st) { | 100 } catch (e, st) { |
| 101 return st; | 101 return st; |
| 102 } | 102 } |
| 103 return null; | 103 return null; |
| 104 } | 104 } |
| 105 | 105 |
| 106 Future testWaitWithSingleErrorWithStackTrace() { | 106 Future testWaitWithSingleErrorWithStackTrace() { |
| 107 List<Future> futures = new List<Future>(); | 107 final futures = new List<Future>(); |
| 108 Completer c1 = new Completer(); | 108 final c1 = new Completer(); |
| 109 Completer c2 = new Completer(); | 109 final c2 = new Completer(); |
| 110 futures.add(c1.future); | 110 futures.add(c1.future); |
| 111 futures.add(c2.future); | 111 futures.add(c2.future); |
| 112 c1.complete(); | 112 c1.complete(); |
| 113 c2.completeError('correct error', currentStackTrace); | 113 c2.completeError('correct error', currentStackTrace); |
| 114 | 114 |
| 115 return Future.wait(futures).then((_) { | 115 return Future.wait(futures).then((_) { |
| 116 throw 'incorrect error'; | 116 throw 'incorrect error'; |
| 117 }).catchError((error, stackTrace) { | 117 }).catchError((error, stackTrace) { |
| 118 Expect.equals('correct error', error); | 118 Expect.equals('correct error', error); |
| 119 Expect.isNotNull(stackTrace); | 119 Expect.isNotNull(stackTrace); |
| 120 }); | 120 }); |
| 121 } | 121 } |
| 122 | 122 |
| 123 Future testWaitWithMultipleErrorsWithStackTrace() { | 123 Future testWaitWithMultipleErrorsWithStackTrace() { |
| 124 List<Future> futures = new List<Future>(); | 124 final futures = new List<Future>(); |
| 125 Completer c1 = new Completer(); | 125 final c1 = new Completer(); |
| 126 Completer c2 = new Completer(); | 126 final c2 = new Completer(); |
| 127 futures.add(c1.future); | 127 futures.add(c1.future); |
| 128 futures.add(c2.future); | 128 futures.add(c2.future); |
| 129 c1.completeError('correct error', currentStackTrace); | 129 c1.completeError('correct error', currentStackTrace); |
| 130 c2.completeError('incorrect error 1'); | 130 c2.completeError('incorrect error 1'); |
| 131 | 131 |
| 132 return Future.wait(futures).then((_) { | 132 return Future.wait(futures).then((_) { |
| 133 throw 'incorrect error 2'; | 133 throw 'incorrect error 2'; |
| 134 }).catchError((error, stackTrace) { | 134 }).catchError((error, stackTrace) { |
| 135 Expect.equals('correct error', error); | 135 Expect.equals('correct error', error); |
| 136 Expect.isNotNull(stackTrace); | 136 Expect.isNotNull(stackTrace); |
| 137 }); | 137 }); |
| 138 } | 138 } |
| 139 | 139 |
| 140 Future testWaitWithMultipleErrorsWithStackTraceEager() { | 140 Future testWaitWithMultipleErrorsWithStackTraceEager() { |
| 141 List<Future> futures = new List<Future>(); | 141 final futures = new List<Future>(); |
| 142 Completer c1 = new Completer(); | 142 final c1 = new Completer(); |
| 143 Completer c2 = new Completer(); | 143 final c2 = new Completer(); |
| 144 futures.add(c1.future); | 144 futures.add(c1.future); |
| 145 futures.add(c2.future); | 145 futures.add(c2.future); |
| 146 c1.completeError('correct error', currentStackTrace); | 146 c1.completeError('correct error', currentStackTrace); |
| 147 c2.completeError('incorrect error 1'); | 147 c2.completeError('incorrect error 1'); |
| 148 | 148 |
| 149 return Future.wait(futures, eagerError: true).then((_) { | 149 return Future.wait(futures, eagerError: true).then((_) { |
| 150 throw 'incorrect error 2'; | 150 throw 'incorrect error 2'; |
| 151 }).catchError((error, stackTrace) { | 151 }).catchError((error, stackTrace) { |
| 152 Expect.equals('correct error', error); | 152 Expect.equals('correct error', error); |
| 153 Expect.isNotNull(stackTrace); | 153 Expect.isNotNull(stackTrace); |
| 154 }); | 154 }); |
| 155 } | 155 } |
| 156 | 156 |
| 157 Future testEagerWait() { | 157 Future testEagerWait() { |
| 158 var st; | 158 var st; |
| 159 try { | 159 try { |
| 160 throw 0; | 160 throw 0; |
| 161 } catch (e, s) { | 161 } catch (e, s) { |
| 162 st = s; | 162 st = s; |
| 163 } | 163 } |
| 164 Completer c1 = new Completer(); | 164 final c1 = new Completer(); |
| 165 Completer c2 = new Completer(); | 165 final c2 = new Completer(); |
| 166 List<Future> futures = <Future>[c1.future, c2.future]; | 166 final futures = <Future>[c1.future, c2.future]; |
| 167 Future waited = Future.wait(futures, eagerError: true); | 167 final waited = Future.wait(futures, eagerError: true); |
| 168 var result = waited.then((v) { | 168 final result = waited.then((v) { |
| 169 throw "should not be called"; | 169 throw "should not be called"; |
| 170 }, onError: (e, s) { | 170 }, onError: (e, s) { |
| 171 Expect.equals(e, 42); | 171 Expect.equals(e, 42); |
| 172 Expect.identical(st, s); | 172 Expect.identical(st, s); |
| 173 return true; | 173 return true; |
| 174 }); | 174 }); |
| 175 c1.completeError(42, st); | 175 c1.completeError(42, st); |
| 176 return result; | 176 return result; |
| 177 } | 177 } |
| 178 | 178 |
| 179 Future testForEachEmpty() { | 179 Future testForEachEmpty() { |
| 180 return Future.forEach([], (_) { | 180 return Future.forEach([], (_) { |
| 181 throw 'should not be called'; | 181 throw 'should not be called'; |
| 182 }); | 182 }); |
| 183 } | 183 } |
| 184 | 184 |
| 185 Future testForEach() { | 185 Future testForEach() { |
| 186 var seen = <int>[]; | 186 final seen = <int>[]; |
| 187 return Future.forEach([1, 2, 3, 4, 5], (n) { | 187 return Future.forEach([1, 2, 3, 4, 5], (n) { |
| 188 seen.add(n); | 188 seen.add(n); |
| 189 return new Future.value(); | 189 return new Future.value(); |
| 190 }).then((_) => Expect.listEquals([1, 2, 3, 4, 5], seen)); | 190 }).then((_) => Expect.listEquals([1, 2, 3, 4, 5], seen)); |
| 191 } | 191 } |
| 192 | 192 |
| 193 Future testForEachSync() { | 193 Future testForEachSync() { |
| 194 var seen = <int>[]; | 194 final seen = <int>[]; |
| 195 return Future.forEach([1, 2, 3, 4, 5], seen.add).then( | 195 return Future.forEach([1, 2, 3, 4, 5], seen.add).then( |
| 196 (_) => Expect.listEquals([1, 2, 3, 4, 5], seen)); | 196 (_) => Expect.listEquals([1, 2, 3, 4, 5], seen)); |
| 197 } | 197 } |
| 198 | 198 |
| 199 Future testForEachWithException() { | 199 Future testForEachWithException() { |
| 200 var seen = <int>[]; | 200 final seen = <int>[]; |
| 201 return Future.forEach([1, 2, 3, 4, 5], (n) { | 201 return Future.forEach([1, 2, 3, 4, 5], (n) { |
| 202 if (n == 4) throw 'correct exception'; | 202 if (n == 4) throw 'correct exception'; |
| 203 seen.add(n); | 203 seen.add(n); |
| 204 return new Future.value(); | 204 return new Future.value(); |
| 205 }).then((_) { | 205 }).then((_) { |
| 206 throw 'incorrect exception'; | 206 throw 'incorrect exception'; |
| 207 }).catchError((error) { | 207 }).catchError((error) { |
| 208 Expect.equals('correct exception', error); | 208 Expect.equals('correct exception', error); |
| 209 }); | 209 }); |
| 210 } | 210 } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 232 if (count == 4) throw 'correct exception'; | 232 if (count == 4) throw 'correct exception'; |
| 233 return new Future(() => true); | 233 return new Future(() => true); |
| 234 }).then((_) { | 234 }).then((_) { |
| 235 throw 'incorrect exception'; | 235 throw 'incorrect exception'; |
| 236 }).catchError((error) { | 236 }).catchError((error) { |
| 237 Expect.equals('correct exception', error); | 237 Expect.equals('correct exception', error); |
| 238 }); | 238 }); |
| 239 } | 239 } |
| 240 | 240 |
| 241 main() { | 241 main() { |
| 242 List<Future> futures = new List<Future>(); | 242 final futures = new List<Future>(); |
| 243 | 243 |
| 244 futures.add(testWaitEmpty()); | 244 futures.add(testWaitEmpty()); |
| 245 futures.add(testCompleteAfterWait()); | 245 futures.add(testCompleteAfterWait()); |
| 246 futures.add(testCompleteBeforeWait()); | 246 futures.add(testCompleteBeforeWait()); |
| 247 futures.add(testWaitWithMultipleValues()); | 247 futures.add(testWaitWithMultipleValues()); |
| 248 futures.add(testWaitWithSingleError()); | 248 futures.add(testWaitWithSingleError()); |
| 249 futures.add(testWaitWithMultipleErrors()); | 249 futures.add(testWaitWithMultipleErrors()); |
| 250 futures.add(testWaitWithMultipleErrorsEager()); | 250 futures.add(testWaitWithMultipleErrorsEager()); |
| 251 futures.add(testWaitWithSingleErrorWithStackTrace()); | 251 futures.add(testWaitWithSingleErrorWithStackTrace()); |
| 252 futures.add(testWaitWithMultipleErrorsWithStackTrace()); | 252 futures.add(testWaitWithMultipleErrorsWithStackTrace()); |
| 253 futures.add(testWaitWithMultipleErrorsWithStackTraceEager()); | 253 futures.add(testWaitWithMultipleErrorsWithStackTraceEager()); |
| 254 futures.add(testEagerWait()); | 254 futures.add(testEagerWait()); |
| 255 futures.add(testForEachEmpty()); | 255 futures.add(testForEachEmpty()); |
| 256 futures.add(testForEach()); | 256 futures.add(testForEach()); |
| 257 futures.add(testForEachSync()); | 257 futures.add(testForEachSync()); |
| 258 futures.add(testForEachWithException()); | 258 futures.add(testForEachWithException()); |
| 259 futures.add(testDoWhile()); | 259 futures.add(testDoWhile()); |
| 260 futures.add(testDoWhileSync()); | 260 futures.add(testDoWhileSync()); |
| 261 futures.add(testDoWhileWithException()); | 261 futures.add(testDoWhileWithException()); |
| 262 | 262 |
| 263 asyncStart(); | 263 asyncStart(); |
| 264 Future.wait(futures).then((List list) { | 264 Future.wait(futures).then((List list) { |
| 265 Expect.equals(18, list.length); | 265 Expect.equals(18, list.length); |
| 266 asyncEnd(); | 266 asyncEnd(); |
| 267 }); | 267 }); |
| 268 } | 268 } |
| OLD | NEW |