matches method

  1. @override
bool matches(
  1. dynamic className,
  2. Map matchState
)

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