1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.yaml.snakeyaml.issues.issue11;
18
19 import java.io.IOException;
20 import java.util.Map;
21 import java.util.TreeMap;
22
23 import junit.framework.TestCase;
24
25 import org.yaml.snakeyaml.Yaml;
26 import org.yaml.snakeyaml.constructor.AbstractConstruct;
27 import org.yaml.snakeyaml.constructor.Constructor;
28 import org.yaml.snakeyaml.nodes.Node;
29 import org.yaml.snakeyaml.nodes.ScalarNode;
30 import org.yaml.snakeyaml.nodes.Tag;
31 import org.yaml.snakeyaml.representer.Represent;
32 import org.yaml.snakeyaml.representer.Representer;
33
34 public class YamlMapTest extends TestCase {
35 public void testYaml() throws IOException {
36 Yaml yaml = new Yaml(new ExtendedConstructor(), new ExtendedRepresenter());
37 String output = yaml.dump(new Custom(123));
38
39 Custom o = (Custom) yaml.load(output);
40 assertEquals("123", o.getStr());
41 }
42
43 @SuppressWarnings("unchecked")
44 public void testYamlMap() throws IOException {
45 Map<String, Object> data = new TreeMap<String, Object>();
46 data.put("customTag", new Custom(123));
47
48 Yaml yaml = new Yaml(new ExtendedConstructor(), new ExtendedRepresenter());
49 String output = yaml.dump(data);
50
51 Object o = yaml.load(output);
52
53 assertTrue(o instanceof Map);
54 Map<String, Object> m = (Map<String, Object>) o;
55 assertTrue(m.get("customTag") instanceof Custom);
56 }
57
58 @SuppressWarnings("unchecked")
59 public void testYamlMapBean() throws IOException {
60 Map<String, Object> data = new TreeMap<String, Object>();
61 data.put("knownClass", new Wrapper("test", new Custom(456)));
62
63 Yaml yaml = new Yaml(new ExtendedConstructor(), new ExtendedRepresenter());
64 String output = yaml.dump(data);
65
66 Object o = yaml.load(output);
67
68 assertTrue(o instanceof Map);
69 Map<String, Object> m = (Map<String, Object>) o;
70 assertEquals(Wrapper.class, m.get("knownClass").getClass());
71 }
72
73 public static class Wrapper {
74 private String a;
75 private Custom b;
76
77 public Wrapper(String s, Custom bb) {
78 a = s;
79 b = bb;
80 }
81
82 public Wrapper() {
83 }
84
85 public String getA() {
86 return a;
87 }
88
89 public void setA(String s) {
90 a = s;
91 }
92
93 public Custom getB() {
94 return b;
95 }
96
97 public void setB(Custom bb) {
98 b = bb;
99 }
100 }
101
102 public static class Custom {
103 final private String str;
104
105 public Custom(Integer i) {
106 str = i.toString();
107 }
108
109 public Custom(Custom c) {
110 str = c.str;
111 }
112
113 public String toString() {
114 return str;
115 }
116
117 public String getStr() {
118 return str;
119 }
120 }
121
122 public static class ExtendedRepresenter extends Representer {
123 public ExtendedRepresenter() {
124 this.representers.put(Custom.class, new RepresentCustom());
125 }
126
127 private class RepresentCustom implements Represent {
128 public Node representData(Object data) {
129 return representScalar(new Tag("!Custom"), ((Custom) data).toString());
130 }
131 }
132 }
133
134 public static class ExtendedConstructor extends Constructor {
135 public ExtendedConstructor() {
136 this.yamlConstructors.put(new Tag("!Custom"), new ConstructCustom());
137 }
138
139 private class ConstructCustom extends AbstractConstruct {
140 public Object construct(Node node) {
141 String str = (String) constructScalar((ScalarNode) node);
142 return new Custom(new Integer(str));
143 }
144
145 }
146 }
147 }