Home | History | Annotate | Download | only in snakeyaml
      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