blob: a7e091f354f9a17def295f806677b1a6711fc40f [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.xbean.recipe;
import junit.framework.TestCase;
import org.apache.xbean.propertyeditor.PropertyEditors;
import static org.apache.xbean.recipe.Person.ConstructionCalled.CONSTRUCTOR;
import static org.apache.xbean.recipe.Person.ConstructionCalled.CONSTRUCTOR_4_ARG;
import static org.apache.xbean.recipe.Person.ConstructionCalled.NEW_INSTANCE;
import static org.apache.xbean.recipe.Person.ConstructionCalled.NEW_INSTANCE_4_ARG;
import static org.apache.xbean.recipe.Person.ConstructionCalled.PERSON_FACTORY;
import static org.apache.xbean.recipe.Person.ConstructionCalled.PERSON_FACTORY_4_ARG;
import java.net.URL;
public class ObjectRecipeTest extends TestCase {
protected void setUp() throws Exception {
PropertyEditors.class.getName();
}
public void testSetters() throws Exception {
ObjectRecipe objectRecipe = new ObjectRecipe(Person.class);
doTest(objectRecipe, CONSTRUCTOR);
}
public void testConstructor() throws Exception {
ObjectRecipe objectRecipe = new ObjectRecipe(Person.class, new String[]{"name", "age", "homePage", "car"}, new Class[]{String.class, Integer.TYPE, URL.class, Car.class});
doTest(objectRecipe, CONSTRUCTOR_4_ARG);
}
public void testConstructorWithImpliedTypes() throws Exception {
ObjectRecipe objectRecipe = new ObjectRecipe(Person.class, new String[]{"name", "age", "homePage", "car"}, null);
doTest(objectRecipe, CONSTRUCTOR_4_ARG);
}
public void testConstructorWithNamedParameters() throws Exception {
ObjectRecipe objectRecipe = new ObjectRecipe(Person.class);
objectRecipe.allow(Option.NAMED_PARAMETERS);
doTest(objectRecipe, CONSTRUCTOR_4_ARG);
}
public void testStaticFactoryMethodAndSetters() throws Exception {
ObjectRecipe objectRecipe = new ObjectRecipe(Person.class, "newInstance");
doTest(objectRecipe, NEW_INSTANCE);
}
public void testStaticFactoryMethodWithParams() throws Exception {
ObjectRecipe objectRecipe = new ObjectRecipe(Person.class, "newInstance", new String[]{"name", "age", "homePage", "car"}, new Class[]{String.class, Integer.TYPE, URL.class, Car.class});
doTest(objectRecipe, NEW_INSTANCE_4_ARG);
}
public void testStaticFactoryMethodWithImpliedTypes() throws Exception {
ObjectRecipe objectRecipe = new ObjectRecipe(Person.class, "newInstance", new String[]{"name", "age", "homePage", "car"});
doTest(objectRecipe, NEW_INSTANCE_4_ARG);
}
public void testStaticFactoryMethodWithNamedParameters() throws Exception {
ObjectRecipe objectRecipe = new ObjectRecipe(Person.class, "newInstance");
objectRecipe.allow(Option.NAMED_PARAMETERS);
doTest(objectRecipe, NEW_INSTANCE_4_ARG);
}
public void testInstanceFactorySetters() throws Exception {
ObjectRecipe objectRecipe = new ObjectRecipe(PersonFactory.class, "create");
doTest(objectRecipe, PERSON_FACTORY);
}
public void testInstanceFactoryConstructor() throws Exception {
ObjectRecipe objectRecipe = new ObjectRecipe(PersonFactory.class, "create", new String[]{"name", "age", "homePage", "car"}, new Class[]{String.class, Integer.TYPE, URL.class, Car.class});
doTest(objectRecipe, PERSON_FACTORY_4_ARG);
}
public void testInstanceFactoryConstructorWithImpliedTypes() throws Exception {
ObjectRecipe objectRecipe = new ObjectRecipe(PersonFactory.class, "create", new String[]{"name", "age", "homePage", "car"});
doTest(objectRecipe, PERSON_FACTORY_4_ARG);
}
public void testInstanceFactoryConstructorWithNamedParameters() throws Exception {
ObjectRecipe objectRecipe = new ObjectRecipe(PersonFactory.class, "create");
objectRecipe.allow(Option.NAMED_PARAMETERS);
doTest(objectRecipe, PERSON_FACTORY_4_ARG);
}
public void testWhitespaceInjection() throws Exception {
String name = " Foo Bar ";
char ch = ' ';
ObjectRecipe objectRecipe = new ObjectRecipe(Value.class);
objectRecipe.setProperty("name", name);
objectRecipe.setProperty("type", " ");
Value c = (Value) objectRecipe.create();
assertEquals(name, c.name);
assertEquals(ch, c.type);
}
public static class Value {
public String name;
public char type;
}
private void doTest(ObjectRecipe objectRecipe, Person.ConstructionCalled expectedConstruction) throws Exception {
Person expected = new Person("Joe", 21, new URL("http://www.acme.org"), new Car("Mini", "Cooper", 2008));
objectRecipe.setProperty("name", "Joe");
objectRecipe.setProperty("age", "21");
objectRecipe.setProperty("homePage", "http://www.acme.org");
ObjectRecipe carRecipe = new ObjectRecipe(Car.class, new String[]{"make", "model", "year"});
carRecipe.setProperty("make", "Mini");
carRecipe.setProperty("model", "Cooper");
carRecipe.setProperty("year", "2008");
objectRecipe.setProperty("car", carRecipe);
Person actual = (Person) objectRecipe.create(Person.class.getClassLoader());
assertEquals("person", expected, actual);
assertEquals(expectedConstruction, actual.getConstructionCalled());
}
public void testCompoundProperties() throws Exception {
ObjectRecipe objectRecipe = new ObjectRecipe(Component.class);
objectRecipe.setCompoundProperty("name", "Adam");
objectRecipe.setCompoundProperty("box.height", 5);
objectRecipe.setCompoundProperty("box.width", 10);
objectRecipe.setCompoundProperty("component.name", "Eva");
objectRecipe.setCompoundProperty("component.box.height", 10);
objectRecipe.setCompoundProperty("component.box.width", 20);
Component component = (Component) objectRecipe.create(Component.class.getClassLoader());
assertEquals("Adam", component.getName());
assertEquals(5, component.getBox().getHeight());
assertEquals(10, component.getBox().getWidth());
assertEquals("Eva", component.getComponent().getName());
assertEquals(10, component.getComponent().getBox().getHeight());
assertEquals(20, component.getComponent().getBox().getWidth());
}
public void testStringCharArray() {
{
final ObjectRecipe recipe = new ObjectRecipe(StringCharArray.class);
recipe.setProperty("chars", "v1");
recipe.setProperty("string", "v2");
final StringCharArray v = StringCharArray.class.cast(recipe.create());
assertEquals("v1", new String(v.chars));
assertEquals("v2", v.string);
}
{
final ObjectRecipe recipe = new ObjectRecipe(StringCharArray.class);
recipe.setProperty("chars", "v1".toCharArray());
recipe.setProperty("string", "v2".toCharArray());
final StringCharArray v = StringCharArray.class.cast(recipe.create());
assertEquals("v1", new String(v.chars));
assertEquals("v2", v.string);
}
}
public static class Component {
String name;
Box box;
Component component;
public Box getBox() {
if (box == null) {
box = new Box();
}
return box;
}
public Component getComponent() {
if (component == null) {
component = new Component();
}
return component;
}
public Component getNullComponent() {
return null;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public static class StringCharArray {
private char[] chars;
private String string;
public void setChars(final char[] chars) {
this.chars = chars;
}
public void setString(final String string) {
this.string = string;
}
}
}