1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.pyyaml;
17
18 import java.util.ArrayList;
19 import java.util.HashMap;
20 import java.util.HashSet;
21 import java.util.List;
22 import java.util.Map;
23 import java.util.Set;
24 import java.util.TreeMap;
25
26 import junit.framework.TestCase;
27
28 import org.yaml.snakeyaml.Yaml;
29 import org.yaml.snakeyaml.constructor.SafeConstructor;
30
31 public class PyRecursiveTest extends TestCase {
32
33 @SuppressWarnings("unchecked")
34 public void testDict() {
35 Map<AnInstance, AnInstance> value = new HashMap<AnInstance, AnInstance>();
36 AnInstance instance = new AnInstance(value, value);
37 value.put(instance, instance);
38 Yaml yaml = new Yaml();
39 String output1 = yaml.dump(value);
40 assertTrue(output1.contains("!!org.pyyaml.AnInstance"));
41 assertTrue(output1.contains("&id001"));
42 assertTrue(output1.contains("&id002"));
43 assertTrue(output1.contains("*id001"));
44 assertTrue(output1.contains("*id002"));
45 assertTrue(output1.contains("foo"));
46 assertTrue(output1.contains("bar"));
47 Map<AnInstance, AnInstance> value2 = (Map<AnInstance, AnInstance>) yaml.load(output1);
48 assertEquals(value.size(), value2.size());
49 for (AnInstance tmpInstance : value2.values()) {
50 assertSame(tmpInstance.getBar(), tmpInstance.getFoo());
51 assertSame(tmpInstance.getBar(), value2);
52 assertSame(tmpInstance, value2.get(tmpInstance));
53 }
54 }
55
56 @SuppressWarnings({ "unchecked", "rawtypes" })
57 public void testDictSafeConstructor() {
58 Map value = new TreeMap();
59 value.put("abc", "www");
60 value.put("qwerty", value);
61 Yaml yaml = new Yaml(new SafeConstructor());
62 String output1 = yaml.dump(value);
63 assertEquals("&id001\nabc: www\nqwerty: *id001\n", output1);
64 Map value2 = (Map) yaml.load(output1);
65 assertEquals(2, value2.size());
66 assertEquals("www", value2.get("abc"));
67 assertTrue(value2.get("qwerty") instanceof Map);
68 Map value3 = (Map) value2.get("qwerty");
69 assertTrue(value3.get("qwerty") instanceof Map);
70 }
71
72 @SuppressWarnings({ "unchecked", "rawtypes" })
73 public void testList() {
74 List value = new ArrayList();
75 value.add(value);
76 value.add("test");
77 value.add(new Integer(1));
78
79 Yaml yaml = new Yaml();
80 String output1 = yaml.dump(value);
81 assertEquals("&id001\n- *id001\n- test\n- 1\n", output1);
82 List value2 = (List) yaml.load(output1);
83 assertEquals(3, value2.size());
84 assertEquals(value.size(), value2.size());
85 assertSame(value2, value2.get(0));
86
87
88
89 value.remove(0);
90 value2.remove(0);
91 assertEquals(value, value2);
92 }
93
94 @SuppressWarnings({ "unchecked", "rawtypes" })
95 public void testListSafeConstructor() {
96 List value = new ArrayList();
97 value.add(value);
98 value.add("test");
99 value.add(new Integer(1));
100
101 Yaml yaml = new Yaml(new SafeConstructor());
102 String output1 = yaml.dump(value);
103 assertEquals("&id001\n- *id001\n- test\n- 1\n", output1);
104 List value2 = (List) yaml.load(output1);
105 assertEquals(3, value2.size());
106 assertEquals(value.size(), value2.size());
107 assertSame(value2, value2.get(0));
108
109
110
111 value.remove(0);
112 value2.remove(0);
113 assertEquals(value, value2);
114 }
115
116 @SuppressWarnings({ "unchecked", "rawtypes" })
117 public void testSet() {
118 Set value = new HashSet();
119 value.add(new AnInstance(value, value));
120 Yaml yaml = new Yaml();
121 String output1 = yaml.dump(value);
122 Set<AnInstance> value2 = (Set<AnInstance>) yaml.load(output1);
123
124 assertEquals(value.size(), value2.size());
125 for (AnInstance tmpInstance : value2) {
126 assertSame(tmpInstance.getBar(), tmpInstance.getFoo());
127 assertSame(tmpInstance.getBar(), value2);
128 }
129 }
130
131 public void testSet2() {
132 Set<Object> set = new HashSet<Object>(3);
133 set.add("aaa");
134 set.add(111);
135 set.add(set);
136 Yaml yaml = new Yaml();
137 try {
138 yaml.dump(set);
139 fail("Java does not allow a recursive set to be a key for a map.");
140 } catch (StackOverflowError e) {
141
142 }
143 }
144 }