Skip to content

Commit

Permalink
Fix a type error that occurs comparing two large maps with `deepEqual…
Browse files Browse the repository at this point in the history
…s`. (#2442)

Closes #2442

Avoid inference forcing a `List<Iterable<String>>` which
results in a type error inserting a range into a list requiring
`List<String>`. Add a test for collection truncating which
would have failed with a type error before this fix.
  • Loading branch information
matanlurey authored Jan 17, 2025
1 parent b5bfba5 commit 073ef8b
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 2 deletions.
2 changes: 2 additions & 0 deletions pkgs/checks/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
- Add `containsMatchingInOrder` and `containsEqualInOrder` to replace the
combined functionality in `containsInOrder`.
- Replace `pairwiseComparesTo` with `pairwiseMatches`.
- Fix a bug where printing the result of a failed deep quality check would
fail with a `TypeError` when comparing large `Map` instances
- Increase SDK constraint to ^3.5.0.

## 0.3.0
Expand Down
5 changes: 3 additions & 2 deletions pkgs/checks/lib/src/describe.dart
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,10 @@ Iterable<String> _prettyPrint(
Iterable<String> _prettyPrintCollection(
String open, String close, List<Iterable<String>> elements, int maxLength) {
if (elements.length > _maxItems) {
elements.replaceRange(_maxItems - 1, elements.length, [
const ellipsisElement = [
['...']
]);
];
elements.replaceRange(_maxItems - 1, elements.length, ellipsisElement);
}
if (elements.every((e) => e.length == 1)) {
final singleLine = '$open${elements.map((e) => e.single).join(', ')}$close';
Expand Down
30 changes: 30 additions & 0 deletions pkgs/checks/test/pretty_print_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// Copyright (c) 2025, 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 'package:checks/checks.dart';
import 'package:checks/context.dart';
import 'package:test/scaffolding.dart';

void main() {
group('literal', () {
group('truncates large collections', () {
const maxUntruncatedCollection = 25;
final largeList =
List<int>.generate(maxUntruncatedCollection + 1, (i) => i);
test('in lists', () {
check(literal(largeList)).last.equals('...]');
});
test('in sets', () {
check(literal(largeList.toSet())).last.equals('...}');
});
test('in iterables', () {
check(literal(largeList.followedBy([]))).last.equals('...)');
});
test('in maps', () {
final map = Map<int, int>.fromIterables(largeList, largeList);
check(literal(map)).last.equals('...}');
});
});
});
}

0 comments on commit 073ef8b

Please sign in to comment.