1 /** 2 * Copyright (c) 2008, 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 } 188