package com.thoughtworks.acceptance.annotations;

import com.thoughtworks.acceptance.AbstractAcceptanceTest;
import com.thoughtworks.xstream.annotations.Annotations;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import java.util.ArrayList;
import java.util.List;

/**
 * Test for annotations mapping implicit collections.
 *
 * @author Lucio Benfante <a href="mailto:lucio@benfante.com">lucio@benfante.com</a>
 * @version $Revision$
 */
public class ImplicitCollectionTest extends AbstractAcceptanceTest {
            
    public void testSimpleImplicitCollection() {
        String expected = "" +
                "<root>\n" +
                "  <string>one</string>\n" +
                "  <string>two</string>\n" +
                "</root>";
        Annotations.configureAliases(xstream, ImplicitRootOne.class);
        ImplicitRootOne implicitRoot = new ImplicitRootOne();
        implicitRoot.getValues().add("one");
        implicitRoot.getValues().add("two");
        assertBothWays(implicitRoot, expected);
    }

    public void testImplicitCollectionWithItemFieldName() {
        String expected = "" +
                "<root>\n" +
                "  <value>one</value>\n" +
                "  <value>two</value>\n" +
                "</root>";
        Annotations.configureAliases(xstream, ImplicitRootTwo.class);
        ImplicitRootTwo implicitRoot = new ImplicitRootTwo();
        implicitRoot.getValues().add("one");
        implicitRoot.getValues().add("two");
        assertBothWays(implicitRoot, expected);
    }
    
    @XStreamAlias("root")
    public static class ImplicitRootOne {
        @XStreamImplicit()
        private List<String> values = new ArrayList();

        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();

        public List<String> getValues() {
            return values;
        }

        public void setValues(List<String> values) {
            this.values = values;
        }
    }
    
}
