Fixed: TESTNG-415. Assert.assertEquals() for sets and maps fails with 'null' as arguments
diff --git a/CHANGES.txt b/CHANGES.txt
index db10560..d996ca0 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -2,6 +2,7 @@
 
 Added: -randomizesuites (Nalin Makar)
 Added: IConfigurable
+Fixed: TESTNG-415. Assert.assertEquals() for sets and maps fails with 'null' as arguments
 Fixed: TESTNG-384. Use CharSequence instead of String for assert messages (Tom‡s Pollak)
 Fixed: TESTNG-186. Rename IWorkerApadter to IWorkerAdapter (Tom‡s Pollak)
 Fixed: typo -testRunFactory
diff --git a/src/main/java/org/testng/Assert.java b/src/main/java/org/testng/Assert.java
index 4ba1055..9cd73ec 100644
--- a/src/main/java/org/testng/Assert.java
+++ b/src/main/java/org/testng/Assert.java
@@ -512,7 +512,7 @@
     
     if (actual == null || expected == null) {
       if (message != null) fail(message);
-      else fail("Arrays not equal: " + expected + " and " + actual);
+      else fail("Collections not equal: " + expected + " and " + actual);
     }
     
     assertEquals(actual.size(), expected.size(), message + ": lists don't have the same size");
@@ -659,6 +659,12 @@
    * Asserts that two sets are equal.
    */
   static public void assertEquals(Set actual, Set expected) {
+    if(actual == expected) return;
+
+    if (actual == null || expected == null) {
+      fail("Sets not equal: " + expected + " and " + actual);
+    }
+
     if (!actual.equals(expected)) {
       fail("Sets differ: expected " + expected + " but got " + actual);
     }
@@ -668,9 +674,15 @@
    * Asserts that two maps are equal.
    */
   static public void assertEquals(Map actual, Map expected) {
-      if (!actual.equals(expected)) {
-        fail("Maps differ: expected " + expected + " but got " + actual);
-      }
+    if(actual == expected) return;
+
+    if (actual == null || expected == null) {
+      fail("Maps not equal: " + expected + " and " + actual);
     }
 
+    if (!actual.equals(expected)) {
+      fail("Maps differ: expected " + expected + " but got " + actual);
+    }
+  }
+
 }
diff --git a/src/test/java/org/testng/AssertTest.java b/src/test/java/org/testng/AssertTest.java
index d637aac..43dda11 100644
--- a/src/test/java/org/testng/AssertTest.java
+++ b/src/test/java/org/testng/AssertTest.java
@@ -1,8 +1,12 @@
 package org.testng;

 

 import java.util.Collection;

+import java.util.Map;

+import java.util.Set;

 

 import org.testng.annotations.Test;

+import org.testng.collections.Maps;

+import org.testng.internal.annotations.Sets;

 

 

 /**

@@ -29,4 +33,42 @@
     Collection actual = null;

     Assert.assertEquals(actual, expected);

   }

+

+  @Test

+  public void nullSetAssertEquals() {

+    Set expected = null;

+    Set actual = null;

+    Assert.assertEquals(actual, expected);

+  }

+

+  @Test

+  public void nullMapAssertEquals() {

+    Map expected = null;

+    Map actual = null;

+    Assert.assertEquals(actual, expected);

+  }

+

+  @Test

+  public void oneNullMapAssertEquals() {

+    Map expected = Maps.newHashMap();

+    Map actual = null;

+    try {

+      Assert.assertEquals(actual, expected);

+    }

+    catch (AssertionError error) {

+      //do nothing

+    }

+  }

+

+  @Test

+  public void oneNullSetAssertEquals() {

+    Set expected = null;

+    Set actual = Sets.newHashSet();

+    try {

+      Assert.assertEquals(actual, expected);

+    }

+    catch (AssertionError error) {

+      //do nothing

+    }

+  }

 }