| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 future_test; | 5 library future_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 |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 }); | 114 }); |
| 115 } | 115 } |
| 116 | 116 |
| 117 void testCompleteManySuccessHandlers() { | 117 void testCompleteManySuccessHandlers() { |
| 118 final completer = new Completer<int>(); | 118 final completer = new Completer<int>(); |
| 119 final future = completer.future; | 119 final future = completer.future; |
| 120 int before; | 120 int before; |
| 121 int after1; | 121 int after1; |
| 122 int after2; | 122 int after2; |
| 123 | 123 |
| 124 var futures = []; | 124 var futures = <Future<int>>[]; |
| 125 futures.add(future.then((int v) { | 125 futures.add(future.then((int v) { |
| 126 before = v; | 126 before = v; |
| 127 })); | 127 })); |
| 128 completer.complete(3); | 128 completer.complete(3); |
| 129 futures.add(future.then((int v) { | 129 futures.add(future.then((int v) { |
| 130 after1 = v; | 130 after1 = v; |
| 131 })); | 131 })); |
| 132 futures.add(future.then((int v) { | 132 futures.add(future.then((int v) { |
| 133 after2 = v; | 133 after2 = v; |
| 134 })); | 134 })); |
| (...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 594 completer.future.then((v) { | 594 completer.future.then((v) { |
| 595 Expect.equals(42, v); | 595 Expect.equals(42, v); |
| 596 asyncEnd(); | 596 asyncEnd(); |
| 597 }); | 597 }); |
| 598 completer2.complete(42); | 598 completer2.complete(42); |
| 599 } | 599 } |
| 600 | 600 |
| 601 void testCompleteWithFutureSuccess2() { | 601 void testCompleteWithFutureSuccess2() { |
| 602 asyncStart(); | 602 asyncStart(); |
| 603 final completer = new Completer<int>(); | 603 final completer = new Completer<int>(); |
| 604 Future result = new Future.value(42); | 604 final result = new Future<int>.value(42); |
| 605 completer.complete(result); | 605 completer.complete(result); |
| 606 completer.future.then((v) { | 606 completer.future.then((v) { |
| 607 Expect.equals(42, v); | 607 Expect.equals(42, v); |
| 608 asyncEnd(); | 608 asyncEnd(); |
| 609 }); | 609 }); |
| 610 } | 610 } |
| 611 | 611 |
| 612 void testCompleteWithFutureError() { | 612 void testCompleteWithFutureError() { |
| 613 asyncStart(); | 613 asyncStart(); |
| 614 final completer = new Completer<int>(); | 614 final completer = new Completer<int>(); |
| 615 final completer2 = new Completer<int>(); | 615 final completer2 = new Completer<int>(); |
| 616 completer.complete(completer2.future); | 616 completer.complete(completer2.future); |
| 617 completer.future.then((v) { | 617 completer.future.then((v) { |
| 618 Expect.fail("Should not happen"); | 618 Expect.fail("Should not happen"); |
| 619 asyncEnd(); | 619 asyncEnd(); |
| 620 }, onError: (e) { | 620 }, onError: (e) { |
| 621 Expect.equals("ERROR-tcwfe", e); | 621 Expect.equals("ERROR-tcwfe", e); |
| 622 asyncEnd(); | 622 asyncEnd(); |
| 623 }); | 623 }); |
| 624 completer2.completeError("ERROR-tcwfe"); | 624 completer2.completeError("ERROR-tcwfe"); |
| 625 } | 625 } |
| 626 | 626 |
| 627 void testCompleteWithFutureError2() { | 627 void testCompleteWithFutureError2() { |
| 628 asyncStart(); | 628 asyncStart(); |
| 629 final completer = new Completer<int>(); | 629 final completer = new Completer<int>(); |
| 630 Future result = new Future.error("ERROR-tcwfe2"); | 630 var result = new Future<int>.error("ERROR-tcwfe2"); |
| 631 completer.complete(result); | 631 completer.complete(result); |
| 632 completer.future.then((v) { | 632 completer.future.then((v) { |
| 633 Expect.fail("Should not happen"); | 633 Expect.fail("Should not happen"); |
| 634 asyncEnd(); | 634 asyncEnd(); |
| 635 }, onError: (e) { | 635 }, onError: (e) { |
| 636 Expect.equals("ERROR-tcwfe2", e); | 636 Expect.equals("ERROR-tcwfe2", e); |
| 637 asyncEnd(); | 637 asyncEnd(); |
| 638 }); | 638 }); |
| 639 |
| 639 } | 640 } |
| 640 | 641 |
| 641 void testCompleteErrorWithFuture() { | 642 void testCompleteErrorWithFuture() { |
| 642 asyncStart(); | 643 asyncStart(); |
| 643 final completer = new Completer<int>(); | 644 final completer = new Completer<int>(); |
| 644 completer.completeError(new Future.value(42)); | 645 completer.completeError(new Future.value(42)); |
| 645 completer.future.then((_) { | 646 completer.future.then((_) { |
| 646 Expect.fail("Shouldn't happen"); | 647 Expect.fail("Shouldn't happen"); |
| 647 }, onError: (e, s) { | 648 }, onError: (e, s) { |
| 648 Future f = e; | 649 Future f = e; |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 769 } | 770 } |
| 770 | 771 |
| 771 void testWaitCleanUp() { | 772 void testWaitCleanUp() { |
| 772 asyncStart(); | 773 asyncStart(); |
| 773 // Creates three futures with different completion times, and where some fail. | 774 // Creates three futures with different completion times, and where some fail. |
| 774 // The `mask` specifies which futures fail (values 1-7), | 775 // The `mask` specifies which futures fail (values 1-7), |
| 775 // and `permute` defines the order of completion. values 0-5. | 776 // and `permute` defines the order of completion. values 0-5. |
| 776 void doTest(int mask, int permute) { | 777 void doTest(int mask, int permute) { |
| 777 asyncStart(); | 778 asyncStart(); |
| 778 String stringId = "waitCleanup-$mask-$permute"; | 779 String stringId = "waitCleanup-$mask-$permute"; |
| 779 List futures = new List(3); | 780 List<Future> futures = new List(3); |
| 780 List cleanup = new List(3); | 781 List cleanup = new List(3); |
| 781 int permuteTmp = permute; | 782 int permuteTmp = permute; |
| 782 for (int i = 0; i < 3; i++) { | 783 for (int i = 0; i < 3; i++) { |
| 783 bool throws = (mask & (1 << i)) != 0; | 784 bool throws = (mask & (1 << i)) != 0; |
| 784 var future = new Future.delayed(new Duration(milliseconds: 100 * (i + 1)), | 785 var future = new Future.delayed(new Duration(milliseconds: 100 * (i + 1)), |
| 785 () => (throws ? throw "Error $i($mask-$permute)" : i)); | 786 () => (throws ? throw "Error $i($mask-$permute)" : i)); |
| 786 int mod = 3 - i; | 787 int mod = 3 - i; |
| 787 int position = permuteTmp % mod; | 788 int position = permuteTmp % mod; |
| 788 permuteTmp = permuteTmp ~/ mod; | 789 permuteTmp = permuteTmp ~/ mod; |
| 789 while (futures[position] != null) position++; | 790 while (futures[position] != null) position++; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 814 void testWaitCleanUpEager() { | 815 void testWaitCleanUpEager() { |
| 815 asyncStart(); | 816 asyncStart(); |
| 816 // Creates three futures with different completion times, and where some fail. | 817 // Creates three futures with different completion times, and where some fail. |
| 817 // The `mask` specifies which futures fail (values 1-7), | 818 // The `mask` specifies which futures fail (values 1-7), |
| 818 // and `permute` defines the order of completion. values 0-5. | 819 // and `permute` defines the order of completion. values 0-5. |
| 819 void doTest(int mask, int permute) { | 820 void doTest(int mask, int permute) { |
| 820 asyncStart(); | 821 asyncStart(); |
| 821 asyncStart(); | 822 asyncStart(); |
| 822 bool done = false; | 823 bool done = false; |
| 823 String stringId = "waitCleanup-$mask-$permute"; | 824 String stringId = "waitCleanup-$mask-$permute"; |
| 824 List futures = new List(3); | 825 List<Future> futures = new List<Future>(3); |
| 825 List cleanup = new List(3); | 826 List cleanup = new List(3); |
| 826 int permuteTmp = permute; | 827 int permuteTmp = permute; |
| 827 for (int i = 0; i < 3; i++) { | 828 for (int i = 0; i < 3; i++) { |
| 828 bool throws = (mask & (1 << i)) != 0; | 829 bool throws = (mask & (1 << i)) != 0; |
| 829 var future = new Future.delayed(new Duration(milliseconds: 100 * (i + 1)), | 830 var future = new Future.delayed(new Duration(milliseconds: 100 * (i + 1)), |
| 830 () => (throws ? throw "Error $i($mask-$permute)" : i)); | 831 () => (throws ? throw "Error $i($mask-$permute)" : i)); |
| 831 int mod = 3 - i; | 832 int mod = 3 - i; |
| 832 int position = permuteTmp % mod; | 833 int position = permuteTmp % mod; |
| 833 permuteTmp = permuteTmp ~/ mod; | 834 permuteTmp = permuteTmp ~/ mod; |
| 834 while (futures[position] != null) position++; | 835 while (futures[position] != null) position++; |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 987 testType(name, future.whenComplete(() {}), depth - 1); | 988 testType(name, future.whenComplete(() {}), depth - 1); |
| 988 } | 989 } |
| 989 } | 990 } |
| 990 | 991 |
| 991 for (var value in [42, null]) { | 992 for (var value in [42, null]) { |
| 992 testType("Future($value)", new Future<int>(() => value)); | 993 testType("Future($value)", new Future<int>(() => value)); |
| 993 testType("Future.delayed($value)", | 994 testType("Future.delayed($value)", |
| 994 new Future<int>.delayed(Duration.ZERO, () => value)); | 995 new Future<int>.delayed(Duration.ZERO, () => value)); |
| 995 testType( | 996 testType( |
| 996 "Future.microtask($value)", new Future<int>.microtask(() => value)); | 997 "Future.microtask($value)", new Future<int>.microtask(() => value)); |
| 997 testType("Future.sync($value)", new Future<int>.sync(() => value)); //# 01:
ok | 998 testType( |
| 998 testType("Future.sync(future($value))", // //# 01:
continued | 999 "Future.sync($value)", new Future<int>.sync(() => value)); // #01: ok |
| 999 new Future<int>.sync(() => new Future<int>.value(value))); //# 01:
continued | 1000 testType( //# 01: continued |
| 1001 "Future.sync(future($value))", //# 01: continued |
| 1002 new Future<int>.sync(//# 01: continued |
| 1003 () => new Future<int>.value(value))); //# 01: continued |
| 1000 testType("Future.value($value)", new Future<int>.value(value)); | 1004 testType("Future.value($value)", new Future<int>.value(value)); |
| 1001 } | 1005 } |
| 1002 testType("Completer.future", new Completer<int>().future); | 1006 testType("Completer.future", new Completer<int>().future); |
| 1003 testType("Future.error", new Future<int>.error("ERR")..catchError((_) {})); | 1007 testType("Future.error", new Future<int>.error("ERR")..catchError((_) {})); |
| 1004 } | 1008 } |
| 1005 | 1009 |
| 1006 void testAnyValue() { | 1010 void testAnyValue() { |
| 1007 asyncStart(); | 1011 asyncStart(); |
| 1008 var cs = new List.generate(3, (_) => new Completer()); | 1012 var cs = new List.generate(3, (_) => new Completer()); |
| 1009 var result = Future.any(cs.map((x) => x.future)); | 1013 var result = Future.any(cs.map((x) => x.future)); |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1167 testAnyIgnoreIncomplete(); | 1171 testAnyIgnoreIncomplete(); |
| 1168 testAnyIgnoreError(); | 1172 testAnyIgnoreError(); |
| 1169 | 1173 |
| 1170 testFutureResult(); | 1174 testFutureResult(); |
| 1171 | 1175 |
| 1172 asyncEnd(); | 1176 asyncEnd(); |
| 1173 } | 1177 } |
| 1174 | 1178 |
| 1175 /// A well-behaved Future that isn't recognizable as a _Future. | 1179 /// A well-behaved Future that isn't recognizable as a _Future. |
| 1176 class CustomFuture<T> implements Future<T> { | 1180 class CustomFuture<T> implements Future<T> { |
| 1177 Future _realFuture; | 1181 Future<T> _realFuture; |
| 1178 CustomFuture(this._realFuture); | 1182 CustomFuture(this._realFuture); |
| 1179 Future then(action(result), {Function onError}) => | 1183 Future<S> then<S>(action(T result), {Function onError}) => |
| 1180 _realFuture.then(action, onError: onError); | 1184 _realFuture.then(action, onError: onError); |
| 1181 Future catchError(Function onError, {bool test(e)}) => | 1185 Future<T> catchError(Function onError, {bool test(e)}) => |
| 1182 _realFuture.catchError(onError, test: test); | 1186 _realFuture.catchError(onError, test: test); |
| 1183 Future whenComplete(action()) => _realFuture.whenComplete(action); | 1187 Future<T> whenComplete(action()) => _realFuture.whenComplete(action); |
| 1184 Future timeout(Duration timeLimit, {void onTimeout()}) => | 1188 Future<T> timeout(Duration timeLimit, {void onTimeout()}) => |
| 1185 _realFuture.timeout(timeLimit, onTimeout: onTimeout); | 1189 _realFuture.timeout(timeLimit, onTimeout: onTimeout); |
| 1186 Stream asStream() => _realFuture.asStream(); | 1190 Stream<T> asStream() => _realFuture.asStream(); |
| 1187 String toString() => "CustomFuture@${_realFuture.hashCode}"; | 1191 String toString() => "CustomFuture@${_realFuture.hashCode}"; |
| 1188 int get hashCode => _realFuture.hashCode; | 1192 int get hashCode => _realFuture.hashCode; |
| 1189 } | 1193 } |
| 1190 | 1194 |
| 1191 /// A bad future that throws on every method. | 1195 /// A bad future that throws on every method. |
| 1192 class BadFuture<T> implements Future<T> { | 1196 class BadFuture<T> implements Future<T> { |
| 1193 Future then(action(T result), {Function onError}) { | 1197 Future<S> then<S>(action(T result), {Function onError}) { |
| 1194 throw "then GOTCHA!"; | 1198 throw "then GOTCHA!"; |
| 1195 } | 1199 } |
| 1196 | 1200 |
| 1197 Future catchError(Function onError, {bool test(e)}) { | 1201 Future<T> catchError(Function onError, {bool test(Object e)}) { |
| 1198 throw "catch GOTCHA!"; | 1202 throw "catch GOTCHA!"; |
| 1199 } | 1203 } |
| 1200 | 1204 |
| 1201 Future whenComplete(action()) { | 1205 Future<T> whenComplete(action()) { |
| 1202 throw "finally GOTCHA!"; | 1206 throw "finally GOTCHA!"; |
| 1203 } | 1207 } |
| 1204 | 1208 |
| 1205 Stream<T> asStream() { | 1209 Stream<T> asStream() { |
| 1206 throw "asStream GOTCHA!"; | 1210 throw "asStream GOTCHA!"; |
| 1207 } | 1211 } |
| 1208 | 1212 |
| 1209 Future timeout(Duration duration, {onTimeout()}) { | 1213 Future<T> timeout(Duration duration, {onTimeout()}) { |
| 1210 throw "timeout GOTCHA!"; | 1214 throw "timeout GOTCHA!"; |
| 1211 } | 1215 } |
| 1212 } | 1216 } |
| 1213 | 1217 |
| 1214 // An evil future that completes with another future. | 1218 // An evil future that completes with another future. |
| 1215 class UglyFuture implements Future<dynamic> { | 1219 class UglyFuture implements Future<dynamic> { |
| 1216 final _result; | 1220 final _result; |
| 1217 UglyFuture(int badness) | 1221 UglyFuture(int badness) |
| 1218 : _result = (badness == 0) ? 42 : new UglyFuture(badness - 1); | 1222 : _result = (badness == 0) ? 42 : new UglyFuture(badness - 1); |
| 1219 Future then(action(value), {onError(error, StackTrace stack)}) { | 1223 Future<S> then<S>(action(value), {Function onError}) { |
| 1220 var c = new Completer(); | 1224 var c = new Completer(); |
| 1221 c.complete(new Future.microtask(() => action(_result))); | 1225 c.complete(new Future.microtask(() => action(_result))); |
| 1222 return c.future; | 1226 return c.future; |
| 1223 } | 1227 } |
| 1224 | 1228 |
| 1225 Future catchError(onError, {test}) => this; // Never an error. | 1229 Future catchError(onError, {test}) => this; // Never an error. |
| 1226 Future whenComplete(action()) { | 1230 Future whenComplete(action()) { |
| 1227 return new Future.microtask(action).then((_) => this); | 1231 return new Future.microtask(action).then((_) => this); |
| 1228 } | 1232 } |
| 1229 | 1233 |
| 1230 Stream asStream() { | 1234 Stream asStream() { |
| 1231 return (new StreamController() | 1235 return (new StreamController() |
| 1232 ..add(_result) | 1236 ..add(_result) |
| 1233 ..close()) | 1237 ..close()) |
| 1234 .stream; | 1238 .stream; |
| 1235 } | 1239 } |
| 1236 | 1240 |
| 1237 Future timeout(Duration duration, {onTimeout()}) { | 1241 Future timeout(Duration duration, {onTimeout()}) { |
| 1238 return this; | 1242 return this; |
| 1239 } | 1243 } |
| 1240 } | 1244 } |
| OLD | NEW |