// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.document.predicate; import org.junit.Test; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; /** * @author Simon Thoresen Hult */ public class FeatureSetTest { @Test public void requireThatFeatureSetIsAValue() { assertTrue(PredicateValue.class.isAssignableFrom(FeatureSet.class)); } @Test public void requireThatAccessorsWork() { FeatureSet node = new FeatureSet("key", "valueA", "valueB"); assertEquals("key", node.getKey()); assertValues(Arrays.asList("valueA", "valueB"), node); node.addValue("valueC"); assertValues(Arrays.asList("valueA", "valueB", "valueC"), node); node.addValues(Arrays.asList("valueD", "valueE")); assertValues(Arrays.asList("valueA", "valueB", "valueC", "valueD", "valueE"), node); node.setValues(Arrays.asList("valueF", "valueG")); assertValues(Arrays.asList("valueF", "valueG"), node); } @Test public void requireThatValueSetIsMutable() { FeatureSet node = new FeatureSet("key"); node.getValues().add("valueA"); assertValues(Arrays.asList("valueA"), node); node = new FeatureSet("key", "valueA"); node.getValues().add("valueB"); assertValues(Arrays.asList("valueA", "valueB"), node); } @Test public void requireThatConstructorsWork() { FeatureSet node = new FeatureSet("key", "valueA", "valueB"); assertEquals("key", node.getKey()); assertValues(Arrays.asList("valueA", "valueB"), node); node = new FeatureSet("key", Arrays.asList("valueA", "valueB")); assertEquals("key", node.getKey()); assertValues(Arrays.asList("valueA", "valueB"), node); } @Test public void requireThatCloneIsImplemented() throws CloneNotSupportedException { FeatureSet node1 = new FeatureSet("key", "valueA", "valueB"); FeatureSet node2 = node1.clone(); assertEquals(node1, node2); assertNotSame(node1, node2); assertNotSame(node1.getValues(), node2.getValues()); } @Test public void requireThatHashCodeIsImplemented() { assertEquals(new FeatureSet("key").hashCode(), new FeatureSet("key").hashCode()); } @Test public void requireThatEqualsIsImplemented() { FeatureSet lhs = new FeatureSet("keyA", "valueA", "valueB"); assertTrue(lhs.equals(lhs)); assertFalse(lhs.equals(new Object())); FeatureSet rhs = new FeatureSet("keyB"); assertFalse(lhs.equals(rhs)); rhs.setKey("keyA"); assertFalse(lhs.equals(rhs)); rhs.addValue("valueA"); assertFalse(lhs.equals(rhs)); rhs.addValue("valueB"); assertTrue(lhs.equals(rhs)); } @Test public void requireThatkeyIsMandatoryInConstructor() { try { new FeatureSet(null); fail(); } catch (NullPointerException e) { assertEquals("key", e.getMessage()); } try { new FeatureSet(null, Collections.emptyList()); fail(); } catch (NullPointerException e) { assertEquals("key", e.getMessage()); } } @Test public void requireThatkeyIsMandatoryInSetter() { FeatureSet node = new FeatureSet("foo"); try { node.setKey(null); fail(); } catch (NullPointerException e) { assertEquals("key", e.getMessage()); } assertEquals("foo", node.getKey()); } @Test public void requireThatValueIsMandatoryInSetter() { FeatureSet node = new FeatureSet("foo", "bar"); try { node.addValue(null); fail(); } catch (NullPointerException e) { assertEquals("value", e.getMessage()); } assertValues(Arrays.asList("bar"), node); } @Test public void requireThatKeyIsEscapedInToString() { assertEquals("foo in [val]", new FeatureSet("foo", "val").toString()); assertEquals("'\\foo' in [val]", new FeatureSet("\foo", "val").toString()); assertEquals("'\\x27foo\\x27' in [val]", new FeatureSet("'foo'", "val").toString()); } @Test public void requireThatValuesAreEscapedInToString() { assertEquals("key in [bar, foo]", new FeatureSet("key", "foo", "bar").toString()); assertEquals("key in ['\\foo', 'ba\\r']", new FeatureSet("key", "\foo", "ba\r").toString()); assertEquals("key in ['\\x27bar\\x27', '\\x27foo\\x27']", new FeatureSet("key", "'foo'", "'bar'").toString()); } @Test public void requireThatSimpleStringsArePrettyPrinted() { assertEquals("foo in [bar]", new FeatureSet("foo", "bar").toString()); } @Test public void requireThatComplexStringsAreEscaped() { assertEquals("'\\foo' in ['ba\\r']", new FeatureSet("\foo", "ba\r").toString()); } @Test public void requireThatNegatedFeatureSetsArePrettyPrinted() { assertEquals("country not in [no, se]", new Negation(new FeatureSet("country", "no", "se")).toString()); } private static void assertValues(Collection expected, FeatureSet actual) { List tmp = new ArrayList<>(expected); for (String value : actual.getValues()) { assertNotNull(value, tmp.remove(value)); } assertTrue(tmp.toString(), tmp.isEmpty()); } }