Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(48)

Side by Side Diff: tests/lib/async/future_test.dart

Issue 815773002: Add cleanUp function to Future.wait. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: More test Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« sdk/lib/async/future.dart ('K') | « sdk/lib/async/future.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 731 matching lines...) Expand 10 before | Expand all | Expand 10 after
742 final future = new Future<int>.sync(() { 742 final future = new Future<int>.sync(() {
743 return new Future<int>.value(42); 743 return new Future<int>.value(42);
744 }); 744 });
745 745
746 future.then((int val) { 746 future.then((int val) {
747 Expect.equals(val, 42); 747 Expect.equals(val, 42);
748 asyncEnd(); 748 asyncEnd();
749 }); 749 });
750 } 750 }
751 751
752 void testWaitCleanUp() {
753 asyncStart();
754 // Creates three futures with different completion times, and where some fail.
755 // The `mask` specifies which futures fail (values 1-7),
756 // and `permute` defines the order of completion. values 0-5.
757 void doTest(int mask, int permute) {
758 asyncStart();
759 String stringId = "waitCleanup-$mask-$permute";
760 List futures = new List(3);
761 List cleanup = new List(3);
762 int permuteTmp = permute;
763 for (int i = 0; i < 3; i++) {
764 bool throws = (mask & (1 << i)) != 0;
765 var future = new Future.delayed(
766 new Duration(milliseconds: 100 * (i + 1)),
767 () => (throws ? throw "Error $i($mask-$permute)" : i));
768 int mod = 3 - i;
769 int position = permuteTmp % mod;
770 permuteTmp = permuteTmp ~/ mod;
771 while (futures[position] != null) position++;
772 futures[position] = future;
773 cleanup[i] = throws;
774 }
775 void cleanUp(index) {
Søren Gjesse 2015/01/09 10:04:11 Check that cleanup[index] is false.
Lasse Reichstein Nielsen 2015/01/09 10:52:09 Done.
776 cleanup[index] = true;
777 }
778 Future.wait(futures, cleanUp: cleanUp)
Søren Gjesse 2015/01/09 10:04:11 Maybe also test with eager error.
Lasse Reichstein Nielsen 2015/01/09 10:52:09 Done.
779 .then((_) { Expect.fail("No error: $stringId"); },
780 onError: (e, s) {
Søren Gjesse 2015/01/09 10:04:11 Wouldnt it read better if you use catchError here?
Lasse Reichstein Nielsen 2015/01/09 10:52:09 It would be wrong, even if it might read better. T
781 Expect.listEquals([true, true, true], cleanup);
782 asyncEnd();
783 });
784 }
785
786 for (int i = 1; i < 8; i++) {
787 for (int j = 0; j < 6; j++) {
788 doTest(i, j);
789 }
790 }
791 asyncEnd();
792 }
793
794 void testWaitCleanUpError() {
795 var cms = const Duration(milliseconds: 100);
796 var cleanups = new List.filled(3, false);
797 var uncaughts = new List.filled(3, false);
798 asyncStart();
799 asyncStart();
800 asyncStart();
801 runZoned(() {
802 Future.wait([new Future.delayed(cms, () => 0),
803 new Future.delayed(cms * 2, ()=> throw 1),
804 new Future.delayed(cms * 3, () => 2)],
805 cleanUp: (index) {
806 Expect.isTrue(index == 0 || index == 2, "$index");
807 Expect.isFalse(cleanups[index]);
808 cleanups[index] = true;
809 throw index;
810 })
811 .catchError((e) {
812 Expect.equals(e, 1);
813 asyncEnd();
814 });
815
816 }, onError: (int index, s) {
817 Expect.isTrue(index == 0 || index == 2, "$index");
818 Expect.isFalse(uncaughts[index]);
819 uncaughts[index] = true;
820 asyncEnd();
821 });
822 }
823
752 main() { 824 main() {
753 asyncStart(); 825 asyncStart();
754 826
755 testValue(); 827 testValue();
756 testSync(); 828 testSync();
757 testNeverComplete(); 829 testNeverComplete();
758 830
759 testComplete(); 831 testComplete();
760 testCompleteWithSuccessHandlerBeforeComplete(); 832 testCompleteWithSuccessHandlerBeforeComplete();
761 testCompleteWithSuccessHandlerAfterComplete(); 833 testCompleteWithSuccessHandlerAfterComplete();
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
798 testFutureCatchThrowsAsync(); 870 testFutureCatchThrowsAsync();
799 testFutureWhenThrowsAsync(); 871 testFutureWhenThrowsAsync();
800 testFutureCatchRethrowsAsync(); 872 testFutureCatchRethrowsAsync();
801 873
802 testChainedFutureValue(); 874 testChainedFutureValue();
803 testChainedFutureValueDelay(); 875 testChainedFutureValueDelay();
804 testChainedFutureError(); 876 testChainedFutureError();
805 877
806 testSyncFuture_i13368(); 878 testSyncFuture_i13368();
807 879
880 testWaitCleanUp();
881 testWaitCleanUpError();
882
808 asyncEnd(); 883 asyncEnd();
809 } 884 }
810 885
811 /// A Future that isn't recognizable as a _Future. 886 /// A Future that isn't recognizable as a _Future.
812 class CustomFuture<T> implements Future<T> { 887 class CustomFuture<T> implements Future<T> {
813 Future _realFuture; 888 Future _realFuture;
814 CustomFuture(this._realFuture); 889 CustomFuture(this._realFuture);
815 Future then(action(result), {Function onError}) => 890 Future then(action(result), {Function onError}) =>
816 _realFuture.then(action, onError: onError); 891 _realFuture.then(action, onError: onError);
817 Future catchError(Function onError, {bool test(e)}) => 892 Future catchError(Function onError, {bool test(e)}) =>
818 _realFuture.catchError(onError, test: test); 893 _realFuture.catchError(onError, test: test);
819 Future whenComplete(action()) => _realFuture.whenComplete(action); 894 Future whenComplete(action()) => _realFuture.whenComplete(action);
820 Future timeout(Duration timeLimit, {void onTimeout()}) => 895 Future timeout(Duration timeLimit, {void onTimeout()}) =>
821 _realFuture.timeout(timeLimit, onTimeout: onTimeout); 896 _realFuture.timeout(timeLimit, onTimeout: onTimeout);
822 Stream asStream() => _realFuture.asStream(); 897 Stream asStream() => _realFuture.asStream();
823 String toString() => "CustomFuture@${_realFuture.hashCode}"; 898 String toString() => "CustomFuture@${_realFuture.hashCode}";
824 int get hashCode => _realFuture.hashCode; 899 int get hashCode => _realFuture.hashCode;
825 } 900 }
OLDNEW
« sdk/lib/async/future.dart ('K') | « sdk/lib/async/future.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698