/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.collections.map; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; import org.apache.commons.collections.BulkTest; /** * Abstract test class for {@link java.util.SortedMap} methods and contracts. * * @version $Revision: 646780 $ $Date: 2008-04-10 13:48:07 +0100 (Thu, 10 Apr 2008) $ * * @author Stephen Colebourne */ public abstract class AbstractTestSortedMap extends AbstractTestMap { /** * JUnit constructor. * * @param testName the test name */ public AbstractTestSortedMap(String testName) { super(testName); } //----------------------------------------------------------------------- /** * Can't sort null keys. * * @return false */ public boolean isAllowNullKey() { return false; } /** * SortedMap uses TreeMap as its known comparison. * * @return a map that is known to be valid */ public Map makeConfirmedMap() { return new TreeMap(); } //----------------------------------------------------------------------- public void testComparator() { SortedMap sm = (SortedMap) makeFullMap(); // no tests I can think of } public void testFirstKey() { SortedMap sm = (SortedMap) makeFullMap(); assertSame(sm.keySet().iterator().next(), sm.firstKey()); } public void testLastKey() { SortedMap sm = (SortedMap) makeFullMap(); Object obj = null; for (Iterator it = sm.keySet().iterator(); it.hasNext();) { obj = (Object) it.next(); } assertSame(obj, sm.lastKey()); } //----------------------------------------------------------------------- public BulkTest bulkTestHeadMap() { return new TestHeadMap(this); } public BulkTest bulkTestTailMap() { return new TestTailMap(this); } public BulkTest bulkTestSubMap() { return new TestSubMap(this); } public static abstract class TestViewMap extends AbstractTestSortedMap { protected final AbstractTestMap main; protected final List subSortedKeys = new ArrayList(); protected final List subSortedValues = new ArrayList(); protected final List subSortedNewValues = new ArrayList(); public TestViewMap(String name, AbstractTestMap main) { super(name); this.main = main; } public void resetEmpty() { // needed to init verify correctly main.resetEmpty(); super.resetEmpty(); } public void resetFull() { // needed to init verify correctly main.resetFull(); super.resetFull(); } public void verify() { // cross verify changes on view with changes on main map super.verify(); main.verify(); } public BulkTest bulkTestHeadMap() { return null; // block infinite recursion } public BulkTest bulkTestTailMap() { return null; // block infinite recursion } public BulkTest bulkTestSubMap() { return null; // block infinite recursion } public Object[] getSampleKeys() { return subSortedKeys.toArray(); } public Object[] getSampleValues() { return subSortedValues.toArray(); } public Object[] getNewSampleValues() { return subSortedNewValues.toArray(); } public boolean isAllowNullKey() { return main.isAllowNullKey(); } public boolean isAllowNullValue() { return main.isAllowNullValue(); } public boolean isPutAddSupported() { return main.isPutAddSupported(); } public boolean isPutChangeSupported() { return main.isPutChangeSupported(); } public boolean isRemoveSupported() { return main.isRemoveSupported(); } public boolean isTestSerialization() { return false; } // public void testSimpleSerialization() throws Exception { // if (main.isSubMapViewsSerializable() == false) return; // super.testSimpleSerialization(); // } // public void testSerializeDeserializeThenCompare() throws Exception { // if (main.isSubMapViewsSerializable() == false) return; // super.testSerializeDeserializeThenCompare(); // } // public void testEmptyMapCompatibility() throws Exception { // if (main.isSubMapViewsSerializable() == false) return; // super.testEmptyMapCompatibility(); // } // public void testFullMapCompatibility() throws Exception { // if (main.isSubMapViewsSerializable() == false) return; // super.testFullMapCompatibility(); // } } public static class TestHeadMap extends TestViewMap { static final int SUBSIZE = 6; final Object toKey; public TestHeadMap(AbstractTestMap main) { super("SortedMap.HeadMap", main); SortedMap sm = (SortedMap) main.makeFullMap(); for (Iterator it = sm.entrySet().iterator(); it.hasNext();) { Map.Entry entry = (Map.Entry) it.next(); this.subSortedKeys.add(entry.getKey()); this.subSortedValues.add(entry.getValue()); } this.toKey = this.subSortedKeys.get(SUBSIZE); this.subSortedKeys.subList(SUBSIZE, this.subSortedKeys.size()).clear(); this.subSortedValues.subList(SUBSIZE, this.subSortedValues.size()).clear(); this.subSortedNewValues.addAll(Arrays.asList(main.getNewSampleValues()).subList(0, SUBSIZE)); } public Map makeEmptyMap() { // done this way so toKey is correctly set in the returned map return ((SortedMap) main.makeEmptyMap()).headMap(toKey); } public Map makeFullMap() { return ((SortedMap) main.makeFullMap()).headMap(toKey); } public void testHeadMapOutOfRange() { if (isPutAddSupported() == false) return; resetEmpty(); try { ((SortedMap) map).put(toKey, subSortedValues.get(0)); fail(); } catch (IllegalArgumentException ex) {} verify(); } public String getCompatibilityVersion() { return main.getCompatibilityVersion() + ".HeadMapView"; } // public void testCreate() throws Exception { // Map map = makeEmptyMap(); // writeExternalFormToDisk( // (java.io.Serializable) map, // "D:/dev/collections/data/test/FixedSizeSortedMap.emptyCollection.version3.1.HeadMapView.obj"); // map = makeFullMap(); // writeExternalFormToDisk( // (java.io.Serializable) map, // "D:/dev/collections/data/test/FixedSizeSortedMap.fullCollection.version3.1.HeadMapView.obj"); // } } public static class TestTailMap extends TestViewMap { static final int SUBSIZE = 6; final Object fromKey; final Object invalidKey; public TestTailMap(AbstractTestMap main) { super("SortedMap.TailMap", main); SortedMap sm = (SortedMap) main.makeFullMap(); for (Iterator it = sm.entrySet().iterator(); it.hasNext();) { Map.Entry entry = (Map.Entry) it.next(); this.subSortedKeys.add(entry.getKey()); this.subSortedValues.add(entry.getValue()); } this.fromKey = this.subSortedKeys.get(this.subSortedKeys.size() - SUBSIZE); this.invalidKey = this.subSortedKeys.get(this.subSortedKeys.size() - SUBSIZE - 1); this.subSortedKeys.subList(0, this.subSortedKeys.size() - SUBSIZE).clear(); this.subSortedValues.subList(0, this.subSortedValues.size() - SUBSIZE).clear(); this.subSortedNewValues.addAll(Arrays.asList(main.getNewSampleValues()).subList(0, SUBSIZE)); } public Map makeEmptyMap() { // done this way so toKey is correctly set in the returned map return ((SortedMap) main.makeEmptyMap()).tailMap(fromKey); } public Map makeFullMap() { return ((SortedMap) main.makeFullMap()).tailMap(fromKey); } public void testTailMapOutOfRange() { if (isPutAddSupported() == false) return; resetEmpty(); try { ((SortedMap) map).put(invalidKey, subSortedValues.get(0)); fail(); } catch (IllegalArgumentException ex) {} verify(); } public String getCompatibilityVersion() { return main.getCompatibilityVersion() + ".TailMapView"; } // public void testCreate() throws Exception { // Map map = makeEmptyMap(); // writeExternalFormToDisk( // (java.io.Serializable) map, // "D:/dev/collections/data/test/FixedSizeSortedMap.emptyCollection.version3.1.TailMapView.obj"); // map = makeFullMap(); // writeExternalFormToDisk( // (java.io.Serializable) map, // "D:/dev/collections/data/test/FixedSizeSortedMap.fullCollection.version3.1.TailMapView.obj"); // } } public static class TestSubMap extends TestViewMap { static final int SUBSIZE = 3; final Object fromKey; final Object toKey; public TestSubMap(AbstractTestMap main) { super("SortedMap.SubMap", main); SortedMap sm = (SortedMap) main.makeFullMap(); for (Iterator it = sm.entrySet().iterator(); it.hasNext();) { Map.Entry entry = (Map.Entry) it.next(); this.subSortedKeys.add(entry.getKey()); this.subSortedValues.add(entry.getValue()); } this.fromKey = this.subSortedKeys.get(SUBSIZE); this.toKey = this.subSortedKeys.get(this.subSortedKeys.size() - SUBSIZE); this.subSortedKeys.subList(0, SUBSIZE).clear(); this.subSortedKeys.subList(this.subSortedKeys.size() - SUBSIZE, this.subSortedKeys.size()).clear(); this.subSortedValues.subList(0, SUBSIZE).clear(); this.subSortedValues.subList(this.subSortedValues.size() - SUBSIZE, this.subSortedValues.size()).clear(); this.subSortedNewValues.addAll(Arrays.asList(main.getNewSampleValues()).subList( SUBSIZE, this.main.getNewSampleValues().length - SUBSIZE)); } public Map makeEmptyMap() { // done this way so toKey is correctly set in the returned map return ((SortedMap) main.makeEmptyMap()).subMap(fromKey, toKey); } public Map makeFullMap() { return ((SortedMap) main.makeFullMap()).subMap(fromKey, toKey); } public void testSubMapOutOfRange() { if (isPutAddSupported() == false) return; resetEmpty(); try { ((SortedMap) map).put(toKey, subSortedValues.get(0)); fail(); } catch (IllegalArgumentException ex) {} verify(); } public String getCompatibilityVersion() { return main.getCompatibilityVersion() + ".SubMapView"; } // public void testCreate() throws Exception { // Map map = makeEmptyMap(); // writeExternalFormToDisk( // (java.io.Serializable) map, // "D:/dev/collections/data/test/TransformedSortedMap.emptyCollection.version3.1.SubMapView.obj"); // map = makeFullMap(); // writeExternalFormToDisk( // (java.io.Serializable) map, // "D:/dev/collections/data/test/TransformedSortedMap.fullCollection.version3.1.SubMapView.obj"); // } } }