package org.dcache.services.info.base;
import org.junit.Test;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import static org.junit.Assert.*;
/**
* Test that StringStateValue behaves as expected.
*
* @author Paul Millar <paul.millar@desy.de>
*/
public class StringStateValueTest extends InfoBaseTestHelper {
private static final String[] TEST_STRINGS = { null, "", "foo", "bar", "baz"};
@Test
public void testHashCode() {
Set<Integer> seenHashCodes = new TreeSet<>();
for( String testString : TEST_STRINGS) {
StringStateValue testValue = new StringStateValue( testString);
assertFalse( "hashCode for " + testString + " repeated",
hashAlreadySeen( seenHashCodes, testValue.hashCode()));
StringStateValue testValue2 = new StringStateValue( testString);
assertTrue( "hashCode for " + testString + " not found again",
hashAlreadySeen( seenHashCodes, testValue2.hashCode()));
}
}
@Test
public void testGetTypeName() {
// We do it a few times, just in case.
for( String testString : TEST_STRINGS) {
StringStateValue testValue = new StringStateValue( testString);
assertEquals( testValue.getTypeName(), "string");
}
}
@Test
public void testAcceptVisitorStatePathStateVisitor() {
class TestStringVisitor implements StateVisitor {
boolean broken;
String foundValue;
StatePath foundPath;
@Override
public void visitString( StatePath path, StringStateValue value) {
foundPath = path;
foundValue = value.toString();
}
@Override
public void visitInteger( StatePath path, IntegerStateValue value) {
broken = true;
}
@Override
public void visitBoolean( StatePath path, BooleanStateValue value) {
broken = true;
}
@Override
public void visitFloatingPoint( StatePath path, FloatingPointStateValue value) {
broken = true;
}
@Override
public void visitCompositePreDescend( StatePath path, Map<String,String> metadata) {
broken = true;
}
@Override
public void visitCompositePostDescend( StatePath path, Map<String,String> metadata) {
broken = true;
}
@Override
public boolean isVisitable( StatePath path) {
return true;
}
}
StatePath path = new StatePath( "path");
for( String testString : TEST_STRINGS) {
StringStateValue testValue = new StringStateValue( testString);
TestStringVisitor testVisitor = new TestStringVisitor();
testValue.acceptVisitor( path, testVisitor);
assertFalse( "visitor called back on a method it shouldn't have", testVisitor.broken);
assertEquals( "visitor failed to discover string", expectedToStringValue( testString), testVisitor.foundValue);
assertEquals( "visitor failed to return equal StatePath", path, testVisitor.foundPath);
}
}
@Test
public void testEqualsObject() {
for( String firstString : TEST_STRINGS) {
StringStateValue firstSsv = new StringStateValue( firstString);
for( String secondString : TEST_STRINGS) {
StringStateValue secondSsv = new StringStateValue( secondString);
boolean shouldBeEqual = false;
// Somehow getting this correct without getting a NullPointerException is difficult.
if( firstString == null) {
if( secondString == null) {
shouldBeEqual = true;
}
} else {
shouldBeEqual = firstString.equals( secondString);
}
if( shouldBeEqual) {
assertEquals( "two StringStateValues same creating String, first.equals(second)", firstSsv, secondSsv);
assertEquals( "two StringStateValues same creating String, second.equals(first)", secondSsv, firstSsv);
} else {
assertFalse( "two StringStateValues different creating String, first.equals(second)", firstSsv.equals( secondSsv));
assertFalse( "two StringStateValues different creating String, second.equals(first)", secondSsv.equals( firstSsv));
}
}
}
}
@Test
public void testStringStateValueString() {
for( String stringVal : TEST_STRINGS) {
assertIsEphemeral("creating with a regular string: " + stringVal, new StringStateValue(stringVal));
}
}
@Test
public void testStringStateValueStringBoolean() {
for( String stringVal : TEST_STRINGS) {
assertIsEphemeral("creating with a regular string: " + stringVal, new StringStateValue(stringVal, false));
}
for( String stringVal : TEST_STRINGS) {
assertIsImmortal("creating with a regular string: " + stringVal, new StringStateValue(stringVal, true));
}
}
@Test
public void testStringStateValueStringLong() {
for( long duration = -1; duration < 3; duration++) {
assertIsMortal( "str: (null) + " + Long.toString(duration), new StringStateValue( null, duration), duration < 0 ? 0 : duration);
assertIsMortal( "str: \"\" + " + Long.toString(duration), new StringStateValue( "", duration), duration < 0 ? 0 : duration);
for( String strVal : TEST_STRINGS) {
assertIsMortal("str: \"" + strVal + "\" + " + Long
.toString(duration), new StringStateValue(strVal, duration), duration < 0 ? 0 : duration);
}
}
}
@Test
public void testToString() {
for( String stringVal : TEST_STRINGS) {
StringStateValue value = new StringStateValue( stringVal);
assertEquals( "built from " + stringVal, expectedToStringValue( stringVal), value.toString());
}
}
/**
* What String we expect to see when calling toString()
* @param buildString the String used to build the StringStateValue
* @return the expected result from toString()
*/
private String expectedToStringValue( String buildString) {
return buildString != null ? buildString : "(null)";
}
}