in lib/src/iterable_matchers.dart [154:194]
String? _test(List values) {
// Check the lengths are the same.
if (_expected.length > values.length) {
return 'has too few elements (${values.length} < ${_expected.length})';
} else if (!_allowUnmatchedValues && _expected.length < values.length) {
return 'has too many elements (${values.length} > ${_expected.length})';
}
var edges = List.generate(values.length, (_) => <int>[], growable: false);
for (var v = 0; v < values.length; v++) {
for (var m = 0; m < _expected.length; m++) {
if (_expected[m].matches(values[v], {})) {
edges[v].add(m);
}
}
}
// The index into `values` matched with each matcher or `null` if no value
// has been matched yet.
var matched = List<int?>.filled(_expected.length, null);
for (var valueIndex = 0; valueIndex < values.length; valueIndex++) {
_findPairing(edges, valueIndex, matched);
}
for (var matcherIndex = 0;
matcherIndex < _expected.length;
matcherIndex++) {
if (matched[matcherIndex] == null) {
final description = StringDescription()
.add('has no match for ')
.addDescriptionOf(_expected[matcherIndex])
.add(' at index $matcherIndex');
final remainingUnmatched =
matched.sublist(matcherIndex + 1).where((m) => m == null).length;
return remainingUnmatched == 0
? description.toString()
: description
.add(' along with $remainingUnmatched other unmatched')
.toString();
}
}
return null;
}