package edu.stanford.nlp.util;
import edu.stanford.nlp.ling.CoreLabel;
import junit.framework.TestCase;
import java.util.ArrayList;
import java.util.List;
import edu.stanford.nlp.ling.CoreAnnotations;
/**
* Test various operations of the ArrayCoreMap: equals, toString, etc.
*/
public class ArrayCoreMapTest extends TestCase {
public void testCreate() {
ArrayCoreMap foo = new ArrayCoreMap();
assertEquals(0, foo.size());
}
public void testGetAndSet() {
ArrayCoreMap foo = new ArrayCoreMap();
assertEquals(0, foo.size());
foo.set(CoreAnnotations.TextAnnotation.class, "foo");
assertEquals("foo", foo.get(CoreAnnotations.TextAnnotation.class));
assertEquals(null, foo.get(CoreAnnotations.PartOfSpeechAnnotation.class));
assertEquals(null, foo.get(CoreAnnotations.ParagraphsAnnotation.class));
assertEquals(1, foo.size());
foo.set(CoreAnnotations.PartOfSpeechAnnotation.class, "F");
assertEquals("foo", foo.get(CoreAnnotations.TextAnnotation.class));
assertEquals("F", foo.get(CoreAnnotations.PartOfSpeechAnnotation.class));
assertEquals(null, foo.get(CoreAnnotations.ParagraphsAnnotation.class));
assertEquals(2, foo.size());
List<CoreMap> paragraphs = new ArrayList<CoreMap>();
ArrayCoreMap f1 = new ArrayCoreMap();
f1.set(CoreAnnotations.TextAnnotation.class, "f");
paragraphs.add(f1);
ArrayCoreMap f2 = new ArrayCoreMap();
f2.set(CoreAnnotations.TextAnnotation.class, "o");
paragraphs.add(f2);
foo.set(CoreAnnotations.ParagraphsAnnotation.class, paragraphs);
assertEquals("foo", foo.get(CoreAnnotations.TextAnnotation.class));
assertEquals("F", foo.get(CoreAnnotations.PartOfSpeechAnnotation.class));
// will test equality of the coremaps in another test
assertEquals(3, foo.size());
}
public void testSimpleEquals() {
ArrayCoreMap foo = new ArrayCoreMap();
List<CoreMap> paragraphs = new ArrayList<CoreMap>();
ArrayCoreMap f1 = new ArrayCoreMap();
f1.set(CoreAnnotations.TextAnnotation.class, "f");
paragraphs.add(f1);
ArrayCoreMap f2 = new ArrayCoreMap();
f2.set(CoreAnnotations.TextAnnotation.class, "o");
paragraphs.add(f2);
foo.set(CoreAnnotations.ParagraphsAnnotation.class, paragraphs);
ArrayCoreMap bar = new ArrayCoreMap();
bar.set(CoreAnnotations.ParagraphsAnnotation.class, paragraphs);
assertEquals(foo, bar);
assertEquals(bar, foo);
assertFalse(foo.equals(f1));
assertFalse(foo.equals(f2));
assertEquals(f1, f1);
assertFalse(f1.equals(f2));
}
/**
* Test that neither hashCode() nor toString() hang
*/
public void testKeySet() {
ArrayCoreMap foo = new ArrayCoreMap();
foo.set(CoreAnnotations.TextAnnotation.class, "foo");
foo.set(CoreAnnotations.PartOfSpeechAnnotation.class, "NN");
foo.set(CoreAnnotations.DocIDAnnotation.class, null);
assertTrue(foo.keySet().contains(CoreAnnotations.TextAnnotation.class));
assertTrue(foo.keySet().contains(CoreAnnotations.PartOfSpeechAnnotation.class));
assertTrue(foo.keySet().contains(CoreAnnotations.DocIDAnnotation.class));
assertFalse(foo.keySet().contains(CoreAnnotations.TokensAnnotation.class));
}
/**
* Test that neither hashCode() nor toString() hang
*/
public void testNoHanging() {
ArrayCoreMap foo = new ArrayCoreMap();
List<CoreMap> paragraphs = new ArrayList<CoreMap>();
ArrayCoreMap f1 = new ArrayCoreMap();
f1.set(CoreAnnotations.TextAnnotation.class, "f");
paragraphs.add(f1);
ArrayCoreMap f2 = new ArrayCoreMap();
f2.set(CoreAnnotations.TextAnnotation.class, "o");
paragraphs.add(f2);
foo.set(CoreAnnotations.ParagraphsAnnotation.class, paragraphs);
foo.toString();
foo.hashCode();
}
public void testRemove() {
ArrayCoreMap foo = new ArrayCoreMap();
foo.set(CoreAnnotations.TextAnnotation.class, "foo");
foo.set(CoreAnnotations.PartOfSpeechAnnotation.class, "F");
assertEquals("foo", foo.get(CoreAnnotations.TextAnnotation.class));
assertEquals("F", foo.get(CoreAnnotations.PartOfSpeechAnnotation.class));
assertEquals(2, foo.size());
foo.remove(CoreAnnotations.TextAnnotation.class);
assertEquals(1, foo.size());
assertEquals(null, foo.get(CoreAnnotations.TextAnnotation.class));
assertEquals("F", foo.get(CoreAnnotations.PartOfSpeechAnnotation.class));
foo.set(CoreAnnotations.TextAnnotation.class, "bar");
assertEquals("bar", foo.get(CoreAnnotations.TextAnnotation.class));
assertEquals("F", foo.get(CoreAnnotations.PartOfSpeechAnnotation.class));
assertEquals(2, foo.size());
foo.remove(CoreAnnotations.TextAnnotation.class);
assertEquals(1, foo.size());
assertEquals(null, foo.get(CoreAnnotations.TextAnnotation.class));
assertEquals("F", foo.get(CoreAnnotations.PartOfSpeechAnnotation.class));
foo.remove(CoreAnnotations.PartOfSpeechAnnotation.class);
assertEquals(0, foo.size());
assertEquals(null, foo.get(CoreAnnotations.TextAnnotation.class));
assertEquals(null, foo.get(CoreAnnotations.PartOfSpeechAnnotation.class));
// Removing an element that doesn't exist
// shouldn't blow up on us in any way
foo.remove(CoreAnnotations.PartOfSpeechAnnotation.class);
assertEquals(0, foo.size());
assertEquals(null, foo.get(CoreAnnotations.TextAnnotation.class));
assertEquals(null, foo.get(CoreAnnotations.PartOfSpeechAnnotation.class));
// after removing all sorts of stuff, the original ArrayCoreMap
// should now be equal to a new empty one
ArrayCoreMap bar = new ArrayCoreMap();
assertEquals(foo, bar);
foo.set(CoreAnnotations.TextAnnotation.class, "foo");
foo.set(CoreAnnotations.PartOfSpeechAnnotation.class, "F");
bar.set(CoreAnnotations.TextAnnotation.class, "foo");
assertFalse(foo.equals(bar));
foo.remove(CoreAnnotations.PartOfSpeechAnnotation.class);
assertEquals(foo, bar);
assertEquals(1, foo.size());
foo.remove(CoreAnnotations.PartOfSpeechAnnotation.class);
assertEquals(1, foo.size());
assertEquals("foo", foo.get(CoreAnnotations.TextAnnotation.class));
assertEquals(null, foo.get(CoreAnnotations.PartOfSpeechAnnotation.class));
}
public void testToShortString() {
ArrayCoreMap foo = new ArrayCoreMap();
foo.set(CoreAnnotations.TextAnnotation.class, "word");
foo.set(CoreAnnotations.PartOfSpeechAnnotation.class, "NN");
assertEquals("word/NN", foo.toShortString("Text", "PartOfSpeech"));
assertEquals("NN", foo.toShortString("PartOfSpeech"));
assertEquals("", foo.toShortString("Lemma"));
assertEquals("word|NN", foo.toShortString('|', "Text", "PartOfSpeech", "Lemma"));
foo.set(CoreAnnotations.AntecedentAnnotation.class, "the price of tea");
assertEquals("{word/NN/the price of tea}", foo.toShortString("Text", "PartOfSpeech", "Antecedent"));
}
/**
* Tests equals in the case of different annotations added in
* different orders
*/
public void testEqualsReversedInsertOrder() {
ArrayCoreMap foo = new ArrayCoreMap();
List<CoreMap> paragraphs = new ArrayList<CoreMap>();
ArrayCoreMap f1 = new ArrayCoreMap();
f1.set(CoreAnnotations.TextAnnotation.class, "f");
paragraphs.add(f1);
ArrayCoreMap f2 = new ArrayCoreMap();
f2.set(CoreAnnotations.TextAnnotation.class, "o");
paragraphs.add(f2);
foo.set(CoreAnnotations.ParagraphsAnnotation.class, paragraphs);
foo.set(CoreAnnotations.TextAnnotation.class, "A");
foo.set(CoreAnnotations.PartOfSpeechAnnotation.class, "B");
ArrayCoreMap bar = new ArrayCoreMap();
List<CoreMap> paragraphs2 = new ArrayList<CoreMap>(paragraphs);
bar.set(CoreAnnotations.TextAnnotation.class, "A");
bar.set(CoreAnnotations.PartOfSpeechAnnotation.class, "B");
bar.set(CoreAnnotations.ParagraphsAnnotation.class, paragraphs2);
assertEquals(foo, bar);
assertEquals(bar, foo);
assertFalse(foo.equals(f1));
assertFalse(foo.equals(f2));
assertEquals(3, foo.size());
}
/**
* ArrayCoreMap should be able to handle loops in its annotations
* without blowing up
*/
public void testObjectLoops() {
ArrayCoreMap foo = new ArrayCoreMap();
foo.set(CoreAnnotations.TextAnnotation.class, "foo");
foo.set(CoreAnnotations.PartOfSpeechAnnotation.class, "B");
List<CoreMap> fooParagraph = new ArrayList<CoreMap>();
fooParagraph.add(foo);
ArrayCoreMap f1 = new ArrayCoreMap();
f1.set(CoreAnnotations.ParagraphsAnnotation.class, fooParagraph);
List<CoreMap> p1 = new ArrayList<CoreMap>();
p1.add(f1);
foo.set(CoreAnnotations.ParagraphsAnnotation.class, p1);
foo.toString();
foo.hashCode();
}
public void testObjectLoopEquals() {
ArrayCoreMap foo = new ArrayCoreMap();
foo.set(CoreAnnotations.TextAnnotation.class, "foo");
foo.set(CoreAnnotations.PartOfSpeechAnnotation.class, "B");
List<CoreMap> fooParagraph = new ArrayList<CoreMap>();
fooParagraph.add(foo);
ArrayCoreMap f1 = new ArrayCoreMap();
f1.set(CoreAnnotations.ParagraphsAnnotation.class, fooParagraph);
List<CoreMap> p1 = new ArrayList<CoreMap>();
p1.add(f1);
foo.set(CoreAnnotations.ParagraphsAnnotation.class, p1);
foo.toString();
int fh = foo.hashCode();
ArrayCoreMap bar = new ArrayCoreMap();
bar.set(CoreAnnotations.TextAnnotation.class, "foo");
bar.set(CoreAnnotations.PartOfSpeechAnnotation.class, "B");
List<CoreMap> barParagraph = new ArrayList<CoreMap>();
barParagraph.add(bar);
ArrayCoreMap f2 = new ArrayCoreMap();
f2.set(CoreAnnotations.ParagraphsAnnotation.class, barParagraph);
List<CoreMap> p2 = new ArrayList<CoreMap>();
p2.add(f2);
bar.set(CoreAnnotations.ParagraphsAnnotation.class, p2);
bar.toString();
int bh = bar.hashCode();
assertEquals(foo, bar);
assertEquals(bar, foo);
assertEquals(fh, bh);
ArrayCoreMap baz = new ArrayCoreMap();
baz.set(CoreAnnotations.TextAnnotation.class, "foo");
baz.set(CoreAnnotations.PartOfSpeechAnnotation.class, "B");
List<CoreMap> foobarParagraph = new ArrayList<CoreMap>();
foobarParagraph.add(foo);
foobarParagraph.add(bar);
ArrayCoreMap f3 = new ArrayCoreMap();
f3.set(CoreAnnotations.ParagraphsAnnotation.class, foobarParagraph);
List<CoreMap> p3 = new ArrayList<CoreMap>();
p3.add(f3);
baz.set(CoreAnnotations.ParagraphsAnnotation.class, p3);
assertFalse(foo.equals(baz));
assertFalse(baz.equals(foo));
ArrayCoreMap biff = new ArrayCoreMap();
biff.set(CoreAnnotations.TextAnnotation.class, "foo");
biff.set(CoreAnnotations.PartOfSpeechAnnotation.class, "B");
List<CoreMap> barfooParagraph = new ArrayList<CoreMap>();
barfooParagraph.add(foo);
barfooParagraph.add(bar);
ArrayCoreMap f4 = new ArrayCoreMap();
f4.set(CoreAnnotations.ParagraphsAnnotation.class, barfooParagraph);
List<CoreMap> p4 = new ArrayList<CoreMap>();
p4.add(f4);
biff.set(CoreAnnotations.ParagraphsAnnotation.class, p4);
assertEquals(baz, biff);
barfooParagraph.clear();
assertFalse(baz.equals(biff));
barfooParagraph.add(foo);
assertFalse(baz.equals(biff));
barfooParagraph.add(baz);
assertFalse(baz.equals(biff));
barfooParagraph.clear();
assertFalse(baz.equals(biff));
barfooParagraph.add(foo);
barfooParagraph.add(bar);
assertEquals(baz, biff);
}
public void testCoreLabelSetWordBehavior() {
CoreLabel foo = new CoreLabel();
foo.set(CoreAnnotations.TextAnnotation.class, "foo");
foo.set(CoreAnnotations.PartOfSpeechAnnotation.class, "B");
foo.set(CoreAnnotations.LemmaAnnotation.class, "fool");
// Lemma gets removed with word
ArrayCoreMap copy = new ArrayCoreMap(foo);
assertEquals(copy, foo);
foo.setWord("foo");
assertEquals(copy, foo); // same word set
foo.setWord("bar");
assertFalse(copy.equals(foo)); // lemma removed
foo.setWord("foo");
assertFalse(copy.equals(foo)); // still removed
foo.set(CoreAnnotations.LemmaAnnotation.class, "fool");
assertEquals(copy, foo); // back to normal
// Hash code is consistent
int hashCode = foo.hashCode();
assertEquals(copy.hashCode(), hashCode);
foo.setWord("bar");
assertFalse(hashCode == foo.hashCode());
foo.setWord("foo");
assertFalse(hashCode == foo.hashCode());
// Hash code doesn't care between a value of null and the key not existing
assertTrue(foo.lemma() == null);
int lemmalessHashCode = foo.hashCode();
foo.remove(CoreAnnotations.LemmaAnnotation.class);
assertEquals(lemmalessHashCode, foo.hashCode());
foo.setLemma(null);
assertEquals(lemmalessHashCode, foo.hashCode());
foo.setLemma("fool");
assertEquals(hashCode, foo.hashCode());
// Check equals
foo.setWord("bar");
foo.setWord("foo");
ArrayCoreMap nulledCopy = new ArrayCoreMap(foo);
assertEquals(nulledCopy, foo);
foo.remove(CoreAnnotations.LemmaAnnotation.class);
assertEquals(nulledCopy, foo);
}
public void testCopyConstructor() {
ArrayCoreMap biff = new ArrayCoreMap();
biff.set(CoreAnnotations.TextAnnotation.class, "foo");
biff.set(CoreAnnotations.PartOfSpeechAnnotation.class, "B");
biff.set(CoreAnnotations.LemmaAnnotation.class, "fozzle");
ArrayCoreMap boff = new ArrayCoreMap(biff);
assertEquals(3, boff.size());
assertEquals(biff, boff);
assertEquals("fozzle", boff.get(CoreAnnotations.LemmaAnnotation.class));
}
}