Added additional tests for map classes based on mutation results (#87)

diff --git a/src/test/java/org/apache/commons/collections4/collection/TransformedCollectionTest.java b/src/test/java/org/apache/commons/collections4/collection/TransformedCollectionTest.java
index 399f088..172d6f8 100644
--- a/src/test/java/org/apache/commons/collections4/collection/TransformedCollectionTest.java
+++ b/src/test/java/org/apache/commons/collections4/collection/TransformedCollectionTest.java
@@ -39,9 +39,17 @@
             return Integer.valueOf((String) input);
         }
     }
+    
+    private static class ToLowerCase implements Transformer<Object, Object> {
+        @Override
+        public Object transform(final Object input) {
+            return ((String) input).toLowerCase();
+        }
+    }
 
     public static final Transformer<Object, Object> NOOP_TRANSFORMER = TransformerUtils.nopTransformer();
     public static final Transformer<Object, Object> STRING_TO_INTEGER_TRANSFORMER = new StringToInteger();
+    public static final Transformer<Object, Object> TO_LOWER_CASE_TRANSFORMER = new ToLowerCase();
 
     public TransformedCollectionTest(final String testName) {
         super(testName);
diff --git a/src/test/java/org/apache/commons/collections4/map/LazySortedMapTest.java b/src/test/java/org/apache/commons/collections4/map/LazySortedMapTest.java
index f031591..4a67ec8 100644
--- a/src/test/java/org/apache/commons/collections4/map/LazySortedMapTest.java
+++ b/src/test/java/org/apache/commons/collections4/map/LazySortedMapTest.java
@@ -22,6 +22,7 @@
 import java.util.Map;
 import java.util.SortedMap;
 import java.util.TreeMap;
+import java.util.concurrent.ConcurrentSkipListMap;
 
 import org.apache.commons.collections4.Factory;
 import org.apache.commons.collections4.FactoryUtils;
@@ -38,7 +39,16 @@
 @SuppressWarnings("boxing")
 public class LazySortedMapTest<K, V> extends AbstractSortedMapTest<K, V> {
 
+	private class ReverseStringComparator implements Comparator<String> {
+		@Override
+		public int compare(String arg0, String arg1) {
+			return arg1.compareTo(arg0);
+		}
+	}
+	
     private static final Factory<Integer> oneFactory = FactoryUtils.constantFactory(1);
+    
+    protected final Comparator<String> reverseStringComparator = new ReverseStringComparator();
 
     public LazySortedMapTest(final String testName) {
         super(testName);
@@ -95,6 +105,25 @@
         assertTrue("natural order, so comparator should be null",
             c == null);
     }
+    
+    public void testReverseSortOrder() {
+        final SortedMap<String, Number> map = lazySortedMap(new ConcurrentSkipListMap<String, Number>(reverseStringComparator), oneFactory);
+        map.put("A",  5);
+        map.get("B"); // Entry with value "One" created
+        map.put("C", 8);
+        assertEquals("Last key should be A", "A", map.lastKey());
+        assertEquals("First key should be C", "C", map.firstKey());
+        assertEquals("First key in tail map should be B",
+            "B", map.tailMap("B").firstKey());
+        assertEquals("Last key in head map should be B",
+            "B", map.headMap("A").lastKey());
+        assertEquals("Last key in submap should be B",
+            "B", map.subMap("C","A").lastKey());
+
+        final Comparator<?> c = map.comparator();
+        assertTrue("natural order, so comparator should be null",
+            c == reverseStringComparator);
+    }
 
     public void testTransformerDecorate() {
         final Transformer<Object, Integer> transformer = TransformerUtils.asTransformer(oneFactory);
diff --git a/src/test/java/org/apache/commons/collections4/map/PredicatedSortedMapTest.java b/src/test/java/org/apache/commons/collections4/map/PredicatedSortedMapTest.java
index 2758131..dd059ab 100644
--- a/src/test/java/org/apache/commons/collections4/map/PredicatedSortedMapTest.java
+++ b/src/test/java/org/apache/commons/collections4/map/PredicatedSortedMapTest.java
@@ -22,6 +22,7 @@
 import java.util.Map;
 import java.util.SortedMap;
 import java.util.TreeMap;
+import java.util.concurrent.ConcurrentSkipListMap;
 
 import org.apache.commons.collections4.Predicate;
 import org.apache.commons.collections4.functors.TruePredicate;
@@ -34,9 +35,18 @@
  */
 public class PredicatedSortedMapTest<K, V> extends AbstractSortedMapTest<K, V> {
 
+	private class ReverseStringComparator implements Comparator<K> {
+		@Override
+		public int compare(K arg0, K arg1) {
+			return ((String) arg1).compareTo((String)arg0);
+		}
+	}
+	
     protected static final Predicate<Object> truePredicate = TruePredicate.truePredicate();
 
     protected static final Predicate<Object> testPredicate = o -> o instanceof String;
+    
+    protected final Comparator<K> reverseStringComparator = new ReverseStringComparator();
 
     public PredicatedSortedMapTest(final String testName) {
         super(testName);
@@ -56,6 +66,10 @@
     public SortedMap<K, V> makeTestMap() {
         return decorateMap(new TreeMap<K, V>(), testPredicate, testPredicate);
     }
+    
+    public SortedMap<K, V> makeTestMapWithComparator() {
+        return decorateMap(new ConcurrentSkipListMap<K, V>(reverseStringComparator), testPredicate, testPredicate);
+    }
 
     @Override
     public boolean isSubMapViewsSerializable() {
@@ -164,6 +178,38 @@
         assertTrue("natural order, so comparator should be null",
             c == null);
     }
+    
+    @SuppressWarnings("unchecked")
+    public void testReverseSortOrder() {
+        final SortedMap<K, V> map = makeTestMapWithComparator();
+        map.put((K) "A",  (V) "a");
+        map.put((K) "B", (V) "b");
+        try {
+            map.put(null, (V) "c");
+            fail("Null key should raise IllegalArgument");
+        } catch (final IllegalArgumentException e) {
+            // expected
+        }
+        map.put((K) "C", (V) "c");
+        try {
+            map.put((K) "D", null);
+            fail("Null value should raise IllegalArgument");
+        } catch (final IllegalArgumentException e) {
+            // expected
+        }
+        assertEquals("Last key should be A", "A", map.lastKey());
+        assertEquals("First key should be C", "C", map.firstKey());
+        assertEquals("First key in tail map should be B",
+            "B", map.tailMap((K) "B").firstKey());
+        assertEquals("Last key in head map should be B",
+            "B", map.headMap((K) "A").lastKey());
+        assertEquals("Last key in submap should be B",
+           "B", map.subMap((K) "C",(K) "A").lastKey());
+
+        final Comparator<? super K> c = map.comparator();
+        assertTrue("reverse order, so comparator should be reverseStringComparator",
+            c == reverseStringComparator);
+    }
 
     @Override
     public String getCompatibilityVersion() {
diff --git a/src/test/java/org/apache/commons/collections4/map/TransformedMapTest.java b/src/test/java/org/apache/commons/collections4/map/TransformedMapTest.java
index c2eaff7..aab0797 100644
--- a/src/test/java/org/apache/commons/collections4/map/TransformedMapTest.java
+++ b/src/test/java/org/apache/commons/collections4/map/TransformedMapTest.java
@@ -125,14 +125,14 @@
         final Map<K, V> trans = TransformedMap
                 .transformedMap(
                         base,
-                        null,
+                        (Transformer<? super K, ? extends K>) TransformedCollectionTest.TO_LOWER_CASE_TRANSFORMER,
                         (Transformer<? super V, ? extends V>) TransformedCollectionTest.STRING_TO_INTEGER_TRANSFORMER);
         assertEquals(3, trans.size());
-        assertEquals(Integer.valueOf(1), trans.get("A"));
-        assertEquals(Integer.valueOf(2), trans.get("B"));
-        assertEquals(Integer.valueOf(3), trans.get("C"));
+        assertEquals(Integer.valueOf(1), trans.get("a"));
+        assertEquals(Integer.valueOf(2), trans.get("b"));
+        assertEquals(Integer.valueOf(3), trans.get("c"));
         trans.put((K) "D", (V) "4");
-        assertEquals(Integer.valueOf(4), trans.get("D"));
+        assertEquals(Integer.valueOf(4), trans.get("d"));
     }
 
     //-----------------------------------------------------------------------