/* * Created at 23.03.2004 14:39:41 * Copyright (c) 2004 by Norman Fomferra */ package com.bc.util.prop; import junit.framework.TestCase; import java.text.ParseException; import java.util.Date; import java.util.Map; public class PropertyParserTest extends TestCase { public PropertyParserTest(String s) { super(s); } public void testMapPropertyParsing() throws ParseException, PropertyNotFoundException { Property p; NestedProperty np1, np2; MapProperty mp1; GenericProperty gp2, gp3; p = PropertyParser.parseProperty(Map.class, "a"); assertTrue(p instanceof MapProperty); assertEquals("a", p.getName()); assertEquals(Property.UNKNOWN_TYPE, p.getType()); p = PropertyParser.parseProperty(Map.class, "a.b"); assertTrue(p instanceof NestedProperty); np1 = (NestedProperty) p; assertEquals("a.b", np1.getName()); assertEquals(Property.UNKNOWN_TYPE, np1.getType()); assertEquals(MapProperty.class, np1.getParent().getClass()); assertEquals(GenericProperty.class, np1.getChild().getClass()); mp1 = (MapProperty) np1.getParent(); gp2 = (GenericProperty) np1.getChild(); assertEquals("a", mp1.getName()); assertEquals(Property.UNKNOWN_TYPE, mp1.getType()); assertEquals("b", gp2.getName()); assertEquals(Property.UNKNOWN_TYPE, gp2.getType()); p = PropertyParser.parseProperty(Map.class, "a.b.c"); assertTrue(p instanceof NestedProperty); np2 = (NestedProperty) p; assertEquals("a.b.c", np2.getName()); assertEquals(Property.UNKNOWN_TYPE, np2.getType()); assertEquals(NestedProperty.class, np2.getParent().getClass()); assertEquals(GenericProperty.class, np2.getChild().getClass()); np1 = (NestedProperty) np2.getParent(); gp3 = (GenericProperty) np2.getChild(); assertEquals("a.b", np1.getName()); assertEquals(Property.UNKNOWN_TYPE, np1.getType()); assertEquals(MapProperty.class, np1.getParent().getClass()); assertEquals(GenericProperty.class, np1.getChild().getClass()); mp1 = (MapProperty) np1.getParent(); gp2 = (GenericProperty) np1.getChild(); assertEquals("a", mp1.getName()); assertEquals(Property.UNKNOWN_TYPE, mp1.getType()); assertEquals("b", gp2.getName()); assertEquals(Property.UNKNOWN_TYPE, gp2.getType()); assertEquals("c", gp3.getName()); assertEquals(Property.UNKNOWN_TYPE, gp3.getType()); } public void testSimpleBeanPropertyParsing() throws ParseException, PropertyNotFoundException { Property p; p = PropertyParser.parseProperty(TestBean.class, "vi"); assertTrue(p instanceof BeanProperty); assertEquals("vi", p.getName()); assertEquals(int.class, p.getType()); p = PropertyParser.parseProperty(TestBean.class, "vf"); assertTrue(p instanceof BeanProperty); assertEquals("vf", p.getName()); assertEquals(double.class, p.getType()); p = PropertyParser.parseProperty(TestBean.class, "vs"); assertTrue(p instanceof BeanProperty); assertEquals("vs", p.getName()); assertEquals(String.class, p.getType()); p = PropertyParser.parseProperty(TestBean.class, "vd"); assertTrue(p instanceof BeanProperty); assertEquals("vd", p.getName()); assertEquals(Date.class, p.getType()); p = PropertyParser.parseProperty(TestBean.class, "vo"); assertTrue(p instanceof BeanProperty); assertEquals("vo", p.getName()); assertEquals(TestBean.class, p.getType()); p = PropertyParser.parseProperty(TestBean.class, "vm"); assertTrue(p instanceof BeanProperty); assertEquals("vm", p.getName()); assertEquals(Map.class, p.getType()); p = PropertyParser.parseProperty(TestBean.class, "ai"); assertTrue(p instanceof BeanProperty); assertEquals("ai", p.getName()); assertEquals(int[].class, p.getType()); p = PropertyParser.parseProperty(TestBean.class, "af"); assertTrue(p instanceof BeanProperty); assertEquals("af", p.getName()); assertEquals(double[].class, p.getType()); p = PropertyParser.parseProperty(TestBean.class, "as"); assertTrue(p instanceof BeanProperty); assertEquals("as", p.getName()); assertEquals(String[].class, p.getType()); p = PropertyParser.parseProperty(TestBean.class, "ad"); assertTrue(p instanceof BeanProperty); assertEquals("ad", p.getName()); assertEquals(Date[].class, p.getType()); p = PropertyParser.parseProperty(TestBean.class, "ao"); assertTrue(p instanceof BeanProperty); assertEquals("ao", p.getName()); assertEquals(TestBean[].class, p.getType()); p = PropertyParser.parseProperty(TestBean.class, "am"); assertTrue(p instanceof BeanProperty); assertEquals("am", p.getName()); assertEquals(Map[].class, p.getType()); } public void testArrayBeanPropertyParsing() throws ParseException, PropertyNotFoundException { Property p; ArrayProperty ap; p = PropertyParser.parseProperty(TestBean.class, "ai[0]"); assertTrue(p instanceof ArrayProperty); ap = (ArrayProperty) p; assertTrue(ap.getArray() instanceof BeanProperty); assertEquals("ai[0]", ap.getName()); assertEquals(int.class, ap.getType()); assertEquals(0, ap.getIndex()); p = PropertyParser.parseProperty(TestBean.class, "af[354]"); assertTrue(p instanceof ArrayProperty); ap = (ArrayProperty) p; assertTrue(ap.getArray() instanceof BeanProperty); assertEquals("af[354]", ap.getName()); assertEquals(double.class, ap.getType()); assertEquals(354, ap.getIndex()); p = PropertyParser.parseProperty(TestBean.class, "as[54]"); assertTrue(p instanceof ArrayProperty); ap = (ArrayProperty) p; assertTrue(ap.getArray() instanceof BeanProperty); assertEquals("as[54]", ap.getName()); assertEquals(String.class, ap.getType()); assertEquals(54, ap.getIndex()); p = PropertyParser.parseProperty(TestBean.class, "ad[987]"); assertTrue(p instanceof ArrayProperty); ap = (ArrayProperty) p; assertTrue(ap.getArray() instanceof BeanProperty); assertEquals("ad[987]", ap.getName()); assertEquals(Date.class, ap.getType()); assertEquals(987, ap.getIndex()); p = PropertyParser.parseProperty(TestBean.class, "ao[632]"); assertTrue(p instanceof ArrayProperty); ap = (ArrayProperty) p; assertTrue(ap.getArray() instanceof BeanProperty); assertEquals("ao[632]", ap.getName()); assertEquals(TestBean.class, ap.getType()); assertEquals(632, ap.getIndex()); } public void testDelegateBeanPropertyParsing() throws ParseException, PropertyNotFoundException { Property p; NestedProperty dp; p = PropertyParser.parseProperty(TestBean.class, "vo.vi"); assertTrue(p instanceof NestedProperty); dp = (NestedProperty) p; assertTrue(dp.getParent() instanceof BeanProperty); assertTrue(dp.getChild() instanceof BeanProperty); assertEquals("vo.vi", dp.getName()); assertEquals(int.class, dp.getType()); p = PropertyParser.parseProperty(TestBean.class, "vo.vo.vf"); assertTrue(p instanceof NestedProperty); dp = (NestedProperty) p; assertTrue(dp.getParent() instanceof NestedProperty); assertTrue(dp.getChild() instanceof BeanProperty); assertEquals("vo.vo.vf", dp.getName()); assertEquals(double.class, dp.getType()); p = PropertyParser.parseProperty(TestBean.class, "vo.vo.vo.vs"); assertTrue(p instanceof NestedProperty); dp = (NestedProperty) p; assertTrue(dp.getParent() instanceof NestedProperty); assertTrue(dp.getChild() instanceof BeanProperty); assertEquals("vo.vo.vo.vs", dp.getName()); assertEquals(String.class, dp.getType()); p = PropertyParser.parseProperty(TestBean.class, "vo.vo.vo.vo.vd"); assertTrue(p instanceof NestedProperty); dp = (NestedProperty) p; assertTrue(dp.getParent() instanceof NestedProperty); assertTrue(dp.getChild() instanceof BeanProperty); assertEquals("vo.vo.vo.vo.vd", dp.getName()); assertEquals(Date.class, dp.getType()); } public void testArrayDelegateBeanPropertyParsing() throws ParseException, PropertyNotFoundException { Property p; NestedProperty dp; p = PropertyParser.parseProperty(TestBean.class, "ao[56].ai"); assertNotNull(p); assertEquals(NestedProperty.class, p.getClass()); dp = (NestedProperty) p; assertTrue(dp.getParent() instanceof ArrayProperty); assertTrue(dp.getChild() instanceof BeanProperty); assertEquals("ao[56].ai", dp.getName()); assertEquals(int[].class, dp.getType()); p = PropertyParser.parseProperty(TestBean.class, "ao[56].vo.ad[6]"); assertNotNull(p); assertEquals(NestedProperty.class, p.getClass()); dp = (NestedProperty) p; assertTrue(dp.getParent() instanceof NestedProperty); assertTrue(dp.getChild() instanceof ArrayProperty); assertEquals("ao[56].vo.ad[6]", p.getName()); assertEquals(Date.class, p.getType()); p = PropertyParser.parseProperty(TestBean.class, "vo.ao[0].vs"); assertNotNull(p); assertEquals(NestedProperty.class, p.getClass()); dp = (NestedProperty) p; assertTrue(dp.getParent() instanceof NestedProperty); assertTrue(dp.getChild() instanceof BeanProperty); assertEquals("vo.ao[0].vs", p.getName()); assertEquals(String.class, p.getType()); } public void testParseExceptionNotThrown() throws PropertyNotFoundException { assertParseExceptionNotThrown(TestBean.class, "vo "); assertParseExceptionNotThrown(TestBean.class, " vo"); assertParseExceptionNotThrown(TestBean.class, " vo "); assertParseExceptionNotThrown(TestBean.class, " vo . ai[ 6 ] "); assertParseExceptionNotThrown(TestBean.class, " vo . am[ 6 ].bibo "); assertParseExceptionNotThrown(TestBean.class, " vo . am[ 6 ][ \"bi-bo\"] "); assertParseExceptionNotThrown(TestBean.class, " vo . vm.bibo "); assertParseExceptionNotThrown(TestBean.class, " vo . vm[ \"bi-bo\"] "); assertParseExceptionNotThrown(TestBean.class, " vm[ \"bi-bo\"].erno "); assertParseExceptionNotThrown(TestBean.class, " vm[ \"bi-bo\"][\"er-no\"] "); } public void testPropertyNotFoundExceptionThrown() throws ParseException { assertPropertyNotFoundExceptionThrown(TestBean.class, "a", "'a' not found"); assertPropertyNotFoundExceptionThrown(TestBean.class, "vo.a", "'a' not found"); assertPropertyNotFoundExceptionThrown(TestBean.class, "ai.a", "'a' not found"); assertPropertyNotFoundExceptionThrown(TestBean.class, "ai[2].a", "'a' not found"); } public void testParseExceptionThrown() throws PropertyNotFoundException { assertParseExceptionThrown(TestBean.class, "+", "name expected, got +"); assertParseExceptionThrown(TestBean.class, "]", "name expected, got ]"); assertParseExceptionThrown(TestBean.class, " ", "name expected, got "); assertParseExceptionThrown(TestBean.class, "vo. ", "name expected, got vo. "); assertParseExceptionThrown(TestBean.class, "vo.+", "name expected, got vo.+"); assertParseExceptionThrown(TestBean.class, "vo.]", "name expected, got vo.]"); assertParseExceptionThrown(TestBean.class, "vo+", "'.' or '[' or EOS expected"); assertParseExceptionThrown(TestBean.class, "vo]", "'.' or '[' or EOS expected"); assertParseExceptionThrown(TestBean.class, "ai[ ", "index or key expected"); assertParseExceptionThrown(TestBean.class, "ai[+", "index or key expected"); assertParseExceptionThrown(TestBean.class, "ai[]", "index or key expected"); assertParseExceptionThrown(TestBean.class, "ai[x", "index or key expected"); assertParseExceptionThrown(TestBean.class, "ai[1 ", "']' expected"); assertParseExceptionThrown(TestBean.class, "ai[1+", "']' expected"); assertParseExceptionThrown(TestBean.class, "ai[1[", "']' expected"); assertParseExceptionThrown(TestBean.class, "ai[1x", "']' expected"); assertParseExceptionThrown(TestBean.class, "vi[0]", "'vi' is not a Java array"); assertParseExceptionThrown(TestBean.class, "ao[2][3]", "'ao[2]' is not a Java array"); assertParseExceptionThrown(TestBean.class, "ai[\"a\"]", "'ai' is not a java.util.Map"); assertParseExceptionThrown(TestBean.class, "vm[\"a]", "string delimitter expected"); } private void assertPropertyNotFoundExceptionThrown(Class baseType, String fullName, String expectedMsg) throws ParseException { try { PropertyParser.parseProperty(baseType, fullName); fail(); } catch (PropertyNotFoundException expected) { assertEquals(expectedMsg, expected.getMessage()); } } private void assertParseExceptionNotThrown(final Class baseType, final String fullName) throws PropertyNotFoundException { try { PropertyParser.parseProperty(baseType, fullName); } catch (ParseException unexpected) { fail(fullName + ": offset " + unexpected.getErrorOffset() + ": " + unexpected.getMessage()); } } private void assertParseExceptionThrown(final Class baseType, final String fullName, final String expectedMsg) throws PropertyNotFoundException { try { PropertyParser.parseProperty(baseType, fullName); fail(); } catch (ParseException expected) { assertEquals(expectedMsg, expected.getMessage()); } } }