Chromium Code Reviews| Index: lib/unittest/operator_matchers.dart |
| =================================================================== |
| --- lib/unittest/operator_matchers.dart (revision 0) |
| +++ lib/unittest/operator_matchers.dart (revision 0) |
| @@ -0,0 +1,176 @@ |
| +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| +// for details. All rights reserved. Use of this source code is governed by a |
| +// BSD-style license that can be found in the LICENSE file. |
| + |
| +/** |
| + * This returns a matcher that inverts [matcher] to its logical negation. |
| + */ |
| +IMatcher isNot(matcher) => new _IsNot(wrapMatcher(matcher)); |
| + |
| +class _IsNot extends Matcher { |
| + final IMatcher _matcher; |
| + |
| + const _IsNot(IMatcher this._matcher); |
| + |
| + bool matches(item) => !_matcher.matches(item); |
| + |
| + IDescription describe(IDescription description) => |
| + description.add('not ').addDescriptionOf(_matcher); |
| +} |
| + |
| +/** |
| + * This returns a matcher that matches if all of the matchers passed as |
| + * arguments (up to 7) match. Instead of passing the matchers separately |
| + * they can be passed as a single List argument. |
| + * Any argument that is not a matcher is implicitly wrapped in a |
| + * Matcher to check for equality. |
| +*/ |
| +IMatcher allOf(arg0, |
| + [arg1 = null, |
| + arg2 = null, |
| + arg3 = null, |
| + arg4 = null, |
| + arg5 = null, |
| + arg6 = null]) { |
| + if (arg0 is List) { |
| + expect(arg1, isNull); |
| + expect(arg2, isNull); |
| + expect(arg3, isNull); |
| + expect(arg4, isNull); |
| + expect(arg5, isNull); |
| + expect(arg6, isNull); |
| + for (int i = 0; i < arg0.length; i++) { |
| + arg0[i] = wrapMatcher(arg0[i]); |
| + } |
| + return new _AllOf(arg0); |
| + } else { |
| + List matchers = new List(); |
| + if (arg0 != null) { |
| + matchers.add(arg0); |
| + } |
| + if (arg1 != null) { |
| + matchers.add(arg1); |
| + } |
| + if (arg2 != null) { |
| + matchers.add(arg2); |
| + } |
| + if (arg3 != null) { |
| + matchers.add(arg3); |
| + } |
| + if (arg4 != null) { |
| + matchers.add(arg4); |
| + } |
| + if (arg5 != null) { |
| + matchers.add(arg5); |
| + } |
| + if (arg6 != null) { |
| + matchers.add(arg6); |
| + } |
| + return new _AllOf(matchers); |
| + } |
| +} |
| + |
| +class _AllOf extends Matcher { |
| + final Iterable<IMatcher> _matchers; |
| + |
| + const _AllOf(this._matchers); |
| + |
| + bool matches(item) { |
| + for (var matcher in _matchers) { |
| + if (!matcher.matches(item)) { |
| + return false; |
| + } |
| + } |
| + return true; |
| + } |
| + |
| + IDescription describeMismatch(item, IDescription mismatchDescription) { |
| + for (var matcher in _matchers) { |
| + if (!matcher.matches(item)) { |
| + mismatchDescription.addDescriptionOf(matcher).add(' '); |
| + matcher.describeMismatch(item, mismatchDescription); |
| + break; |
| + } |
| + } |
| + return mismatchDescription; |
| + } |
| + |
| + IDescription describe(IDescription description) => |
| + description.addList('(', ' and ', ')', _matchers); |
| +} |
| + |
| +/** |
| + * Matches if any of the given matchers evaluate to true. The |
| + * arguments can be a set of matchers as separate parameters |
| + * (up to 7), or a List of matchers. |
| + * |
| + * The matchers are evaluated from left to right using short-circuit |
| + * evaluation, so evaluation stops as soon as a matcher returns true. |
| + * |
| + * Any argument that is not a matcher is implicitly wrapped in a |
| + * Matcher to check for equality. |
| +*/ |
| + |
| +IMatcher anyOf(arg0, |
| + [arg1 = null, |
| + arg2 = null, |
| + arg3 = null, |
| + arg4 = null, |
| + arg5 = null, |
| + arg6 = null]) { |
| + if (arg0 is List) { |
| + expect(arg1, isNull); |
|
Bob Nystrom
2012/06/01 18:22:23
This does look pretty nice. I like the new API you
gram
2012/06/01 22:22:00
Done.
|
| + expect(arg2, isNull); |
| + expect(arg3, isNull); |
| + expect(arg4, isNull); |
| + expect(arg5, isNull); |
| + expect(arg6, isNull); |
| + for (int i = 0; i < arg0.length; i++) { |
| + arg0[i] = wrapMatcher(arg0[i]); |
| + } |
| + return new _AnyOf(arg0); |
| + } else { |
| + List matchers = new List(); |
| + if (arg0 != null) { |
| + matchers.add(arg0); |
| + } |
| + if (arg1 != null) { |
| + matchers.add(arg1); |
| + } |
| + if (arg2 != null) { |
| + matchers.add(arg2); |
| + } |
| + if (arg3 != null) { |
| + matchers.add(arg3); |
| + } |
| + if (arg4 != null) { |
| + matchers.add(arg4); |
| + } |
| + if (arg5 != null) { |
| + matchers.add(arg5); |
| + } |
| + if (arg6 != null) { |
| + matchers.add(arg6); |
| + } |
| + return new _AnyOf(matchers); |
| + } |
| +} |
| + |
| +class _AnyOf extends Matcher { |
| + final Iterable<IMatcher> _matchers; |
| + |
| + const _AnyOf(this._matchers); |
| + |
| + bool matches(item) { |
| + for (var matcher in _matchers) { |
| + if (matcher.matches(item)) { |
| + return true; |
| + } |
| + } |
| + return false; |
| + } |
| + |
| + IDescription describe(IDescription description) => |
| + description.addList('(', ' or ', ')', _matchers); |
| +} |
| + |