Skip to content

Commit e3d9e07

Browse files
authored
Restore deep equality comparison for map containsOnly assertions (#2265)
1 parent f8ee3f3 commit e3d9e07

File tree

2 files changed

+20
-6
lines changed

2 files changed

+20
-6
lines changed

src/main/java/org/assertj/core/internal/Maps.java

+10-6
Original file line numberDiff line numberDiff line change
@@ -486,20 +486,24 @@ private static <K, V> Map<K, V> mapWithoutExpectedEntries(Map<K, V> actual, Entr
486486
// Stream API avoided for performance reasons
487487
try {
488488
Map<K, V> clonedMap = clone(actual);
489-
for (Entry<? extends K, ? extends V> expectedEntry : expectedEntries) {
490-
clonedMap.remove(expectedEntry.getKey(), expectedEntry.getValue());
491-
}
489+
removeEntries(clonedMap, expectedEntries);
492490
return clonedMap;
493491
} catch (NoSuchMethodException | UnsupportedOperationException e) {
494492
// actual cannot be cloned or is unmodifiable, falling back to LinkedHashMap
495493
Map<K, V> copiedMap = new LinkedHashMap<>(actual);
496-
for (Entry<? extends K, ? extends V> expectedEntry : expectedEntries) {
497-
copiedMap.remove(expectedEntry.getKey(), expectedEntry.getValue());
498-
}
494+
removeEntries(copiedMap, expectedEntries);
499495
return copiedMap;
500496
}
501497
}
502498

499+
private static <K, V> void removeEntries(Map<K, V> map, Entry<? extends K, ? extends V>[] entries) {
500+
for (Entry<? extends K, ? extends V> entry : entries) {
501+
// must perform deep equals comparison on values as Map.remove(Object, Object) relies on
502+
// Objects.equals which does not handle deep equality (e.g. arrays in map entry values)
503+
if (containsEntry(map, entry)) map.remove(entry.getKey());
504+
}
505+
}
506+
503507
public <K, V> void assertContainsExactly(AssertionInfo info, Map<K, V> actual, Entry<? extends K, ? extends V>[] entries) {
504508
doCommonContainsCheck(info, actual, entries);
505509
if (actual.isEmpty() && entries.length == 0) return;

src/test/java/org/assertj/core/internal/maps/Maps_assertContainsOnly_Test.java

+10
Original file line numberDiff line numberDiff line change
@@ -243,4 +243,14 @@ private static Stream<Arguments> orderDependentFailureTestCases() {
243243
set(entry("name", "Yoda"), entry("job", "Jedi"))));
244244
}
245245

246+
@SuppressWarnings("unchecked")
247+
@Test
248+
void should_pass_if_value_type_is_array() {
249+
// GIVEN
250+
Map<String, byte[]> actual = mapOf(entry("key1", new byte[] { 1, 2 }), entry("key2", new byte[] { 3, 4, 5 }));
251+
Entry<String, byte[]>[] expected = new Entry[] { entry("key2", new byte[] { 3, 4, 5 }), entry("key1", new byte[] { 1, 2 }) };
252+
// WHEN/THEN
253+
assertThatNoException().isThrownBy(() -> maps.assertContainsOnly(info, actual, expected));
254+
}
255+
246256
}

0 commit comments

Comments
 (0)