/* * 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 01. December 2006 by Joerg Schaible */ package com.thoughtworks.acceptance.annotations; import com.thoughtworks.acceptance.AbstractAcceptanceTest; import com.thoughtworks.xstream.InitializationException; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import com.thoughtworks.xstream.annotations.XStreamImplicit; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Test for annotations mapping implicit collections. * * @author Lucio Benfante * @author Jörg Schaible */ public class ImplicitCollectionTest extends AbstractAcceptanceTest { @Override protected XStream createXStream() { XStream xstream = super.createXStream(); xstream.autodetectAnnotations(true); return xstream; } public void testAnnotation() { String expected = "" + "<root>\n" + " <string>one</string>\n" + " <string>two</string>\n" + "</root>"; ImplicitRootOne implicitRoot = new ImplicitRootOne(); implicitRoot.getValues().add("one"); implicitRoot.getValues().add("two"); assertBothWays(implicitRoot, expected); } public void testAnnotationWithItemFieldName() { String expected = "" + "<root>\n" + " <value>one</value>\n" + " <value>two</value>\n" + "</root>"; ImplicitRootTwo implicitRoot = new ImplicitRootTwo(); implicitRoot.getValues().add("one"); implicitRoot.getValues().add("two"); assertBothWays(implicitRoot, expected); } public void testAnnotationFailsForInvalidFieldType() { try { xstream.processAnnotations(InvalidImplicitRoot.class); fail("Thrown " + InitializationException.class.getName() + " expected"); } catch (final InitializationException e) { assertTrue(e.getMessage().indexOf("\"value\"") > 0); } } @XStreamAlias("root") public static class ImplicitRootOne { @XStreamImplicit() private List<String> values = new ArrayList<String>(); public List<String> getValues() { return values; } public void setValues(List<String> values) { this.values = values; } } @XStreamAlias("root") public static class ImplicitRootTwo { @XStreamImplicit(itemFieldName = "value") private List<String> values = new ArrayList<String>(); public List<String> getValues() { return values; } public void setValues(List<String> values) { this.values = values; } } @XStreamAlias("root") public static class InvalidImplicitRoot { @XStreamImplicit(itemFieldName = "outch") private String value; public String getValue() { return value; } public void setValue(String value) { this.value = value; } } @XStreamAlias("implicit") public static class ImplicitParameterizedType { @XStreamImplicit(itemFieldName = "line") private ArrayList<ArrayList<Point>> signatureLines; } @XStreamAlias("point") public static class Point { @XStreamAsAttribute private int x; @XStreamAsAttribute private int y; public Point(int x, int y) { this.x = x; this.y = y; } } public void testAnnotationHandlesParameterizedTypes() { String xml = "" + "<implicit>\n" + " <line>\n" + " <point x=\"33\" y=\"11\"/>\n" + " </line>\n" + "</implicit>"; ImplicitParameterizedType root = new ImplicitParameterizedType(); root.signatureLines = new ArrayList<ArrayList<Point>>(); root.signatureLines.add(new ArrayList<Point>()); root.signatureLines.get(0).add(new Point(33, 11)); assertBothWays(root, xml); } @XStreamAlias("type") public static class ParametrizedTypeIsInterface { @XStreamImplicit() private ArrayList<Map> list = new ArrayList<Map>(); } public void testWorksForTypesThatAreInterfaces() { ParametrizedTypeIsInterface type = new ParametrizedTypeIsInterface(); type.list = new ArrayList<Map>(); type.list.add(new HashMap()); String xml = "" // + "<type>\n" // + " <map/>\n" // + "</type>"; assertBothWays(type, xml); } @XStreamAlias("untyped") private static class Untyped { @XStreamImplicit private List list = new ArrayList(); public Untyped() { list.add("1"); } } public void testCanHandleUntypedCollections() { Untyped untyped = new Untyped(); String xml = "" // + "<untyped>\n" // + " <string>1</string>\n" // + "</untyped>"; assertBothWays(untyped, xml); } }