package br.com.caelum.iogi.collections; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import java.util.Arrays; import org.junit.Test; import br.com.caelum.iogi.Iogi; import br.com.caelum.iogi.MixedObjectAndArray; import br.com.caelum.iogi.fixtures.OneIntegerPrimitive; import br.com.caelum.iogi.fixtures.TwoArguments; import br.com.caelum.iogi.parameters.Parameter; import br.com.caelum.iogi.parameters.Parameters; import br.com.caelum.iogi.reflection.Target; import br.com.caelum.iogi.util.DefaultLocaleProvider; import br.com.caelum.iogi.util.NullDependencyProvider; public class ArrayInstantiationTests { private final Iogi iogi = new Iogi(new NullDependencyProvider(), new DefaultLocaleProvider()); @Test public void canInstantiateAnArrayOfStrings() throws Exception { final Target<String[]> target = Target.create(String[].class, "arr"); final String[] array = iogi.instantiate(target, new Parameter("arr[0]", "one"), new Parameter("arr[1]", "two")); assertArrayEquals(new String[] {"one", "two"}, array); } @Test public void canInstantiateAnArrayOfIntegerWrappers() throws Exception { final Target<Integer[]> target = Target.create(Integer[].class, "arr"); final Integer[] array = iogi.instantiate(target, new Parameter("arr[0]", "99"), new Parameter("arr[1]", "98")); assertArrayEquals(new Integer[] {99, 98}, array); } @Test public void canInstantiateAnArrayOfPrimitiveIntegers() throws Exception { final Target<int[]> target = Target.create(int[].class, "arr"); final int[] array = iogi.instantiate(target, new Parameter("arr[0]", "99"), new Parameter("arr[1]", "98")); assertArrayEquals(new int[] {99, 98}, array); } @Test public void canInstantiateAnArrayOfObjects() throws Exception { final Target<OneIntegerPrimitive[]> target = Target.create(OneIntegerPrimitive[].class, "arr"); final OneIntegerPrimitive[] array = iogi.instantiate(target, new Parameter("arr[0].anInteger", "99"), new Parameter("arr[1].anInteger", "98")); assertEquals(99, array[0].getAnInteger()); assertEquals(98, array[1].getAnInteger()); } @Test public void willInstantiateAnZeroLengthArrayIfGivenNoParameters() { final Target<String[]> target = Target.create(String[].class, "arr"); final String[] array = iogi.instantiate(target); assertEquals(0, array.length); } @Test public void canInstantiateAnArrayOfObjectsWithMoreThanOneConstructorParameter() throws Exception { final Target<TwoArguments[]> target = Target.create(TwoArguments[].class, "arr"); final TwoArguments[] array = iogi.instantiate(target, new Parameter("arr[0].one", "10"), new Parameter("arr[0].two", "11"), new Parameter("arr[1].one", "20"), new Parameter("arr[1].two", "21")); assertEquals(10, array[0].getOne()); assertEquals(11, array[0].getTwo()); assertEquals(20, array[1].getOne()); assertEquals(21, array[1].getTwo()); } @Test public void canMixArraysWithNonArraysAsParametersForAConstructor() throws Exception { final Target<MixedObjectAndArray> target = Target.create(MixedObjectAndArray.class, "root"); final MixedObjectAndArray rootObject = iogi.instantiate(target, new Parameter("root.array[0].someString", "10"), new Parameter("root.array[1].someString", "20"), new Parameter("root.object.someString", "00")); assertEquals("00", rootObject.getObject().getSomeString()); assertEquals("10", rootObject.getArray()[0].getSomeString()); assertEquals("20", rootObject.getArray()[1].getSomeString()); } @Test public void canInstantiateMoreThanOneArrayFromTheSameParameterList() throws Exception { final Target<String[]> firstArrayTarget = Target.create(String[].class, "arr1"); final Target<String[]> secondArrayTarget = Target.create(String[].class, "arr2"); final Parameters parameters = new Parameters(Arrays.asList( new Parameter("arr1[0]", "10"), new Parameter("arr1[1]", "11"), new Parameter("arr2[0]", "20"), new Parameter("arr2[1]", "21"))); final String[] firstArray = iogi.instantiate(firstArrayTarget, parameters); final String[] secondArray = iogi.instantiate(secondArrayTarget, parameters); assertArrayEquals(new String[] {"10", "11"}, firstArray); assertArrayEquals(new String[] {"20", "21"}, secondArray); } @Test public void willCreateAnArrayWithLengthEqualToTheNumberOfSpecifiedParameters() { final Target<OneIntegerPrimitive[]> target = Target.create(OneIntegerPrimitive[].class, "arr"); final Parameter at0 = new Parameter("arr[0].anInteger", "1"); final Parameter at16 = new Parameter("arr[16].anInteger", "2"); final OneIntegerPrimitive[] array = iogi.instantiate(target, at0, at16); assertEquals(2, array.length); } @Test public void orderOfElementsInTheArrayCorrespondsToTheOrderOfTheIndexes() { final Target<OneIntegerPrimitive[]> target = Target.create(OneIntegerPrimitive[].class, "arr"); final Parameter at16 = new Parameter("arr[16].anInteger", "3"); final Parameter at0 = new Parameter("arr[0].anInteger", "1"); final Parameter at5 = new Parameter("arr[5].anInteger", "2"); final OneIntegerPrimitive[] array = iogi.instantiate(target, at16, at0, at5); assertEquals(1, array[0].getAnInteger()); assertEquals(2, array[1].getAnInteger()); assertEquals(3, array[2].getAnInteger()); } }