package com.thoughtworks.acceptance.annotations;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.thoughtworks.acceptance.AbstractAcceptanceTest;
import com.thoughtworks.xstream.annotations.Annotations;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamContainedType;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;

/**
 * Simple tests for field annotations
 * 
 */
public class AnnotationsFieldTest extends AbstractAcceptanceTest {
    
	public void testAnnotations()  {
        Annotations.configureAliases(xstream, Person.class);
        List<String> nickNames = new ArrayList<String>();
        nickNames.add("johnny");
        nickNames.add("jack");
        Person person = new Person("john", "doe", 25, nickNames);
        String xml = 
                "<person>\n"+
                "  <first-name>john</first-name>\n" +
                "  <last-name>doe</last-name>\n" +
                "  <age-in-years>25</age-in-years>\n" +
                "  <nick-names class=\"list\">\n" +
                "    <string>johnny</string>\n" +
                "    <string>jack</string>\n" +
                "  </nick-names>\n" +
                "</person>";
        assertBothWays(person, xml);
    }
    
    @XStreamAlias("person")
    public static class Person {
        @XStreamAlias("first-name")
        String firstName;
        @XStreamAlias("last-name")
        String lastName;
        @XStreamAlias("age-in-years")
        int ageInYears;
        @XStreamAlias("nick-names")
        List<String> nickNames;
        
        public Person(String firstName, String lastName, int ageInYears, List<String> nickNames) {
            this.firstName = firstName;
            this.lastName = lastName;
            this.ageInYears = ageInYears;
            this.nickNames = nickNames;
        }
        
        public boolean equals(Object obj) {
            if((obj == null) || !(obj instanceof Person)) return false;
            return toString().equals(obj.toString());
        }
        
        @Override
        public String toString() {
            StringBuilder sb = new StringBuilder();
            sb.append("firstName:").append(firstName)
            .append(",lastName:").append(lastName)
            .append(",ageInYears:").append(ageInYears)
            .append(",nickNames:").append(nickNames);
            return sb.toString();
        }
        
    }

}
