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

Side by Side Diff: lib/src/frontend/expect_async.dart

Issue 1159923010: Use the Zone API for registerException. (Closed) Base URL: git@github.com:dart-lang/test@master
Patch Set: more changes Created 5 years, 6 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
OLDNEW
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 library test.frontend.expect_async; 5 library test.frontend.expect_async;
6 6
7 import 'dart:async';
8
7 import '../backend/invoker.dart'; 9 import '../backend/invoker.dart';
8 import '../backend/state.dart'; 10 import '../backend/state.dart';
9 import 'expect.dart'; 11 import 'expect.dart';
10 12
11 /// An object used to detect unpassed arguments. 13 /// An object used to detect unpassed arguments.
12 const _PLACEHOLDER = const Object(); 14 const _PLACEHOLDER = const Object();
13 15
14 // Functions used to check how many arguments a callback takes. 16 // Functions used to check how many arguments a callback takes.
15 typedef _Func0(); 17 typedef _Func0();
16 typedef _Func1(a); 18 typedef _Func1(a);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 61
60 /// An optional description of why the function is expected to be called. 62 /// An optional description of why the function is expected to be called.
61 /// 63 ///
62 /// If not passed, this will be an empty string. 64 /// If not passed, this will be an empty string.
63 final String _reason; 65 final String _reason;
64 66
65 /// The number of times the function has been called. 67 /// The number of times the function has been called.
66 int _actualCalls = 0; 68 int _actualCalls = 0;
67 69
68 /// The test invoker in which this function was wrapped. 70 /// The test invoker in which this function was wrapped.
69 final Invoker _invoker; 71 Invoker get _invoker => _zone[#test.invoker];
72
73 /// The zone in which this function was wrapped.
74 final Zone _zone;
70 75
71 /// Whether this function has been called the requisite number of times. 76 /// Whether this function has been called the requisite number of times.
72 bool _complete; 77 bool _complete;
73 78
74 /// Wraps [callback] in a function that asserts that it's called at least 79 /// Wraps [callback] in a function that asserts that it's called at least
75 /// [minExpected] times and no more than [maxExpected] times. 80 /// [minExpected] times and no more than [maxExpected] times.
76 /// 81 ///
77 /// If passed, [id] is used as a descriptive name fo the function and [reason] 82 /// If passed, [id] is used as a descriptive name fo the function and [reason]
78 /// as a reason it's expected to be called. If [isDone] is passed, the test 83 /// as a reason it's expected to be called. If [isDone] is passed, the test
79 /// won't be allowed to complete until it returns `true`. 84 /// won't be allowed to complete until it returns `true`.
80 _ExpectedFunction(Function callback, int minExpected, int maxExpected, 85 _ExpectedFunction(Function callback, int minExpected, int maxExpected,
81 {String id, String reason, bool isDone()}) 86 {String id, String reason, bool isDone()})
82 : this._callback = callback, 87 : this._callback = callback,
83 _minExpectedCalls = minExpected, 88 _minExpectedCalls = minExpected,
84 _maxExpectedCalls = (maxExpected == 0 && minExpected > 0) 89 _maxExpectedCalls = (maxExpected == 0 && minExpected > 0)
85 ? minExpected 90 ? minExpected
86 : maxExpected, 91 : maxExpected,
87 this._isDone = isDone, 92 this._isDone = isDone,
88 this._reason = reason == null ? '' : '\n$reason', 93 this._reason = reason == null ? '' : '\n$reason',
89 this._invoker = Invoker.current, 94 this._zone = Zone.current,
90 this._id = _makeCallbackId(id, callback) { 95 this._id = _makeCallbackId(id, callback) {
91 if (_invoker == null) { 96 if (_invoker == null) {
92 throw new StateError("[expectAsync] was called outside of a test."); 97 throw new StateError("[expectAsync] was called outside of a test.");
93 } else if (maxExpected > 0 && minExpected > maxExpected) { 98 } else if (maxExpected > 0 && minExpected > maxExpected) {
94 throw new ArgumentError("max ($maxExpected) may not be less than count " 99 throw new ArgumentError("max ($maxExpected) may not be less than count "
95 "($minExpected)."); 100 "($minExpected).");
96 } 101 }
97 102
98 if (isDone != null || minExpected > 0) { 103 if (isDone != null || minExpected > 0) {
99 _invoker.addOutstandingCallback(); 104 _invoker.addOutstandingCallback();
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
171 _invoker.liveTest.state.result == Result.success) { 176 _invoker.liveTest.state.result == Result.success) {
172 throw 'Callback ${_id}called ($_actualCalls) after test case ' 177 throw 'Callback ${_id}called ($_actualCalls) after test case '
173 '${_invoker.liveTest.test.name} had already completed.$_reason'; 178 '${_invoker.liveTest.test.name} had already completed.$_reason';
174 } else if (_maxExpectedCalls >= 0 && _actualCalls > _maxExpectedCalls) { 179 } else if (_maxExpectedCalls >= 0 && _actualCalls > _maxExpectedCalls) {
175 throw new TestFailure('Callback ${_id}called more times than expected ' 180 throw new TestFailure('Callback ${_id}called more times than expected '
176 '($_maxExpectedCalls).$_reason'); 181 '($_maxExpectedCalls).$_reason');
177 } 182 }
178 183
179 return Function.apply(_callback, args.toList()); 184 return Function.apply(_callback, args.toList());
180 } catch (error, stackTrace) { 185 } catch (error, stackTrace) {
181 _invoker.handleError(error, stackTrace); 186 _zone.handleUncaughtError(error, stackTrace);
182 return null; 187 return null;
183 } finally { 188 } finally {
184 _afterRun(); 189 _afterRun();
185 } 190 }
186 } 191 }
187 192
188 /// After each time the function is run, check to see if it's complete. 193 /// After each time the function is run, check to see if it's complete.
189 void _afterRun() { 194 void _afterRun() {
190 if (_complete) return; 195 if (_complete) return;
191 if (_minExpectedCalls > 0 && _actualCalls < _minExpectedCalls) return; 196 if (_minExpectedCalls > 0 && _actualCalls < _minExpectedCalls) return;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 /// true will the callback be considered complete. [callback] may take up to six 230 /// true will the callback be considered complete. [callback] may take up to six
226 /// optional or required positional arguments; named arguments are not 231 /// optional or required positional arguments; named arguments are not
227 /// supported. 232 /// supported.
228 /// 233 ///
229 /// Both [id] and [reason] are optional and provide extra information about the 234 /// Both [id] and [reason] are optional and provide extra information about the
230 /// callback when debugging. [id] should be the name of the callback, while 235 /// callback when debugging. [id] should be the name of the callback, while
231 /// [reason] should be the reason the callback is expected to be called. 236 /// [reason] should be the reason the callback is expected to be called.
232 Function expectAsyncUntil(Function callback, bool isDone(), 237 Function expectAsyncUntil(Function callback, bool isDone(),
233 {String id, String reason}) => new _ExpectedFunction(callback, 0, -1, 238 {String id, String reason}) => new _ExpectedFunction(callback, 0, -1,
234 id: id, reason: reason, isDone: isDone).func; 239 id: id, reason: reason, isDone: isDone).func;
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698