package edu.stanford.nlp.ling.tokensregex.matcher;
import edu.stanford.nlp.util.StringUtils;
import junit.framework.TestCase;
import java.util.*;
/**
* Test case for TrieMap
*
* @author Angel Chang
*/
public class TrieMapTest extends TestCase {
public void testTrieBasic() throws Exception {
TrieMap<String,Boolean> trieMap = new TrieMap<String,Boolean>();
trieMap.put(new String[]{"a","white","cat"}, Boolean.TRUE);
trieMap.put(new String[]{"a","white","hat"}, Boolean.TRUE);
trieMap.put(new String[]{"a","black","cat"}, Boolean.TRUE);
trieMap.put(new String[]{"a","black","cat","climbed","on","the","sofa"}, Boolean.TRUE);
System.out.println(trieMap);
System.out.println(trieMap.toFormattedString());
// Test get and remove
assertTrue(trieMap.get(new String[]{"a", "white", "hat"}));
assertNull(trieMap.get(new String[]{"a", "white"}));
trieMap.remove(new String[]{"a", "white", "hat"});
assertTrue(trieMap.get(new String[]{"a", "white", "cat"}));
assertNull(trieMap.get(new String[]{"a", "white", "hat"}));
// Test keys
assertTrue(trieMap.containsKey(new String[]{"a", "white", "cat"}));
assertFalse(trieMap.containsKey(new String[]{"white", "cat"}));
assertEquals(3, trieMap.size());
assertEquals(3, trieMap.keySet().size());
// Test putAll
Map<List<String>,Boolean> m = new HashMap<List<String>,Boolean>();
m.put( Arrays.asList("a", "purple", "giraffe"), Boolean.TRUE);
m.put( Arrays.asList("four", "orange", "bears"), Boolean.TRUE);
trieMap.putAll(m);
assertTrue(trieMap.containsKey(new String[]{"a", "purple", "giraffe"}));
assertTrue(trieMap.containsKey(new String[]{"four", "orange", "bears"}));
assertEquals(5, trieMap.size());
assertEquals(5, trieMap.keySet().size());
}
public void testTrieFindAll() throws Exception {
TrieMap<String,Boolean> trieMap = new TrieMap<String,Boolean>();
trieMap.put(new String[]{"a","white","cat"}, Boolean.TRUE);
trieMap.put(new String[]{"a","white","hat"}, Boolean.TRUE);
trieMap.put(new String[]{"a","black","cat"}, Boolean.TRUE);
trieMap.put(new String[]{"a","black","cat","climbed","on","the","sofa"}, Boolean.TRUE);
trieMap.put(new String[]{"white"}, Boolean.TRUE);
TrieMapMatcher<String,Boolean> matcher = new TrieMapMatcher<String, Boolean>(trieMap);
List<Match<String,Boolean>> matches =
matcher.findAllMatches("a","white","cat","is","wearing","a","white","hat");
List<Match<String,Boolean>> expected = new ArrayList<Match<String,Boolean>>();
expected.add(new Match<String,Boolean>(Arrays.asList("a", "white", "cat"), Boolean.TRUE, 0, 3));
expected.add(new Match<String,Boolean>(Arrays.asList("white"), Boolean.TRUE, 1, 2));
expected.add(new Match<String,Boolean>(Arrays.asList("a", "white", "hat"), Boolean.TRUE, 5, 8));
expected.add(new Match<String,Boolean>(Arrays.asList("white"), Boolean.TRUE, 6, 7));
assertEquals("Expecting " + expected.size() + " matches: got " + matches, expected.size(), matches.size());
assertEquals("Expecting " + expected + ", got " + matches, expected, matches);
}
public void testTrieFindNonOverlapping() throws Exception {
TrieMap<String,Boolean> trieMap = new TrieMap<String,Boolean>();
trieMap.put(new String[]{"a","white","cat"}, Boolean.TRUE);
trieMap.put(new String[]{"a","white","hat"}, Boolean.TRUE);
trieMap.put(new String[]{"a","black","cat"}, Boolean.TRUE);
trieMap.put(new String[]{"a","black","cat","climbed","on","the","sofa"}, Boolean.TRUE);
trieMap.put(new String[]{"white"}, Boolean.TRUE);
TrieMapMatcher<String,Boolean> matcher = new TrieMapMatcher<String, Boolean>(trieMap);
List<Match<String,Boolean>> matches =
matcher.findNonOverlapping("a","white","cat","is","wearing","a","white","hat","and","a","black","cat","climbed","on","the","sofa");
List<Match<String,Boolean>> expected = new ArrayList<Match<String,Boolean>>();
expected.add(new Match<String,Boolean>(Arrays.asList("a", "white", "cat"), Boolean.TRUE, 0, 3));
expected.add(new Match<String,Boolean>(Arrays.asList("a", "white", "hat"), Boolean.TRUE, 5, 8));
expected.add(new Match<String,Boolean>(Arrays.asList("a","black","cat","climbed","on","the","sofa"), Boolean.TRUE, 9, 16));
assertEquals("Expecting " + expected.size() + " matches: got " + matches, expected.size(), matches.size());
assertEquals("Expecting " + expected + ", got " + matches, expected, matches);
}
public void testTrieSegment() throws Exception {
TrieMap<String,Boolean> trieMap = new TrieMap<String,Boolean>();
trieMap.put(new String[]{"a","white","cat"}, Boolean.TRUE);
trieMap.put(new String[]{"a","white","hat"}, Boolean.TRUE);
trieMap.put(new String[]{"a","black","cat"}, Boolean.TRUE);
trieMap.put(new String[]{"a","black","cat","climbed","on","the","sofa"}, Boolean.TRUE);
trieMap.put(new String[]{"white"}, Boolean.TRUE);
TrieMapMatcher<String,Boolean> matcher = new TrieMapMatcher<String, Boolean>(trieMap);
List<Match<String,Boolean>> matches =
matcher.segment("a","white","cat","is","wearing","a","white","hat","and","a","black","cat","climbed","on","the","sofa");
List<Match<String,Boolean>> expected = new ArrayList<Match<String,Boolean>>();
expected.add(new Match<String,Boolean>(Arrays.asList("a", "white", "cat"), Boolean.TRUE, 0, 3));
expected.add(new Match<String,Boolean>(Arrays.asList("is", "wearing"), null, 3, 5));
expected.add(new Match<String,Boolean>(Arrays.asList("a", "white", "hat"), Boolean.TRUE, 5, 8));
expected.add(new Match<String,Boolean>(Arrays.asList("and"), null, 8, 9));
expected.add(new Match<String,Boolean>(Arrays.asList("a","black","cat","climbed","on","the","sofa"), Boolean.TRUE, 9, 16));
assertEquals("Expecting " + expected.size() + " matches: got " + matches, expected.size(), matches.size());
assertEquals("Expecting " + expected + ", got " + matches, expected, matches);
}
public void testTrieFindClosest() throws Exception {
TrieMap<String,Boolean> trieMap = new TrieMap<String,Boolean>();
trieMap.put(new String[]{"a","white","cat"}, Boolean.TRUE);
trieMap.put(new String[]{"a","white","hat"}, Boolean.TRUE);
trieMap.put(new String[]{"a","black","cat"}, Boolean.TRUE);
trieMap.put(new String[]{"a","black","hat"}, Boolean.TRUE);
trieMap.put(new String[]{"a","colored","hat"}, Boolean.TRUE);
TrieMapMatcher<String,Boolean> matcher = new TrieMapMatcher<String, Boolean>(trieMap);
List<ApproxMatch<String,Boolean>> matches = matcher.findClosestMatches(new String[]{"the", "black", "hat"}, 2);
List<ApproxMatch<String,Boolean>> expected = new ArrayList<ApproxMatch<String,Boolean>>();
expected.add(new ApproxMatch<String,Boolean>(Arrays.asList("a", "black", "hat"), Boolean.TRUE, 0, 3, 1.0));
expected.add(new ApproxMatch<String,Boolean>(Arrays.asList("a", "black", "cat"), Boolean.TRUE, 0, 3, 2.0));
assertEquals("\nExpecting " + expected + ",\n got " + matches, expected, matches);
//System.out.println(matches);
// TODO: ordering of results with same score
matches = matcher.findClosestMatches(new String[]{"the", "black"}, 5);
expected = new ArrayList<ApproxMatch<String,Boolean>>();
expected.add(new ApproxMatch<String,Boolean>(Arrays.asList("a", "black", "cat"), Boolean.TRUE, 0, 2, 2.0));
expected.add(new ApproxMatch<String,Boolean>(Arrays.asList("a", "black", "hat"), Boolean.TRUE, 0, 2, 2.0));
expected.add(new ApproxMatch<String,Boolean>(Arrays.asList("a", "colored", "hat"), Boolean.TRUE, 0, 2, 3.0));
expected.add(new ApproxMatch<String,Boolean>(Arrays.asList("a", "white", "cat"), Boolean.TRUE, 0, 2, 3.0));
expected.add(new ApproxMatch<String,Boolean>(Arrays.asList("a", "white", "hat"), Boolean.TRUE, 0, 2, 3.0));
assertEquals("\nExpecting " + StringUtils.join(expected, "\n") + ",\ngot " + StringUtils.join(matches, "\n"), expected, matches);
//System.out.println(matches);
matches = matcher.findClosestMatches(new String[]{"the", "black","cat","is","wearing","a","white","hat"}, 5);
expected = new ArrayList<ApproxMatch<String,Boolean>>();
expected.add(new ApproxMatch<String,Boolean>(Arrays.asList("a", "white", "hat"), Boolean.TRUE, 0, 8, 5.0));
expected.add(new ApproxMatch<String,Boolean>(Arrays.asList("a", "black", "cat"), Boolean.TRUE, 0, 8, 6.0));
expected.add(new ApproxMatch<String,Boolean>(Arrays.asList("a", "black", "hat"), Boolean.TRUE, 0, 8, 6.0));
expected.add(new ApproxMatch<String,Boolean>(Arrays.asList("a", "colored", "hat"), Boolean.TRUE, 0, 8, 6.0));
expected.add(new ApproxMatch<String,Boolean>(Arrays.asList("a", "white", "cat"), Boolean.TRUE, 0, 8, 6.0));
assertEquals("Expecting " + StringUtils.join(expected, "\n") + ",\ngot " + StringUtils.join(matches, "\n"), expected, matches);
//System.out.println(matches);
matches = matcher.findClosestMatches(new String[]{"the", "black","cat","is","wearing","a","white","hat"}, 6, true, true);
// [([[a, black, cat]-[a, white, hat]] -> true-true at (0,8),3.0),
expected = new ArrayList<ApproxMatch<String,Boolean>>();
expected.add(new ApproxMatch<String,Boolean>(Arrays.asList("a", "black", "cat", "a", "white", "hat"), Boolean.TRUE, 0, 8,
Arrays.asList(
new Match<String,Boolean>( Arrays.asList("a", "black", "cat"), Boolean.TRUE, 0, 3),
new Match<String,Boolean>( Arrays.asList("a", "white", "hat"), Boolean.TRUE, 5, 8)),
3.0));
// ([[a, black, hat]-[a, black, hat]] -> true-true at (0,8),4.0),
expected.add(new ApproxMatch<String,Boolean>(Arrays.asList("a", "black", "cat", "a", "black", "hat"), Boolean.TRUE, 0, 8,
Arrays.asList(
new Match<String,Boolean>( Arrays.asList("a", "black", "cat"), Boolean.TRUE, 0, 3),
new Match<String,Boolean>( Arrays.asList("a", "black", "hat"), Boolean.TRUE, 5, 8)),
4.0));
// ([[a, black, hat]-[a, colored, hat]] -> true-true at (0,8),4.0),
expected.add(new ApproxMatch<String,Boolean>(Arrays.asList("a", "black", "cat", "a", "colored", "hat"), Boolean.TRUE, 0, 8,
Arrays.asList(
new Match<String,Boolean>( Arrays.asList("a", "black", "cat"), Boolean.TRUE, 0, 3),
new Match<String,Boolean>( Arrays.asList("a", "colored", "hat"), Boolean.TRUE, 5, 8)),
4.0));
// ([[a, black, cat]-[a, white, cat]] -> true-true at (0,8),4.0),
expected.add(new ApproxMatch<String,Boolean>(Arrays.asList("a", "black", "cat", "a", "white", "cat"), Boolean.TRUE, 0, 8,
Arrays.asList(
new Match<String,Boolean>( Arrays.asList("a", "black", "cat"), Boolean.TRUE, 0, 3),
new Match<String,Boolean>( Arrays.asList("a", "white", "cat"), Boolean.TRUE, 5, 8)),
4.0));
// ([[a, black, cat]-[a, white, hat]] -> true-true at (0,8),4.0),
expected.add(new ApproxMatch<String,Boolean>(Arrays.asList("a", "black", "hat", "a", "white", "hat"), Boolean.TRUE, 0, 8,
Arrays.asList(
new Match<String,Boolean>( Arrays.asList("a", "black", "hat"), Boolean.TRUE, 0, 3),
new Match<String,Boolean>( Arrays.asList("a", "white", "hat"), Boolean.TRUE, 5, 8)),
4.0));
// ([[a, black, cat]-[a, black, cat]-[a, white, hat]] -> true-true at (0,8),4.0)]
expected.add(new ApproxMatch<String,Boolean>(Arrays.asList("a", "black", "cat", "a", "black", "cat", "a", "white", "hat"), Boolean.TRUE, 0, 8,
Arrays.asList(
new Match<String,Boolean>( Arrays.asList("a", "black", "cat"), Boolean.TRUE, 0, 3),
new Match<String,Boolean>( Arrays.asList("a", "black", "cat"), Boolean.TRUE, 3, 5),
new Match<String,Boolean>( Arrays.asList("a", "white", "hat"), Boolean.TRUE, 5, 8)),
4.0));
assertEquals("\nExpecting " + StringUtils.join(expected, "\n") + ",\ngot " + StringUtils.join(matches, "\n"), expected, matches);
}
}