// Copyright (c) 2003-present, Jodd Team (http://jodd.org) // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. package jodd.bean; import org.junit.Test; import java.util.List; import java.util.Map; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.fail; public class BeanIndexPropertyTest { // simple public static class Simple<T extends Number> { public T data; public T getDataX() {return data;} public void setDataX(T data) {this.data = data;} } public static class SimpleLong extends Simple<Long> {} // bean 1 public static class Bean1 { public Simple[] array1; public SimpleLong[] array2; public List<Simple> list1; public Map<String, Simple> map1; public Map<Integer, Simple> map2; public Simple[] getArray1X() {return array1;} public void setArray1X(Simple[] array1) {this.array1 = array1;} public SimpleLong[] getArray2X() {return array2;} public void setArray2X(SimpleLong[] array2) {this.array2 = array2;} public List<Simple> getList1X() {return list1;} public void setList1X(List<Simple> list1) {this.list1 = list1;} public Map<String, Simple> getMap1X() {return map1;} public void setMap1X(Map<String, Simple> map1) {this.map1 = map1;} public Map<Integer, Simple> getMap2X() {return map2;} public void setMap2X(Map<Integer, Simple> map2) {this.map2 = map2;} } public static class Bean2<T extends Number> { public T[] array1; public List<T> list1; public Map<String, T> map1; public Map<Integer, T> map2; public T[] getArray1X() {return array1;} public void setArray1X(T[] array1) {this.array1 = array1;} public List<T> getList1X() {return list1;} public void setList1X(List<T> list1) {this.list1 = list1;} public Map<String, T> getMap1X() {return map1;} public void setMap1X(Map<String, T> map1) {this.map1 = map1;} public Map<Integer, T> getMap2X() {return map2;} public void setMap2X(Map<Integer, T> map2) {this.map2 = map2;} } public static class Bean2Long extends Bean2<Long> {} // ---------------------------------------------------------------- tests @Test public void testGetSetArray1() { for (int i = 0; i < 2; i++) { String suffix = ""; if (i == 1) { suffix = "X"; } Bean1 bean1 = new Bean1(); assertNull(BeanUtil.pojo.getProperty(bean1, "array1" + suffix)); try { BeanUtil.pojo.getProperty(bean1, "array1" + suffix + "[0]"); fail(); // fails to read index of null property } catch (BeanException ignore) { } // array1[0] try { BeanUtil.pojo.setProperty(bean1, "array1" + suffix + "[0].data" + suffix, Integer.valueOf(173)); fail(); } catch (BeanException ignored) { } BeanUtil.forced.setProperty(bean1, "array1" + suffix + "[0].data" + suffix, Integer.valueOf(173)); assertNotNull(bean1.array1); assertEquals(Integer.valueOf(173), bean1.array1[0].data); // array2[0] try { BeanUtil.pojo.setProperty(bean1, "array2" + suffix + "[0].data" + suffix, Integer.valueOf(173)); fail(); } catch (BeanException ignored) { } BeanUtil.forced.setProperty(bean1, "array2" + suffix + "[0].data" + suffix, Integer.valueOf(173)); assertNotNull(bean1.array2); assertEquals(Long.valueOf(173), bean1.array2[0].data); } } @Test public void testGetSetArray2() { for (int i = 0; i < 2; i++) { String suffix = ""; if (i == 1) { suffix = "X"; } Bean2 bean2 = new Bean2(); Bean2Long bean2Long = new Bean2Long(); // array1[0] try { BeanUtil.pojo.setProperty(bean2, "array1" + suffix + "[0]", Integer.valueOf(173)); fail(); } catch (BeanException ignore) { } BeanUtil.forced.setProperty(bean2, "array1" + suffix + "[0]", Integer.valueOf(173)); assertNotNull(bean2.array1); assertEquals(Integer.valueOf(173), bean2.array1[0]); try { BeanUtil.pojo.setProperty(bean2Long, "array1" + suffix + "[0]", Integer.valueOf(173)); fail(); } catch (BeanException ignore) { } BeanUtil.forced.setProperty(bean2Long, "array1" + suffix + "[0]", Integer.valueOf(173)); assertNotNull(bean2Long.array1); assertEquals(Long.valueOf(173), bean2Long.array1[0]); assertEquals(Long.class, bean2Long.array1[0].getClass()); } } // ---------------------------------------------------------------- list @Test public void testGetSetList() { for (int i = 0; i < 2; i++) { String suffix = ""; if (i == 1) { suffix = "X"; } Bean1 bean1 = new Bean1(); assertNull(BeanUtil.pojo.getProperty(bean1, "list1" + suffix)); try { BeanUtil.pojo.getProperty(bean1, "list1" + suffix + "[0]"); fail(); // fails to read index of null property } catch (BeanException ignored) { } try { BeanUtil.pojo.setProperty(bean1, "list1" + suffix + "[0].data" + suffix, Integer.valueOf(173)); fail(); } catch (BeanException ignored) { } BeanUtil.forced.setProperty(bean1, "list1" + suffix + "[0].data" + suffix, Integer.valueOf(173)); assertNotNull(bean1.list1); assertEquals(Integer.valueOf(173), bean1.list1.get(0).data); } } @Test public void testGetSetList2() { for (int i = 0; i < 2; i++) { String suffix = ""; if (i == 1) { suffix = "X"; } Bean2 bean2 = new Bean2(); Bean2Long bean2Long = new Bean2Long(); // array1[0] try { BeanUtil.pojo.setProperty(bean2, "list1" + suffix + "[0]", Integer.valueOf(173)); fail(); } catch (BeanException ignore) { } BeanUtil.forced.setProperty(bean2, "list1" + suffix + "[0]", Integer.valueOf(173)); assertNotNull(bean2.list1); assertEquals(Integer.valueOf(173), bean2.list1.get(0)); try { BeanUtil.pojo.setProperty(bean2Long, "list1" + suffix + "[0]", Integer.valueOf(173)); fail(); } catch (BeanException ignore) { } BeanUtil.forced.setProperty(bean2Long, "list1" + suffix + "[0]", Integer.valueOf(173)); assertNotNull(bean2Long.list1); assertEquals(Long.valueOf(173), bean2Long.list1.get(0)); assertEquals(Long.class, bean2Long.list1.get(0).getClass()); } } // ---------------------------------------------------------------- map @Test public void testGetSetMap() { for (int i = 0; i < 2; i++) { String suffix = ""; if (i == 1) { suffix = "X"; } Bean1 bean1 = new Bean1(); assertNull(BeanUtil.pojo.getProperty(bean1, "map1" + suffix)); try { BeanUtil.pojo.setProperty(bean1, "map1" + suffix + "[x0].data" + suffix, Integer.valueOf(173)); fail(); } catch (BeanException ignored) { } BeanUtil.forced.setProperty(bean1, "map1" + suffix + "[x0].data" + suffix, Integer.valueOf(173)); assertNotNull(bean1.map1); assertEquals(Integer.valueOf(173), bean1.map1.get("x0").data); } } @Test public void testGetSetMapWithIntegerKey() { for (int i = 0; i < 2; i++) { String suffix = ""; if (i == 1) { suffix = "X"; } Bean1 bean1 = new Bean1(); assertNull(BeanUtil.pojo.getProperty(bean1, "map2" + suffix)); try { BeanUtil.pojo.setProperty(bean1, "map2" + suffix + "[0].data" + suffix, Integer.valueOf(173)); fail(); } catch (BeanException ignored) { } BeanUtil.forced.setProperty(bean1, "map2" + suffix + "[0].data" + suffix, Integer.valueOf(173)); assertNotNull(bean1.map2); assertEquals(Integer.valueOf(173), bean1.map2.get(Integer.valueOf(0)).data); } } @Test public void testGetSetMap2() { for (int i = 0; i < 2; i++) { String suffix = ""; if (i == 1) { suffix = "X"; } Bean2 bean2 = new Bean2(); Bean2Long bean2Long = new Bean2Long(); // array1[0] try { BeanUtil.pojo.setProperty(bean2, "map1" + suffix + "[0x]", Integer.valueOf(173)); fail(); } catch (BeanException ignore) { } BeanUtil.forced.setProperty(bean2, "map1" + suffix + "[0x]", Integer.valueOf(173)); assertNotNull(bean2.map1); assertEquals(Integer.valueOf(173), bean2.map1.get("0x")); try { BeanUtil.pojo.setProperty(bean2Long, "map1" + suffix + "[0x]", Integer.valueOf(173)); fail(); } catch (BeanException ignore) { } BeanUtil.forced.setProperty(bean2Long, "map1" + suffix + "[0x]", Integer.valueOf(173)); assertNotNull(bean2Long.map1); assertEquals(Long.valueOf(173), bean2Long.map1.get("0x")); assertEquals(Long.class, bean2Long.map1.get("0x").getClass()); } } @Test public void testGetSetMap2withIntegerKey() { for (int i = 0; i < 2; i++) { String suffix = ""; if (i == 1) { suffix = "X"; } Bean2 bean2 = new Bean2(); Bean2Long bean2Long = new Bean2Long(); // array1[0] try { BeanUtil.pojo.setProperty(bean2, "map2" + suffix + "[0]", Integer.valueOf(173)); fail(); } catch (BeanException ignore) { } BeanUtil.forced.setProperty(bean2, "map2" + suffix + "[0]", Integer.valueOf(173)); assertNotNull(bean2.map2); assertEquals(Integer.valueOf(173), bean2.map2.get(Integer.valueOf(0))); try { BeanUtil.pojo.setProperty(bean2Long, "map2" + suffix + "[0]", Integer.valueOf(173)); fail(); } catch (BeanException ignore) { } BeanUtil.forced.setProperty(bean2Long, "map2" + suffix + "[0]", Integer.valueOf(173)); assertNotNull(bean2Long.map2); assertEquals(Long.valueOf(173), bean2Long.map2.get(Integer.valueOf(0))); assertEquals(Long.class, bean2Long.map2.get(Integer.valueOf(0)).getClass()); } } }