package org.simpleframework.xml.strategy;
import java.io.StringWriter;
import java.util.List;
import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;
import org.simpleframework.xml.core.Persister;
import org.simpleframework.xml.strategy.CycleStrategy;
import org.simpleframework.xml.ValidationTestCase;
public class ListCycleTest extends ValidationTestCase {
private static final String SOURCE =
"<?xml version=\"1.0\"?>\n"+
"<root id='main'>\n"+
" <one length='5' id='numbers'>\n\r"+
" <text value='entry one'/> \n\r"+
" <text value='entry two'/> \n\r"+
" <text value='entry three'/> \n\r"+
" <text value='entry four'/> \n\r"+
" <text value='entry five'/> \n\r"+
" </one>\n\r"+
" <two ref='numbers'/>\n"+
" <three length='3'>\n" +
" <text value='tom'/> \n\r"+
" <text value='dick'/> \n\r"+
" <text value='harry'/> \n\r"+
" </three>\n"+
" <example ref='main'/>\n"+
"</root>";
private static final String NESTED =
"<?xml version=\"1.0\"?>\n"+
"<root id='main'>\n"+
" <list id='list'>\n" +
" <value> \n\r"+
" <list ref='list'/>\n"+
" </value>\r\n"+
" </list>\n"+
"</root>";
private static final String INLINE_LIST =
"<?xml version=\"1.0\"?>\n"+
"<inlineListExample id='main'>\n"+
" <text value='entry one'/> \n\r"+
" <text value='entry two'/> \n\r"+
" <text value='entry three'/> \n\r"+
" <text value='entry four'/> \n\r"+
" <text value='entry five'/> \n\r"+
" <example ref='main'/>\n"+
"</inlineListExample>";
private static final String INLINE_PRIMITIVE_LIST =
"<?xml version=\"1.0\"?>\n"+
"<inlinePrimitiveListExample id='main'>\n"+
" <string>entry one</string> \n\r"+
" <string>entry two</string> \n\r"+
" <string>entry three</string> \n\r"+
" <string>entry four</string> \n\r"+
" <string>entry five</string> \n\r"+
" <example ref='main'/>\n"+
"</inlinePrimitiveListExample>";
@Root(name="root")
private static class ListExample {
@ElementList(name="one", type=Entry.class)
public List<Entry> one;
@ElementList(name="two", type=Entry.class)
public List<Entry> two;
@ElementList(name="three", type=Entry.class)
public List<Entry> three;
@Element(name="example")
public ListExample example;
}
@Root
private static class InlineListExample {
@ElementList(inline=true)
public List<Entry> list;
@Element
public InlineListExample example;
}
@Root
private static class InlinePrimitiveListExample {
@ElementList(inline=true, data=true)
public List<String> list;
@Element
public InlinePrimitiveListExample example;
}
@Root(name="text")
private static class Entry {
@Attribute(name="value")
public String value;
public Entry() {
super();
}
public Entry(String value) {
this.value = value;
}
}
@Root(name="root")
private static class NestedListExample {
@ElementList(name="list", type=Value.class)
public List<Value> list;
}
@Root(name="value")
private static class Value {
@ElementList(name="list", type=Value.class, required=false)
private List<Value> list;
}
private Persister persister;
public void setUp() throws Exception {
persister = new Persister(new CycleStrategy("id", "ref"));
}
public void testCycle() throws Exception {
ListExample example = persister.read(ListExample.class, SOURCE);
assertEquals(example.one.size(), 5);
assertEquals(example.one.get(0).value, "entry one");
assertEquals(example.one.get(1).value, "entry two");
assertEquals(example.one.get(2).value, "entry three");
assertEquals(example.one.get(3).value, "entry four");
assertEquals(example.one.get(4).value, "entry five");
assertEquals(example.two.size(), 5);
assertEquals(example.two.get(0).value, "entry one");
assertEquals(example.two.get(1).value, "entry two");
assertEquals(example.two.get(2).value, "entry three");
assertEquals(example.two.get(3).value, "entry four");
assertEquals(example.two.get(4).value, "entry five");
assertEquals(example.three.size(), 3);
assertEquals(example.three.get(0).value, "tom");
assertEquals(example.three.get(1).value, "dick");
assertEquals(example.three.get(2).value, "harry");
assertTrue(example.one == example.two);
assertTrue(example == example.example);
StringWriter out = new StringWriter();
persister.write(example, out);
example = persister.read(ListExample.class, SOURCE);
assertEquals(example.one.size(), 5);
assertEquals(example.one.get(0).value, "entry one");
assertEquals(example.one.get(1).value, "entry two");
assertEquals(example.one.get(2).value, "entry three");
assertEquals(example.one.get(3).value, "entry four");
assertEquals(example.one.get(4).value, "entry five");
assertEquals(example.two.size(), 5);
assertEquals(example.two.get(0).value, "entry one");
assertEquals(example.two.get(1).value, "entry two");
assertEquals(example.two.get(2).value, "entry three");
assertEquals(example.two.get(3).value, "entry four");
assertEquals(example.two.get(4).value, "entry five");
assertEquals(example.three.size(), 3);
assertEquals(example.three.get(0).value, "tom");
assertEquals(example.three.get(1).value, "dick");
assertEquals(example.three.get(2).value, "harry");
assertTrue(example.one == example.two);
assertTrue(example == example.example);
validate(example, persister);
}
public void testInlineList() throws Exception {
InlineListExample example = persister.read(InlineListExample.class, INLINE_LIST);
assertEquals(example.list.size(), 5);
assertEquals(example.list.get(0).value, "entry one");
assertEquals(example.list.get(1).value, "entry two");
assertEquals(example.list.get(2).value, "entry three");
assertEquals(example.list.get(3).value, "entry four");
assertEquals(example.list.get(4).value, "entry five");
assertTrue(example == example.example);
StringWriter out = new StringWriter();
persister.write(example, out);
example = persister.read(InlineListExample.class, INLINE_LIST);
assertEquals(example.list.size(), 5);
assertEquals(example.list.get(0).value, "entry one");
assertEquals(example.list.get(1).value, "entry two");
assertEquals(example.list.get(2).value, "entry three");
assertEquals(example.list.get(3).value, "entry four");
assertEquals(example.list.get(4).value, "entry five");
assertTrue(example == example.example);
validate(example, persister);
}
public void testInlinePrimitiveList() throws Exception {
InlinePrimitiveListExample example = persister.read(InlinePrimitiveListExample.class, INLINE_PRIMITIVE_LIST);
assertEquals(example.list.size(), 5);
assertEquals(example.list.get(0), "entry one");
assertEquals(example.list.get(1), "entry two");
assertEquals(example.list.get(2), "entry three");
assertEquals(example.list.get(3), "entry four");
assertEquals(example.list.get(4), "entry five");
assertTrue(example == example.example);
StringWriter out = new StringWriter();
persister.write(example, out);
example = persister.read(InlinePrimitiveListExample.class, INLINE_PRIMITIVE_LIST);
assertEquals(example.list.size(), 5);
assertEquals(example.list.get(0), "entry one");
assertEquals(example.list.get(1), "entry two");
assertEquals(example.list.get(2), "entry three");
assertEquals(example.list.get(3), "entry four");
assertEquals(example.list.get(4), "entry five");
assertTrue(example == example.example);
validate(example, persister);
}
public void testNestedExample() throws Exception {
NestedListExample root = persister.read(NestedListExample.class, NESTED);
assertEquals(root.list.size(), 1);
assertTrue(root.list.get(0).list == root.list);
validate(root, persister);
}
}