package hudson.plugins.analysis.graph;
import static junit.framework.Assert.*;
import net.sf.json.JSONObject;
import org.junit.Test;
import org.mortbay.util.ajax.JSON;
import com.google.common.collect.Sets;
/**
* Tests the class {@link GraphConfiguration}.
*
* @author Ulli Hafner
*/
public class GraphConfigurationTest {
/** Error message. */
private static final String VALID_CONFIGURATION_NOT_ACCEPTED = "Valid configuration not accepted.";
/** Valid width. */
private static final int WIDTH = 50;
/** Valid height. */
private static final int HEIGHT = 100;
/** Valid build count. */
private static final int BUILDS = 200;
/** Valid day count. */
private static final int DAYS = 300;
/**
* Ensures that invalid string values are rejected.
*/
@Test
public void testInvalidConfiguations() {
assertInvalidInitializationValue("");
assertInvalidInitializationValue("111!");
assertInvalidInitializationValue(null);
assertInvalidInitializationValue("111!111!");
assertInvalidInitializationValue("111!111!HELP");
assertInvalidInitializationValue("50!50!FIXED!1");
assertInvalidInitializationValue("NEW!50!12!13!FIXED");
assertInvalidInitializationValue("50.1!50!12!13!FIXED");
assertInvalidInitializationValue("50!100!200!300!FALSCH");
}
/**
* Asserts that the provided initialization value is correctly rejected and
* the configuration is initialized by default values.
*
* @param initializationValue
* initialization value
*/
private void assertInvalidInitializationValue(final String initializationValue) {
GraphConfiguration configuration = createDetailUnderTest();
assertFalse("Invalid configuration accepted.", configuration.initializeFrom(initializationValue));
assertTrue("Invalid configuration state.", configuration.isDefault());
}
/**
* Creates the configuration under test.
*
* @return the configuration under test
*/
private GraphConfiguration createDetailUnderTest() {
return new GraphConfiguration(Sets.newHashSet(new PriorityGraph(), new NewVersusFixedGraph(), new EmptyGraph()));
}
/**
* Ensures that valid string values are correctly parsed.
*/
@Test
public void testValidConfiguations() {
assertValidConfiguation("50!100!200!300!FIXED!1", WIDTH, HEIGHT, BUILDS, DAYS, NewVersusFixedGraph.class, true);
assertValidConfiguation("50!100!200!300!PRIORITY!0", WIDTH, HEIGHT, BUILDS, DAYS, PriorityGraph.class, false);
assertValidConfiguation("50!100!200!300!NONE!1", WIDTH, HEIGHT, BUILDS, DAYS, EmptyGraph.class, true);
GraphConfiguration configuration = createDetailUnderTest();
assertTrue(VALID_CONFIGURATION_NOT_ACCEPTED, configuration.initializeFrom("50!100!0!0!NONE!1"));
assertFalse("Build count is defined but should not.", configuration.isBuildCountDefined());
assertFalse("Day count is defined but should not.", configuration.isDayCountDefined());
assertTrue(VALID_CONFIGURATION_NOT_ACCEPTED, configuration.initializeFrom("50!100!2!1!NONE!0"));
assertTrue("Build count is not defined but should.", configuration.isBuildCountDefined());
assertTrue("Day count is not defined but should.", configuration.isDayCountDefined());
}
/**
* Ensures that the new boolean property useBuildDate is correctly initialized.
*/
@Test
public void testUseBuildDate() {
assertValidConfiguation("50!100!200!300!FIXED!1", WIDTH, HEIGHT, BUILDS, DAYS, NewVersusFixedGraph.class, true);
assertValidConfiguation("50!100!200!300!PRIORITY!0", WIDTH, HEIGHT, BUILDS, DAYS, PriorityGraph.class, false);
GraphConfiguration configuration = createDetailUnderTest();
assertTrue(VALID_CONFIGURATION_NOT_ACCEPTED, configuration.initializeFrom("50!100!0!0!NONE!1"));
assertTrue("Use build date is defined but should not.", configuration.useBuildDateAsDomain());
assertTrue(VALID_CONFIGURATION_NOT_ACCEPTED, configuration.initializeFrom("50!100!2!1!NONE!0"));
assertFalse("Use build date is not defined but should.", configuration.useBuildDateAsDomain());
}
/**
* Ensures that the specified string value is correctly parsed.
*
* @param initialization
* the initialization value
* @param expectedWidth
* the expected width
* @param expectedHeight
* the expected height
* @param expectedBuildCount
* the expected number of builds
* @param expectedDayCount
* the expected number of days
* @param expectedType
* the expected type
* @param expectedUseBuildDate
* the expected use build date
*/
private void assertValidConfiguation(final String initialization, final int expectedWidth, final int expectedHeight,
final int expectedBuildCount, final int expectedDayCount, final Class<? extends BuildResultGraph> expectedType,
final boolean expectedUseBuildDate) {
GraphConfiguration configuation = assertValidConfiguation(initialization, expectedWidth, expectedHeight, expectedBuildCount, expectedDayCount, expectedType);
assertEquals("Wrong value for useBuildDate", expectedUseBuildDate, configuation.useBuildDateAsDomain());
}
/**
* Ensures that a valid JSON configuration is correctly parsed.
*/
@Test
public void testValidJSONConfiguations() {
Object enabled = JSON.parse("{\"\":\"\",\"buildCountString\":\"" + BUILDS
+ "\",\"dayCountString\":\"" + DAYS
+ "\",\"graphType\":\"FIXED\",\"height\":\"" + HEIGHT + "\",\"width\":\"" + WIDTH + "\",\"useBuildDateAsDomain\":\"" + true + "\"}");
JSONObject jsonObject = JSONObject.fromObject(enabled);
GraphConfiguration configuration = createDetailUnderTest();
assertTrue(VALID_CONFIGURATION_NOT_ACCEPTED, configuration.initializeFrom(jsonObject));
verifyConfiguration(WIDTH, HEIGHT, BUILDS, DAYS, NewVersusFixedGraph.class, configuration);
assertTrue(VALID_CONFIGURATION_NOT_ACCEPTED, configuration.useBuildDateAsDomain());
}
/**
* Ensures that the specified string value is correctly parsed.
*
* @param initialization
* the initialization value
* @param expectedWidth
* the expected width
* @param expectedHeight
* the expected height
* @param expectedBuildCount
* the expected number of builds
* @param expectedDayCount
* the expected number of days
* @param expectedType
* the expected type
* @return the created configuration
*/
private GraphConfiguration assertValidConfiguation(final String initialization, final int expectedWidth, final int expectedHeight,
final int expectedBuildCount, final int expectedDayCount, final Class<? extends BuildResultGraph> expectedType) {
GraphConfiguration configuration = createDetailUnderTest();
assertTrue(VALID_CONFIGURATION_NOT_ACCEPTED, configuration.initializeFrom(initialization));
verifyConfiguration(expectedWidth, expectedHeight, expectedBuildCount, expectedDayCount,
expectedType, configuration);
return configuration;
}
/**
* Verifies the configuration values.
*
* @param expectedWidth
* expected width
* @param expectedHeight
* expected height
* @param expectedBuildCount
* expected build count
* @param expectedDayCount
* expected day count
* @param expectedType
* expected type of graph
* @param configuration
* the actual configuration to verify
*/
private void verifyConfiguration(final int expectedWidth, final int expectedHeight,
final int expectedBuildCount, final int expectedDayCount,
final Class<? extends BuildResultGraph> expectedType, final GraphConfiguration configuration) {
assertFalse("Valid configuration is not accepted.", configuration.isDefault());
assertEquals("Wrong width.", expectedWidth, configuration.getWidth());
assertEquals("Wrong height.", expectedHeight, configuration.getHeight());
assertEquals("Wrong build counter.", expectedBuildCount, configuration.getBuildCount());
assertEquals("Wrong day counter.", expectedDayCount, configuration.getDayCount());
assertSame("Wrong type.", expectedType, configuration.getGraphType().getClass());
if (expectedType == EmptyGraph.class) {
assertFalse("Graph is visible.", configuration.isVisible());
}
else {
assertTrue("Graph is not visible.", configuration.isVisible());
}
String serialized = configuration.serializeToString();
GraphConfiguration other = createDetailUnderTest();
assertTrue(VALID_CONFIGURATION_NOT_ACCEPTED, other.initializeFrom(serialized));
assertEquals("Serialize did not work.", other, configuration);
}
}