matches method
Does the matching of the actual vs expected values.
item
is the actual value. matchState
can be supplied
and may be used to add details about the mismatch that are too
costly to determine in describeMismatch.
Implementation
@override
bool matches(className, Map matchState) {
// There's a bug in DDC where, though the docs say `className` should
// return `String`, it will return `AnimatedString` for `SvgElement`s. See
// https://github.com/dart-lang/sdk/issues/36200.
String? castClassName;
if (className is String) {
castClassName = className;
} else if (className is AnimatedString) {
castClassName = className.baseVal;
} else {
throw ArgumentError.value(className, 'Must be a string type');
}
Iterable actualClasses = getClassIterable(castClassName);
Set missingClasses = expectedClasses.difference(actualClasses.toSet());
Set unwantedClasses = unexpectedClasses.intersection(actualClasses.toSet());
// Calculate extraneous classes with Lists instead of Sets, to catch duplicates in actualClasses.
List expectedClassList = expectedClasses.toList();
List extraneousClasses = actualClasses
.where((className) => !expectedClassList.remove(className))
.toList();
matchState.addAll({
'missingClasses': missingClasses,
'unwantedClasses': unwantedClasses,
'extraneousClasses': extraneousClasses
});
if (allowExtraneous) {
return missingClasses.isEmpty && unwantedClasses.isEmpty;
} else {
return missingClasses.isEmpty && extraneousClasses.isEmpty;
}
}