package org.rapidbeans.core.basic; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import java.math.BigDecimal; import java.net.MalformedURLException; import java.net.URL; import java.text.DateFormat; import java.text.ParseException; import java.util.Arrays; import java.util.List; import java.util.Locale; import org.junit.Assert; import org.junit.Test; import org.rapidbeans.core.common.ReadonlyListCollection; import org.rapidbeans.core.exception.ValidationException; import org.rapidbeans.core.type.TypeRapidEnum; import org.rapidbeans.core.util.Version; import org.rapidbeans.domain.math.Length; import org.rapidbeans.domain.math.UnitLength; import org.rapidbeans.domain.org.Sex; import org.rapidbeans.test.Lang; import org.rapidbeans.test.TestBean; import org.rapidbeans.test.TestHelper; /** * Test generic beans. * * @author Martin Bluemel */ public class GenericBeanTest { /** * Test of createInstance(XmlNode). * * This Method is intended to be used for Unit Tests. The bean's type is not * registered at the bean type loader (RapidBeansTypeLoader). */ @Test public void testCreateInstanceDescr() { String descr = "<beantype name=\"TestBean1\"/>"; GenericBean bean1 = TestHelper.createGenericBeanInstance(descr); assertEquals("TestBean1", bean1.getType().getName()); } /** * Test of createInstance(XmlNode). * * This Method is intended to be used for Unit Tests. The bean's type is not * registered at the bean type loader (RapidBeansTypeLoader). */ @Test public void testCreateInstanceDescrTypeLoader() { String descr = "<beantype name=\"TestBean\"/>"; GenericBean bean1 = TestHelper.createGenericBeanInstance(descr); GenericBean bean2 = TestHelper.createGenericBeanInstance(descr); // approve that the type instances are not registered assertTrue(bean1.getType() != bean2.getType()); } /** * Test of createInstance(XmlNode). */ @Test public void testCreateInstanceDescrPropsList() { String descr = "<beantype name=\"TestBean\">" + "<property name=\"xxx\" key=\"true\"/>" + "<property name=\"yyy\" type=\"integer\" default=\"85737\"/>" + "<property name=\"zzz\" pattern=\"\\A[.\\-0-9A-Za-z]*@[.\\-0-9A-Za-z]*\\z\"/>" + "</beantype>"; GenericBean bean = TestHelper.createGenericBeanInstance(descr); assertEquals(3, bean.getPropertyList().size()); } /** * Test of createInstance(XmlNode). */ @Test public void testCreateInstanceDescrPropsDefault() { String descr = "<beantype name=\"TestBean\">" + "<property name=\"xxx\" key=\"true\"/>" + "<property name=\"yyy\" type=\"integer\" default=\"85737\"/>" + "<property name=\"zzz\" pattern=\"\\A[.\\-0-9A-Za-z]*@[.\\-0-9A-Za-z]*\\z\"/>" + "</beantype>"; GenericBean bean = TestHelper.createGenericBeanInstance(descr); assertEquals(85737, bean.getProperty("yyy").getValue()); } /** * Test of createInstance(XmlNode). */ @Test public void testCreateInstanceDescrPropsSetValueOk() { String descr = "<beantype name=\"TestBean\">" + "<property name=\"xxx\" key=\"true\"/>" + "<property name=\"yyy\" type=\"integer\" default=\"85737\"/>" + "<property name=\"zzz\" pattern=\"\\A[.\\-0-9A-Za-z]*@[.\\-0-9A-Za-z]*\\z\"/>" + "</beantype>"; GenericBean bean = TestHelper.createGenericBeanInstance(descr); bean.setPropValue("zzz", "martin.bluemel@web.de"); assertEquals("martin.bluemel@web.de", bean.getProperty("zzz").getValue()); } /** * Test of createInstance(XmlNode). */ @Test public void testCreateInstanceDescrPropsSetValueWrong() { String descr = "<beantype name=\"TestBean\">" + "<property name=\"xxx\" key=\"true\"/>" + "<property name=\"yyy\" type=\"integer\" default=\"85737\"/>" + "<property name=\"zzz\" pattern=\"\\A[.\\-0-9A-Za-z]*@[.\\-0-9A-Za-z]*\\z\"/>" + "</beantype>"; GenericBean bean = TestHelper.createGenericBeanInstance(descr); try { bean.setPropValue("zzz", "abc"); fail("expected ValidationException"); } catch (ValidationException e) { assertTrue(true); } } /** * Test createInstance(String typename). * * This Method can be used for generic beans A generic bean has a pure * declarative type without a Java class definition). If you use this method * the bean's type is registered a the bean type loader. */ @Test public void testCreateInstanceFromModels() { GenericBean bean1 = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); assertEquals("org.rapidbeans.test.TestBeanGen", bean1.getType().getName()); GenericBean bean2 = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); assertEquals("org.rapidbeans.test.TestBeanGen", bean2.getType().getName()); // approve that the type instance is registered just once assertSame(bean1.getType(), bean2.getType()); } @Test @SuppressWarnings("unchecked") public void testPropertyFile() { GenericBean bean = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); assertSame(Sex.male, (Sex) ((List<RapidEnum>) bean.getPropValue("sex")).get(0)); bean.setPropValue("sex", Sex.female); assertSame(Sex.female, (Sex) ((List<RapidEnum>) bean.getPropValue("sex")).get(0)); } @Test public void testStringProperty() throws SecurityException, NoSuchFieldException, ParseException { GenericBean bean = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); Assert.assertEquals("Ismaning", bean.getPropValue("city")); bean.setPropValue("city", "Mannheim"); Assert.assertEquals("Mannheim", bean.getPropValue("city")); } @Test(expected = ValidationException.class) public void testStringPropertyInvalid() { GenericBean bean = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); bean.setPropValue("email", "xyz"); } @Test public void testDateProperty() throws SecurityException, NoSuchFieldException, ParseException { GenericBean bean = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); Assert.assertEquals(DFDATE.parse("14.10.1964"), bean.getPropValue("dateofbirth")); bean.setPropValue("dateofbirth", DFDATE.parse("15.10.1964")); Assert.assertEquals(DFDATE.parse("15.10.1964"), bean.getPropValue("dateofbirth")); } @Test(expected = ValidationException.class) public void testDatePropertyInvalid() throws ParseException { GenericBean bean = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); bean.setPropValue("dateofbirth", DFDATE.parse("14.10.1700")); } @Test public void testBooleanProperty() throws SecurityException, NoSuchFieldException, ParseException { GenericBean bean = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); Assert.assertEquals(true, bean.getPropValue("married")); bean.setPropValue("married", false); Assert.assertEquals(false, bean.getPropValue("married")); } @Test(expected = ValidationException.class) public void testBooleanPropertyInvalid() throws ParseException { GenericBean bean = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); bean.setPropValue("married", null); } @Test public void testIntegerProperty() throws SecurityException, NoSuchFieldException, ParseException { GenericBean bean = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); Assert.assertEquals(43, bean.getPropValue("shoesize")); bean.setPropValue("shoesize", 40); Assert.assertEquals(40, bean.getPropValue("shoesize")); } @Test(expected = ValidationException.class) public void testIntegerPropertyInvalid() throws SecurityException, NoSuchFieldException, ParseException { GenericBean bean = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); bean.setPropValue("shoesize", 5); } @SuppressWarnings("unchecked") @Test public void testChoicePropertySingle() { GenericBean bean = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); Assert.assertEquals(Sex.male, ((ReadonlyListCollection<Sex>) bean.getPropValue("sex")).get(0)); bean.setPropValue("sex", Sex.female); Assert.assertEquals(Sex.female, ((ReadonlyListCollection<Sex>) bean.getPropValue("sex")).get(0)); } @Test(expected = ValidationException.class) public void testChoicePropertySingleInvalidEnumType() { GenericBean bean = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); bean.setPropValue("sex", UnitLength.cm); } @SuppressWarnings("unchecked") @Test public void testChoicePropertyMultiple() { TypeRapidEnum tlang = TypeRapidEnum.forName("org.rapidbeans.test.LangGeneric"); GenericBean bean = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); assertListsEqual(Arrays.asList(new RapidEnum[] { tlang.elementOf("german"), tlang.elementOf("english"), tlang.elementOf("french") }), (List<RapidEnum>) bean.getPropValue("languages")); bean.setPropValue("languages", (Arrays.asList(new RapidEnum[] { tlang.elementOf("chinese"), tlang.elementOf("spanish") }))); assertListsEqual(Arrays.asList(new RapidEnum[] { tlang.elementOf("chinese"), tlang.elementOf("spanish") }), (List<RapidEnum>) bean.getPropValue("languages")); } @Test(expected = ValidationException.class) public void testChoicePropertyMultipleInvalid() { GenericBean bean = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); bean.setPropValue("languages", (Arrays.asList(new Lang[] { Lang.chinese, Lang.spanish }))); } @Test public void testFileProperty() { GenericBean bean = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); Assert.assertEquals(new File("."), bean.getPropValue("homedir")); bean.setPropValue("homedir", new File(System.getProperty("user.dir"))); Assert.assertEquals(new File(System.getProperty("user.dir")), bean.getPropValue("homedir")); } @Test(expected = ValidationException.class) public void testFilePropertyInvalid() { GenericBean bean = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); bean.setPropValue("homedir", new File("pom.xml")); } @Test @SuppressWarnings("unchecked") public void testOverriding() { GenericBean bean = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanExtended1aGen"); Sex defaultSex = (Sex) ((List<RapidEnum>) bean.getPropValue("sex")).get(0); assertSame(Sex.female, defaultSex); } @Test public void testQuantityProperty() { GenericBean bean = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); Assert.assertEquals(new Length(new BigDecimal("1.73"), UnitLength.m), bean.getPropValue("height")); bean.setPropValue("height", new Length(new BigDecimal("73"), UnitLength.cm)); Assert.assertEquals(new Length(new BigDecimal("73"), UnitLength.cm), bean.getPropValue("height")); } @Test(expected = ValidationException.class) public void testQuantityInvalid() { GenericBean bean = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); bean.setPropValue("height", new Length(new BigDecimal("3.05"), UnitLength.m)); } @SuppressWarnings("unchecked") @Test public void testAssociationPropertySingle() { GenericBean father = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); GenericBean son = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); Assert.assertNull(son.getPropValue("father")); Assert.assertNull(father.getPropValue("children")); son.setPropValue("father", father); Assert.assertSame(father, ((List<GenericBean>) son.getPropValue("father")).get(0)); Assert.assertEquals(1, ((List<GenericBean>) father.getPropValue("children")).size()); Assert.assertSame(son, ((List<GenericBean>) father.getPropValue("children")).get(0)); } @SuppressWarnings("unchecked") @Test public void testAssociationPropertyMultiple() { GenericBean father = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); Assert.assertNull(father.getPropValue("children")); GenericBean son1 = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); Assert.assertNull((son1.getPropValue("father"))); GenericBean son2 = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); Assert.assertNull((son2.getPropValue("father"))); GenericBean son3 = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); Assert.assertNull((son3.getPropValue("father"))); GenericBean son4 = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); Assert.assertNull((son4.getPropValue("father"))); father.setPropValue("children", Arrays.asList(new GenericBean[] { son1, son2, son3, son4 })); Assert.assertEquals(4, ((List<GenericBean>) father.getPropValue("children")).size()); Assert.assertSame(son1, ((List<GenericBean>) father.getPropValue("children")).get(0)); Assert.assertSame(son2, ((List<GenericBean>) father.getPropValue("children")).get(1)); Assert.assertSame(son3, ((List<GenericBean>) father.getPropValue("children")).get(2)); Assert.assertSame(son4, ((List<GenericBean>) father.getPropValue("children")).get(3)); } @Test(expected = ValidationException.class) public void testAssociationPropertyMultipleInvalid() { GenericBean bean = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); bean.setPropValue("children", (Arrays.asList(new TestBean[] { new TestBean(), new TestBean(), new TestBean(), new TestBean(), new TestBean() }))); } @Test public void testVersionProperty() { GenericBean bean = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); Assert.assertEquals(new Version("2.0"), bean.getPropValue("version")); bean.setPropValue("version", new Version("3.0.0")); Assert.assertEquals(new Version("3.0.0"), bean.getPropValue("version")); } @Test(expected = ValidationException.class) public void testVersionInvalid() { GenericBean bean = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); bean.setPropValue("version", null); } @Test public void testUrlProperty() throws MalformedURLException { GenericBean bean = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); Assert.assertEquals(new URL("http://www.rapidbeans.org"), bean.getPropValue("webaddress")); bean.setPropValue("webaddress", new URL("http://www.martin-bluemel.de")); Assert.assertEquals(new URL("http://www.martin-bluemel.de"), bean.getPropValue("webaddress")); } @Test(expected = ValidationException.class) public void testUrlInvalid() { GenericBean bean = (GenericBean) RapidBeanImplParent.createInstance("org.rapidbeans.test.TestBeanGen"); bean.setPropValue("webaddress", null); } private void assertListsEqual(List<?> list1, List<?> list2) { int len = list1.size(); if (len != list2.size()) { Assert.fail("Lists have diferent sizes"); } for (int i = 0; i < len; i++) { if (!list1.get(i).equals(list2.get(i))) { Assert.fail("List elements [" + Integer.toString(i) + "] \"" + list1.get(i).toString() + "\" and \"" + list2.get(i).toString() + "\" differ"); } } } /** * Date formatter. */ static final DateFormat DFDATE = DateFormat.getDateInstance( DateFormat.MEDIUM, Locale.GERMAN); /** * Date formatter. */ static final DateFormat DFTIME = DateFormat.getDateTimeInstance( DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.GERMAN); /** * Date formatter. */ static final DateFormat DFTIMELONG = DateFormat.getDateTimeInstance( DateFormat.MEDIUM, DateFormat.LONG, Locale.GERMAN); }