Index: pkg/typed_mock/lib/typed_mock.dart |
diff --git a/pkg/analysis_server/test/typed_mock.dart b/pkg/typed_mock/lib/typed_mock.dart |
similarity index 81% |
rename from pkg/analysis_server/test/typed_mock.dart |
rename to pkg/typed_mock/lib/typed_mock.dart |
index d2b91dd9dc2f2e5d2017cfd4798e6ed54dbf502c..3cde9a69ab613442cdfee20f29aca4208a550758 100644 |
--- a/pkg/analysis_server/test/typed_mock.dart |
+++ b/pkg/typed_mock/lib/typed_mock.dart |
@@ -3,10 +3,28 @@ library typed_mock; |
_InvocationMatcher _lastMatcher; |
- |
/// Enables stubbing methods. |
-/// Use it when you want the mock to return particular value when particular |
-/// method is called. |
+/// |
+/// Use it when you want the mock to return a particular value when a particular |
+/// method, getter or setter is called. |
+/// |
+/// when(obj.testProperty).thenReturn(10); |
+/// expect(obj.testProperty, 10); // pass |
+/// |
+/// You can specify multiple matchers, which are checked one after another. |
+/// |
+/// when(obj.testMethod(anyInt)).thenReturn('was int'); |
+/// when(obj.testMethod(anyString)).thenReturn('was String'); |
+/// expect(obj.testMethod(42), 'was int'); // pass |
+/// expect(obj.testMethod('foo'), 'was String'); // pass |
+/// |
+/// You can even provide a function to calculate results. |
+/// Function can be also used to capture invocation arguments (if you test some |
+/// consumer). |
+/// |
+/// when(obj.testMethod(anyInt)).thenInvoke((int p) => 10 + p); |
+/// expect(obj.testMethod(1), 11); // pass |
+/// expect(obj.testMethod(5), 15); // pass |
Behavior when(_ignored) { |
try { |
var mock = _lastMatcher._mock; |
@@ -111,7 +129,7 @@ class _InvocationMatcher { |
for (int i = 0; i < _matchers.length; i++) { |
var matcher = _matchers[i]; |
var argument = arguments[i]; |
- if (!matcher.match(argument)) { |
+ if (!matcher.matches(argument)) { |
return false; |
} |
} |
@@ -138,6 +156,7 @@ class Behavior { |
bool _throwExceptionEnabled = false; |
var _throwException; |
+ /// Invokes the given [function] with actual arguments and returns its result. |
Behavior thenInvoke(Function function) { |
_reset(); |
_thenFunctionEnabled = true; |
@@ -145,6 +164,7 @@ class Behavior { |
return this; |
} |
+ /// Returns the specific value. |
Behavior thenReturn(value) { |
_reset(); |
_returnAlwaysEnabled = true; |
@@ -152,6 +172,8 @@ class Behavior { |
return this; |
} |
+ /// Returns values from the [list] starting from first to the last. |
+ /// If the end of list is reached a [StateError] is thrown. |
Behavior thenReturnList(List list) { |
_reset(); |
_returnListEnabled = true; |
@@ -160,6 +182,7 @@ class Behavior { |
return this; |
} |
+ /// Throws the specified [exception] object. |
Behavior thenThrow(exception) { |
_reset(); |
_throwExceptionEnabled = true; |
@@ -283,6 +306,17 @@ class Verifier { |
} |
+/// A class to extend mocks from. |
+/// It supports specifying behavior using [when] and validation of interactions |
+/// using [verify]. |
+/// |
+/// abstract class Name { |
+/// String get firstName; |
+/// String get lastName; |
+/// } |
+/// class NameMock extends TypedMock implements Name { |
+/// noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
+/// } |
class TypedMock { |
final Map<Symbol, List<_InvocationMatcher>> _matchersMap = {}; |
@@ -327,8 +361,11 @@ class TypedMock { |
} |
+/// [ArgumentMatcher] checks whether the given argument satisfies some |
+/// condition. |
abstract class ArgumentMatcher { |
- bool match(val); |
+ /// Checks whether this matcher accepts the given argument. |
+ bool matches(val); |
} |
@@ -338,11 +375,12 @@ class _ArgumentMatcher_equals extends ArgumentMatcher { |
_ArgumentMatcher_equals(this.expected); |
@override |
- bool match(val) { |
+ bool matches(val) { |
return val == expected; |
} |
} |
+/// Matches an argument that is equal to the given [expected] value. |
equals(expected) { |
return new _ArgumentMatcher_equals(expected); |
} |
@@ -350,39 +388,43 @@ equals(expected) { |
class _ArgumentMatcher_anyBool extends ArgumentMatcher { |
@override |
- bool match(val) { |
+ bool matches(val) { |
return val is bool; |
} |
} |
+/// Matches any [bool] value. |
final anyBool = new _ArgumentMatcher_anyBool(); |
class _ArgumentMatcher_anyInt extends ArgumentMatcher { |
@override |
- bool match(val) { |
+ bool matches(val) { |
return val is int; |
} |
} |
+/// Matches any [int] value. |
final anyInt = new _ArgumentMatcher_anyInt(); |
class _ArgumentMatcher_anyObject extends ArgumentMatcher { |
@override |
- bool match(val) { |
+ bool matches(val) { |
return true; |
} |
} |
+/// Matches any [Object] (or subclass) value. |
final anyObject = new _ArgumentMatcher_anyObject(); |
class _ArgumentMatcher_anyString extends ArgumentMatcher { |
@override |
- bool match(val) { |
+ bool matches(val) { |
return val is String; |
} |
} |
+/// Matches any [String] value. |
final anyString = new _ArgumentMatcher_anyString(); |