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

Unified Diff: lib/unittest/mock.dart

Issue 10694146: Added ability to disable logging in mocks, to avoid the memory overhead if you don't need behavior … (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « lib/unittest/expect.dart ('k') | lib/unittest/unittest.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/unittest/mock.dart
===================================================================
--- lib/unittest/mock.dart (revision 9570)
+++ lib/unittest/mock.dart (working copy)
@@ -12,7 +12,7 @@
var description = new StringDescription();
description.add('Expected ${signature} ').addDescriptionOf(matcher).
add('\n but: ');
- matcher.describeMismatch(actual, description);
+ matcher.describeMismatch(actual, description).add('.');
return description.toString();
}
@@ -156,7 +156,7 @@
return false;
}
if (arguments.length < argMatchers.length) {
- throw new Exception("Less arguments than matchers for $method");
+ throw new Exception("Less arguments than matchers for $method.");
}
for (var i = 0; i < argMatchers.length; i++) {
if (!argMatchers[i].matches(arguments[i])) {
@@ -728,22 +728,33 @@
/** The mock name. Needed if the log is shared; optional otherwise. */
final String name;
- /** The set of [behavior]s supported. */
- Map<String,Behavior> behaviors;
+ /** The set of [Behavior]s supported. */
+ Map<String,Behavior> _behaviors;
/** The [log] of calls made. Only used if [name] is null. */
LogEntryList log;
/** How to handle unknown method calls - swallow or throw. */
- final bool throwIfNoBehavior = false;
+ final bool _throwIfNoBehavior;
+ /** Whether to create an audit log or not. */
+ bool _logging;
+
+ bool get logging() => _logging;
+ bool set logging(bool value) {
+ if (value && log == null) {
+ log = new LogEntryList();
+ }
+ _logging = value;
+ }
+
/**
* Default constructor. Unknown method calls are allowed and logged,
* the mock has no name, and has its own log.
*/
- Mock() : throwIfNoBehavior = false, name = null {
- log = new LogEntryList();
- behaviors = new Map<String,Behavior>();
+ Mock() : _throwIfNoBehavior = false, log = null, name = null {
+ logging = true;
+ _behaviors = new Map<String,Behavior>();
}
/**
@@ -751,14 +762,15 @@
* a shared [log]. If [throwIfNoBehavior] is true, any calls to methods
* that have no defined behaviors will throw an exception; otherwise they
* will be allowed and logged (but will not do anything).
+ * If [enableLogging] is false, no logging will be done initially (whether
+ * or not a [log] is supplied), but [logging] can be set to true later.
*/
Mock.custom([this.name,
this.log,
- this.throwIfNoBehavior = false]) {
- if (log == null) {
- log = new LogEntryList();
- }
- behaviors = new Map<String,Behavior>();
+ throwIfNoBehavior = false,
+ enableLogging = true]) : _throwIfNoBehavior = throwIfNoBehavior {
+ logging = enableLogging;
+ _behaviors = new Map<String,Behavior>();
}
/**
@@ -772,12 +784,12 @@
*/
Behavior when(CallMatcher logFilter) {
String key = logFilter.toString();
- if (!behaviors.containsKey(key)) {
+ if (!_behaviors.containsKey(key)) {
Behavior b = new Behavior(logFilter);
- behaviors[key] = b;
+ _behaviors[key] = b;
return b;
} else {
- return behaviors[key];
+ return _behaviors[key];
}
}
@@ -793,8 +805,8 @@
method = 'get ${method.substring(4)}';
}
bool matchedMethodName = false;
- for (String k in behaviors.getKeys()) {
- Behavior b = behaviors[k];
+ for (String k in _behaviors.getKeys()) {
+ Behavior b = _behaviors[k];
if (b.matcher.nameFilter.matches(method)) {
matchedMethodName = true;
}
@@ -816,10 +828,14 @@
_Action action = response.action;
var value = response.value;
if (action == _Action.RETURN) {
- log.add(new LogEntry(name, method, args, action, value));
+ if (_logging) {
+ log.add(new LogEntry(name, method, args, action, value));
+ }
return value;
} else if (action == _Action.THROW) {
- log.add(new LogEntry(name, method, args, action, value));
+ if (_logging) {
+ log.add(new LogEntry(name, method, args, action, value));
+ }
throw value;
} else if (action == _Action.PROXY) {
var rtn;
@@ -864,9 +880,11 @@
break;
default:
throw new Exception(
- "Cannot proxy calls with more than 10 parameters");
+ "Cannot proxy calls with more than 10 parameters.");
}
- log.add(new LogEntry(name, method, args, action, rtn));
+ if (_logging) {
+ log.add(new LogEntry(name, method, args, action, rtn));
+ }
return rtn;
}
}
@@ -875,18 +893,28 @@
// User did specify behavior for this method, but all the
// actions are exhausted. This is considered an error.
throw new Exception('No more actions for method '
- '${_qualifiedName(name, method)}');
- } else if (throwIfNoBehavior) {
+ '${_qualifiedName(name, method)}.');
+ } else if (_throwIfNoBehavior) {
throw new Exception('No behavior specified for method '
- '${_qualifiedName(name, method)}');
+ '${_qualifiedName(name, method)}.');
}
- // User hasn't specified behavior for this method; we don't throw
+ // Otherwise user hasn't specified behavior for this method; we don't throw
// so we can underspecify.
- log.add(new LogEntry(name, method, args, _Action.IGNORE));
+ if (_logging) {
+ log.add(new LogEntry(name, method, args, _Action.IGNORE));
+ }
}
/** [verifyZeroInteractions] returns true if no calls were made */
- bool verifyZeroInteractions() => log.logs.length == 0;
+ bool verifyZeroInteractions() {
+ if (log == null) {
+ // This means we created the mock with logging off and have never turned
+ // it on, so it doesn't make sense to verify behavior on such a mock.
+ throw new
+ Exception("Can't verify behavior when logging was never enabled.");
+ }
+ return log.logs.length == 0;
+ }
/**
* [getLogs] extracts all calls from the call log that match the
@@ -904,6 +932,13 @@
LogEntryList getLogs([CallMatcher logFilter,
Matcher actionMatcher,
bool destructive = false]) {
- return log.getMatches(name, logFilter, actionMatcher, destructive);
+ if (log == null) {
+ // This means we created the mock with logging off and have never turned
+ // it on, so it doesn't make sense to get logs from such a mock.
+ throw new
+ Exception("Can't retrieve logs when logging was never enabled.");
+ } else {
+ return log.getMatches(name, logFilter, actionMatcher, destructive);
+ }
}
}
« no previous file with comments | « lib/unittest/expect.dart ('k') | lib/unittest/unittest.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698