1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.yaml.snakeyaml;
18
19 import java.sql.Timestamp;
20 import java.util.Date;
21
22 import junit.framework.TestCase;
23
24 import org.yaml.snakeyaml.nodes.Node;
25 import org.yaml.snakeyaml.nodes.Tag;
26 import org.yaml.snakeyaml.representer.Represent;
27 import org.yaml.snakeyaml.representer.Representer;
28
29 public class JavaBeanWithNullValuesTest extends TestCase {
30 private Yaml loader;
31
32 @Override
33 protected void setUp() throws Exception {
34 loader = new Yaml();
35 }
36
37 public void testNotNull() throws Exception {
38 String dumpStr = dumpJavaBeanWithNullValues(false);
39
40 Yaml yaml = new Yaml();
41 JavaBeanWithNullValues parsed = (JavaBeanWithNullValues) yaml.load(dumpStr);
42 assertNotNull(parsed.getString());
43 assertNotNull(parsed.getBoolean1());
44 assertNotNull(parsed.getDate());
45 assertNotNull(parsed.getDouble1());
46 assertNotNull(parsed.getFloat1());
47 assertNotNull(parsed.getInteger());
48 assertNotNull(parsed.getLong1());
49 assertNotNull(parsed.getSqlDate());
50 assertNotNull(parsed.getTimestamp());
51
52 parsed = loader.loadAs(dumpStr, JavaBeanWithNullValues.class);
53 assertNotNull(parsed.getString());
54 assertNotNull(parsed.getBoolean1());
55 assertNotNull(parsed.getDate());
56 assertNotNull(parsed.getDouble1());
57 assertNotNull(parsed.getFloat1());
58 assertNotNull(parsed.getInteger());
59 assertNotNull(parsed.getLong1());
60 assertNotNull(parsed.getSqlDate());
61 assertNotNull(parsed.getTimestamp());
62 }
63
64 public void testNull() throws Exception {
65 String dumpStr = dumpJavaBeanWithNullValues(true);
66 Yaml yaml = new Yaml();
67 JavaBeanWithNullValues parsed = (JavaBeanWithNullValues) yaml.load(dumpStr);
68 assertNull(parsed.getString());
69
70 parsed = loader.loadAs(dumpStr, JavaBeanWithNullValues.class);
71 assertNull(parsed.getString());
72 }
73
74 public void testNullStringAndBoolean() throws Exception {
75 JavaBeanWithNullValues javaBeanWithNullValues = new JavaBeanWithNullValues();
76 DumperOptions options = new DumperOptions();
77 options.setDefaultScalarStyle(DumperOptions.ScalarStyle.DOUBLE_QUOTED);
78 options.setExplicitStart(true);
79 options.setExplicitEnd(true);
80 Yaml yaml = new Yaml(new CustomRepresenter(), options);
81 javaBeanWithNullValues.setBoolean1(null);
82 javaBeanWithNullValues.setDate(new Date(System.currentTimeMillis()));
83 javaBeanWithNullValues.setDouble1(1d);
84 javaBeanWithNullValues.setFloat1(1f);
85 javaBeanWithNullValues.setInteger(1);
86 javaBeanWithNullValues.setLong1(1l);
87 javaBeanWithNullValues.setSqlDate(new java.sql.Date(System.currentTimeMillis()));
88 javaBeanWithNullValues.setString(null);
89 javaBeanWithNullValues.setTimestamp(new Timestamp(System.currentTimeMillis()));
90
91 String dumpStr = yaml.dump(javaBeanWithNullValues);
92
93 yaml = new Yaml();
94 JavaBeanWithNullValues parsed = (JavaBeanWithNullValues) yaml.load(dumpStr);
95 assertNull(" expect null, got " + parsed.getBoolean1(), parsed.getBoolean1());
96 assertNull(" expect null, got " + parsed.getString(), parsed.getString());
97 }
98
99 public void testNoRootTag() throws Exception {
100 JavaBeanWithNullValues javaBeanWithNullValues = new JavaBeanWithNullValues();
101 DumperOptions options = new DumperOptions();
102 options.setDefaultScalarStyle(DumperOptions.ScalarStyle.DOUBLE_QUOTED);
103 options.setExplicitStart(true);
104 options.setExplicitEnd(true);
105 Yaml yaml = new Yaml(new CustomRepresenter(), options);
106 javaBeanWithNullValues.setBoolean1(null);
107 javaBeanWithNullValues.setDate(new Date(System.currentTimeMillis()));
108 javaBeanWithNullValues.setDouble1(1d);
109 javaBeanWithNullValues.setFloat1(1f);
110 javaBeanWithNullValues.setInteger(1);
111 javaBeanWithNullValues.setLong1(1l);
112 javaBeanWithNullValues.setSqlDate(new java.sql.Date(System.currentTimeMillis()));
113 javaBeanWithNullValues.setString(null);
114 javaBeanWithNullValues.setTimestamp(new Timestamp(System.currentTimeMillis()));
115
116 String dumpStr = yaml.dumpAsMap(javaBeanWithNullValues);
117
118 assertFalse("No explicit root tag must be used.",
119 dumpStr.contains("JavaBeanWithNullValues"));
120 yaml = new Yaml(new CustomRepresenter(), options);
121 JavaBeanWithNullValues parsed = loader.loadAs(dumpStr, JavaBeanWithNullValues.class);
122 assertNull(" expect null, got " + parsed.getBoolean1(), parsed.getBoolean1());
123 assertNull(" expect null, got " + parsed.getString(), parsed.getString());
124 assertEquals(1d, parsed.getDouble1());
125 assertEquals(1f, parsed.getFloat1());
126 assertEquals(new Integer(1), parsed.getInteger());
127 assertEquals(new Long(1l), parsed.getLong1());
128 }
129
130 private String dumpJavaBeanWithNullValues(boolean nullValues) {
131 JavaBeanWithNullValues javaBeanWithNullValues = new JavaBeanWithNullValues();
132 DumperOptions options = new DumperOptions();
133 options.setDefaultScalarStyle(DumperOptions.ScalarStyle.DOUBLE_QUOTED);
134 options.setExplicitStart(true);
135 options.setExplicitEnd(true);
136 Yaml yaml = new Yaml(new CustomRepresenter(), options);
137 if (nullValues) {
138 return yaml.dump(javaBeanWithNullValues);
139 }
140 javaBeanWithNullValues.setBoolean1(false);
141 javaBeanWithNullValues.setDate(new Date(System.currentTimeMillis()));
142 javaBeanWithNullValues.setDouble1(1d);
143 javaBeanWithNullValues.setFloat1(1f);
144 javaBeanWithNullValues.setInteger(1);
145 javaBeanWithNullValues.setLong1(1l);
146 javaBeanWithNullValues.setSqlDate(new java.sql.Date(System.currentTimeMillis()));
147 javaBeanWithNullValues.setString("");
148 javaBeanWithNullValues.setTimestamp(new Timestamp(System.currentTimeMillis()));
149 return yaml.dump(javaBeanWithNullValues);
150 }
151
152 public class CustomRepresenter extends Representer {
153 public CustomRepresenter() {
154 this.representers.put(Float.class, new RepresentFloat());
155 this.representers.put(Long.class, new RepresentLong());
156 this.representers.put(java.sql.Date.class, new RepresentDate());
157 this.representers.put(java.sql.Timestamp.class, new RepresentTime());
158 }
159
160 private class RepresentFloat implements Represent {
161 public Node representData(Object data) {
162 return representScalar(new Tag(Tag.PREFIX + "java.lang.Float"),
163 ((Float) data).toString());
164 }
165 }
166
167 private class RepresentLong implements Represent {
168 public Node representData(Object data) {
169 return representScalar(new Tag(Tag.PREFIX + "java.lang.Long"),
170 ((Long) data).toString());
171 }
172 }
173
174 private class RepresentDate implements Represent {
175 public Node representData(Object data) {
176 return representScalar(new Tag(Tag.PREFIX + "java.sql.Date"),
177 ((java.sql.Date) data).toString());
178 }
179 }
180
181 private class RepresentTime implements Represent {
182 public Node representData(Object data) {
183 return representScalar(new Tag(Tag.PREFIX + "java.sql.Timestamp"),
184 ((java.sql.Timestamp) data).toString());
185 }
186 }
187 }
188 }