diff --git a/user/test/com/google/gwt/emultest/java/lang/BooleanTest.java b/user/test/com/google/gwt/emultest/java/lang/BooleanTest.java
index b2c264c..acde217 100644
--- a/user/test/com/google/gwt/emultest/java/lang/BooleanTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/BooleanTest.java
@@ -107,7 +107,7 @@
   public void testEqualityNormalizer() {
     Boolean b = false;
     if (b != null) {
-      assertEquals(b.booleanValue(), false);
+      assertEquals(false, b.booleanValue());
     } else {
       fail("false should not evaluate to null");
     }
diff --git a/user/test/com/google/gwt/emultest/java/lang/CharacterTest.java b/user/test/com/google/gwt/emultest/java/lang/CharacterTest.java
index 737a4ee..e843146 100644
--- a/user/test/com/google/gwt/emultest/java/lang/CharacterTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/CharacterTest.java
@@ -179,7 +179,7 @@
   }
 
   public void testCharValue() {
-    assertEquals(new Character((char) 32).charValue(), (char) 32);
+    assertEquals((char) 32, new Character((char) 32).charValue());
   }
 
   public void testCodePoint() {
diff --git a/user/test/com/google/gwt/emultest/java/lang/CompilerConstantStringTest.java b/user/test/com/google/gwt/emultest/java/lang/CompilerConstantStringTest.java
index 6b76b0e..fc58bdc 100644
--- a/user/test/com/google/gwt/emultest/java/lang/CompilerConstantStringTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/CompilerConstantStringTest.java
@@ -36,13 +36,13 @@
   }
 
   public void testCharAt() {
-    assertEquals("abc".charAt(1), 'b');
+    assertEquals('b', "abc".charAt(1));
   }
 
   public void testConcat() {
     assertEquals("abcdef", "abc" + "def");
     assertEquals("abcdef", "abc".concat("def"));
-    assertEquals("".concat(""), "");
+    assertEquals("", "".concat(""));
     char c = 'd';
     String s = "abc";
     assertEquals("abcd", "abc" + 'd');
@@ -60,9 +60,9 @@
     assertEquals(new String(constant), constant);
     assertEquals(new String(chars), constant);
     assertEquals(new String(chars, 2, 3), shortString);
-    assertEquals(new String(""), "");
-    assertEquals(new String(new String(new String(new String("")))), "");
-    assertEquals(new String(new char[] {}), "");
+    assertEquals("", new String(""));
+    assertEquals("", new String(new String(new String(new String("")))));
+    assertEquals("", new String(new char[] {}));
   }
 
   public void testContains() {
@@ -148,13 +148,13 @@
 
   public void testIndexOf() {
     String haystack = "abcdefghi";
-    assertEquals(haystack.indexOf("q"), -1);
-    assertEquals(haystack.indexOf('q'), -1);
-    assertEquals(haystack.indexOf("a"), 0);
-    assertEquals(haystack.indexOf('a'), 0);
-    assertEquals(haystack.indexOf('a', 1), -1);
-    assertEquals(haystack.indexOf("bc"), 1);
-    assertEquals(haystack.indexOf(""), 0);
+    assertEquals(-1, haystack.indexOf("q"));
+    assertEquals(-1, haystack.indexOf('q'));
+    assertEquals(0, haystack.indexOf("a"));
+    assertEquals(0, haystack.indexOf('a'));
+    assertEquals(-1, haystack.indexOf('a', 1));
+    assertEquals(1, haystack.indexOf("bc"));
+    assertEquals(0, haystack.indexOf(""));
   }
 
   public void testLastIndexOf() {
@@ -202,8 +202,8 @@
   }
 
   public void testReplace() {
-    assertEquals("axax".replace('x', 'a'), "aaaa");
-    assertEquals("aaaa".replace('x', 'a'), "aaaa");
+    assertEquals("aaaa", "axax".replace('x', 'a'));
+    assertEquals("aaaa", "aaaa".replace('x', 'a'));
     for (char from = 32; from < 250; ++from) {
       char to = (char) (from + 5);
       assertEquals(toS(to), toS(from).replace(from, to));
diff --git a/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java b/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java
index c157804..cd10a2b 100644
--- a/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java
@@ -119,7 +119,7 @@
   public void testEqualityNormalizer() {
     Double d = 0.0;
     if (d != null) {
-      assertEquals(d.doubleValue(), 0.0);
+      assertEquals(0.0, d.doubleValue());
     } else {
       fail("0.0 should not evaluate to null");
     }
diff --git a/user/test/com/google/gwt/emultest/java/lang/StringBufferTest.java b/user/test/com/google/gwt/emultest/java/lang/StringBufferTest.java
index 1d65b96..72ce245 100644
--- a/user/test/com/google/gwt/emultest/java/lang/StringBufferTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/StringBufferTest.java
@@ -106,7 +106,7 @@
    * This method tests <code>charAt</code>.
    */
   public void testCharAt() {
-    assertEquals(new StringBuffer("abc").charAt(1), 'b');
+    assertEquals('b', new StringBuffer("abc").charAt(1));
   }
 
   /**
@@ -115,7 +115,7 @@
   public void testContructor() {
     String constant = "abcdef";
     assertEquals(new StringBuffer(constant).toString(), constant);
-    assertEquals(new StringBuffer().toString(), "");
+    assertEquals("", new StringBuffer().toString());
     assertEquals(new StringBuffer((CharSequence) constant).toString(), constant);
   }
 
@@ -125,11 +125,11 @@
   public void testDelete() {
     StringBuffer haystack = new StringBuffer("abcdefghi");
     haystack.delete(2, 4);
-    assertEquals(haystack.toString(), "abefghi");
+    assertEquals("abefghi", haystack.toString());
     haystack.deleteCharAt(0);
-    assertEquals(haystack.toString(), "befghi");
+    assertEquals("befghi", haystack.toString());
     haystack.deleteCharAt(1);
-    assertEquals(haystack.toString(), "bfghi");
+    assertEquals("bfghi", haystack.toString());
   }
 
   /**
@@ -150,13 +150,13 @@
    */
   public void testIndexOf() {
     String haystack = "abcdefghi";
-    assertEquals(haystack.indexOf("q"), -1);
-    assertEquals(haystack.indexOf('q'), -1);
-    assertEquals(haystack.indexOf("a"), 0);
-    assertEquals(haystack.indexOf('a'), 0);
-    assertEquals(haystack.indexOf('a', 1), -1);
-    assertEquals(haystack.indexOf("bc"), 1);
-    assertEquals(haystack.indexOf(""), 0);
+    assertEquals(-1, haystack.indexOf("q"));
+    assertEquals(-1, haystack.indexOf('q'));
+    assertEquals(0, haystack.indexOf("a"));
+    assertEquals(0, haystack.indexOf('a'));
+    assertEquals(-1, haystack.indexOf('a', 1));
+    assertEquals(1, haystack.indexOf("bc"));
+    assertEquals(0, haystack.indexOf(""));
   }
 
   /**
@@ -217,7 +217,7 @@
     for (int i = 0; i < 10; i++) {
       x.delete(5, 15);
     }
-    assertEquals(x.toString(), "12345");
+    assertEquals("12345", x.toString());
   }
 
   /**
@@ -263,28 +263,28 @@
     }
     assertTrue("endwith1", x.toString().endsWith("0123456789"));
     assertTrue("startswith1", x.toString().startsWith("0123456789"));
-    assertEquals(x.length(), size);
+    assertEquals(size, x.length());
     x = new StringBuffer();
     for (int i = 0; i < size * 4; i++) {
       x.append("" + i % 10);
     }
     assertTrue("endswith2", x.toString().endsWith("0123456789"));
     assertTrue("startswith2", x.toString().startsWith("0123456789"));
-    assertEquals("length2", x.length(), size * 4);
+    assertEquals("length2", size * 4, x.length());
     x = new StringBuffer();
     for (int i = 0; i < size; i++) {
       x.insert(0, "" + i % 10);
     }
     assertTrue("endswith3", x.toString().endsWith("9876543210"));
     assertTrue("startswith3", x.toString().startsWith("9876543210"));
-    assertEquals("length3", x.length(), size);
+    assertEquals("length3", size, x.length());
     x = new StringBuffer();
     for (int i = 0; i < size * 4; i++) {
       x.insert(0, "" + i % 10);
     }
     assertTrue("endswith4", x.toString().endsWith("9876543210"));
     assertTrue("startswith4", x.toString().startsWith("9876543210"));
-    assertEquals("size4", x.length(), size * 4);
+    assertEquals("size4", size * 4, x.length());
   }
 
   /**
@@ -331,11 +331,11 @@
   public void testSetLength() {
     StringBuffer x = new StringBuffer("abcdefghi");
     x.setLength(20);
-    assertEquals(x.length(), 20);
-    assertEquals(x.toString(), x.toString(), "abcdefghi\0\0\0\0\0\0\0\0\0\0\0");
+    assertEquals(20, x.length());
+    assertEquals(x.toString(), "abcdefghi\0\0\0\0\0\0\0\0\0\0\0", x.toString());
     x.setLength(5);
-    assertEquals(x.length(), 5);
-    assertEquals(x.toString(), "abcde");
+    assertEquals(5, x.length());
+    assertEquals("abcde", x.toString());
   }
 
   /**
diff --git a/user/test/com/google/gwt/emultest/java/lang/StringTest.java b/user/test/com/google/gwt/emultest/java/lang/StringTest.java
index 48194ef..87cf441 100644
--- a/user/test/com/google/gwt/emultest/java/lang/StringTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/StringTest.java
@@ -38,7 +38,7 @@
   }
 
   public void testCharAt() {
-    assertEquals(hideFromCompiler("abc").charAt(1), 'b');
+    assertEquals('b', hideFromCompiler("abc").charAt(1));
   }
 
   public void testCodePoint() {
@@ -523,13 +523,13 @@
 
   public void testIndexOf() {
     String haystack = "abcdefghi";
-    assertEquals(haystack.indexOf("q"), -1);
-    assertEquals(haystack.indexOf('q'), -1);
-    assertEquals(haystack.indexOf("a"), 0);
-    assertEquals(haystack.indexOf('a'), 0);
-    assertEquals(haystack.indexOf('a', 1), -1);
-    assertEquals(haystack.indexOf("bc"), 1);
-    assertEquals(haystack.indexOf(""), 0);
+    assertEquals(-1, haystack.indexOf("q"));
+    assertEquals(-1, haystack.indexOf('q'));
+    assertEquals(0, haystack.indexOf("a"));
+    assertEquals(0, haystack.indexOf('a'));
+    assertEquals(-1, haystack.indexOf('a', 1));
+    assertEquals(1, haystack.indexOf("bc"));
+    assertEquals(0, haystack.indexOf(""));
 
     try {
       returnNull().indexOf("");
diff --git a/user/test/com/google/gwt/emultest/java/util/ArraysTest.java b/user/test/com/google/gwt/emultest/java/util/ArraysTest.java
index 9580db9..73f8ee6 100644
--- a/user/test/com/google/gwt/emultest/java/util/ArraysTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/ArraysTest.java
@@ -1390,7 +1390,7 @@
     // empty array
     Object[] test = {};
     Arrays.sort(test);
-    assertEquals(test.length, 0);
+    assertEquals(0, test.length);
     // array with one element
     Integer[] test2 = {1};
     Arrays.sort(test2);
diff --git a/user/test/com/google/gwt/emultest/java/util/CollectionsTest.java b/user/test/com/google/gwt/emultest/java/util/CollectionsTest.java
index 74cd10f..08fad5d 100644
--- a/user/test/com/google/gwt/emultest/java/util/CollectionsTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/CollectionsTest.java
@@ -80,7 +80,7 @@
     assertEquals(deque.getFirst(), o3);
     assertEquals(deque.element(), o3);
 
-    assertEquals(deque.size(), 3);
+    assertEquals(3, deque.size());
     assertEquals(deque.size(), queueView.size());
 
     assertEquals(deque.getFirst(), o3);
diff --git a/user/test/com/google/gwt/emultest/java/util/DateTest.java b/user/test/com/google/gwt/emultest/java/util/DateTest.java
index df9cd70..87da303 100644
--- a/user/test/com/google/gwt/emultest/java/util/DateTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/DateTest.java
@@ -166,21 +166,21 @@
     Date accum0 = create();
     Date arg10 = create();
     int a0 = accum0.compareTo(arg10);
-    assertEquals(a0, 0);
+    assertEquals(0, a0);
     // /////////////////////////////
     // Past
     // /////////////////////////////
     Date accum1 = create();
     Date arg20 = create(PAST);
     int a1 = accum1.compareTo(arg20);
-    assertEquals(a1, 1);
+    assertEquals(1, a1);
     // /////////////////////////////
     // Future
     // /////////////////////////////
     Date accum2 = create();
     Date arg30 = create(FUTURE);
     int a2 = accum2.compareTo(arg30);
-    assertEquals(a2, -1);
+    assertEquals(-1, a2);
   }
 
   /** Testing for public int java.util.Date.getDate(). */
@@ -249,13 +249,13 @@
     // /////////////////////////////
     Date accum1 = create(PAST);
     int a1 = accum1.getMinutes();
-    assertEquals(a1, 0);
+    assertEquals(0, a1);
     // /////////////////////////////
     // Future
     // /////////////////////////////
     Date accum2 = create(FUTURE);
     int a2 = accum2.getMinutes();
-    assertEquals(a2, 4);
+    assertEquals(4, a2);
   }
 
   /** Testing for public int java.util.Date.getMonth(). */
@@ -342,7 +342,7 @@
     // /////////////////////////////
     Date accum1 = create(PAST);
     int a1 = accum1.getYear();
-    assertEquals(a1, -20);
+    assertEquals(-20, a1);
 
     // /////////////////////////////
     // Future
diff --git a/user/test/com/google/gwt/emultest/java/util/HashMapTest.java b/user/test/com/google/gwt/emultest/java/util/HashMapTest.java
index 81054aa..206f52d 100644
--- a/user/test/com/google/gwt/emultest/java/util/HashMapTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/HashMapTest.java
@@ -131,21 +131,21 @@
 
   public void testAddEqualKeys() {
     final HashMap<Number, Object> expected = new HashMap<Number, Object>();
-    assertEquals(expected.size(), 0);
+    assertEquals(0, expected.size());
     iterateThrough(expected);
     expected.put(new Long(45), new Object());
-    assertEquals(expected.size(), 1);
+    assertEquals(1, expected.size());
     iterateThrough(expected);
     expected.put(new Integer(45), new Object());
     assertNotSame(new Integer(45), new Long(45));
-    assertEquals(expected.size(), 2);
+    assertEquals(2, expected.size());
     iterateThrough(expected);
   }
 
   public void testAddWatch() {
     HashMap<String, String> m = new HashMap<String, String>();
     m.put("watch", "watch");
-    assertEquals(m.get("watch"), "watch");
+    assertEquals("watch", m.get("watch"));
   }
 
   /*
@@ -241,21 +241,21 @@
     // Check that the entry set looks right
     hashMap.put(KEY_TEST_ENTRY_SET, VALUE_TEST_ENTRY_SET_1);
     entrySet = hashMap.entrySet();
-    assertEquals(entrySet.size(), SIZE_ONE);
+    assertEquals(SIZE_ONE, entrySet.size());
     Iterator<Map.Entry<String, String>> itSet = entrySet.iterator();
     Map.Entry<String, String> entry = itSet.next();
-    assertEquals(entry.getKey(), KEY_TEST_ENTRY_SET);
-    assertEquals(entry.getValue(), VALUE_TEST_ENTRY_SET_1);
+    assertEquals(KEY_TEST_ENTRY_SET, entry.getKey());
+    assertEquals(VALUE_TEST_ENTRY_SET_1, entry.getValue());
     assertEmptyIterator(itSet);
 
     // Check that entries in the entrySet are update correctly on overwrites
     hashMap.put(KEY_TEST_ENTRY_SET, VALUE_TEST_ENTRY_SET_2);
     entrySet = hashMap.entrySet();
-    assertEquals(entrySet.size(), SIZE_ONE);
+    assertEquals(SIZE_ONE, entrySet.size());
     itSet = entrySet.iterator();
     entry = itSet.next();
-    assertEquals(entry.getKey(), KEY_TEST_ENTRY_SET);
-    assertEquals(entry.getValue(), VALUE_TEST_ENTRY_SET_2);
+    assertEquals(KEY_TEST_ENTRY_SET, entry.getKey());
+    assertEquals(VALUE_TEST_ENTRY_SET_2, entry.getValue());
     assertEmptyIterator(itSet);
 
     // Check that entries are updated on removes
@@ -328,8 +328,8 @@
     Map.Entry<String, String> bogus = dummy.entrySet().iterator().next();
     Set<Map.Entry<String, String>> entrySet = hashMap.entrySet();
     boolean removed = entrySet.remove(bogus);
-    assertEquals(removed, false);
-    assertEquals(hashMap.get("A"), "B");
+    assertEquals(false, removed);
+    assertEquals("B", hashMap.get("A"));
   }
 
   /*
@@ -515,7 +515,7 @@
 
     dstMap.remove(KEY_KEY);
     assertTrue(dstMap.isEmpty());
-    assertEquals(dstMap.size(), 0);
+    assertEquals(0, dstMap.size());
   }
 
   public void testKeysConflict() {
@@ -524,22 +524,22 @@
     hashMap.put(STRING_ZERO_KEY, STRING_ZERO_VALUE);
     hashMap.put(INTEGER_ZERO_KEY, INTEGER_ZERO_VALUE);
     hashMap.put(ODD_ZERO_KEY, ODD_ZERO_VALUE);
-    assertEquals(hashMap.get(INTEGER_ZERO_KEY), INTEGER_ZERO_VALUE);
-    assertEquals(hashMap.get(ODD_ZERO_KEY), ODD_ZERO_VALUE);
-    assertEquals(hashMap.get(STRING_ZERO_KEY), STRING_ZERO_VALUE);
+    assertEquals(INTEGER_ZERO_VALUE, hashMap.get(INTEGER_ZERO_KEY));
+    assertEquals(ODD_ZERO_VALUE, hashMap.get(ODD_ZERO_KEY));
+    assertEquals(STRING_ZERO_VALUE, hashMap.get(STRING_ZERO_KEY));
     hashMap.remove(INTEGER_ZERO_KEY);
-    assertEquals(hashMap.get(ODD_ZERO_KEY), ODD_ZERO_VALUE);
-    assertEquals(hashMap.get(STRING_ZERO_KEY), STRING_ZERO_VALUE);
+    assertEquals(ODD_ZERO_VALUE, hashMap.get(ODD_ZERO_KEY));
+    assertEquals(STRING_ZERO_VALUE, hashMap.get(STRING_ZERO_KEY));
     assertEquals(hashMap.get(INTEGER_ZERO_KEY), null);
     hashMap.remove(ODD_ZERO_KEY);
     assertEquals(hashMap.get(INTEGER_ZERO_KEY), null);
     assertEquals(hashMap.get(ODD_ZERO_KEY), null);
-    assertEquals(hashMap.get(STRING_ZERO_KEY), STRING_ZERO_VALUE);
+    assertEquals(STRING_ZERO_VALUE, hashMap.get(STRING_ZERO_KEY));
     hashMap.remove(STRING_ZERO_KEY);
     assertEquals(hashMap.get(INTEGER_ZERO_KEY), null);
     assertEquals(hashMap.get(ODD_ZERO_KEY), null);
     assertEquals(hashMap.get(STRING_ZERO_KEY), null);
-    assertEquals(hashMap.size(), 0);
+    assertEquals(0, hashMap.size());
   }
 
   /*
@@ -597,9 +597,9 @@
     checkEmptyHashMapAssumptions(hashMap);
 
     assertNull(hashMap.put(KEY_TEST_PUT, VALUE_TEST_PUT_1));
-    assertEquals(hashMap.put(KEY_TEST_PUT, VALUE_TEST_PUT_2), VALUE_TEST_PUT_1);
+    assertEquals(VALUE_TEST_PUT_1, hashMap.put(KEY_TEST_PUT, VALUE_TEST_PUT_2));
     assertNull(hashMap.put(null, VALUE_TEST_PUT_1));
-    assertEquals(hashMap.put(null, VALUE_TEST_PUT_2), VALUE_TEST_PUT_1);
+    assertEquals(VALUE_TEST_PUT_1, hashMap.put(null, VALUE_TEST_PUT_2));
   }
 
   /**
@@ -648,9 +648,9 @@
 
     dstMap.putAll(srcMap);
     assertEquals(dstMap.size(), srcMap.size());
-    assertEquals(dstMap.get(KEY_1), VALUE_2);
-    assertEquals(dstMap.get(KEY_2), VALUE_3);
-    assertEquals(dstMap.get(KEY_3), VALUE_1);
+    assertEquals(VALUE_2, dstMap.get(KEY_1));
+    assertEquals(VALUE_3, dstMap.get(KEY_2));
+    assertEquals(VALUE_1, dstMap.get(KEY_3));
 
     // Check that a putAll does adds data but does not remove it
 
@@ -659,10 +659,10 @@
     assertEquals(dstMap.size(), srcMap.size());
     assertTrue(dstMap.containsKey(KEY_4));
     assertTrue(dstMap.containsValue(VALUE_4));
-    assertEquals(dstMap.get(KEY_1), VALUE_2);
-    assertEquals(dstMap.get(KEY_2), VALUE_3);
-    assertEquals(dstMap.get(KEY_3), VALUE_1);
-    assertEquals(dstMap.get(KEY_4), VALUE_4);
+    assertEquals(VALUE_2, dstMap.get(KEY_1));
+    assertEquals(VALUE_3, dstMap.get(KEY_2));
+    assertEquals(VALUE_1, dstMap.get(KEY_3));
+    assertEquals(VALUE_4, dstMap.get(KEY_4));
 
     dstMap.putAll(dstMap);
   }
@@ -679,7 +679,7 @@
     assertNotNull(hashMap.remove(null));
 
     hashMap.put(KEY_TEST_REMOVE, VALUE_TEST_REMOVE);
-    assertEquals(hashMap.remove(KEY_TEST_REMOVE), VALUE_TEST_REMOVE);
+    assertEquals(VALUE_TEST_REMOVE, hashMap.remove(KEY_TEST_REMOVE));
     assertNull(hashMap.remove(KEY_TEST_REMOVE));
   }
 
@@ -691,21 +691,21 @@
     checkEmptyHashMapAssumptions(hashMap);
 
     // Test size behavior on put
-    assertEquals(hashMap.size(), SIZE_ZERO);
+    assertEquals(SIZE_ZERO, hashMap.size());
     hashMap.put(KEY_1, VALUE_1);
-    assertEquals(hashMap.size(), SIZE_ONE);
+    assertEquals(SIZE_ONE, hashMap.size());
     hashMap.put(KEY_2, VALUE_2);
-    assertEquals(hashMap.size(), SIZE_TWO);
+    assertEquals(SIZE_TWO, hashMap.size());
     hashMap.put(KEY_3, VALUE_3);
-    assertEquals(hashMap.size(), SIZE_THREE);
+    assertEquals(SIZE_THREE, hashMap.size());
 
     // Test size behavior on remove
     hashMap.remove(KEY_1);
-    assertEquals(hashMap.size(), SIZE_TWO);
+    assertEquals(SIZE_TWO, hashMap.size());
     hashMap.remove(KEY_2);
-    assertEquals(hashMap.size(), SIZE_ONE);
+    assertEquals(SIZE_ONE, hashMap.size());
     hashMap.remove(KEY_3);
-    assertEquals(hashMap.size(), SIZE_ZERO);
+    assertEquals(SIZE_ZERO, hashMap.size());
 
     // Test size behavior on putAll
     hashMap.put(KEY_1, VALUE_1);
@@ -713,11 +713,11 @@
     hashMap.put(KEY_3, VALUE_3);
     HashMap<String, String> srcMap = new HashMap<String, String>(hashMap);
     hashMap.putAll(srcMap);
-    assertEquals(hashMap.size(), SIZE_THREE);
+    assertEquals(SIZE_THREE, hashMap.size());
 
     // Test size behavior on clear
     hashMap.clear();
-    assertEquals(hashMap.size(), SIZE_ZERO);
+    assertEquals(SIZE_ZERO, hashMap.size());
   }
 
   /**
@@ -744,11 +744,11 @@
 
     Collection<String> valColl = hashMap.values();
     assertNotNull(valColl);
-    assertEquals(valColl.size(), SIZE_ONE);
+    assertEquals(SIZE_ONE, valColl.size());
 
     Iterator<String> itVal = valColl.iterator();
     String val = itVal.next();
-    assertEquals(val, VALUE_VAL);
+    assertEquals(VALUE_VAL, val);
   }
 
   @SuppressWarnings("rawtypes")
diff --git a/user/test/com/google/gwt/emultest/java/util/IdentityHashMapTest.java b/user/test/com/google/gwt/emultest/java/util/IdentityHashMapTest.java
index d6bc22c..2d1f544 100644
--- a/user/test/com/google/gwt/emultest/java/util/IdentityHashMapTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/IdentityHashMapTest.java
@@ -134,21 +134,21 @@
 
   public void testAddEqualKeys() {
     final IdentityHashMap expected = new IdentityHashMap();
-    assertEquals(expected.size(), 0);
+    assertEquals(0, expected.size());
     iterateThrough(expected);
     expected.put(new Long(45), new Object());
-    assertEquals(expected.size(), 1);
+    assertEquals(1, expected.size());
     iterateThrough(expected);
     expected.put(new Integer(45), new Object());
     assertNotSame(new Integer(45), new Long(45));
-    assertEquals(expected.size(), 2);
+    assertEquals(2, expected.size());
     iterateThrough(expected);
   }
 
   public void testAddWatch() {
     IdentityHashMap m = new IdentityHashMap();
     m.put("watch", "watch");
-    assertEquals(m.get("watch"), "watch");
+    assertEquals("watch", m.get("watch"));
   }
 
   /*
@@ -247,20 +247,20 @@
     // Check that the entry set looks right
     hashMap.put(KEY_TEST_ENTRY_SET, VALUE_TEST_ENTRY_SET_1);
     entrySet = hashMap.entrySet();
-    assertEquals(entrySet.size(), SIZE_ONE);
+    assertEquals(SIZE_ONE, entrySet.size());
     Iterator itSet = entrySet.iterator();
     Map.Entry entry = (Map.Entry) itSet.next();
-    assertEquals(entry.getKey(), KEY_TEST_ENTRY_SET);
-    assertEquals(entry.getValue(), VALUE_TEST_ENTRY_SET_1);
+    assertEquals(KEY_TEST_ENTRY_SET, entry.getKey());
+    assertEquals(VALUE_TEST_ENTRY_SET_1, entry.getValue());
 
     // Check that entries in the entrySet are update correctly on overwrites
     hashMap.put(KEY_TEST_ENTRY_SET, VALUE_TEST_ENTRY_SET_2);
     entrySet = hashMap.entrySet();
-    assertEquals(entrySet.size(), SIZE_ONE);
+    assertEquals(SIZE_ONE, entrySet.size());
     itSet = entrySet.iterator();
     entry = (Map.Entry) itSet.next();
-    assertEquals(entry.getKey(), KEY_TEST_ENTRY_SET);
-    assertEquals(entry.getValue(), VALUE_TEST_ENTRY_SET_2);
+    assertEquals(KEY_TEST_ENTRY_SET, entry.getKey());
+    assertEquals(VALUE_TEST_ENTRY_SET_2, entry.getValue());
 
     // Check that entries are updated on removes
     hashMap.remove(KEY_TEST_ENTRY_SET);
@@ -334,8 +334,8 @@
     Entry bogus = (Entry) dummy.entrySet().iterator().next();
     Set entrySet = hashMap.entrySet();
     boolean removed = entrySet.remove(bogus);
-    assertEquals(removed, false);
-    assertEquals(hashMap.get("A"), "B");
+    assertEquals(false, removed);
+    assertEquals("B", hashMap.get("A"));
   }
 
   /*
@@ -527,7 +527,7 @@
 
     dstMap.remove(KEY_KEY);
     assertTrue(dstMap.isEmpty());
-    assertEquals(dstMap.size(), 0);
+    assertEquals(0, dstMap.size());
   }
 
   public void testKeysConflict() {
@@ -536,22 +536,22 @@
     hashMap.put(STRING_ZERO_KEY, STRING_ZERO_VALUE);
     hashMap.put(INTEGER_ZERO_KEY, INTEGER_ZERO_VALUE);
     hashMap.put(ODD_ZERO_KEY, ODD_ZERO_VALUE);
-    assertEquals(hashMap.get(INTEGER_ZERO_KEY), INTEGER_ZERO_VALUE);
-    assertEquals(hashMap.get(ODD_ZERO_KEY), ODD_ZERO_VALUE);
-    assertEquals(hashMap.get(STRING_ZERO_KEY), STRING_ZERO_VALUE);
+    assertEquals(INTEGER_ZERO_VALUE, hashMap.get(INTEGER_ZERO_KEY));
+    assertEquals(ODD_ZERO_VALUE, hashMap.get(ODD_ZERO_KEY));
+    assertEquals(STRING_ZERO_VALUE, hashMap.get(STRING_ZERO_KEY));
     hashMap.remove(INTEGER_ZERO_KEY);
-    assertEquals(hashMap.get(ODD_ZERO_KEY), ODD_ZERO_VALUE);
-    assertEquals(hashMap.get(STRING_ZERO_KEY), STRING_ZERO_VALUE);
+    assertEquals(ODD_ZERO_VALUE, hashMap.get(ODD_ZERO_KEY));
+    assertEquals(STRING_ZERO_VALUE, hashMap.get(STRING_ZERO_KEY));
     assertEquals(hashMap.get(INTEGER_ZERO_KEY), null);
     hashMap.remove(ODD_ZERO_KEY);
     assertEquals(hashMap.get(INTEGER_ZERO_KEY), null);
     assertEquals(hashMap.get(ODD_ZERO_KEY), null);
-    assertEquals(hashMap.get(STRING_ZERO_KEY), STRING_ZERO_VALUE);
+    assertEquals(STRING_ZERO_VALUE, hashMap.get(STRING_ZERO_KEY));
     hashMap.remove(STRING_ZERO_KEY);
     assertEquals(hashMap.get(INTEGER_ZERO_KEY), null);
     assertEquals(hashMap.get(ODD_ZERO_KEY), null);
     assertEquals(hashMap.get(STRING_ZERO_KEY), null);
-    assertEquals(hashMap.size(), 0);
+    assertEquals(0, hashMap.size());
   }
 
   /*
@@ -582,9 +582,9 @@
     checkEmptyHashMapAssumptions(hashMap);
 
     assertNull(hashMap.put(KEY_TEST_PUT, VALUE_TEST_PUT_1));
-    assertEquals(hashMap.put(KEY_TEST_PUT, VALUE_TEST_PUT_2), VALUE_TEST_PUT_1);
+    assertEquals(VALUE_TEST_PUT_1, hashMap.put(KEY_TEST_PUT, VALUE_TEST_PUT_2));
     assertNull(hashMap.put(null, VALUE_TEST_PUT_1));
-    assertEquals(hashMap.put(null, VALUE_TEST_PUT_2), VALUE_TEST_PUT_1);
+    assertEquals(VALUE_TEST_PUT_1, hashMap.put(null, VALUE_TEST_PUT_2));
   }
 
   /**
@@ -633,9 +633,9 @@
 
     dstMap.putAll(srcMap);
     assertEquals(dstMap.size(), srcMap.size());
-    assertEquals(dstMap.get(KEY_1), VALUE_2);
-    assertEquals(dstMap.get(KEY_2), VALUE_3);
-    assertEquals(dstMap.get(KEY_3), VALUE_1);
+    assertEquals(VALUE_2, dstMap.get(KEY_1));
+    assertEquals(VALUE_3, dstMap.get(KEY_2));
+    assertEquals(VALUE_1, dstMap.get(KEY_3));
 
     // Check that a putAll does adds data but does not remove it
 
@@ -644,10 +644,10 @@
     assertEquals(dstMap.size(), srcMap.size());
     assertTrue(dstMap.containsKey(KEY_4));
     assertTrue(dstMap.containsValue(VALUE_4));
-    assertEquals(dstMap.get(KEY_1), VALUE_2);
-    assertEquals(dstMap.get(KEY_2), VALUE_3);
-    assertEquals(dstMap.get(KEY_3), VALUE_1);
-    assertEquals(dstMap.get(KEY_4), VALUE_4);
+    assertEquals(VALUE_2, dstMap.get(KEY_1));
+    assertEquals(VALUE_3, dstMap.get(KEY_2));
+    assertEquals(VALUE_1, dstMap.get(KEY_3));
+    assertEquals(VALUE_4, dstMap.get(KEY_4));
 
     dstMap.putAll(dstMap);
   }
@@ -664,7 +664,7 @@
     assertNotNull(hashMap.remove(null));
 
     hashMap.put(KEY_TEST_REMOVE, VALUE_TEST_REMOVE);
-    assertEquals(hashMap.remove(KEY_TEST_REMOVE), VALUE_TEST_REMOVE);
+    assertEquals(VALUE_TEST_REMOVE, hashMap.remove(KEY_TEST_REMOVE));
     assertNull(hashMap.remove(KEY_TEST_REMOVE));
   }
 
@@ -676,21 +676,21 @@
     checkEmptyHashMapAssumptions(hashMap);
 
     // Test size behavior on put
-    assertEquals(hashMap.size(), SIZE_ZERO);
+    assertEquals(SIZE_ZERO, hashMap.size());
     hashMap.put(KEY_1, VALUE_1);
-    assertEquals(hashMap.size(), SIZE_ONE);
+    assertEquals(SIZE_ONE, hashMap.size());
     hashMap.put(KEY_2, VALUE_2);
-    assertEquals(hashMap.size(), SIZE_TWO);
+    assertEquals(SIZE_TWO, hashMap.size());
     hashMap.put(KEY_3, VALUE_3);
-    assertEquals(hashMap.size(), SIZE_THREE);
+    assertEquals(SIZE_THREE, hashMap.size());
 
     // Test size behavior on remove
     hashMap.remove(KEY_1);
-    assertEquals(hashMap.size(), SIZE_TWO);
+    assertEquals(SIZE_TWO, hashMap.size());
     hashMap.remove(KEY_2);
-    assertEquals(hashMap.size(), SIZE_ONE);
+    assertEquals(SIZE_ONE, hashMap.size());
     hashMap.remove(KEY_3);
-    assertEquals(hashMap.size(), SIZE_ZERO);
+    assertEquals(SIZE_ZERO, hashMap.size());
 
     // Test size behavior on putAll
     hashMap.put(KEY_1, VALUE_1);
@@ -698,11 +698,11 @@
     hashMap.put(KEY_3, VALUE_3);
     IdentityHashMap srcMap = new IdentityHashMap(hashMap);
     hashMap.putAll(srcMap);
-    assertEquals(hashMap.size(), SIZE_THREE);
+    assertEquals(SIZE_THREE, hashMap.size());
 
     // Test size behavior on clear
     hashMap.clear();
-    assertEquals(hashMap.size(), SIZE_ZERO);
+    assertEquals(SIZE_ZERO, hashMap.size());
   }
 
   /**
@@ -729,11 +729,11 @@
 
     Collection valColl = hashMap.values();
     assertNotNull(valColl);
-    assertEquals(valColl.size(), SIZE_ONE);
+    assertEquals(SIZE_ONE, valColl.size());
 
     Iterator itVal = valColl.iterator();
     String val = (String) itVal.next();
-    assertEquals(val, VALUE_VAL);
+    assertEquals(VALUE_VAL, val);
   }
 
   @Override
diff --git a/user/test/com/google/gwt/emultest/java/util/LinkedHashMapTest.java b/user/test/com/google/gwt/emultest/java/util/LinkedHashMapTest.java
index bbbdb40..85c0b4b 100644
--- a/user/test/com/google/gwt/emultest/java/util/LinkedHashMapTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/LinkedHashMapTest.java
@@ -147,21 +147,21 @@
 
   public void testAddEqualKeys() {
     final LinkedHashMap<Number, Object> expected = new LinkedHashMap<Number, Object>();
-    assertEquals(expected.size(), 0);
+    assertEquals(0, expected.size());
     iterateThrough(expected);
     expected.put(new Long(45), new Object());
-    assertEquals(expected.size(), 1);
+    assertEquals(1, expected.size());
     iterateThrough(expected);
     expected.put(new Integer(45), new Object());
     assertNotSame(new Integer(45), new Long(45));
-    assertEquals(expected.size(), 2);
+    assertEquals(2, expected.size());
     iterateThrough(expected);
   }
 
   public void testAddWatch() {
     LinkedHashMap<String, String> m = new LinkedHashMap<String, String>();
     m.put("watch", "watch");
-    assertEquals(m.get("watch"), "watch");
+    assertEquals("watch", m.get("watch"));
   }
 
   /*
@@ -257,20 +257,20 @@
     // Check that the entry set looks right
     hashMap.put(KEY_TEST_ENTRY_SET, VALUE_TEST_ENTRY_SET_1);
     entrySet = hashMap.entrySet();
-    assertEquals(entrySet.size(), SIZE_ONE);
+    assertEquals(SIZE_ONE, entrySet.size());
     Iterator<Entry<String, String>> itSet = entrySet.iterator();
     Map.Entry<String, String> entry = itSet.next();
-    assertEquals(entry.getKey(), KEY_TEST_ENTRY_SET);
-    assertEquals(entry.getValue(), VALUE_TEST_ENTRY_SET_1);
+    assertEquals(KEY_TEST_ENTRY_SET, entry.getKey());
+    assertEquals(VALUE_TEST_ENTRY_SET_1, entry.getValue());
 
     // Check that entries in the entrySet are update correctly on overwrites
     hashMap.put(KEY_TEST_ENTRY_SET, VALUE_TEST_ENTRY_SET_2);
     entrySet = hashMap.entrySet();
-    assertEquals(entrySet.size(), SIZE_ONE);
+    assertEquals(SIZE_ONE, entrySet.size());
     itSet = entrySet.iterator();
     entry = itSet.next();
-    assertEquals(entry.getKey(), KEY_TEST_ENTRY_SET);
-    assertEquals(entry.getValue(), VALUE_TEST_ENTRY_SET_2);
+    assertEquals(KEY_TEST_ENTRY_SET, entry.getKey());
+    assertEquals(VALUE_TEST_ENTRY_SET_2, entry.getValue());
 
     // Check that entries are updated on removes
     hashMap.remove(KEY_TEST_ENTRY_SET);
@@ -288,8 +288,8 @@
     Entry<String, String> bogus = dummy.entrySet().iterator().next();
     Set<Entry<String, String>> entrySet = hashMap.entrySet();
     boolean removed = entrySet.remove(bogus);
-    assertEquals(removed, false);
-    assertEquals(hashMap.get("A"), "B");
+    assertEquals(false, removed);
+    assertEquals("B", hashMap.get("A"));
   }
 
   /*
@@ -366,7 +366,7 @@
 
     dstMap.remove(KEY_KEY);
     assertTrue(dstMap.isEmpty());
-    assertEquals(dstMap.size(), 0);
+    assertEquals(0, dstMap.size());
   }
 
   public void testKeysConflict() {
@@ -375,22 +375,22 @@
     hashMap.put(STRING_ZERO_KEY, STRING_ZERO_VALUE);
     hashMap.put(INTEGER_ZERO_KEY, INTEGER_ZERO_VALUE);
     hashMap.put(ODD_ZERO_KEY, ODD_ZERO_VALUE);
-    assertEquals(hashMap.get(INTEGER_ZERO_KEY), INTEGER_ZERO_VALUE);
-    assertEquals(hashMap.get(ODD_ZERO_KEY), ODD_ZERO_VALUE);
-    assertEquals(hashMap.get(STRING_ZERO_KEY), STRING_ZERO_VALUE);
+    assertEquals(INTEGER_ZERO_VALUE, hashMap.get(INTEGER_ZERO_KEY));
+    assertEquals(ODD_ZERO_VALUE, hashMap.get(ODD_ZERO_KEY));
+    assertEquals(STRING_ZERO_VALUE, hashMap.get(STRING_ZERO_KEY));
     hashMap.remove(INTEGER_ZERO_KEY);
-    assertEquals(hashMap.get(ODD_ZERO_KEY), ODD_ZERO_VALUE);
-    assertEquals(hashMap.get(STRING_ZERO_KEY), STRING_ZERO_VALUE);
+    assertEquals(ODD_ZERO_VALUE, hashMap.get(ODD_ZERO_KEY));
+    assertEquals(STRING_ZERO_VALUE, hashMap.get(STRING_ZERO_KEY));
     assertEquals(hashMap.get(INTEGER_ZERO_KEY), null);
     hashMap.remove(ODD_ZERO_KEY);
     assertEquals(hashMap.get(INTEGER_ZERO_KEY), null);
     assertEquals(hashMap.get(ODD_ZERO_KEY), null);
-    assertEquals(hashMap.get(STRING_ZERO_KEY), STRING_ZERO_VALUE);
+    assertEquals(STRING_ZERO_VALUE, hashMap.get(STRING_ZERO_KEY));
     hashMap.remove(STRING_ZERO_KEY);
     assertEquals(hashMap.get(INTEGER_ZERO_KEY), null);
     assertEquals(hashMap.get(ODD_ZERO_KEY), null);
     assertEquals(hashMap.get(STRING_ZERO_KEY), null);
-    assertEquals(hashMap.size(), 0);
+    assertEquals(0, hashMap.size());
   }
 
   /*
@@ -545,9 +545,9 @@
     checkEmptyLinkedHashMapAssumptions(hashMap);
 
     assertNull(hashMap.put(KEY_TEST_PUT, VALUE_TEST_PUT_1));
-    assertEquals(hashMap.put(KEY_TEST_PUT, VALUE_TEST_PUT_2), VALUE_TEST_PUT_1);
+    assertEquals(VALUE_TEST_PUT_1, hashMap.put(KEY_TEST_PUT, VALUE_TEST_PUT_2));
     assertNull(hashMap.put(null, VALUE_TEST_PUT_1));
-    assertEquals(hashMap.put(null, VALUE_TEST_PUT_2), VALUE_TEST_PUT_1);
+    assertEquals(VALUE_TEST_PUT_1, hashMap.put(null, VALUE_TEST_PUT_2));
   }
 
   /**
@@ -596,9 +596,9 @@
 
     dstMap.putAll(srcMap);
     assertEquals(dstMap.size(), srcMap.size());
-    assertEquals(dstMap.get(KEY_1), VALUE_2);
-    assertEquals(dstMap.get(KEY_2), VALUE_3);
-    assertEquals(dstMap.get(KEY_3), VALUE_1);
+    assertEquals(VALUE_2, dstMap.get(KEY_1));
+    assertEquals(VALUE_3, dstMap.get(KEY_2));
+    assertEquals(VALUE_1, dstMap.get(KEY_3));
 
     // Check that a putAll does adds data but does not remove it
 
@@ -607,10 +607,10 @@
     assertEquals(dstMap.size(), srcMap.size());
     assertTrue(dstMap.containsKey(KEY_4));
     assertTrue(dstMap.containsValue(VALUE_4));
-    assertEquals(dstMap.get(KEY_1), VALUE_2);
-    assertEquals(dstMap.get(KEY_2), VALUE_3);
-    assertEquals(dstMap.get(KEY_3), VALUE_1);
-    assertEquals(dstMap.get(KEY_4), VALUE_4);
+    assertEquals(VALUE_2, dstMap.get(KEY_1));
+    assertEquals(VALUE_3, dstMap.get(KEY_2));
+    assertEquals(VALUE_1, dstMap.get(KEY_3));
+    assertEquals(VALUE_4, dstMap.get(KEY_4));
 
     dstMap.putAll(dstMap);
   }
@@ -627,7 +627,7 @@
     assertNotNull(hashMap.remove(null));
 
     hashMap.put(KEY_TEST_REMOVE, VALUE_TEST_REMOVE);
-    assertEquals(hashMap.remove(KEY_TEST_REMOVE), VALUE_TEST_REMOVE);
+    assertEquals(VALUE_TEST_REMOVE, hashMap.remove(KEY_TEST_REMOVE));
     assertNull(hashMap.remove(KEY_TEST_REMOVE));
   }
 
@@ -679,21 +679,21 @@
     checkEmptyLinkedHashMapAssumptions(hashMap);
 
     // Test size behavior on put
-    assertEquals(hashMap.size(), SIZE_ZERO);
+    assertEquals(SIZE_ZERO, hashMap.size());
     hashMap.put(KEY_1, VALUE_1);
-    assertEquals(hashMap.size(), SIZE_ONE);
+    assertEquals(SIZE_ONE, hashMap.size());
     hashMap.put(KEY_2, VALUE_2);
-    assertEquals(hashMap.size(), SIZE_TWO);
+    assertEquals(SIZE_TWO, hashMap.size());
     hashMap.put(KEY_3, VALUE_3);
-    assertEquals(hashMap.size(), SIZE_THREE);
+    assertEquals(SIZE_THREE, hashMap.size());
 
     // Test size behavior on remove
     hashMap.remove(KEY_1);
-    assertEquals(hashMap.size(), SIZE_TWO);
+    assertEquals(SIZE_TWO, hashMap.size());
     hashMap.remove(KEY_2);
-    assertEquals(hashMap.size(), SIZE_ONE);
+    assertEquals(SIZE_ONE, hashMap.size());
     hashMap.remove(KEY_3);
-    assertEquals(hashMap.size(), SIZE_ZERO);
+    assertEquals(SIZE_ZERO, hashMap.size());
 
     // Test size behavior on putAll
     hashMap.put(KEY_1, VALUE_1);
@@ -701,11 +701,11 @@
     hashMap.put(KEY_3, VALUE_3);
     LinkedHashMap<String, String> srcMap = cloneLinkedHashMap(hashMap);
     hashMap.putAll(srcMap);
-    assertEquals(hashMap.size(), SIZE_THREE);
+    assertEquals(SIZE_THREE, hashMap.size());
 
     // Test size behavior on clear
     hashMap.clear();
-    assertEquals(hashMap.size(), SIZE_ZERO);
+    assertEquals(SIZE_ZERO, hashMap.size());
   }
 
   /**
@@ -732,11 +732,11 @@
 
     Collection<String> valColl = hashMap.values();
     assertNotNull(valColl);
-    assertEquals(valColl.size(), SIZE_ONE);
+    assertEquals(SIZE_ONE, valColl.size());
 
     Iterator<String> itVal = valColl.iterator();
     String val = itVal.next();
-    assertEquals(val, VALUE_VAL);
+    assertEquals(VALUE_VAL, val);
   }
 
   @Override
diff --git a/user/test/com/google/gwt/emultest/java/util/ListTestBase.java b/user/test/com/google/gwt/emultest/java/util/ListTestBase.java
index a7a923cf..94787d9 100644
--- a/user/test/com/google/gwt/emultest/java/util/ListTestBase.java
+++ b/user/test/com/google/gwt/emultest/java/util/ListTestBase.java
@@ -66,7 +66,7 @@
   public void testAddWatch() {
     List s = makeEmptyList();
     s.add("watch");
-    assertEquals(s.get(0), "watch");
+    assertEquals("watch", s.get(0));
   }
 
   public void testListIteratorAddInSeveralPositions() {
diff --git a/user/test/com/google/gwt/emultest/java/util/StackTest.java b/user/test/com/google/gwt/emultest/java/util/StackTest.java
index 3f648dc..706743c 100644
--- a/user/test/com/google/gwt/emultest/java/util/StackTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/StackTest.java
@@ -40,7 +40,7 @@
     @SuppressWarnings("unchecked")
     Stack<Integer> cloned = (Stack<Integer>) large.clone();
     checkLargeStack(cloned, 0);
-    assertEquals(large.size(), TEST_SIZE);
+    assertEquals(TEST_SIZE, large.size());
   }
 
   /**
@@ -105,14 +105,14 @@
             "Increasing search found", searchStack.search(theInt), searchStack.size() - theInt);
       }
       for (int theInt = stackSizeIncreasing; theInt < TEST_SEARCH_SIZE; theInt++) {
-        assertEquals("Increasing not found", searchStack.search(theInt), -1);
+        assertEquals("Increasing not found", -1, searchStack.search(theInt));
       }
       searchStack.push(stackSizeIncreasing);
     }
     for (int stackSizeDecreasing = TEST_SEARCH_SIZE - 1; stackSizeDecreasing >= 0;
         stackSizeDecreasing--) {
       for (int theInt = TEST_SEARCH_SIZE - 1; theInt > stackSizeDecreasing; theInt--) {
-        assertEquals("Search decreasing not found", searchStack.search(theInt), -1);
+        assertEquals("Search decreasing not found", -1, searchStack.search(theInt));
       }
       for (int theInt = stackSizeDecreasing; theInt >= 0; theInt--) {
         assertEquals(
diff --git a/user/test/com/google/gwt/emultest/java/util/TreeMapTest.java b/user/test/com/google/gwt/emultest/java/util/TreeMapTest.java
index 783ff66..bef7fac 100644
--- a/user/test/com/google/gwt/emultest/java/util/TreeMapTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/TreeMapTest.java
@@ -1666,7 +1666,7 @@
 
     destMap.remove(keys[0]);
     assertTrue(destMap.isEmpty());
-    assertEquals(destMap.size(), 0);
+    assertEquals(0, destMap.size());
   }
 
   /**
diff --git a/user/test/com/google/gwt/emultest/java/util/TreeSetTest.java b/user/test/com/google/gwt/emultest/java/util/TreeSetTest.java
index 8fcd829..87a76d5 100644
--- a/user/test/com/google/gwt/emultest/java/util/TreeSetTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/TreeSetTest.java
@@ -905,7 +905,7 @@
 
     destSet.remove(getKeys()[0]);
     assertTrue(destSet.isEmpty());
-    assertEquals(destSet.size(), 0);
+    assertEquals(0, destSet.size());
   }
 
   /**
diff --git a/user/test/com/google/gwt/user/client/ui/CheckBoxTest.java b/user/test/com/google/gwt/user/client/ui/CheckBoxTest.java
index 1aa3133..42dad7b 100644
--- a/user/test/com/google/gwt/user/client/ui/CheckBoxTest.java
+++ b/user/test/com/google/gwt/user/client/ui/CheckBoxTest.java
@@ -75,9 +75,9 @@
   @SuppressWarnings("deprecation")
   public void testAccessors() {
     cb.setHTML("test HTML");
-    assertEquals(cb.getHTML(), "test HTML");
+    assertEquals("test HTML", cb.getHTML());
     cb.setText("test Text");
-    assertEquals(cb.getText(), "test Text");
+    assertEquals("test Text", cb.getText());
 
     cb.setValue(true);
     assertTrue(cb.getValue());
@@ -99,10 +99,10 @@
     assertTrue(cb.isEnabled());
 
     cb.setTabIndex(2);
-    assertEquals(cb.getTabIndex(), 2);
+    assertEquals(2, cb.getTabIndex());
 
     cb.setName("my name");
-    assertEquals(cb.getName(), "my name");
+    assertEquals("my name", cb.getName());
 
     cb.setFormValue("valuable");
     assertEquals("valuable", cb.getFormValue());
@@ -167,15 +167,15 @@
     cb.addClickListener(r2);
 
     ListenerTester.fire();
-    assertEquals(ListenerTester.fired, 2);
+    assertEquals(2, ListenerTester.fired);
 
     cb.removeClickListener(r1);
     ListenerTester.fire();
-    assertEquals(ListenerTester.fired, 1);
+    assertEquals(1, ListenerTester.fired);
 
     cb.removeClickListener(r2);
     ListenerTester.fire();
-    assertEquals(ListenerTester.fired, 0);
+    assertEquals(0, ListenerTester.fired);
   }
 
   public void testCheckboxClick() {
diff --git a/user/test/com/google/gwt/user/client/ui/DOMRtlTest.java b/user/test/com/google/gwt/user/client/ui/DOMRtlTest.java
index 17d7df8..f38a722 100644
--- a/user/test/com/google/gwt/user/client/ui/DOMRtlTest.java
+++ b/user/test/com/google/gwt/user/client/ui/DOMRtlTest.java
@@ -70,7 +70,7 @@
     // position to the new scroll position, but do not assume the absolute
     // position.
     outer.setScrollLeft(-50);
-    assertEquals(outer.getScrollLeft(), -50);
+    assertEquals(-50, outer.getScrollLeft());
     int absLeftScrolled = inner.getAbsoluteLeft();
     assertEquals(50, absLeftScrolled - absLeftStart);
 
diff --git a/user/test/com/google/gwt/user/client/ui/DialogBoxTest.java b/user/test/com/google/gwt/user/client/ui/DialogBoxTest.java
index b02bd66..d8e13c2 100644
--- a/user/test/com/google/gwt/user/client/ui/DialogBoxTest.java
+++ b/user/test/com/google/gwt/user/client/ui/DialogBoxTest.java
@@ -249,7 +249,7 @@
     DialogBox dialogBox = new DialogBox(caption);
     caption.setText("text");
     Element td = dialogBox.getCellElement(0, 1);
-    assertEquals(dialogBox.getText(), "text");
+    assertEquals("text", dialogBox.getText());
     caption.setHTML("<b>text</b>");
     assertEquals("<b>text</b>", dialogBox.getHTML().toLowerCase(Locale.ROOT));
     dialogBox.show();
diff --git a/user/test/com/google/gwt/user/client/ui/DockPanelTest.java b/user/test/com/google/gwt/user/client/ui/DockPanelTest.java
index 066c40d..5a0b0f0 100644
--- a/user/test/com/google/gwt/user/client/ui/DockPanelTest.java
+++ b/user/test/com/google/gwt/user/client/ui/DockPanelTest.java
@@ -90,17 +90,17 @@
     Element table = dock.getElement();
     Element tbody = DOM.getFirstChild(table);
 
-    assertEquals(DOM.getChildCount(tbody), 4);
+    assertEquals(4, DOM.getChildCount(tbody));
 
     Element tr0 = DOM.getChild(tbody, 0);
     Element tr1 = DOM.getChild(tbody, 1);
     Element tr2 = DOM.getChild(tbody, 2);
     Element tr3 = DOM.getChild(tbody, 3);
 
-    assertEquals(DOM.getChildCount(tr0), 1);
-    assertEquals(DOM.getChildCount(tr1), 1);
-    assertEquals(DOM.getChildCount(tr2), 3);
-    assertEquals(DOM.getChildCount(tr3), 1);
+    assertEquals(1, DOM.getChildCount(tr0));
+    assertEquals(1, DOM.getChildCount(tr1));
+    assertEquals(3, DOM.getChildCount(tr2));
+    assertEquals(1, DOM.getChildCount(tr3));
 
     assertTrue(l0.attachedWhenLoaded);
     assertTrue(l1.attachedWhenLoaded);
diff --git a/user/test/com/google/gwt/user/client/ui/GridTest.java b/user/test/com/google/gwt/user/client/ui/GridTest.java
index e4fb933..3bdda3e 100644
--- a/user/test/com/google/gwt/user/client/ui/GridTest.java
+++ b/user/test/com/google/gwt/user/client/ui/GridTest.java
@@ -130,7 +130,7 @@
     assertEquals(3, r.getColumnCount());
 
     int index = r.insertRow(2);
-    assertEquals(index, 2);
+    assertEquals(2, index);
     assertEquals(5, r.getRowCount());
     assertEquals(3, r.getColumnCount());
     assertEquals(5, r.getDOMRowCount());
diff --git a/user/test/com/google/gwt/user/client/ui/MenuBarTest.java b/user/test/com/google/gwt/user/client/ui/MenuBarTest.java
index e41a010..0b0c638 100644
--- a/user/test/com/google/gwt/user/client/ui/MenuBarTest.java
+++ b/user/test/com/google/gwt/user/client/ui/MenuBarTest.java
@@ -406,42 +406,42 @@
 
     // Insert first item
     MenuItem item0 = bar.insertItem(new MenuItem("test", BLANK_COMMAND), 0);
-    assertEquals(bar.getItemIndex(item0), 0);
+    assertEquals(0, bar.getItemIndex(item0));
 
     // Insert item at 0
     MenuItem item1 = bar.insertItem(new MenuItem("test", BLANK_COMMAND), 0);
-    assertEquals(bar.getItemIndex(item1), 0);
-    assertEquals(bar.getItemIndex(item0), 1);
+    assertEquals(0, bar.getItemIndex(item1));
+    assertEquals(1, bar.getItemIndex(item0));
 
     // Insert item at end
     MenuItem item2 = bar.insertItem(new MenuItem("test", BLANK_COMMAND), 2);
-    assertEquals(bar.getItemIndex(item1), 0);
-    assertEquals(bar.getItemIndex(item0), 1);
-    assertEquals(bar.getItemIndex(item2), 2);
+    assertEquals(0, bar.getItemIndex(item1));
+    assertEquals(1, bar.getItemIndex(item0));
+    assertEquals(2, bar.getItemIndex(item2));
 
     // Insert a separator at 0
     MenuItemSeparator separator0 = bar.insertSeparator(0);
-    assertEquals(bar.getSeparatorIndex(separator0), 0);
-    assertEquals(bar.getItemIndex(item1), 1);
-    assertEquals(bar.getItemIndex(item0), 2);
-    assertEquals(bar.getItemIndex(item2), 3);
+    assertEquals(0, bar.getSeparatorIndex(separator0));
+    assertEquals(1, bar.getItemIndex(item1));
+    assertEquals(2, bar.getItemIndex(item0));
+    assertEquals(3, bar.getItemIndex(item2));
 
     // Insert a separator at end
     MenuItemSeparator separator1 = bar.insertSeparator(4);
-    assertEquals(bar.getSeparatorIndex(separator0), 0);
-    assertEquals(bar.getItemIndex(item1), 1);
-    assertEquals(bar.getItemIndex(item0), 2);
-    assertEquals(bar.getItemIndex(item2), 3);
-    assertEquals(bar.getSeparatorIndex(separator1), 4);
+    assertEquals(0, bar.getSeparatorIndex(separator0));
+    assertEquals(1, bar.getItemIndex(item1));
+    assertEquals(2, bar.getItemIndex(item0));
+    assertEquals(3, bar.getItemIndex(item2));
+    assertEquals(4, bar.getSeparatorIndex(separator1));
 
     // Insert a separator at middle
     MenuItemSeparator separator2 = bar.insertSeparator(2);
-    assertEquals(bar.getSeparatorIndex(separator0), 0);
-    assertEquals(bar.getItemIndex(item1), 1);
-    assertEquals(bar.getSeparatorIndex(separator2), 2);
-    assertEquals(bar.getItemIndex(item0), 3);
-    assertEquals(bar.getItemIndex(item2), 4);
-    assertEquals(bar.getSeparatorIndex(separator1), 5);
+    assertEquals(0, bar.getSeparatorIndex(separator0));
+    assertEquals(1, bar.getItemIndex(item1));
+    assertEquals(2, bar.getSeparatorIndex(separator2));
+    assertEquals(3, bar.getItemIndex(item0));
+    assertEquals(4, bar.getItemIndex(item2));
+    assertEquals(5, bar.getSeparatorIndex(separator1));
   }
 
   /**
diff --git a/user/test/com/google/gwt/user/client/ui/TextBoxBaseTestBase.java b/user/test/com/google/gwt/user/client/ui/TextBoxBaseTestBase.java
index 2d3e8e5..7f2d6fe 100644
--- a/user/test/com/google/gwt/user/client/ui/TextBoxBaseTestBase.java
+++ b/user/test/com/google/gwt/user/client/ui/TextBoxBaseTestBase.java
@@ -91,19 +91,24 @@
     // Direction should not be affected when auto-dir is disabled.
     tb.setDirectionEstimator(false);
     tb.setText(rtlText);
-    assertEquals("Direction should not be affected when auto-dir is disabled",
-        tb.getDirection(), Direction.DEFAULT);
+    assertEquals(
+        "Direction should not be affected when auto-dir is disabled",
+        Direction.DEFAULT,
+        tb.getDirection());
 
     // Direction should be instantly updated as auto-dir is enabled.
     tb.setDirectionEstimator(true);
-    assertEquals("Direction should be instantly updated as auto-dir is enabled",
-        tb.getDirection(), Direction.RTL);
+    assertEquals(
+        "Direction should be instantly updated as auto-dir is enabled",
+        Direction.RTL,
+        tb.getDirection());
 
     // Direction should be updated on setText when auto-dir is enabled.
     tb.setText(ltrText);
     assertEquals(
         "Direction should be updated on setText when auto-dir is enabled",
-        tb.getDirection(), Direction.LTR);
+        Direction.LTR,
+        tb.getDirection());
   }
 
   /**
diff --git a/user/test/com/google/gwt/user/client/ui/WidgetCollectionTest.java b/user/test/com/google/gwt/user/client/ui/WidgetCollectionTest.java
index 915043c..4dd0f0c 100644
--- a/user/test/com/google/gwt/user/client/ui/WidgetCollectionTest.java
+++ b/user/test/com/google/gwt/user/client/ui/WidgetCollectionTest.java
@@ -69,17 +69,17 @@
     wc.add(l1);
     wc.add(l2);
 
-    assertEquals(wc.size(), 3);
+    assertEquals(3, wc.size());
     assertEquals(wc.get(1), l1);
 
     wc.remove(l1);
-    assertEquals(wc.size(), 2);
+    assertEquals(2, wc.size());
     assertEquals(wc.get(1), l2);
     assertFalse(wc.contains(l1));
 
     wc.remove(0);
     assertFalse(wc.contains(l0));
-    assertEquals(wc.indexOf(l2), 0);
+    assertEquals(0, wc.indexOf(l2));
   }
 
   public void testIterator() {
