summaryrefslogtreecommitdiffstats
path: root/container-search/src/test/java/com/yahoo/search/result
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
commit72231250ed81e10d66bfe70701e64fa5fe50f712 (patch)
tree2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /container-search/src/test/java/com/yahoo/search/result
Publish
Diffstat (limited to 'container-search/src/test/java/com/yahoo/search/result')
-rw-r--r--container-search/src/test/java/com/yahoo/search/result/DefaultErrorHitTestCase.java124
-rw-r--r--container-search/src/test/java/com/yahoo/search/result/NanNumberTestCase.java41
-rw-r--r--container-search/src/test/java/com/yahoo/search/result/TemplatingTestCase.java174
-rw-r--r--container-search/src/test/java/com/yahoo/search/result/test/ArrayOutputTestCase.java31
-rw-r--r--container-search/src/test/java/com/yahoo/search/result/test/CoverageTestCase.java61
-rw-r--r--container-search/src/test/java/com/yahoo/search/result/test/DeepHitIteratorTestCase.java172
-rw-r--r--container-search/src/test/java/com/yahoo/search/result/test/DefaultErrorHitTestCase.java38
-rw-r--r--container-search/src/test/java/com/yahoo/search/result/test/FillingTestCase.java59
-rw-r--r--container-search/src/test/java/com/yahoo/search/result/test/HitGroupTestCase.java189
9 files changed, 889 insertions, 0 deletions
diff --git a/container-search/src/test/java/com/yahoo/search/result/DefaultErrorHitTestCase.java b/container-search/src/test/java/com/yahoo/search/result/DefaultErrorHitTestCase.java
new file mode 100644
index 00000000000..582b8be1170
--- /dev/null
+++ b/container-search/src/test/java/com/yahoo/search/result/DefaultErrorHitTestCase.java
@@ -0,0 +1,124 @@
+// 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;
+
+import static org.junit.Assert.*;
+
+import java.util.Iterator;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author steinar
+ * @author bratseth
+ */
+public class DefaultErrorHitTestCase {
+
+ private static final String SOURCE = "nalle";
+ DefaultErrorHit de;
+
+ @Before
+ public void setUp() throws Exception {
+ de = new DefaultErrorHit(SOURCE, ErrorMessage.createUnspecifiedError("DefaultErrorHitTestCase"));
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ }
+
+ @Test
+ public final void testSetSourceTakeTwo() {
+ assertEquals(SOURCE, de.getSource());
+ de.setSource(null);
+ assertNull(de.getSource());
+ de.setSource("bamse");
+ assertEquals("bamse", de.getSource());
+ de.addError(ErrorMessage.createBackendCommunicationError("blblbl"));
+ final Iterator<ErrorMessage> errorIterator = de.errorIterator();
+ assertEquals(SOURCE, errorIterator.next().getSource());
+ assertEquals("bamse", errorIterator.next().getSource());
+ }
+
+ @Test
+ public final void testToString() {
+ assertEquals("Error: Source 'nalle': 5: Unspecified error: DefaultErrorHitTestCase", de.toString());
+ }
+
+ @Test
+ public final void testSetMainError() {
+ ErrorMessage e = ErrorMessage.createBackendCommunicationError("abc");
+ assertNull(e.getSource());
+ de.addError(e);
+ assertEquals(SOURCE, e.getSource());
+ boolean caught = false;
+ try {
+ new DefaultErrorHit(SOURCE, null);
+ } catch (NullPointerException ex) {
+ caught = true;
+ }
+ assertTrue(caught);
+
+ caught = false;
+ try {
+ de.addError(null);
+ } catch (NullPointerException ex) {
+ caught = true;
+ }
+ assertTrue(caught);
+ }
+
+ @Test
+ public final void testAddError() {
+ ErrorMessage e = ErrorMessage
+ .createBackendCommunicationError("ljkhlkjh");
+ assertNull(e.getSource());
+ de.addError(e);
+ assertEquals(SOURCE, e.getSource());
+ e = ErrorMessage.createBadRequest("kdjfhsdkfhj");
+ de.addError(e);
+ int i = 0;
+ for (Iterator<ErrorMessage> errors = de.errorIterator(); errors
+ .hasNext(); errors.next()) {
+ ++i;
+ }
+ assertEquals(3, i);
+ }
+
+ @Test
+ public final void testAddErrors() {
+ DefaultErrorHit other = new DefaultErrorHit("abc",
+ ErrorMessage.createBadRequest("sdasd"));
+ de.addErrors(other);
+ int i = 0;
+ for (Iterator<ErrorMessage> errors = de.errorIterator(); errors
+ .hasNext(); errors.next()) {
+ ++i;
+ }
+ assertEquals(2, i);
+ other = new DefaultErrorHit("abd",
+ ErrorMessage.createEmptyDocsums("uiyoiuy"));
+ other.addError(ErrorMessage.createNoAnswerWhenPingingNode("xzvczx"));
+ de.addErrors(other);
+ i = 0;
+ for (Iterator<ErrorMessage> errors = de.errorIterator(); errors
+ .hasNext(); errors.next()) {
+ ++i;
+ }
+ assertEquals(4, i);
+ }
+
+ @Test
+ public final void testHasOnlyErrorCode() {
+ assertTrue(de.hasOnlyErrorCode(com.yahoo.container.protect.Error.UNSPECIFIED.code));
+ assertFalse(de.hasOnlyErrorCode(com.yahoo.container.protect.Error.BACKEND_COMMUNICATION_ERROR.code));
+
+ de.addError(ErrorMessage.createUnspecifiedError("dsfsdfs"));
+ assertTrue(de.hasOnlyErrorCode(com.yahoo.container.protect.Error.UNSPECIFIED.code));
+ assertEquals(com.yahoo.container.protect.Error.UNSPECIFIED.code, de.errors().iterator().next().getCode());
+
+ de.addError(ErrorMessage.createBackendCommunicationError("dsfsdfsd"));
+ assertFalse(de.hasOnlyErrorCode(com.yahoo.container.protect.Error.UNSPECIFIED.code));
+ }
+
+}
diff --git a/container-search/src/test/java/com/yahoo/search/result/NanNumberTestCase.java b/container-search/src/test/java/com/yahoo/search/result/NanNumberTestCase.java
new file mode 100644
index 00000000000..f6b2472cfb5
--- /dev/null
+++ b/container-search/src/test/java/com/yahoo/search/result/NanNumberTestCase.java
@@ -0,0 +1,41 @@
+// 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;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+/**
+ * Integrity test for representation of undefined numeric field values.
+ *
+ * @author <a href="mailto:steinar@yahoo-inc.com">Steinar Knutsen</a>
+ */
+public class NanNumberTestCase {
+
+
+ @Test
+ public final void testIntValue() {
+ assertEquals(0, NanNumber.NaN.intValue());
+ }
+
+ @Test
+ public final void testLongValue() {
+ assertEquals(0L, NanNumber.NaN.longValue());
+ }
+
+ @Test
+ public final void testFloatValue() {
+ assertTrue(Float.isNaN(NanNumber.NaN.floatValue()));
+ }
+
+ @Test
+ public final void testDoubleValue() {
+ assertTrue(Double.isNaN(NanNumber.NaN.doubleValue()));
+ }
+
+ @Test
+ public final void testToString() {
+ assertEquals("", NanNumber.NaN.toString());
+ }
+
+}
diff --git a/container-search/src/test/java/com/yahoo/search/result/TemplatingTestCase.java b/container-search/src/test/java/com/yahoo/search/result/TemplatingTestCase.java
new file mode 100644
index 00000000000..0e382e454b1
--- /dev/null
+++ b/container-search/src/test/java/com/yahoo/search/result/TemplatingTestCase.java
@@ -0,0 +1,174 @@
+// 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;
+
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import com.yahoo.search.rendering.Renderer;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.base.Splitter;
+import com.yahoo.prelude.fastsearch.FastHit;
+import com.yahoo.prelude.templates.UserTemplate;
+import com.yahoo.prelude.templates.test.BoomTemplate;
+import com.yahoo.search.Query;
+import com.yahoo.search.Result;
+
+/**
+ * Control helper method for result rendering/result templates.
+ *
+ * @author <a href="mailto:steinar@yahoo-inc.com">Steinar Knutsen</a>
+ */
+public class TemplatingTestCase {
+ Result result;
+
+ @Before
+ public void setUp() throws Exception {
+ Query q = new Query("/?query=a&presentation.format=nalle&offset=1&hits=5");
+ result = new Result(q);
+ result.setTotalHitCount(1000L);
+ result.hits().add(new FastHit("http://localhost/1", .95));
+ result.hits().add(new FastHit("http://localhost/2", .90));
+ result.hits().add(new FastHit("http://localhost/3", .85));
+ result.hits().add(new FastHit("http://localhost/4", .80));
+ result.hits().add(new FastHit("http://localhost/5", .75));
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ }
+
+ @Test
+ public final void testGetFirstHitNo() {
+ assertEquals(2, result.getTemplating().getFirstHitNo());
+ }
+
+ @Test
+ public final void testGetNextFirstHitNo() {
+ assertEquals(7, result.getTemplating().getNextFirstHitNo());
+ result.getQuery().setHits(6);
+ assertEquals(0, result.getTemplating().getNextFirstHitNo());
+ }
+
+ @Test
+ public final void testGetNextLastHitNo() {
+ assertEquals(11, result.getTemplating().getNextLastHitNo());
+ result.getQuery().setHits(6);
+ assertEquals(0, result.getTemplating().getNextLastHitNo());
+ }
+
+ @Test
+ public final void testGetLastHitNo() {
+ assertEquals(6, result.getTemplating().getLastHitNo());
+ }
+
+ @Test
+ public final void testGetPrevFirstHitNo() {
+ assertEquals(1, result.getTemplating().getPrevFirstHitNo());
+ }
+
+ @Test
+ public final void testGetPrevLastHitNo() {
+ assertEquals(1, result.getTemplating().getPrevLastHitNo());
+ }
+
+ @Test
+ public final void testGetNextResultURL() {
+ String next = result.getTemplating().getNextResultURL();
+ Set<String> expectedParameters = new HashSet<>(Arrays.asList(new String[] {
+ "hits=5",
+ "query=a",
+ "presentation.format=nalle",
+ "offset=6"
+ }));
+ Set<String> actualParameters = new HashSet<>();
+ Splitter s = Splitter.on("&");
+ for (String parameter : s.split(next.substring(next.indexOf('?') + 1))) {
+ actualParameters.add(parameter);
+ }
+ assertEquals(expectedParameters, actualParameters);
+ }
+
+ @Test
+ public final void testGetPreviousResultURL() {
+ String previous = result.getTemplating().getPreviousResultURL();
+ Set<String> expectedParameters = new HashSet<>(Arrays.asList(new String[] {
+ "hits=5",
+ "query=a",
+ "presentation.format=nalle",
+ "offset=0"
+ }));
+ Set<String> actualParameters = new HashSet<>();
+ Splitter s = Splitter.on("&");
+ for (String parameter : s.split(previous.substring(previous.indexOf('?') + 1))) {
+ actualParameters.add(parameter);
+ }
+ assertEquals(expectedParameters, actualParameters);
+ }
+
+ @Test
+ public final void testGetCurrentResultURL() {
+ String previous = result.getTemplating().getCurrentResultURL();
+ Set<String> expectedParameters = new HashSet<>(Arrays.asList(new String[] {
+ "hits=5",
+ "query=a",
+ "presentation.format=nalle",
+ "offset=1"
+ }));
+ Set<String> actualParameters = new HashSet<>();
+ Splitter s = Splitter.on("&");
+ for (String parameter : s.split(previous.substring(previous.indexOf('?') + 1))) {
+ actualParameters.add(parameter);
+ }
+ assertEquals(expectedParameters, actualParameters);
+ }
+
+ @Test
+ public final void testGetTemplates() {
+ @SuppressWarnings({ "unchecked", "deprecation" })
+ UserTemplate<Writer> t = result.getTemplating().getTemplates();
+ assertEquals("default", t.getName());
+ }
+
+ @SuppressWarnings("deprecation")
+ @Test
+ public final void testSetTemplates() {
+ result.getTemplating().setTemplates(new BoomTemplate("gnuff", "text/plain", "ISO-8859-15"));
+ @SuppressWarnings("unchecked")
+ UserTemplate<Writer> t = result.getTemplating().getTemplates();
+ assertEquals("gnuff", t.getName());
+ }
+
+ private static class TestRenderer extends Renderer {
+
+ @Override
+ public void render(Writer writer, Result result) throws IOException {
+ }
+
+ @Override
+ public String getEncoding() {
+ return null;
+ }
+
+ @Override
+ public String getMimeType() {
+ return null;
+ }
+ }
+
+ @SuppressWarnings("deprecation")
+ @Test
+ public final void testUsesDefaultTemplate() {
+ assertTrue(result.getTemplating().usesDefaultTemplate());
+ result.getTemplating().setRenderer(new TestRenderer());
+ assertFalse(result.getTemplating().usesDefaultTemplate());
+ }
+
+}
diff --git a/container-search/src/test/java/com/yahoo/search/result/test/ArrayOutputTestCase.java b/container-search/src/test/java/com/yahoo/search/result/test/ArrayOutputTestCase.java
new file mode 100644
index 00000000000..35841a72428
--- /dev/null
+++ b/container-search/src/test/java/com/yahoo/search/result/test/ArrayOutputTestCase.java
@@ -0,0 +1,31 @@
+// 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.io.IOException;
+
+import com.yahoo.prelude.hitfield.XMLString;
+import com.yahoo.prelude.templates.test.TilingTestCase;
+import com.yahoo.search.Query;
+import com.yahoo.search.Result;
+import com.yahoo.search.result.Hit;
+
+/**
+ * @author bratseth
+ */
+public class ArrayOutputTestCase extends junit.framework.TestCase {
+
+ public void testArrayOutput() throws IOException {
+ Result r=new Result(new Query("?query=ignored"));
+ Hit hit=new Hit("test");
+ hit.setField("phone",new XMLString("\n <item>408-555-1234</item>" + "\n <item>408-555-5678</item>\n "));
+ r.hits().add(hit);
+
+ String rendered = TilingTestCase.getRendered(r);
+ String[] lines= rendered.split("\n");
+ assertEquals(" <field name=\"phone\">",lines[4]);
+ assertEquals(" <item>408-555-1234</item>",lines[5]);
+ assertEquals(" <item>408-555-5678</item>",lines[6]);
+ assertEquals(" </field>",lines[7]);
+ }
+
+}
diff --git a/container-search/src/test/java/com/yahoo/search/result/test/CoverageTestCase.java b/container-search/src/test/java/com/yahoo/search/result/test/CoverageTestCase.java
new file mode 100644
index 00000000000..efa01cc7c53
--- /dev/null
+++ b/container-search/src/test/java/com/yahoo/search/result/test/CoverageTestCase.java
@@ -0,0 +1,61 @@
+// 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 com.yahoo.search.Query;
+import com.yahoo.search.Result;
+import com.yahoo.search.result.Coverage;
+
+/**
+ * @author <a href="mailto:steinar@yahoo-inc.com">Steinar Knutsen</a>
+ */
+public class CoverageTestCase extends junit.framework.TestCase {
+
+ public void testZeroCoverage() {
+ Coverage c = new Coverage(0L, 0, false, 0);
+ assertEquals(0, c.getResultPercentage());
+ assertEquals(0, c.getResultSets());
+ }
+
+ public void testActiveCoverage() {
+ Coverage c = new Coverage(6, 5);
+ assertEquals(5, c.getActive());
+ assertEquals(6, c.getDocs());
+
+ Coverage d = new Coverage(7, 6);
+ c.merge(d);
+ assertEquals(11, c.getActive());
+ assertEquals(13, c.getDocs());
+ }
+
+ public void testDefaultCoverage() {
+ boolean create=true;
+
+ Result r1=new Result(new Query());
+ assertEquals(0,r1.getCoverage(create).getResultSets());
+ Result r2=new Result(new Query());
+
+ r1.mergeWith(r2);
+ assertEquals(0,r1.getCoverage(create).getResultSets());
+ }
+
+ public void testDefaultSearchScenario() {
+ boolean create=true;
+
+ Result federationSearcherResult=new Result(new Query());
+ Result singleSourceResult=new Result(new Query());
+ federationSearcherResult.mergeWith(singleSourceResult);
+ assertNull(federationSearcherResult.getCoverage(!create));
+ assertEquals(0,federationSearcherResult.getCoverage(create).getResultSets());
+ }
+
+ public void testRequestingCoverageSearchScenario() {
+ boolean create=true;
+
+ Result federationSearcherResult=new Result(new Query());
+ Result singleSourceResult=new Result(new Query());
+ singleSourceResult.setCoverage(new Coverage(10,1,true));
+ federationSearcherResult.mergeWith(singleSourceResult);
+ assertEquals(1,federationSearcherResult.getCoverage(create).getResultSets());
+ }
+
+}
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();
+ }
+ }
+}
diff --git a/container-search/src/test/java/com/yahoo/search/result/test/DefaultErrorHitTestCase.java b/container-search/src/test/java/com/yahoo/search/result/test/DefaultErrorHitTestCase.java
new file mode 100644
index 00000000000..2935c826539
--- /dev/null
+++ b/container-search/src/test/java/com/yahoo/search/result/test/DefaultErrorHitTestCase.java
@@ -0,0 +1,38 @@
+// 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 com.yahoo.prelude.templates.SearchRendererAdaptor;
+import com.yahoo.search.result.DefaultErrorHit;
+import com.yahoo.search.result.ErrorMessage;
+
+import java.io.IOException;
+import java.io.StringWriter;
+
+/**
+ * @author bratseth
+ */
+public class DefaultErrorHitTestCase extends junit.framework.TestCase {
+
+ @SuppressWarnings("null")
+ public void testErrorHitRenderingWithException() throws IOException {
+ NullPointerException cause=null;
+ try {
+ Object a=null;
+ a.toString();
+ }
+ catch (NullPointerException e) {
+ cause=e;
+ }
+ StringWriter w=new StringWriter();
+ SearchRendererAdaptor.simpleRenderDefaultErrorHit(w, new DefaultErrorHit("test", new ErrorMessage(79, "Myerror", "Mydetail", cause)));
+ String sep = System.getProperty("line.separator");
+ assertEquals(
+ "<errordetails>\n" +
+ " <error source=\"test\" error=\"Myerror\" code=\"79\">Mydetail\n" +
+ " <cause>\n" +
+ "java.lang.NullPointerException" + sep +
+ "\tat "
+ ,w.toString().substring(0, 119+sep.length()));
+ }
+
+}
diff --git a/container-search/src/test/java/com/yahoo/search/result/test/FillingTestCase.java b/container-search/src/test/java/com/yahoo/search/result/test/FillingTestCase.java
new file mode 100644
index 00000000000..9e16b7312eb
--- /dev/null
+++ b/container-search/src/test/java/com/yahoo/search/result/test/FillingTestCase.java
@@ -0,0 +1,59 @@
+// 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 com.yahoo.search.result.Hit;
+import com.yahoo.search.result.HitGroup;
+
+/**
+ * @author bratseth
+ */
+public class FillingTestCase extends junit.framework.TestCase {
+
+ public void testFillingAPIConsistency() {
+ HitGroup group=new HitGroup();
+ group.add(new Hit("hit:1"));
+ group.add(new Hit("hit:2"));
+ assertTrue(group.isFilled("summary"));
+ }
+
+ public void testFillingAPIConsistencyTwoPhase() {
+ HitGroup group=new HitGroup();
+ group.add(createNonFilled("hit:1"));
+ group.add(createNonFilled("hit:2"));
+ assertFalse(group.isFilled("summary"));
+ fillHitsIn(group, "summary");
+ group.analyze();
+ assertTrue(group.isFilled("summary")); // consistent again
+ }
+
+ public void testFillingAPIConsistencyThreePhase() {
+ HitGroup group=new HitGroup();
+ group.add(createNonFilled("hit:1"));
+ group.add(createNonFilled("hit:2"));
+ assertFalse(group.isFilled("summary"));
+ assertFalse(group.isFilled("otherSummary"));
+ fillHitsIn(group, "otherSummary");
+ group.analyze();
+ assertFalse(group.isFilled("summary"));
+ assertTrue(group.isFilled("otherSummary"));
+ fillHitsIn(group, "summary");
+ assertTrue(group.isFilled("otherSummary"));
+ group.analyze();
+ assertTrue(group.isFilled("summary")); // consistent again
+ assertTrue(group.isFilled("otherSummary"));
+ }
+
+ private Hit createNonFilled(String id) {
+ Hit hit=new Hit(id);
+ hit.setFillable();
+ return hit;
+ }
+
+ private void fillHitsIn(HitGroup group,String summary) {
+ for (Hit hit : group.asList()) {
+ if (hit.isMeta()) continue;
+ hit.setFilled(summary);
+ }
+ }
+
+}
diff --git a/container-search/src/test/java/com/yahoo/search/result/test/HitGroupTestCase.java b/container-search/src/test/java/com/yahoo/search/result/test/HitGroupTestCase.java
new file mode 100644
index 00000000000..c2d5e73fb97
--- /dev/null
+++ b/container-search/src/test/java/com/yahoo/search/result/test/HitGroupTestCase.java
@@ -0,0 +1,189 @@
+// 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 com.yahoo.search.result.Hit;
+import com.yahoo.search.result.HitGroup;
+
+import java.util.Arrays;
+
+/**
+ * @author <a href="mailto:bratseth@yahoo-inc.com">Jon Bratseth</a>
+ */
+public class HitGroupTestCase extends junit.framework.TestCase {
+
+ public void testStringStripping() {
+ assertEquals("avabarne", Hit.stripCharacter('j', "javabjarne"));
+ assertEquals("", Hit.stripCharacter('j', ""));
+ assertEquals("", Hit.stripCharacter('j', "j"));
+ assertEquals("frank", Hit.stripCharacter('j', "frank"));
+ assertEquals("foo", Hit.stripCharacter('j', "fooj"));
+ assertEquals("", Hit.stripCharacter('j', "jjjjj"));
+ }
+
+ public void testRecursiveGet() {
+ // Level 1
+ HitGroup g1=new HitGroup();
+ g1.add(new Hit("1"));
+
+ // Level 2
+ HitGroup g1_1=new HitGroup();
+ g1_1.add(new Hit("1.1"));
+ g1.add(g1_1);
+
+ HitGroup g1_2=new HitGroup();
+ g1_2.add(new Hit("1.2"));
+ g1.add(g1_2);
+
+ // Level 3
+ HitGroup g1_1_1=new HitGroup();
+ g1_1_1.add(new Hit("1.1.1"));
+ g1_1.add(g1_1_1);
+
+ HitGroup g1_1_2=new HitGroup();
+ g1_1_2.add(new Hit("1.1.2"));
+ g1_1.add(g1_1_2);
+
+ HitGroup g1_2_1=new HitGroup();
+ g1_2_1.add(new Hit("1.2.1"));
+ g1_2.add(g1_2_1);
+
+ HitGroup g1_2_2=new HitGroup();
+ g1_2_2.add(new Hit("1.2.2"));
+ g1_2.add(g1_2_2);
+
+ // Level 4
+ HitGroup g1_1_1_1=new HitGroup();
+ g1_1_1_1.add(new Hit("1.1.1.1"));
+ g1_1_1.add(g1_1_1_1);
+
+ assertNotNull(g1.get("1"));
+ assertNotNull(g1.get("1.1"));
+ assertNotNull(g1.get("1.2"));
+ assertNotNull(g1.get("1.1.1"));
+ assertNotNull(g1.get("1.1.2"));
+ assertNotNull(g1.get("1.2.1"));
+ assertNotNull(g1.get("1.2.2"));
+ assertNotNull(g1.get("1.1.1.1"));
+
+ assertNotNull(g1.get("1",-1));
+ assertNotNull(g1.get("1.1",-1));
+ assertNotNull(g1.get("1.2",-1));
+ assertNotNull(g1.get("1.1.1",-1));
+ assertNotNull(g1.get("1.1.2",-1));
+ assertNotNull(g1.get("1.2.1",-1));
+ assertNotNull(g1.get("1.2.2",-1));
+ assertNotNull(g1.get("1.1.1.1",-1));
+
+ assertNotNull(g1.get("1",0));
+ assertNull(g1.get("1.1",0));
+ assertNull(g1.get("1.2",0));
+ assertNull(g1.get("1.1.1",0));
+ assertNull(g1.get("1.1.2",0));
+ assertNull(g1.get("1.2.1",0));
+ assertNull(g1.get("1.2.2",0));
+ assertNull(g1.get("1.1.1.1",0));
+
+ assertNotNull(g1.get("1",1));
+ assertNotNull(g1.get("1.1",1));
+ assertNotNull(g1.get("1.2",1));
+ assertNull(g1.get("1.1.1",1));
+ assertNull(g1.get("1.1.2",1));
+ assertNull(g1.get("1.2.1",1));
+ assertNull(g1.get("1.2.2",1));
+ assertNull(g1.get("1.1.1.1",1));
+
+ assertNotNull(g1.get("1",2));
+ assertNotNull(g1.get("1.1",2));
+ assertNotNull(g1.get("1.2",2));
+ assertNotNull(g1.get("1.1.1",2));
+ assertNotNull(g1.get("1.1.2",2));
+ assertNotNull(g1.get("1.2.1",2));
+ assertNotNull(g1.get("1.2.2",2));
+ assertNull(g1.get("1.1.1.1",2));
+
+ assertNotNull(g1.get("1.1.1.1",3));
+
+ assertNull(g1.get("3",2));
+ }
+
+ public void testThatHitGroupIsUnFillable() {
+ HitGroup hg = new HitGroup("test");
+ {
+ Hit hit = new Hit("http://nalle.balle/1.html", 832);
+ hit.setField("url", "http://nalle.balle/1.html");
+ hit.setField("clickurl", "javascript:openWindow('http://www.foo');");
+ hit.setField("attributes", Arrays.asList("typevideo"));
+ hg.add(hit);
+ }
+ {
+ Hit hit = new Hit("http://nalle.balle/2.html", 442);
+ hit.setField("url", "http://nalle.balle/2.html");
+ hit.setField("clickurl", "");
+ hit.setField("attributes", Arrays.asList("typevideo"));
+ hg.add(hit);
+ }
+ assertFalse(hg.isFillable());
+ assertTrue(hg.isFilled("anyclass"));
+ assertNull(hg.getFilled());
+ }
+
+ public void testThatHitGroupIsFillable() {
+ HitGroup hg = new HitGroup("test");
+ {
+ Hit hit = new Hit("http://nalle.balle/1.html", 832);
+ hit.setField("url", "http://nalle.balle/1.html");
+ hit.setField("clickurl", "javascript:openWindow('http://www.foo');");
+ hit.setField("attributes", Arrays.asList("typevideo"));
+ hit.setFillable();
+ hg.add(hit);
+ }
+ {
+ Hit hit = new Hit("http://nalle.balle/2.html", 442);
+ hit.setField("url", "http://nalle.balle/2.html");
+ hit.setField("clickurl", "");
+ hit.setField("attributes", Arrays.asList("typevideo"));
+ hit.setFillable();
+ hg.add(hit);
+ }
+ assertTrue(hg.isFillable());
+ assertFalse(hg.isFilled("anyclass"));
+ assertTrue(hg.getFilled().isEmpty());
+ }
+
+ public void testThatHitGroupIsFillableAfterFillableChangeunderTheHood() {
+ HitGroup hg = new HitGroup("test");
+ {
+ Hit hit = new Hit("http://nalle.balle/1.html", 832);
+ hit.setField("url", "http://nalle.balle/1.html");
+ hit.setField("clickurl", "javascript:openWindow('http://www.foo');");
+ hit.setField("attributes", Arrays.asList("typevideo"));
+ hg.add(hit);
+ }
+ {
+ Hit hit = new Hit("http://nalle.balle/2.html", 442);
+ hit.setField("url", "http://nalle.balle/2.html");
+ hit.setField("clickurl", "");
+ hit.setField("attributes", Arrays.asList("typevideo"));
+ hg.add(hit);
+ }
+ assertFalse(hg.isFillable());
+ assertTrue(hg.isFilled("anyclass"));
+
+ for (Hit h : hg.asList()) {
+ h.setFillable();
+ }
+
+ HitGroup toplevel = new HitGroup("toplevel");
+ toplevel.add(hg);
+
+ assertTrue(toplevel.isFillable());
+ assertNotNull(toplevel.getFilled());
+ assertFalse(toplevel.isFilled("anyclass"));
+
+ assertTrue(hg.isFillable());
+ assertNotNull(hg.getFilled());
+ assertFalse(hg.isFilled("anyclass"));
+ assertTrue(hg.getFilled().isEmpty());
+ }
+
+}