// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.prelude.query;
import static org.junit.jupiter.api.Assertions.*;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
/**
* Keep CompositeTaggableItem, SimpleTaggableItem and TaggableSegmentItem in
* lockstep.
*
* @author Steinar Knutsen
*/
public class TaggableItemsTestCase {
@BeforeEach
public void setUp() throws Exception {
}
@AfterEach
public void tearDown() throws Exception {
}
private static class ApiMethod {
@Override
public int hashCode() {
return name.hashCode();
}
@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final ApiMethod other = (ApiMethod) obj;
if (!name.equals(other.name)) {
return false;
}
if (parameterTypes.length != other.parameterTypes.length) {
return false;
}
for (int i = 0; i < parameterTypes.length; ++i) {
if (parameterTypes[i] != other.parameterTypes[i]) {
return false;
}
}
if (returnType != other.returnType) {
return false;
}
return true;
}
public ApiMethod(final Method method) {
if (method == null) {
throw new IllegalArgumentException();
}
name = method.getName();
returnType = method.getReturnType();
parameterTypes = method.getParameterTypes();
}
@Override
public String toString() {
final StringBuilder s = new StringBuilder();
s.append(returnType.getSimpleName()).append(' ').append(name)
.append('(');
final int initLen = s.length();
for (final Class> c : parameterTypes) {
if (s.length() != initLen) {
s.append(", ");
}
s.append(c.getSimpleName());
}
s.append(')');
return s.toString();
}
private final String name;
private final Class> returnType;
private final Class>[] parameterTypes;
}
@Test
void requireSimilarAPIs() {
final Method[] composite = CompositeTaggableItem.class
.getDeclaredMethods();
final Method[] simple = SimpleTaggableItem.class.getDeclaredMethods();
final Method[] segment = TaggableSegmentItem.class.getDeclaredMethods();
final int numberOfMethods = 10;
assertEquals(numberOfMethods, composite.length);
assertEquals(numberOfMethods, simple.length);
assertEquals(numberOfMethods, segment.length);
final Set compositeSet = methodSet(composite);
final Set simpleSet = methodSet(simple);
final Set segmentSet = methodSet(segment);
assertEquals(compositeSet, simpleSet);
assertEquals(simpleSet, segmentSet);
}
public Set methodSet(final Method[] methods) {
final Set methodSet = new HashSet<>();
for (final Method m : methods) {
methodSet.add(new ApiMethod(m));
}
return methodSet;
}
@Test
final void testSetUniqueID() {
final PhraseSegmentItem p = new PhraseSegmentItem("farmyards", false,
false);
assertFalse(p.hasUniqueID());
p.setUniqueID(10);
assertEquals(10, p.getUniqueID());
assertTrue(p.hasUniqueID());
}
@Test
final void testSetConnectivity() {
final PhraseSegmentItem p = new PhraseSegmentItem("farmyards", false,
false);
assertEquals(0.0d, p.getConnectivity(), 1e-9);
final WordItem w = new WordItem("nalle");
final double expectedConnectivity = 37e9;
p.setConnectivity(w, expectedConnectivity);
assertSame(w, p.getConnectedItem());
assertEquals(expectedConnectivity, p.getConnectivity(), 1e0);
}
@Test
final void testSetSignificance() {
final PhraseSegmentItem p = new PhraseSegmentItem("farmyards", false,
false);
// unset
assertEquals(0.0d, p.getSignificance(), 1e-9);
assertFalse(p.hasExplicitSignificance());
p.setSignificance(500.0d);
assertTrue(p.hasExplicitSignificance());
}
}