// Copyright 2013 Thomas Müller
// This file is part of MarMoT, which is licensed under GPLv3.
package marmot.test.util;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertTrue;
import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import marmot.util.CollectableDouble;
import marmot.util.CollectableSet;
import marmot.util.StringUtils;
import marmot.util.Trie;
import org.junit.Test;
public class TrieTest {
@Test
public void testSimpleDoubleInsertion() {
Trie<CollectableDouble> trie = new Trie<CollectableDouble>();
trie.addWord("a", new CollectableDouble(10.));
assertFalse(trie.isTerminal());
Map<Character, Trie<CollectableDouble>> children = trie.getChildren();
assertNotSame(null, children);
assertEquals(1, children.size());
Trie<CollectableDouble> child = children.get('a');
assertNotSame(null, child);
assertEquals(10., child.getContent().getValue(), 0.001);
assertTrue(child.isTerminal());
trie.addWord("a", new CollectableDouble(20.));
assertEquals(30., child.getContent().getValue(), 0.001);
trie.addWord("ab", new CollectableDouble(20.));
assertEquals(30., child.getContent().getValue(), 0.001);
}
@Test
public void testSimpleWord() {
Trie<CollectableDouble> trie = new Trie<CollectableDouble>();
trie.addWord("ab", new CollectableDouble(10.));
assertFalse(trie.isTerminal());
Map<Character, Trie<CollectableDouble>> children = trie.getChildren();
assertNotSame(null, children);
assertEquals(1, children.size());
Trie<CollectableDouble> child = children.get('a');
assertNotSame(null, child);
assertEquals(null, child.getContent());
assertFalse(child.isTerminal());
children = child.getChildren();
assertNotSame(null, children);
assertEquals(1, children.size());
child = children.get('b');
assertNotSame(null, child);
assertEquals(10., child.getContent().getValue(), 0.001);
assertTrue(child.isTerminal());
}
@Test
public void toyTestPropagation() {
Trie<CollectableSet> trie, child;
Map<Character, Trie<CollectableSet>> children;
trie = new Trie<CollectableSet>();
trie.addWord("abc", new CollectableSet("A"));
trie.propagateContent(100);
children = trie.getChildren();
assertTrue(null == children);
assertEquals(Collections.singleton("A"), trie.getContent().getValue());
trie = new Trie<CollectableSet>();
trie.addWord("abc", new CollectableSet("A"));
trie.addWord("a", new CollectableSet("B"));
trie.propagateContent(100);
children = trie.getChildren();
assertTrue(null != children);
assertEquals(1, children.size());
child = children.get('a');
assertTrue(null != child);
assertTrue(null == child.getContent());
Set<String> expected_set = new HashSet<String>();
expected_set.add("A");
expected_set.add("B");
assertEquals(expected_set, trie.getContent().getValue());
children = child.getChildren();
assertTrue(null != children);
assertEquals(1, children.size());
child = children.get('b');
children = child.getChildren();
assertTrue(null == children);
assertEquals(Collections.singleton("A"), child.getContent().getValue());
}
public String reverse(String s) {
return StringUtils.reverse(s);
}
@Test
public void testPropagation() {
Trie<CollectableSet> trie = new Trie<CollectableSet>();
Set<String> expected_set = new HashSet<String>();
CollectableSet cset;
trie.addWord(reverse("booking"), new CollectableSet("V"));
trie.addWord(reverse("booking"), new CollectableSet("N"));
trie.addWord(reverse("sleeping"), new CollectableSet("V"));
trie.addWord(reverse("reads"), new CollectableSet("V"));
trie.addWord(reverse("knows"), new CollectableSet("V"));
trie.propagateContent(100);
cset = trie.getContent(reverse("ing"));
assertTrue(null != cset);
expected_set.add("V");
expected_set.add("N");
assertEquals(expected_set, cset.getValue());
cset = trie.getContent(reverse("ping"));
assertTrue(null != cset);
expected_set.clear();
expected_set.add("V");
assertEquals(expected_set, cset.getValue());
cset = trie.getContent(reverse("s"));
assertTrue(null != cset);
expected_set.clear();
expected_set.add("V");
assertEquals(expected_set, cset.getValue());
cset = trie.getContent(reverse("viking"));
assertTrue(null != cset);
expected_set.clear();
expected_set.add("V");
expected_set.add("N");
assertEquals(expected_set, cset.getValue());
cset = trie.getContent(reverse("weeping"));
assertTrue(null != cset);
expected_set.clear();
expected_set.add("V");
assertEquals(expected_set, cset.getValue());
cset = trie.getContent(reverse("geese"));
assertTrue(null != cset);
expected_set.clear();
expected_set.add("V");
expected_set.add("N");
assertEquals(expected_set, cset.getValue());
}
}