| // 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. | |
| import 'interfaces.dart'; | |
| import 'util.dart'; | |
| /// Returns a matcher which matches maps containing the given [value]. | |
| Matcher containsValue(Object? value) => _ContainsValue(value); | |
| class _ContainsValue extends Matcher { | |
| final Object? _value; | |
| const _ContainsValue(this._value); | |
| @override | |
| bool matches(Object? item, Map matchState) => | |
| // ignore: avoid_dynamic_calls | |
| (item as dynamic).containsValue(_value) as bool; | |
| @override | |
| Description describe(Description description) => | |
| description.add('contains value ').addDescriptionOf(_value); | |
| } | |
| /// Returns a matcher which matches maps containing the key-value pair | |
| /// with [key] => [valueOrMatcher]. | |
| Matcher containsPair(Object? key, Object? valueOrMatcher) => | |
| _ContainsMapping(key, wrapMatcher(valueOrMatcher)); | |
| class _ContainsMapping extends Matcher { | |
| final Object? _key; | |
| final Matcher _valueMatcher; | |
| const _ContainsMapping(this._key, this._valueMatcher); | |
| @override | |
| bool matches(Object? item, Map matchState) => | |
| // ignore: avoid_dynamic_calls | |
| ((item as dynamic).containsKey(_key) as bool) && | |
| _valueMatcher.matches((item as dynamic)[_key], matchState); | |
| @override | |
| Description describe(Description description) { | |
| return description | |
| .add('contains pair ') | |
| .addDescriptionOf(_key) | |
| .add(' => ') | |
| .addDescriptionOf(_valueMatcher); | |
| } | |
| @override | |
| Description describeMismatch( | |
| Object? item, | |
| Description mismatchDescription, | |
| Map matchState, | |
| bool verbose, | |
| ) { | |
| // ignore: avoid_dynamic_calls | |
| if (!((item as dynamic).containsKey(_key) as bool)) { | |
| return mismatchDescription | |
| .add(" doesn't contain key ") | |
| .addDescriptionOf(_key); | |
| } else { | |
| mismatchDescription | |
| .add(' contains key ') | |
| .addDescriptionOf(_key) | |
| .add(' but with value '); | |
| _valueMatcher.describeMismatch( | |
| (item as dynamic)[_key], | |
| mismatchDescription, | |
| matchState, | |
| verbose, | |
| ); | |
| return mismatchDescription; | |
| } | |
| } | |
| } |