/* * Copyright (C) 2003, 2004, 2005, 2006 Joe Walnes. * Copyright (C) 2006, 2007 XStream Committers. * All rights reserved. * * The software in this package is published under the terms of the BSD * style license a copy of which has been included with this distribution in * the LICENSE.txt file. * * Created on 03. October 2003 by Joe Walnes */ package com.thoughtworks.acceptance; import com.thoughtworks.acceptance.objects.StandardObject; public class ArraysTest extends AbstractAcceptanceTest { public void testStringArray() { String[] array = new String[]{"a", "b", "c"}; String expected = "" + "<string-array>\n" + " <string>a</string>\n" + " <string>b</string>\n" + " <string>c</string>\n" + "</string-array>"; assertBothWays(array, expected); } public void testPrimitiveArray() { int[] array = new int[]{1, 2}; String expected = "" + "<int-array>\n" + " <int>1</int>\n" + " <int>2</int>\n" + "</int-array>"; assertBothWays(array, expected); } public void testBoxedTypeArray() { Integer[] array = new Integer[]{new Integer(1), new Integer(2)}; String expected = "" + "<java.lang.Integer-array>\n" + " <int>1</int>\n" + " <int>2</int>\n" + "</java.lang.Integer-array>"; assertBothWays(array, expected); } public static class X extends StandardObject { String s = "hi"; } public void testCustomObjectArray() { X[] array = new X[]{new X(), new X()}; String expected = "" + "<com.thoughtworks.acceptance.ArraysTest_-X-array>\n" + " <com.thoughtworks.acceptance.ArraysTest_-X>\n" + " <s>hi</s>\n" + " </com.thoughtworks.acceptance.ArraysTest_-X>\n" + " <com.thoughtworks.acceptance.ArraysTest_-X>\n" + " <s>hi</s>\n" + " </com.thoughtworks.acceptance.ArraysTest_-X>\n" + "</com.thoughtworks.acceptance.ArraysTest_-X-array>"; assertBothWays(array, expected); } public void testArrayOfMixedTypes() { Object[] array = new Number[]{new Long(2), new Integer(3)}; String expected = "" + "<number-array>\n" + " <long>2</long>\n" + " <int>3</int>\n" + "</number-array>"; assertBothWays(array, expected); } public void testEmptyArray() { int[] array = new int[]{}; String expected = "<int-array/>"; assertBothWays(array, expected); } public void testUninitializedArray() { String[] array = new String[4]; array[0] = "zero"; array[2] = "two"; String expected = "" + "<string-array>\n" + " <string>zero</string>\n" + " <null/>\n" + " <string>two</string>\n" + " <null/>\n" + "</string-array>"; assertBothWays(array, expected); } public void testArrayInCustomObject() { ObjWithArray objWithArray = new ObjWithArray(); objWithArray.strings = new String[]{"hi", "bye"}; xstream.alias("owa", ObjWithArray.class); String expected = "" + "<owa>\n" + " <strings>\n" + " <string>hi</string>\n" + " <string>bye</string>\n" + " </strings>\n" + "</owa>"; assertBothWays(objWithArray, expected); } public void testNullArrayInCustomObject() { ObjWithArray objWithArray = new ObjWithArray(); xstream.alias("owa", ObjWithArray.class); String expected = "<owa/>"; assertBothWays(objWithArray, expected); } public static class ObjWithArray extends StandardObject { String[] strings; } public void testDeserializingObjectWhichContainsAPrimitiveLongArray() { String xml = "<owla>" + " <bits class=\"long-array\">" + " <long>0</long>" + " <long>1</long>" + " <long>2</long>" + " </bits>" + "</owla>"; xstream.alias("owla", ObjectWithLongArray.class); ObjectWithLongArray o = (ObjectWithLongArray) xstream.fromXML(xml); assertEquals(o.bits[0], 0); assertEquals(o.bits[1], 1); assertEquals(o.bits[2], 2); } public static class ObjectWithLongArray { long[] bits; } public void testMultidimensionalArray() { int[][] array = new int[3][2]; array[0][0] = 2; array[0][1] = 4; array[1][0] = 8; array[1][1] = 16; array[2] = new int[3]; array[2][0] = 33; array[2][1] = 66; array[2][2] = 99; String expectedXml = "" + "<int-array-array>\n" + " <int-array>\n" + " <int>2</int>\n" + " <int>4</int>\n" + " </int-array>\n" + " <int-array>\n" + " <int>8</int>\n" + " <int>16</int>\n" + " </int-array>\n" + " <int-array>\n" + " <int>33</int>\n" + " <int>66</int>\n" + " <int>99</int>\n" + " </int-array>\n" + "</int-array-array>"; String actualXml = xstream.toXML(array); assertEquals(expectedXml, actualXml); int[][] result = (int[][]) xstream.fromXML(actualXml); assertEquals(2, result[0][0]); assertEquals(4, result[0][1]); assertEquals(8, result[1][0]); assertEquals(16, result[1][1]); assertEquals(99, result[2][2]); assertEquals(3, result.length); assertEquals(2, result[0].length); assertEquals(2, result[1].length); assertEquals(3, result[2].length); } public static class Thing { } public static class SpecialThing extends Thing { } public void testMultidimensionalArrayOfMixedTypes() { xstream.alias("thing", Thing.class); xstream.alias("special-thing", SpecialThing.class); Object[][] array = new Object[2][2]; array[0][0] = new Object(); array[0][1] = "a string"; array[1] = new Thing[2]; array[1][0] = new Thing(); array[1][1] = new SpecialThing(); String expectedXml = "" + "<object-array-array>\n" + " <object-array>\n" + " <object/>\n" + " <string>a string</string>\n" + " </object-array>\n" + " <thing-array>\n" + " <thing/>\n" + " <special-thing/>\n" + " </thing-array>\n" + "</object-array-array>"; String actualXml = xstream.toXML(array); assertEquals(expectedXml, actualXml); Object[][] result = (Object[][]) xstream.fromXML(actualXml); assertEquals(Object.class, result[0][0].getClass()); assertEquals("a string", result[0][1]); assertEquals(Thing.class, result[1][0].getClass()); assertEquals(SpecialThing.class, result[1][1].getClass()); } public static class NoOneLikesMe extends StandardObject { private int name; public NoOneLikesMe(int name) { this.name = name; } } public void testHandlesArrayClassesThatHaveNotYetBeenLoaded() { // Catch weirdness in classloader. // Resolved by using Class.forName(x, false, classLoader), instead of classLoader.loadClass(x); String xml = "" + "<com.thoughtworks.acceptance.ArraysTest_-NoOneLikesMe-array>\n" + " <com.thoughtworks.acceptance.ArraysTest_-NoOneLikesMe>\n" + " <name>99</name>\n" + " </com.thoughtworks.acceptance.ArraysTest_-NoOneLikesMe>\n" + "</com.thoughtworks.acceptance.ArraysTest_-NoOneLikesMe-array>"; NoOneLikesMe[] result = (NoOneLikesMe[]) xstream.fromXML(xml); assertEquals(1, result.length); assertEquals(99, result[0].name); } }