// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.document.annotation; import com.yahoo.document.datatypes.StringFieldValue; import com.yahoo.document.serialization.*; import com.yahoo.io.GrowableByteBuffer; import org.junit.Test; import java.util.ArrayList; import java.util.Iterator; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.fail; /** * @author Einar M R Rosenvinge */ public class SpanListTestCase extends AbstractTypesTest { @Test public void testSerializeDeserialize() { { SpanList spanList = new SpanList(); serializeAndAssert(spanList); } { SpanList spanList = new SpanList(); Span s1 = new Span(1, 2); Span s2 = new Span(3, 4); Span s3 = new Span(4, 5); spanList.add(s1).add(s2).add(s3); SpanList s4 = new SpanList(); Span s5 = new Span(7, 8); Span s6 = new Span(8, 9); s4.add(s5).add(s6); spanList.add(s4); serializeAndAssert(spanList); } } private void serializeAndAssert(SpanList spanList) { GrowableByteBuffer buffer; { buffer = new GrowableByteBuffer(1024); DocumentSerializer serializer = DocumentSerializerFactory.create6(buffer); StringFieldValue value = new StringFieldValue("lkj lkj lkj lkj lkj lkj lkj lkj lkj lkj lkj lkj lkj lkj lk"); SpanTree tree = new SpanTree("bababa", spanList); value.setSpanTree(tree); serializer.write(null, value); buffer.flip(); } SpanList spanList2; { DocumentDeserializer deserializer = DocumentDeserializerFactory.create6(man, buffer); StringFieldValue value = new StringFieldValue(); deserializer.read(null, value); spanList2 = (SpanList)value.getSpanTree("bababa").getRoot(); } assertEquals(spanList, spanList2); assertNotSame(spanList, spanList2); } @Test public void testFromAndTo() { Span s1 = new Span(1, 2); Span s2 = new Span(5, 10); SpanList list = new SpanList(); assertEquals(-1, list.getFrom()); assertEquals(-1, list.getTo()); list.add(s1); assertEquals(1, list.getFrom()); assertEquals(1, list.getFrom()); assertEquals(3, list.getTo()); assertEquals(3, list.getTo()); list.add(s2); assertEquals(1, list.getFrom()); assertEquals(1, list.getFrom()); assertEquals(15, list.getTo()); assertEquals(15, list.getTo()); list.clearChildren(); assertEquals(-1, list.getFrom()); assertEquals(-1, list.getTo()); s1 = new Span(1, 2); s2 = new Span(5, 10); list.add(s1); assertEquals(1, list.getFrom()); assertEquals(1, list.getFrom()); assertEquals(3, list.getTo()); assertEquals(3, list.getTo()); list.add(s2); assertEquals(1, list.getFrom()); assertEquals(1, list.getFrom()); assertEquals(15, list.getTo()); assertEquals(15, list.getTo()); list.remove(s1); assertEquals(5, list.getFrom()); assertEquals(5, list.getFrom()); assertEquals(15, list.getTo()); assertEquals(15, list.getTo()); list.remove(s2); assertEquals(-1, list.getFrom()); assertEquals(-1, list.getTo()); } @Test public void testSortRecursive() { SpanList root = new SpanList(); Span a1 = new Span(0, 1); SpanList b1 = new SpanList(); SpanList c1 = new SpanList(); Span d1 = new Span(9, 1); root.add(d1).add(c1).add(a1).add(b1); Span aB2 = new Span(1, 1); Span bB2 = new Span(2, 1); Span cB2 = new Span(3, 1); Span dB2 = new Span(4, 1); b1.add(dB2).add(cB2).add(bB2).add(aB2); Span aC2 = new Span(5, 1); Span bC2 = new Span(6, 1); Span cC2 = new Span(7, 1); Span dC2 = new Span(8, 1); c1.add(cC2).add(aC2).add(bC2).add(dC2); root.sortChildrenRecursive(); assertSame(a1, root.children().get(0)); assertSame(b1, root.children().get(1)); assertSame(c1, root.children().get(2)); assertSame(d1, root.children().get(3)); assertSame(aB2, b1.children().get(0)); assertSame(bB2, b1.children().get(1)); assertSame(cB2, b1.children().get(2)); assertSame(dB2, b1.children().get(3)); assertSame(aC2, c1.children().get(0)); assertSame(bC2, c1.children().get(1)); assertSame(cC2, c1.children().get(2)); assertSame(dC2, c1.children().get(3)); } @Test public void testTwoLevelFromAndTo() { SpanList root = new SpanList(); SpanList l1 = new SpanList(); root.add(l1); Span s1 = new Span(0, 20); Span s2 = new Span(20, 20); l1.add(s1).add(s2); assertEquals(0, root.getFrom()); assertEquals(40, root.getTo()); assertEquals(0, l1.getFrom()); assertEquals(40, l1.getTo()); Span s3 = new Span(40, 20); l1.add(s3); assertEquals(0, root.getFrom()); assertEquals(60, root.getTo()); assertEquals(0, l1.getFrom()); assertEquals(60, l1.getTo()); } @Test public void testAddingToManyRoots() { Span s1 = new Span(1, 1); Span s2 = new Span(2, 1); Span s3 = new Span(3, 1); SpanList sl1 = new SpanList(); sl1.add(s1).add(s2).add(s3); SpanList sl2 = new SpanList(); try { sl2.add(s1).add(s2).add(s3); fail("Should have failed here!!"); } catch (IllegalStateException ise) { //OK! } SpanTree tree = new SpanTree("foo", sl1); assertSame(tree, sl1.getParent()); assertSame(sl1, tree.getRoot()); SpanList sl3 = new SpanList(); sl1.add(sl3); assertSame(sl3, sl1.children().get(3)); assertSame(sl1, sl3.getParent()); assertSame(tree, sl3.getSpanTree()); assertSame(tree, sl1.getSpanTree()); assertNull(sl2.getSpanTree()); } @Test public void testRemoveInvalidate() { SpanList sl1 = new SpanList(); Span s1 = new Span(1, 2); sl1.add(s1); SpanList sl2 = new SpanList(); try { sl2.add(s1); fail("Should have failed."); } catch (IllegalStateException ise) { //OK! } sl1.remove(0); try { sl2.add(s1); fail("Should have failed."); } catch (IllegalStateException ise) { //OK! } } @Test public void testMoveSimple() { SpanList sl1 = new SpanList(); SpanList sl2 = new SpanList(); Span s1 = new Span(1, 2); sl1.add(s1); assertEquals(1, sl1.children().size()); assertEquals(0, sl2.children().size()); sl1.move(s1, sl2); assertEquals(0, sl1.children().size()); assertEquals(1, sl2.children().size()); sl2.move(0, sl1); assertEquals(1, sl1.children().size()); assertEquals(0, sl2.children().size()); } @Test public void testMoveAlternate() { AlternateSpanList asl1 = new AlternateSpanList(); AlternateSpanList asl2 = new AlternateSpanList(); Span s1 = new Span(1, 2); asl1.add(s1); assertEquals(1, asl1.children().size()); assertEquals(0, asl2.children().size()); asl1.move(s1, asl2); assertEquals(0, asl1.children().size()); assertEquals(1, asl2.children().size()); asl2.move(0, asl1); assertEquals(1, asl1.children().size()); assertEquals(0, asl2.children().size()); } @Test public void testMoveAlternateAdvances() { AlternateSpanList asl1 = new AlternateSpanList(); AlternateSpanList asl2 = new AlternateSpanList(); Span s1 = new Span(1, 2); asl1.addChildren(new ArrayList(), 50d); asl1.addChildren(new ArrayList(), 50d); asl2.addChildren(new ArrayList(), 50d); asl2.addChildren(new ArrayList(), 50d); asl1.add(s1); assertEquals(1, asl1.children(0).size()); assertEquals(0, asl1.children(1).size()); assertEquals(0, asl1.children(2).size()); assertEquals(0, asl2.children(0).size()); assertEquals(0, asl2.children(1).size()); assertEquals(0, asl2.children(2).size()); asl1.move(s1, asl2, 2); assertEquals(0, asl1.children(0).size()); assertEquals(0, asl1.children(1).size()); assertEquals(0, asl1.children(2).size()); assertEquals(0, asl2.children(0).size()); assertEquals(0, asl2.children(1).size()); assertEquals(1, asl2.children(2).size()); asl2.move(2, 0, asl1, 1); assertEquals(0, asl1.children(0).size()); assertEquals(1, asl1.children(1).size()); assertEquals(0, asl1.children(2).size()); assertEquals(0, asl2.children(0).size()); assertEquals(0, asl2.children(1).size()); assertEquals(0, asl2.children(2).size()); } @Test public void testGetStringFieldValue() { StringFieldValue text = getAnnotatedString(); { SpanTree tree = text.getSpanTree("ballooo"); assertSame(text, tree.getStringFieldValue()); AlternateSpanList root = (AlternateSpanList)tree.getRoot(); Iterator it = root.childIteratorRecursive(); while (it.hasNext()) { assertSame(text, it.next().getStringFieldValue()); } } { SpanTree tree = text.getSpanTree("fruits"); assertSame(text, tree.getStringFieldValue()); SpanList root = (SpanList)tree.getRoot(); Iterator it = root.childIteratorRecursive(); while (it.hasNext()) { assertSame(text, it.next().getStringFieldValue()); } } { SpanTree tree = text.removeSpanTree("ballooo"); assertNull(tree.getStringFieldValue()); AlternateSpanList root = (AlternateSpanList)tree.getRoot(); Iterator it = root.childIteratorRecursive(); while (it.hasNext()) { assertNull(it.next().getStringFieldValue()); } } { SpanTree tree = text.removeSpanTree("fruits"); assertNull(tree.getStringFieldValue()); SpanList root = (SpanList)tree.getRoot(); Iterator it = root.childIteratorRecursive(); while (it.hasNext()) { assertNull(it.next().getStringFieldValue()); } } } }