View Javadoc

1   /**
2    * Copyright (c) 2008-2012, http://www.snakeyaml.org
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
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          // System.out.println(dumpStr);
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); // ok
88          javaBeanWithNullValues.setTimestamp(new Timestamp(System.currentTimeMillis()));
89  
90          String dumpStr = yaml.dump(javaBeanWithNullValues);
91          // System.out.println(dumpStr);
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); // ok
113         javaBeanWithNullValues.setTimestamp(new Timestamp(System.currentTimeMillis()));
114 
115         String dumpStr = yaml.dumpAsMap(javaBeanWithNullValues);
116         // System.out.println(dumpStr);
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(""); // ok
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 }