/* * Copyright (C) 2003, 2004 Joe Walnes. * Copyright (C) 2006, 2007, 2008 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 26. September 2003 by Joe Walnes */ package com.thoughtworks.acceptance; import com.thoughtworks.acceptance.objects.StandardObject; import com.thoughtworks.acceptance.someobjects.WithList; import com.thoughtworks.xstream.converters.ConversionException; import java.util.ArrayList; import java.util.LinkedList; public class ConcreteClassesTest extends AbstractAcceptanceTest { public void testDefaultImplementationOfInterface() { xstream.alias("with-list", WithList.class); WithList withList = new WithList(); withList.things = new ArrayList(); String expected = "<with-list>\n" + " <things/>\n" + "</with-list>"; assertBothWays(withList, expected); } public void testAlternativeImplementationOfInterface() { xstream.alias("with-list", WithList.class); xstream.alias("linked-list", LinkedList.class); WithList withList = new WithList(); withList.things = new LinkedList(); String expected = "<with-list>\n" + " <things class=\"linked-list\"/>\n" + "</with-list>"; assertBothWays(withList, expected); } interface MyInterface { } public static class MyImp1 extends StandardObject implements MyInterface { int x = 1; } public static class MyImp2 extends StandardObject implements MyInterface { int y = 2; } public static class MyHolder extends StandardObject { MyInterface field1; MyInterface field2; } public void testCustomInterfaceCanHaveMultipleImplementations() { xstream.alias("intf", MyInterface.class); xstream.alias("imp1", MyImp1.class); xstream.alias("imp2", MyImp2.class); xstream.alias("h", MyHolder.class); MyHolder in = new MyHolder(); in.field1 = new MyImp1(); in.field2 = new MyImp2(); String expected = "" + "<h>\n" + " <field1 class=\"imp1\">\n" + " <x>1</x>\n" + " </field1>\n" + " <field2 class=\"imp2\">\n" + " <y>2</y>\n" + " </field2>\n" + "</h>"; String xml = xstream.toXML(in); assertEquals(expected, xml); MyHolder out = (MyHolder) xstream.fromXML(xml); assertEquals(MyImp1.class, out.field1.getClass()); assertEquals(MyImp2.class, out.field2.getClass()); assertEquals(2, ((MyImp2) out.field2).y); } public void testUnknownChildMatchingATypeThrowsConversionException() { xstream.alias("h", MyHolder.class); String xml = "" + "<h>\n" + " <int>100</int>\n" + "</h>"; try { xstream.fromXML(xml); fail("Thrown " + ConversionException.class.getName() + " expected"); } catch (final ConversionException e) { // ok } } }