Skip to content

Commit d50b2ad

Browse files
committed
Ensure assertions is contents aware
Closes #3227
1 parent 02d223d commit d50b2ad

File tree

3 files changed

+55
-25
lines changed

3 files changed

+55
-25
lines changed

CHANGES.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
Current (7.12.0)
2+
Fixed: GITHUB-3227: assertEqualsNoOrder false positive when collection has same size and actual Collection is subset of expected collection (Krishnan Mahadevan)
23
Fixed: GITHUB-3177: Method org.testng.xml.XmlSuite#toXml do not save new properties like "share-thread-pool-for-data-providers" (Krishnan Mahadevan)
34
Fixed: GITHUB-3179: ClassCastException when use shouldUseGlobalThreadPool(true) property (Krishnan Mahadevan)
45
Fixed: GITHUB-2765: Test timeouts using existing Executor now propagate the stack trace to the ThreadTimeoutException (Charlie Hayes)

testng-asserts/src/main/java/org/testng/Assert.java

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1856,18 +1856,7 @@ public static void assertEqualsNoOrder(Object[] actual, Object[] expected, Strin
18561856
*/
18571857
public static void assertEqualsNoOrder(
18581858
Collection<?> actual, Collection<?> expected, String message) {
1859-
if (actual.size() != expected.size()) {
1860-
failAssertNoEqual(
1861-
"Collections do not have the same size: " + actual.size() + " != " + expected.size(),
1862-
message);
1863-
}
1864-
1865-
List<?> actualCollection = Lists.newArrayList(actual);
1866-
actualCollection.removeAll(expected);
1867-
if (!actualCollection.isEmpty()) {
1868-
failAssertNoEqual(
1869-
"Collections not equal: expected: " + expected + " and actual: " + actual, message);
1870-
}
1859+
validateEqualityNoOrder(actual, expected, "Collections", message);
18711860
}
18721861

18731862
/**
@@ -1879,26 +1868,25 @@ public static void assertEqualsNoOrder(
18791868
* @param message the assertion error message
18801869
*/
18811870
public static void assertEqualsNoOrder(Iterator<?> actual, Iterator<?> expected, String message) {
1882-
List<?> actualCollection = Lists.newArrayList(actual);
1883-
List<?> expectedCollection = Lists.newArrayList(expected);
1871+
validateEqualityNoOrder(
1872+
Lists.newArrayList(actual), Lists.newArrayList(expected), "Iterators", message);
1873+
}
18841874

1885-
if (actualCollection.size() != expectedCollection.size()) {
1875+
private static void validateEqualityNoOrder(
1876+
Collection<?> actual, Collection<?> expected, String prefix, String message) {
1877+
if (actual.size() != expected.size()) {
18861878
failAssertNoEqual(
1887-
"Iterators do not have the same size: "
1888-
+ actualCollection.size()
1889-
+ " != "
1890-
+ expectedCollection.size(),
1879+
prefix + " do not have the same size: " + actual.size() + " != " + expected.size(),
18911880
message);
18921881
}
1882+
List<?> actualCollection = Lists.newArrayList(actual);
1883+
for (Object o : expected) {
1884+
actualCollection.remove(o);
1885+
}
18931886

1894-
actualCollection.removeAll(expectedCollection);
18951887
if (!actualCollection.isEmpty()) {
18961888
failAssertNoEqual(
1897-
"Iterators not equal: expected: "
1898-
+ toString(expected)
1899-
+ " and actual: "
1900-
+ toString(actual),
1901-
message);
1889+
prefix + " not equal: expected: " + expected + " and actual: " + actual, message);
19021890
}
19031891
}
19041892

testng-asserts/src/test/java/org/testng/AssertTest.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.google.common.collect.ImmutableMap;
44
import java.util.*;
5+
import org.testng.annotations.DataProvider;
56
import org.testng.annotations.Test;
67
import org.testng.collections.Lists;
78
import org.testng.collections.Maps;
@@ -602,6 +603,46 @@ public void testAssertEqualsDeepSetFail() {
602603
Assert.assertEqualsDeep(actualSet, expectedSet);
603604
}
604605

606+
@Test(
607+
description = "GITHUB-3227",
608+
dataProvider = "3227-dp",
609+
expectedExceptions = AssertionError.class,
610+
expectedExceptionsMessageRegExp = "list should not be equal")
611+
public void testAssertEqualsNoOrderList(List<String> actual, List<String> expected) {
612+
Assert.assertEqualsNoOrder(actual, expected, "list should not be equal");
613+
}
614+
615+
@DataProvider(name = "3227-dp")
616+
public Object[][] dataProvider() {
617+
return new Object[][] {
618+
{List.of("a", "b", "b"), List.of("a", "b", "c")},
619+
{List.of("a", "b", "b"), List.of("a", "a", "b")},
620+
{List.of("a", "a", "a", "a", "a", "a", "b"), List.of("a", "b", "b", "b", "b", "b", "b")}
621+
};
622+
}
623+
624+
@Test(
625+
description = "GITHUB-3227",
626+
dataProvider = "3227-dp",
627+
expectedExceptions = AssertionError.class,
628+
expectedExceptionsMessageRegExp = "queue should not be equal")
629+
public void testAssertEqualsNoOrderQueue(List<String> actualIn, List<String> expectedIn) {
630+
var actual = new ArrayDeque<>(actualIn);
631+
var expected = new ArrayDeque<>(expectedIn);
632+
Assert.assertEqualsNoOrder(actual, expected, "queue should not be equal");
633+
}
634+
635+
@Test(
636+
description = "GITHUB-3227",
637+
dataProvider = "3227-dp",
638+
expectedExceptions = AssertionError.class,
639+
expectedExceptionsMessageRegExp = "iterator should not be equal")
640+
public void testAssertEqualsNoOrderIterator(List<String> actualIn, List<String> expectedIn) {
641+
var actual = actualIn.iterator();
642+
var expected = expectedIn.iterator();
643+
Assert.assertEqualsNoOrder(actual, expected, "iterator should not be equal");
644+
}
645+
605646
static class Contrived {
606647

607648
int integer;

0 commit comments

Comments
 (0)