// 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; } } }