diff options
Diffstat (limited to 'container-search/src/test/java/com/yahoo/search/result/test/DeepHitIteratorTestCase.java')
-rw-r--r-- | container-search/src/test/java/com/yahoo/search/result/test/DeepHitIteratorTestCase.java | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/container-search/src/test/java/com/yahoo/search/result/test/DeepHitIteratorTestCase.java b/container-search/src/test/java/com/yahoo/search/result/test/DeepHitIteratorTestCase.java new file mode 100644 index 00000000000..386e04ba943 --- /dev/null +++ b/container-search/src/test/java/com/yahoo/search/result/test/DeepHitIteratorTestCase.java @@ -0,0 +1,172 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.search.result.test; + +import java.util.Iterator; +import java.util.NoSuchElementException; + +import com.yahoo.search.result.DeepHitIterator; +import com.yahoo.search.result.Hit; +import com.yahoo.search.result.HitGroup; + +/** + * Ensure that the {@link DeepHitIterator} works as intended. + * + * @author havardpe + */ +public class DeepHitIteratorTestCase extends junit.framework.TestCase { + + public void testEmpty() { + HitGroup hits = new HitGroup(); + Iterator<Hit> it = hits.deepIterator(); + assertFalse(it.hasNext()); + try { + it.next(); + fail(); + } catch (NoSuchElementException e) { + // regular iterator behavior + } + } + + public void testRemove() { + HitGroup hits = new HitGroup(); + hits.add(new Hit("foo")); + hits.add(new Hit("bar")); + + Iterator<Hit> it = hits.deepIterator(); + try { + it.remove(); + fail(); + } catch (IllegalStateException e) { + // need to call next() first + } + assertTrue(it.hasNext()); + assertEquals("foo", it.next().getId().toString()); + assertTrue(it.hasNext()); + try { + it.remove(); + fail(); + } catch (IllegalStateException e) { + // prefetch done + } + assertEquals("bar", it.next().getId().toString()); + it.remove(); // no prefetch done + assertFalse(it.hasNext()); + } + + public void testShallow() { + HitGroup hits = new HitGroup(); + hits.add(new Hit("foo")); + hits.add(new Hit("bar")); + hits.add(new Hit("baz")); + + Iterator<Hit> it = hits.deepIterator(); + assertTrue(it.hasNext()); + assertEquals("foo", it.next().getId().toString()); + assertTrue(it.hasNext()); + assertEquals("bar", it.next().getId().toString()); + assertTrue(it.hasNext()); + assertEquals("baz", it.next().getId().toString()); + assertFalse(it.hasNext()); + } + + public void testDeep() { + HitGroup grandParent = new HitGroup(); + grandParent.add(new Hit("a")); + HitGroup parent = new HitGroup(); + parent.add(new Hit("b")); + HitGroup child = new HitGroup(); + child.add(new Hit("c")); + HitGroup grandChild = new HitGroup(); + grandChild.add(new Hit("d")); + child.add(grandChild); + child.add(new Hit("e")); + parent.add(child); + parent.add(new Hit("f")); + grandParent.add(parent); + grandParent.add(new Hit("g")); + + Iterator<Hit> it = grandParent.deepIterator(); + assertTrue(it.hasNext()); + assertEquals("a", it.next().getId().toString()); + assertTrue(it.hasNext()); + assertEquals("b", it.next().getId().toString()); + assertTrue(it.hasNext()); + assertEquals("c", it.next().getId().toString()); + assertTrue(it.hasNext()); + assertEquals("d", it.next().getId().toString()); + assertTrue(it.hasNext()); + assertEquals("e", it.next().getId().toString()); + assertTrue(it.hasNext()); + assertEquals("f", it.next().getId().toString()); + assertTrue(it.hasNext()); + assertEquals("g", it.next().getId().toString()); + assertFalse(it.hasNext()); + } + + public void testFirstHitIsGroup() { + HitGroup root = new HitGroup(); + HitGroup group = new HitGroup(); + group.add(new Hit("foo")); + root.add(group); + root.add(new Hit("bar")); + + Iterator<Hit> it = root.deepIterator(); + assertTrue(it.hasNext()); + assertEquals("foo", it.next().getId().toString()); + assertTrue(it.hasNext()); + assertEquals("bar", it.next().getId().toString()); + assertFalse(it.hasNext()); + } + + public void testSecondHitIsGroup() { + HitGroup root = new HitGroup(); + root.add(new Hit("foo")); + HitGroup group = new HitGroup(); + group.add(new Hit("bar")); + root.add(group); + + Iterator<Hit> it = root.deepIterator(); + assertTrue(it.hasNext()); + assertEquals("foo", it.next().getId().toString()); + assertTrue(it.hasNext()); + assertEquals("bar", it.next().getId().toString()); + assertFalse(it.hasNext()); + } + + public void testOrder() { + HitGroup root = new HitGroup(); + MyHitGroup group = new MyHitGroup(); + group.add(new Hit("foo")); + root.add(group); + + Iterator<Hit> it = root.deepIterator(); + assertTrue(it.hasNext()); + assertEquals("foo", it.next().getId().toString()); + assertEquals(Boolean.TRUE, group.ordered); + assertFalse(it.hasNext()); + + it = root.unorderedDeepIterator(); + assertTrue(it.hasNext()); + assertEquals("foo", it.next().getId().toString()); + assertEquals(Boolean.FALSE, group.ordered); + assertFalse(it.hasNext()); + } + + @SuppressWarnings("serial") + private static class MyHitGroup extends HitGroup { + + Boolean ordered = null; + + @Override + public Iterator<Hit> iterator() { + ordered = Boolean.TRUE; + return super.iterator(); + } + + @Override + public Iterator<Hit> unorderedIterator() { + ordered = Boolean.FALSE; + return super.unorderedIterator(); + } + } +} |