diff options
author | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-06-15 23:09:44 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-06-15 23:09:44 +0200 |
commit | 72231250ed81e10d66bfe70701e64fa5fe50f712 (patch) | |
tree | 2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /container-search/src/test/java/com/yahoo/search/result |
Publish
Diffstat (limited to 'container-search/src/test/java/com/yahoo/search/result')
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()); + } + +} |