/* * Copyright (C) 2005, 2006 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 16. September 2005 by Mauro Talevi */ package com.thoughtworks.acceptance.annotations; import com.thoughtworks.acceptance.AbstractAcceptanceTest; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamInclude; import java.util.ArrayList; import java.util.List; /** * Tests for annotation detection. * * @author Chung-Onn Cheong * @author Mauro Talevi * @author Guilherme Silveira * @author Jörg Schaible */ public class AnnotationsTest extends AbstractAcceptanceTest { @Override protected XStream createXStream() { XStream xstream = super.createXStream(); xstream.autodetectAnnotations(true); return xstream; } @XStreamAlias("param") public static class ParameterizedContainer { private ParameterizedType<InternalType> type; public ParameterizedContainer() { type = new ParameterizedType<InternalType>(new InternalType()); } } @XStreamAlias("param") public static class DoubleParameterizedContainer { private ArrayList<ArrayList<InternalType>> list; public DoubleParameterizedContainer() { list = new ArrayList<ArrayList<InternalType>>(); list.add(new ArrayList<InternalType>()); list.get(0).add(new InternalType()); } } @XStreamAlias("second") public static class InternalType { @XStreamAlias("aliased") private String original = "value"; @Override public boolean equals(Object obj) { return obj instanceof InternalType ? original.equals(((InternalType)obj).original) : false; } } @XStreamAlias("typeAlias") public static class ParameterizedType<T> { @XStreamAlias("fieldAlias") private T object; public ParameterizedType(T object) { this.object = object; } @Override public boolean equals(Object obj) { return obj instanceof ParameterizedType ? object .equals(((ParameterizedType)obj).object) : false; } } public void testAreDetectedInParameterizedTypes() { String xml = "" + "<param>\n" + " <type>\n" + " <fieldAlias class=\"second\">\n" + " <aliased>value</aliased>\n" + " </fieldAlias>\n" + " </type>\n" + "</param>"; assertBothWays(new ParameterizedContainer(), xml); } public void testAreDetectedInNestedParameterizedTypes() { String xml = "" + "<param>\n" + " <list>\n" + " <list>\n" + " <second>\n" + " <aliased>value</aliased>\n" + " </second>\n" + " </list>\n" + " </list>\n" + "</param>"; assertBothWays(new DoubleParameterizedContainer(), xml); } public void testAreDetectedInArrays() { InternalType[] internalTypes = new InternalType[]{ new InternalType(), new InternalType()}; String xml = "" + "<second-array>\n" + " <second>\n" + " <aliased>value</aliased>\n" + " </second>\n" + " <second>\n" + " <aliased>value</aliased>\n" + " </second>\n" + "</second-array>"; assertBothWays(internalTypes, xml); } public void testAreDetectedInParametrizedArrays() { ParameterizedType<String>[] types = new ParameterizedType[]{ new ParameterizedType<String>("foo"), new ParameterizedType<String>("bar")}; String xml = "" + "<typeAlias-array>\n" + " <typeAlias>\n" + " <fieldAlias class=\"string\">foo</fieldAlias>\n" + " </typeAlias>\n" + " <typeAlias>\n" + " <fieldAlias class=\"string\">bar</fieldAlias>\n" + " </typeAlias>\n" + "</typeAlias-array>"; assertBothWays(types, xml); } public void testAreDetectedInJDKCollection() { List<InternalType> list = new ArrayList<InternalType>(); list.add(new InternalType()); String xml = "" + "<list>\n" + " <second>\n" + " <aliased>value</aliased>\n" + " </second>\n" + "</list>"; assertBothWays(list, xml); } public void testForClassIsDetectedAtDeserialization() { // must preprocess annotations here xstream.processAnnotations(InternalType.class); InternalType internalType = new InternalType(); String xml = "" // + "<second>\n" // + " <aliased>value</aliased>\n" // + "</second>"; assertEquals(internalType, xstream.fromXML(xml)); } @XStreamInclude({InternalType.class}) interface Include { } public void testCanBeIncluded() { // must preprocess annotations from marker interface with inclusion xstream.processAnnotations(Include.class); InternalType internalType = new InternalType(); String xml = "" // + "<second>\n" // + " <aliased>value</aliased>\n" // + "</second>"; assertEquals(internalType, xstream.fromXML(xml)); } }