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