/*
* Copyright 2008 Lukas Lang
*
* 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 org.castor.core.nature;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import junit.framework.TestCase;
import org.castor.core.nature.BaseNature;
import org.castor.core.nature.PropertyHolder;
/**
* Runs various tests on the {@link BaseNature}. Due to visibility restrictions, an
* inner class extending the {@link BaseNature} is defined.
*
* @author Lukas Lang
* @since 1.2.1
*
*/
public final class BaseNatureTest extends TestCase {
/**
* Internal test Nature.
*
* @author Lukas Lang
*
*/
class BaseNatureWrapper extends BaseNature {
/**
* Constructor taking a PropertyHolder
*
* @param holder
* to access.
*/
public BaseNatureWrapper(final PropertyHolder holder) {
super(holder);
}
/**
* Returns the fully qualified name of the BaseNatureWrapper.
*/
public String getId() {
return getClass().getName();
}
}
/**
* Second internal test Nature.
*
* @author Lukas Lang
*
*/
class SecondBaseNatureWrapper extends BaseNature {
/**
* Constructor taking a PropertyHolder
*
* @param holder
* to access.
*/
public SecondBaseNatureWrapper(final PropertyHolder holder) {
super(holder);
}
/**
* Returns the fully qualified name of the BaseNatureWrapper.
*/
public String getId() {
return getClass().getName();
}
}
/**
* Set properties via two Natures on the same {@link ClassInfo} using the same Key.
* Values must not overwrite each other.
*/
public void testUsageOfTwoNaturesUsingSameKey() {
PropertyHolderTest ci = new PropertyHolderTest();
ci.addNature(BaseNatureWrapper.class.getName());
ci.addNature(SecondBaseNatureWrapper.class.getName());
BaseNatureWrapper bnw = new BaseNatureWrapper(ci);
SecondBaseNatureWrapper sbnw = new SecondBaseNatureWrapper(ci);
bnw.setProperty("key", "a");
sbnw.setProperty("key", "b");
assertEquals("a", bnw.getProperty("key"));
assertEquals("b", sbnw.getProperty("key"));
}
/**
* Error Case. Should throw a NullPointerException if null param in
* constructor is given.
*/
public void testNullAsParam() {
try {
BaseNatureWrapper bnw = new BaseNatureWrapper(null);
assertNull(bnw);
fail("NullPointerException should be thrown!");
} catch (NullPointerException npe) {
// do nothing
}
}
/**
* Tests correct implementation of the getId method.
*/
public void testId() {
PropertyHolderTest ci = new PropertyHolderTest();
ci.addNature(BaseNatureWrapper.class.getName());
BaseNatureWrapper bnw = new BaseNatureWrapper(ci);
assertEquals(
"org.castor.core.nature.BaseNatureTest$BaseNatureWrapper",
bnw.getId());
assertEquals(bnw.getId(), bnw.getClass().getName());
}
/**
* Retrieve a property if it was not set before.
*/
public void testGetPropertyIfNotSet() {
PropertyHolderTest ci = new PropertyHolderTest();
ci.addNature(BaseNatureWrapper.class.getName());
BaseNatureWrapper bnw = new BaseNatureWrapper(ci);
assertNull(bnw.getProperty("keynotset"));
}
/**
* Retrieve a regularly set property.
*/
public void testGetSetProperty() {
PropertyHolderTest ci = new PropertyHolderTest();
ci.addNature(BaseNatureWrapper.class.getName());
BaseNatureWrapper bnw = new BaseNatureWrapper(ci);
bnw.setProperty("testproperty", "testvalue");
assertEquals("testvalue", bnw.getProperty("testproperty"));
}
/**
* Set a property twice. The last set value is actual.
*/
public void testSetPropertyTwice() {
PropertyHolderTest ci = new PropertyHolderTest();
ci.addNature(BaseNatureWrapper.class.getName());
BaseNatureWrapper bnw = new BaseNatureWrapper(ci);
bnw.setProperty("testproperty", "testvalue");
bnw.setProperty("testproperty", "testvalueNew");
assertEquals("testvalueNew", bnw.getProperty("testproperty"));
}
/**
* Set null as value.
*/
public void testSetNullAsValue() {
PropertyHolderTest ci = new PropertyHolderTest();
ci.addNature(BaseNatureWrapper.class.getName());
BaseNatureWrapper bnw = new BaseNatureWrapper(ci);
bnw.setProperty("testproperty", null);
assertEquals(null, bnw.getProperty("testproperty"));
}
/**
* Null as a key must not be set.
*/
public void testSetNullAsKey() {
PropertyHolderTest ci = new PropertyHolderTest();
ci.addNature(BaseNatureWrapper.class.getName());
BaseNatureWrapper bnw = new BaseNatureWrapper(ci);
bnw.setProperty(null, "testvalue");
assertEquals(null, bnw.getProperty(null));
}
/**
* Test use of empty String as key. Usage is allowed.
*/
public void testSetEmptyStringAsKey() {
PropertyHolderTest ci = new PropertyHolderTest();
ci.addNature(BaseNatureWrapper.class.getName());
BaseNatureWrapper bnw = new BaseNatureWrapper(ci);
bnw.setProperty("", "testvalue");
assertEquals("testvalue", bnw.getProperty(""));
}
/**
* Checks if the health check works.
*/
public void testInstantiationNatureNotSet() {
PropertyHolderTest ci = new PropertyHolderTest();
try {
BaseNatureWrapper bnw = new BaseNatureWrapper(ci);
assertNull(bnw);
fail("Health check does not work!");
} catch (IllegalStateException ise) {
// do nothing
}
}
/**
* Checks, if default false strategy for properties not set is well
* implemented.
*/
public void testGetBooleanPropertyDefaultFalse() {
PropertyHolderTest ci = new PropertyHolderTest();
ci.addNature(BaseNatureWrapper.class.getName());
BaseNatureWrapper bnw = new BaseNatureWrapper(ci);
assertEquals(false, bnw.getBooleanPropertyDefaultFalse("notsetbefore"));
}
/**
* Checks, if default false strategy for properties not set is well
* implemented. Property was set before.
*/
public void testGetBooleanPropertyDefaultFalseButSet() {
PropertyHolderTest ci = new PropertyHolderTest();
ci.addNature(BaseNatureWrapper.class.getName());
BaseNatureWrapper bnw = new BaseNatureWrapper(ci);
bnw.setProperty("setbefore", new Boolean(true));
assertEquals(true, bnw.getBooleanPropertyDefaultFalse("setbefore"));
}
/**
* Checks, whether a new List is instantiated if property was not set before.
*/
public void testGetPropertyAsListPropertyNotSet() {
PropertyHolderTest ph = new PropertyHolderTest();
ph.addNature(BaseNatureWrapper.class.getName());
BaseNatureWrapper bnw = new BaseNatureWrapper(ph);
List notset = bnw.getPropertyAsList("notsetbefore");
assertNotNull(notset);
assertEquals(0, notset.size());
}
/**
* Checks, whether a new List is instantiated if property was not set
* before.
*/
public void testGetPropertyAsListPropertySet() {
PropertyHolderTest ph = new PropertyHolderTest();
ph.addNature(BaseNatureWrapper.class.getName());
BaseNatureWrapper bnw = new BaseNatureWrapper(ph);
ArrayList list = new ArrayList();
list.add("entry");
bnw.setProperty("setbefore", list);
List setbefore = bnw.getPropertyAsList("setbefore");
assertNotNull(setbefore);
assertEquals(1, setbefore.size());
assertEquals("entry", setbefore.get(0));
}
/**
* Checks, whether a new Map is instantiated if property was not set before.
*/
public void testGetPropertyAsMapPropertyNotSet() {
PropertyHolderTest ph = new PropertyHolderTest();
ph.addNature(BaseNatureWrapper.class.getName());
BaseNatureWrapper bnw = new BaseNatureWrapper(ph);
Map notset = bnw.getPropertyAsMap("notsetbefore");
assertNotNull(notset);
assertEquals(0, notset.size());
}
/**
* Checks, whether a new Map is instantiated if property was not set
* before.
*/
public void testGetPropertyAsMapPropertySet() {
PropertyHolderTest ph = new PropertyHolderTest();
ph.addNature(BaseNatureWrapper.class.getName());
BaseNatureWrapper bnw = new BaseNatureWrapper(ph);
Map map = new HashMap();
map.put("key", "entry");
bnw.setProperty("setbefore", map);
Map setbefore = bnw.getPropertyAsMap("setbefore");
assertNotNull(setbefore);
assertEquals(1, setbefore.size());
assertEquals("entry", setbefore.get("key"));
}
}