package com.blazebit.collection;
import java.util.HashMap;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
/**
*
* @author Christian Beikov
*/
public class TrieMapTest {
public TrieMap<String> map() {
TrieMap<String> map = new TrieMap<String>();
map.put("/page/main", "/main.xhtml");
map.put("/page/main/home", "/pages/home.xhtml");
map.put("/page/main/pictures", "/pages/pictures.xhtml");
map.put("/page/main/projects", "/pages/projects.xhtml");
map.put("/page/main/projects/triemap", "/pages/projectDetails.xhtml");
map.put("/page/admin", "/admin.xhtml");
map.put("/page/sitemap", "/sitemap.xhtml");
map.put("/file/picture", "/picture.xhtml");
return map;
}
@Test
public void testPutAndGet() throws Exception {
TrieMap<String> map = new TrieMap<String>();
map.put("/page/main", null);
assertEquals(1, map.size());
assertNull(map.get("page/main"));
/* Replace value */
map.put("/page/main", "test");
assertEquals(1, map.size());
assertEquals("test", map.get("/page/main"));
}
@Test(expected = IllegalArgumentException.class)
public void testNullPut() {
TrieMap<String> map = new TrieMap<String>();
map.put(null, null);
}
@Test(expected = IllegalArgumentException.class)
public void testNullGet() {
TrieMap<String> map = new TrieMap<String>();
map.get(null);
}
@Test
public void testGetBestMatch() throws Exception {
assertEquals("/page/main/projects/",
map().getBestMatch("/page/main/projects/ai-utils"));
}
@Test
public void testRemove() throws Exception {
TrieMap<String> map = map();
assertEquals(8, map.size());
map.remove("/page/main");
assertEquals(7, map.size());
assertNull(map.get("/page/main"));
assertFalse(map.containsKey("/page/main"));
}
@Test(expected = IllegalArgumentException.class)
public void testNullRemove() {
TrieMap<String> map = new TrieMap<String>();
map.remove(null);
}
@Test
public void testClear() throws Exception {
TrieMap<String> map = map();
assertFalse(map.isEmpty());
map.clear();
assertTrue(map.isEmpty());
}
@Test
public void testContainsKey() throws Exception {
TrieMap<String> map = map();
assertTrue(map.containsKey("/page/main"));
assertFalse(map.containsKey("something that does not exist"));
}
@Test(expected = IllegalArgumentException.class)
public void testNullContainsKey() {
TrieMap<String> map = new TrieMap<String>();
map.containsKey(null);
}
@Test
public void testContainsKeyPrefix() throws Exception {
assertTrue(map().containsKeyPrefix("/p"));
assertTrue(map().containsKeyPrefix("/page"));
assertTrue(map().containsKeyPrefix("/page/"));
assertTrue(map().containsKeyPrefix("/page/main"));
assertFalse(map().containsKeyPrefix("something that does not exist"));
}
@Test(expected = IllegalArgumentException.class)
public void testNullContainsKeyPrefix() {
TrieMap<String> map = new TrieMap<String>();
map.containsKeyPrefix(null);
}
@Test
public void testContainsValue() throws Exception {
TrieMap<String> map = map();
assertTrue(map.containsValue("/main.xhtml"));
assertFalse(map.containsValue("something that does not exist"));
assertFalse(map.containsValue(null));
map.put("null holding node", null);
assertTrue(map.containsValue(null));
}
@Test
public void testInsertOrder1() throws Exception {
TrieMap<String> expectedMap1 = new TrieMap<String>();
expectedMap1.put("/page/main", null);
expectedMap1.put("/page/main/projects", "/pages/projects.xhtml");
expectedMap1.put("/page/main/pictures", "/pages/pictures.xhtml");
expectedMap1.remove("/page/main");
TrieMap<String> expectedMap2 = new TrieMap<String>();
expectedMap2.put("/page/main/projects", "/pages/projects.xhtml");
expectedMap2.put("/page/main", null);
expectedMap2.put("/page/main/pictures", "/pages/pictures.xhtml");
expectedMap2.remove("/page/main");
TrieMap<String> splitMap = new TrieMap<String>();
splitMap.put("/page/main/projects", "/pages/projects.xhtml");
splitMap.put("/page/main/pictures", "/pages/pictures.xhtml");
assertEquals(expectedMap1, splitMap);
assertEquals(expectedMap2, splitMap);
}
@Test
public void testInsertOrder2() throws Exception {
TrieMap<String> splitMap = new TrieMap<String>();
splitMap.put("/page/main/projects/triemap",
"/pages/projectDetails.xhtml");
splitMap.put("/page/main/projects", "/pages/projects.xhtml");
splitMap.put("/page/main/pictures", "/pages/pictures.xhtml");
splitMap.put("/page/main/home", "/pages/home.xhtml");
splitMap.put("/page/main", "/main.xhtml");
splitMap.put("/page/admin", "/admin.xhtml");
splitMap.put("/page/sitemap", "/sitemap.xhtml");
splitMap.put("/file/picture", "/picture.xhtml");
assertEquals(map(), splitMap);
}
@Test
public void testSize() throws Exception {
assertEquals(8, map().size());
}
@Test
public void testKeySet() throws Exception {
TrieMap<String> map = new TrieMap<String>();
Map<CharSequence, String> expectedMap = new HashMap<CharSequence, String>();
expectedMap.put("/page/main/projects/triemap",
"/pages/projectDetails.xhtml");
expectedMap.put("/page/main/projects", "/pages/projects.xhtml");
map.put("/page/main/projects/triemap", "/pages/projectDetails.xhtml");
map.put("/page/main/projects", "/pages/projects.xhtml");
assertEquals(expectedMap.keySet(), map.keySet());
}
@Test
public void testEntrySet() throws Exception {
TrieMap<String> map = new TrieMap<String>();
Map<CharSequence, String> expectedMap = new HashMap<CharSequence, String>();
expectedMap.put("/page/main/projects/triemap",
"/pages/projectDetails.xhtml");
expectedMap.put("/page/main/projects", "/pages/projects.xhtml");
map.put("/page/main/projects/triemap", "/pages/projectDetails.xhtml");
map.put("/page/main/projects", "/pages/projects.xhtml");
assertEquals(expectedMap.entrySet(), map.entrySet());
}
@Test
public void testValues() throws Exception {
TrieMap<String> map = new TrieMap<String>();
Map<CharSequence, String> expectedMap = new HashMap<CharSequence, String>();
expectedMap.put("/page/main/projects/triemap",
"/pages/projectDetails.xhtml");
expectedMap.put("/page/main/projects", "/pages/projects.xhtml");
map.put("/page/main/projects/triemap", "/pages/projectDetails.xhtml");
map.put("/page/main/projects", "/pages/projects.xhtml");
assertTrue(expectedMap.values().containsAll(map.values()));
}
@Test
public void testSubMapPutAndGet() throws Exception {
TrieMap<String> map = new TrieMap<String>();
TrieMap<String> subMap = map.subMap("/page/");
map.put("/page/main", "main");
assertEquals(1, map.size());
assertEquals(1, subMap.size());
assertNull(map.get("page/main"));
assertNull(subMap.get("/main"));
assertEquals("main", map.get("/page/main"));
assertEquals("main", subMap.get("main"));
subMap.put("main/sub", "sub");
assertEquals(2, map.size());
assertEquals(2, subMap.size());
assertEquals("sub", map.get("/page/main/sub"));
assertEquals("sub", subMap.get("main/sub"));
/* Replace value */
subMap.put("main", "test");
assertEquals(2, map.size());
assertEquals(2, subMap.size());
assertEquals("test", map.get("/page/main"));
assertEquals("test", subMap.get("main"));
}
@Test(expected = IllegalArgumentException.class)
public void testSubMapNullPut() {
map().subMap("/page").put(null, null);
}
@Test(expected = IllegalArgumentException.class)
public void testSubMapNullGet() {
map().subMap("/page").get(null);
}
@Test
public void testSubMapGetBestMatch() throws Exception {
assertEquals("/main/projects/",
map().subMap("/page").getBestMatch("/main/projects/ai-utils"));
}
@Test
public void testSubMapRemove() throws Exception {
TrieMap<String> map = map();
TrieMap<String> subMap = map.subMap("/page/");
assertEquals(8, map.size());
assertEquals(7, subMap.size());
map.remove("/page/main");
assertEquals(7, map.size());
assertEquals(6, subMap.size());
assertNull(map.get("/page/main"));
assertNull(subMap.get("main"));
assertFalse(map.containsKey("/page/main"));
assertFalse(subMap.containsKey("main"));
subMap.remove("main/home");
assertEquals(6, map.size());
assertEquals(5, subMap.size());
assertNull(map.get("/page/main/home"));
assertNull(subMap.get("main/home"));
assertFalse(map.containsKey("/page/main/home"));
assertFalse(subMap.containsKey("main/home"));
}
@Test(expected = IllegalArgumentException.class)
public void testSubMapNullRemove() {
map().subMap("/page").remove(null);
}
@Test
public void testSubMapClear() throws Exception {
TrieMap<String> map = map();
TrieMap<String> subMap = map.subMap("/page/");
assertFalse(map.isEmpty());
assertFalse(subMap.isEmpty());
map.clear();
assertTrue(map.isEmpty());
assertTrue(subMap.isEmpty());
map = map();
subMap = map.subMap("/page/");
assertFalse(map.isEmpty());
assertFalse(subMap.isEmpty());
subMap.clear();
assertFalse(map.isEmpty());
assertEquals(1, map.size());
assertTrue(subMap.isEmpty());
}
@Test
public void testSubMapContainsKey() throws Exception {
TrieMap<String> map = map();
TrieMap<String> subMap = map.subMap("/page/");
assertTrue(map.containsKey("/page/main"));
assertFalse(map.containsKey("something that does not exist"));
assertTrue(subMap.containsKey("main"));
assertFalse(subMap.containsKey("something that does not exist"));
}
@Test(expected = IllegalArgumentException.class)
public void testSubMapNullContainsKey() {
map().subMap("/page/").containsKey(null);
}
@Test
public void testSubMapContainsKeyPrefix() throws Exception {
assertTrue(map().subMap("/").containsKeyPrefix("p"));
assertTrue(map().subMap("/").containsKeyPrefix("page"));
assertTrue(map().subMap("/").containsKeyPrefix("page/"));
assertTrue(map().subMap("/").containsKeyPrefix("page/main"));
assertFalse(map().subMap("/").containsKeyPrefix(
"something that does not exist"));
}
@Test(expected = IllegalArgumentException.class)
public void testSubMapNullContainsKeyPrefix() {
map().subMap("/page/").containsKeyPrefix(null);
}
@Test
public void testSubMapContainsValue() throws Exception {
TrieMap<String> map = map().subMap("/page/");
assertTrue(map.containsValue("/main.xhtml"));
assertFalse(map.containsValue("something that does not exist"));
assertFalse(map.containsValue(null));
map.put("null holding node", null);
assertTrue(map.containsValue(null));
}
@Test
public void testSubMapInsertOrder1() throws Exception {
TrieMap<String> expectedMap1 = new TrieMap<String>();
TrieMap<String> expectedSubMap1 = expectedMap1.subMap("/");
expectedSubMap1.put("page/main", null);
expectedSubMap1.put("page/main/projects", "/pages/projects.xhtml");
expectedSubMap1.put("page/main/pictures", "/pages/pictures.xhtml");
expectedSubMap1.remove("page/main");
TrieMap<String> expectedMap2 = new TrieMap<String>();
TrieMap<String> expectedSubMap2 = expectedMap2.subMap("/");
expectedSubMap2.put("page/main/projects", "/pages/projects.xhtml");
expectedSubMap2.put("page/main", null);
expectedSubMap2.put("page/main/pictures", "/pages/pictures.xhtml");
expectedSubMap2.remove("page/main");
TrieMap<String> splitMap = new TrieMap<String>();
splitMap.put("/page/main/projects", "/pages/projects.xhtml");
splitMap.put("/page/main/pictures", "/pages/pictures.xhtml");
assertEquals(expectedMap1, splitMap);
assertEquals(expectedMap2, splitMap);
}
@Test
public void testSubMapInsertOrder2() throws Exception {
TrieMap<String> splitMap = new TrieMap<String>();
TrieMap<String> splitSubMap = splitMap.subMap("/");
splitSubMap.put("page/main/projects/triemap",
"/pages/projectDetails.xhtml");
splitSubMap.put("page/main/projects", "/pages/projects.xhtml");
splitSubMap.put("page/main/pictures", "/pages/pictures.xhtml");
splitSubMap.put("page/main/home", "/pages/home.xhtml");
splitSubMap.put("page/main", "/main.xhtml");
splitSubMap.put("page/admin", "/admin.xhtml");
splitSubMap.put("page/sitemap", "/sitemap.xhtml");
splitSubMap.put("file/picture", "/picture.xhtml");
assertEquals(map(), splitMap);
}
@Test
public void testSubMapSize() throws Exception {
assertEquals(7, map().subMap("/page").size());
assertEquals(5, map().subMap("/page").subMap("/main").size());
}
@Test
public void testSubMapKeySet() throws Exception {
Map<CharSequence, String> expectedMap = new HashMap<CharSequence, String>();
expectedMap.put("/triemap", "/pages/projectDetails.xhtml");
expectedMap.put("", "/pages/projects.xhtml");
assertEquals(expectedMap.keySet(), map().subMap("/page/main/projects")
.keySet());
}
@Test
public void testSubMapEntrySet() throws Exception {
Map<CharSequence, String> expectedMap = new HashMap<CharSequence, String>();
expectedMap.put("/triemap", "/pages/projectDetails.xhtml");
expectedMap.put("", "/pages/projects.xhtml");
assertEquals(expectedMap.entrySet(), map()
.subMap("/page/main/projects").entrySet());
}
@Test
public void testSubMapValues() throws Exception {
Map<CharSequence, String> expectedMap = new HashMap<CharSequence, String>();
expectedMap.put("/triemap", "/pages/projectDetails.xhtml");
expectedMap.put("", "/pages/projects.xhtml");
assertTrue(expectedMap.values().containsAll(
map().subMap("/page/main/projects").values()));
}
@Test
public void testSubMap() throws Exception {
assertEquals(map().subMap("/page/main"),
map().subMap("/page").subMap("/main"));
TrieMap<String> originalMap = map();
int originalSize = originalMap.size();
TrieMap<String> subMap = originalMap.subMap("/page/main/projects/");
assertEquals(1, subMap.size());
assertTrue(subMap.containsKey("triemap"));
subMap.put("ai-utils", "/pages/aiUtils.xhtml");
assertEquals(originalSize + 1, originalMap.size());
assertEquals(2, subMap.size());
assertTrue(subMap.containsKey("ai-utils"));
assertEquals("/pages/aiUtils.xhtml",
originalMap.get("/page/main/projects/ai-utils"));
assertEquals("/pages/aiUtils.xhtml", subMap.get("ai-utils"));
}
}