/*
* Copyright 2002-2011 the original author or authors, or Red-Black IT Ltd, as appropriate.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.redblackit.version;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.TreeMap;
import junit.framework.Assert;
import org.codehaus.jackson.map.ObjectMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public class SimpleVersionInfoTest {
/**
* VersionInfo under test
*/
private SimpleVersionInfo versionInfoUnderTest;
/**
* Properties for construction
*/
private Properties expectedVersionPropertiesConstructor;
/**
* Properties for setting
*/
private Properties expectedVersionPropertiesSetter;
/**
* Create test data
*
* @return test data as list
*/
@Parameters
public static List<Object[]> testData() {
Properties vprops1 = new Properties();
vprops1.put("configurationVersion", "0.0.1");
Properties vprops2 = new Properties();
vprops2.put("configurationVersion", "0.1.Beta");
vprops2.put("versionDate", "20110107");
Properties vprops3 = new Properties();
vprops3.put("extraVersionInfo", "M1");
Properties vprops4 = new Properties();
vprops3.put("author", "Dominic North");
Object[][] data = { { vprops1, vprops3 }, { vprops2, vprops4 },
{ vprops3, null }, { null, vprops1 }, { null, null } };
List<Object[]> dataList = Arrays.asList(data);
return dataList;
}
/**
* Constructor taking instance to test and expected results.
*
* @param expectedVersionPropertiesConstructor
* @param expectedVersionPropertiesSetter
*/
public SimpleVersionInfoTest(
Properties expectedVersionPropertiesConstructor,
Properties expectedVersionPropertiesSetter) {
this.versionInfoUnderTest = new SimpleVersionInfo(
expectedVersionPropertiesConstructor);
this.expectedVersionPropertiesConstructor = expectedVersionPropertiesConstructor;
this.expectedVersionPropertiesSetter = expectedVersionPropertiesSetter;
}
/**
* Test get version properties
*/
@Test
public void getVersionProperties() {
Assert.assertEquals(versionInfoUnderTest.getClass()
+ ":version properties", expectedVersionPropertiesConstructor,
versionInfoUnderTest.getVersionProperties());
}
/**
* Test set version map
*/
@Test
public void setVersionMap() {
Map<String, String> newVersionMap = null;
if (expectedVersionPropertiesSetter != null) {
newVersionMap = new TreeMap<String, String>();
addPropertiesToExpectedVersionMap(newVersionMap,
expectedVersionPropertiesSetter);
}
versionInfoUnderTest.setVersionMap(newVersionMap);
Assert.assertEquals(versionInfoUnderTest.getClass()
+ ":version properties", expectedVersionPropertiesSetter,
versionInfoUnderTest.getVersionProperties());
}
/**
* Test get version map
*/
@Test
public void getVersionMap() {
Map<String, String> expectedVersionMap = null;
if (expectedVersionPropertiesConstructor != null) {
expectedVersionMap = new TreeMap<String, String>();
addPropertiesToExpectedVersionMap(expectedVersionMap,
expectedVersionPropertiesConstructor);
}
Assert.assertEquals(versionInfoUnderTest.getClass() + ":version map",
expectedVersionMap, versionInfoUnderTest.getVersionMap());
}
/**
* Test set version properties
*/
@Test
public void setVersionProperties() {
Map<String, String> expectedVersionMap = null;
if (expectedVersionPropertiesSetter != null) {
expectedVersionMap = new TreeMap<String, String>();
addPropertiesToExpectedVersionMap(expectedVersionMap,
expectedVersionPropertiesSetter);
}
versionInfoUnderTest
.setVersionProperties(expectedVersionPropertiesSetter);
Assert.assertEquals(versionInfoUnderTest.getClass() + ":version maps",
expectedVersionMap, versionInfoUnderTest.getVersionMap());
}
/**
* Test get version string
*/
@Test
public void getVersionString() {
Map<String, String> expectedVersionMap = null;
if (expectedVersionPropertiesConstructor != null) {
expectedVersionMap = new TreeMap<String, String>();
addPropertiesToExpectedVersionMap(expectedVersionMap,
expectedVersionPropertiesConstructor);
}
final String versionString = versionInfoUnderTest.getVersionString();
Assert.assertTrue(versionInfoUnderTest.getClass() + ":version string="
+ versionString + ":expectedVersionMap=" + expectedVersionMap,
versionString.endsWith("versionMap=" + expectedVersionMap));
}
/**
* Test equals
*/
@Test
public void testEquals() {
Assert.assertEquals("indentical objects", versionInfoUnderTest,
versionInfoUnderTest);
Properties otherVersionProps = null;
SimpleVersionInfo otherVersionInfo = null;
Assert.assertFalse("ne null",
versionInfoUnderTest.equals(otherVersionInfo));
otherVersionInfo = new SimpleVersionInfo(otherVersionProps);
Assert.assertEquals("otherVersionInfo with null props",
(expectedVersionPropertiesConstructor == null),
versionInfoUnderTest.equals(otherVersionInfo));
otherVersionProps = new Properties();
otherVersionInfo.setVersionProperties(otherVersionProps);
Assert.assertEquals(
"otherVersionInfo with empty props",
(expectedVersionPropertiesConstructor != null && expectedVersionPropertiesConstructor
.isEmpty()), versionInfoUnderTest
.equals(otherVersionInfo));
if (expectedVersionPropertiesConstructor != null) {
otherVersionProps.putAll(versionInfoUnderTest.getVersionMap());
Assert.assertEquals("eq versionInfo with eq props",
versionInfoUnderTest, otherVersionInfo);
}
otherVersionProps.put("extraKey", "extraValue");
Assert.assertFalse("ne versionInfo with ne props",
versionInfoUnderTest.equals(otherVersionInfo));
}
/**
* Test Jackson Json marshalling/unmarshalling for annotations in class What
* goes in should come out!
*/
@Test
public void testJsonMarshallUnmarshall() throws Exception {
ObjectMapper mapper = new ObjectMapper();
String marshalledVersion = mapper
.writeValueAsString(versionInfoUnderTest);
VersionInfo unmarshalledVersionInfo = mapper.readValue(
marshalledVersion, SimpleVersionInfo.class);
Assert.assertEquals("original and unmarshalled versionInfo",
versionInfoUnderTest, unmarshalledVersionInfo);
}
/**
* Add supplied properties to supplied map
*
* @param expectedVersionMap
* @param versionProperties
*/
private void addPropertiesToExpectedVersionMap(
Map<String, String> expectedVersionMap, Properties versionProperties) {
for (Object pname : versionProperties.keySet()) {
expectedVersionMap.put(pname.toString(),
versionProperties.getProperty(pname.toString()));
}
}
}