/******************************************************************************* * Copyright 2012 Analog Devices, Inc. * * Licensed 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 com.analog.lyric.collect.tests; import static java.util.Objects.*; import static org.junit.Assert.*; import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.Random; import org.junit.Test; import com.analog.lyric.collect.SkipMap; import org.eclipse.jdt.annotation.NonNullByDefault; public class SkipMapTest { @Test public void test() { Comparator<Integer> naturalOrder = new Comparator<Integer>() { @Override @NonNullByDefault(false) public int compare(Integer i1, Integer i2) { return i1.compareTo(i2); } }; SkipMapTester<Integer,String> tester = new SkipMapTester<Integer,String>(); SkipMap<Integer,String> map1 = SkipMap.create(naturalOrder); assertTrue(map1.isEmpty()); tester.validateSkipMap(map1); map1.clear(); assertTrue(map1.isEmpty()); assertNull(map1.ceilingKey(42)); assertNull(map1.floorKey(42)); assertNull(map1.get(42)); assertFalse(map1.keySet().contains(42)); assertFalse(map1.values().contains("42")); Integer k = new Integer(42); assertEquals(null, map1.put(k, "43")); assertEquals(k, map1.firstKey()); assertEquals(k, map1.lastKey()); tester.validateSkipMap(map1); assertEquals("43", map1.put(k, "42")); k = 23; assertNull(map1.put(k, "23")); k = 151; assertNull(map1.put(k, "151")); assertEquals(3, map1.size()); tester.validateSkipMap(map1); assertNull(map1.get(1234)); assertNull(map1.get2(1234)); assertNull(map1.get("not a valid key")); Map.Entry<Integer, String> firstEntry = map1.firstEntry(); requireNonNull(firstEntry); assertEquals("23", firstEntry.getValue()); assertEquals("23", map1.get(map1.firstKey())); firstEntry.setValue("xxx"); assertEquals("xxx", firstEntry.getValue()); assertEquals("xxx", map1.get(map1.firstKey())); map1.clear(); assertTrue(map1.isEmpty()); Random rand = new Random(54321); int[] testInput = new int[200]; for (int i = 0; i < testInput.length; ++i) { testInput[i] = rand.nextInt(); } HashMap<Integer,String> testInputMap = new HashMap<Integer,String>(testInput.length); for (int i : testInput) { String value = Integer.toString(i); assertEquals(testInputMap.put(i, value), map1.put(i, value)); } tester.validateSkipMap(map1); map1.entrySet().clear(); assertTrue(map1.isEmpty()); tester.validateSkipMap(map1); map1.putAll(testInputMap); tester.validateSkipMap(map1); map1.keySet().clear(); assertTrue(map1.isEmpty()); tester.validateSkipMap(map1); map1.putAll(testInputMap); map1.values().clear(); assertTrue(map1.isEmpty()); tester.validateSkipMap(map1); map1.putAll(testInputMap); // Test keySet iterator SkipMap.KeySet<Integer, String> keySet = map1.keySet(); SkipMap.KeyIterator<Integer,String> keyIter = keySet.iterator(); while (keyIter.next() != null) {} keyIter.reset(); while (keyIter.next() != null) { keyIter.remove(); } assertTrue(map1.isEmpty()); assertNotSame(keyIter, keySet.iterator()); keyIter.release(); assertSame(keyIter, keySet.iterator()); // Test values iterator map1.putAll(testInputMap); SkipMap.ValueCollection<Integer,String> values = map1.values(); SkipMap.ValueIterator<Integer,String> valueIter = values.iterator(); while (valueIter.next() != null) {} valueIter.reset(); while (valueIter.next() != null) { valueIter.remove(); } assertTrue(map1.isEmpty()); assertNotSame(valueIter, values.iterator()); valueIter.release(); assertSame(valueIter, values.iterator()); // Test entries iterator map1.putAll(testInputMap); SkipMap.EntrySet<Integer,String> entries = map1.entrySet(); SkipMap.Iterator<Integer,String> iter = entries.iterator(); while (iter.next() != null) {} iter.reset(); assertNull(iter.getLastKey()); while (true) { Map.Entry<Integer,String> entry = iter.next(); if (entry == null) { break; } assertEquals(entry.getKey(), iter.getLastKey()); iter.remove(); } assertNull(iter.getLastKey()); assertTrue(map1.isEmpty()); assertNotSame(iter, entries.iterator()); iter.release(); assertSame(iter, entries.iterator()); map1.putAll(testInputMap); iter = entries.iterator(); SkipMap.Iterator<Integer,String> iter2 = entries.iterator(); assertNotSame(iter, iter2); for (int i = map1.size(); i > 0; --i) { Map.Entry<Integer,String> entry = iter.next(); requireNonNull(entry); String value = iter2.nextValue(); Integer key = iter2.getLastKey(); assertEquals(value, entry.getValue()); assertEquals(key, entry.getKey()); } } }