package org.simpleframework.xml.strategy;
import java.io.StringWriter;
import java.util.ArrayList;
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.Text;
import org.simpleframework.xml.core.Persister;
import org.simpleframework.xml.strategy.CycleStrategy;
import org.simpleframework.xml.ValidationTestCase;
public class CycleTest extends ValidationTestCase {
private static final int ITERATIONS = 1000;
@Root(name="example")
public static class CycleExample {
@ElementList(name="list", type=Entry.class)
private List<Entry> list;
@Element(name="cycle")
private CycleExample cycle;
public CycleExample() {
this.list = new ArrayList();
this.cycle = this;
}
public void add(Entry entry) {
list.add(entry);
}
public Entry get(int index) {
return list.get(index);
}
}
@Root(name="entry")
public static class Entry {
@Attribute(name="key")
private String name;
@Element(name="value")
private String value;
protected Entry() {
super();
}
public Entry(String name, String value) {
this.name = name;
this.value = value;
}
}
private Persister persister;
public void setUp() throws Exception {
persister = new Persister(new CycleStrategy("id", "ref"));
}
public void testCycle() throws Exception {
CycleExample example = new CycleExample();
Entry one = new Entry("1", "one");
Entry two = new Entry("2", "two");
Entry three = new Entry("3", "three");
Entry threeDuplicate = new Entry("3", "three");
example.add(one);
example.add(two);
example.add(three);
example.add(one);
example.add(two);
example.add(threeDuplicate);
assertEquals(example.get(0).value, "one");
assertEquals(example.get(1).value, "two");
assertEquals(example.get(2).value, "three");
assertEquals(example.get(3).value, "one");
assertEquals(example.get(4).value, "two");
assertEquals(example.get(5).value, "three");
assertTrue(example.get(0) == example.get(3));
assertTrue(example.get(1) == example.get(4));
assertFalse(example.get(2) == example.get(5));
StringWriter out = new StringWriter();
persister.write(example, System.out);
persister.write(example, out);
example = persister.read(CycleExample.class, out.toString());
assertEquals(example.get(0).value, "one");
assertEquals(example.get(1).value, "two");
assertEquals(example.get(2).value, "three");
assertEquals(example.get(3).value, "one");
assertEquals(example.get(4).value, "two");
assertTrue(example.get(0) == example.get(3));
assertTrue(example.get(1) == example.get(4));
assertFalse(example.get(2) == example.get(5));
validate(example, persister);
}
public void testMemory() throws Exception {
CycleExample example = new CycleExample();
Entry one = new Entry("1", "one");
Entry two = new Entry("2", "two");
Entry three = new Entry("3", "three");
Entry threeDuplicate = new Entry("3", "three");
example.add(one);
example.add(two);
example.add(three);
example.add(one);
example.add(two);
example.add(threeDuplicate);
StringWriter out = new StringWriter();
persister.write(example, System.out);
persister.write(example, out);
for(int i = 0; i < ITERATIONS; i++) {
persister.write(example, new StringWriter());
}
for(int i = 0; i < ITERATIONS; i++) {
persister.read(CycleExample.class, out.toString());
}
validate(example, persister);
}
}