54 lines
1.6 KiB
Dart
54 lines
1.6 KiB
Dart
import 'package:matcher/matcher.dart';
|
|
|
|
/// Returns a [ContextAwareMatcher] for the given predicate.
|
|
ContextAwareMatcher predicateWithContext(
|
|
bool Function(Object, String, Map, Map) f,
|
|
[String description = 'satisfies function']) {
|
|
return _PredicateWithContext(f, description);
|
|
}
|
|
|
|
/// Wraps [x] in a [ContextAwareMatcher].
|
|
ContextAwareMatcher wrapContextAwareMatcher(x) {
|
|
if (x is ContextAwareMatcher) {
|
|
return x;
|
|
} else if (x is Matcher) {
|
|
return _WrappedContextAwareMatcher(x);
|
|
}
|
|
return wrapContextAwareMatcher(wrapMatcher(x));
|
|
}
|
|
|
|
/// A special [Matcher] that is aware of the context in which it is being executed.
|
|
abstract class ContextAwareMatcher extends Matcher {
|
|
bool matchesWithContext(item, String key, Map context, Map matchState);
|
|
|
|
@override
|
|
bool matches(item, Map matchState) => true;
|
|
}
|
|
|
|
class _WrappedContextAwareMatcher extends ContextAwareMatcher {
|
|
final Matcher matcher;
|
|
|
|
_WrappedContextAwareMatcher(this.matcher);
|
|
|
|
@override
|
|
Description describe(Description description) =>
|
|
matcher.describe(description);
|
|
|
|
@override
|
|
bool matchesWithContext(item, String key, Map context, Map matchState) =>
|
|
matcher.matches(item, matchState);
|
|
}
|
|
|
|
class _PredicateWithContext extends ContextAwareMatcher {
|
|
final bool Function(Object, String, Map, Map) f;
|
|
final String desc;
|
|
|
|
_PredicateWithContext(this.f, this.desc);
|
|
|
|
@override
|
|
Description describe(Description description) => description.add(desc);
|
|
|
|
@override
|
|
bool matchesWithContext(item, String key, Map context, Map matchState) =>
|
|
f(item as Object, key, context, matchState);
|
|
}
|