Home | History | Annotate | Download | only in examples
      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 examples;
     17 
     18 import java.util.HashMap;
     19 import java.util.Map;
     20 import java.util.regex.Pattern;
     21 
     22 import junit.framework.TestCase;
     23 
     24 import org.yaml.snakeyaml.DumperOptions;
     25 import org.yaml.snakeyaml.Yaml;
     26 import org.yaml.snakeyaml.constructor.AbstractConstruct;
     27 import org.yaml.snakeyaml.constructor.Constructor;
     28 import org.yaml.snakeyaml.constructor.SafeConstructor;
     29 import org.yaml.snakeyaml.nodes.Node;
     30 import org.yaml.snakeyaml.nodes.ScalarNode;
     31 import org.yaml.snakeyaml.nodes.Tag;
     32 import org.yaml.snakeyaml.representer.Represent;
     33 import org.yaml.snakeyaml.representer.Representer;
     34 
     35 public class DiceExampleTest extends TestCase {
     36     public void testRepresenter() {
     37         Dice dice = new Dice(3, 6);
     38         DumperOptions options = new DumperOptions();
     39         options.setAllowReadOnlyProperties(true);
     40         Yaml yaml = new Yaml(options);
     41         String output = yaml.dump(dice);
     42         assertEquals("!!examples.Dice {a: 3, b: 6}\n", output);
     43     }
     44 
     45     public void testDiceRepresenter() {
     46         Dice dice = new Dice(3, 6);
     47         Map<String, Dice> data = new HashMap<String, Dice>();
     48         data.put("gold", dice);
     49         Yaml yaml = new Yaml(new DiceRepresenter(), new DumperOptions());
     50         String output = yaml.dump(data);
     51         assertEquals("{gold: !dice '3d6'}\n", output);
     52     }
     53 
     54     class DiceRepresenter extends Representer {
     55         public DiceRepresenter() {
     56             this.representers.put(Dice.class, new RepresentDice());
     57         }
     58 
     59         private class RepresentDice implements Represent {
     60             public Node representData(Object data) {
     61                 Dice dice = (Dice) data;
     62                 String value = dice.getA() + "d" + dice.getB();
     63                 return representScalar(new Tag("!dice"), value);
     64             }
     65         }
     66     }
     67 
     68     class DiceConstructor extends Constructor {
     69         public DiceConstructor() {
     70             this.yamlConstructors.put(new Tag("!dice"), new ConstructDice());
     71         }
     72 
     73         private class ConstructDice extends AbstractConstruct {
     74             public Object construct(Node node) {
     75                 String val = (String) constructScalar((ScalarNode) node);
     76                 int position = val.indexOf('d');
     77                 Integer a = new Integer(val.substring(0, position));
     78                 Integer b = new Integer(val.substring(position + 1));
     79                 return new Dice(a, b);
     80             }
     81         }
     82     }
     83 
     84     @SuppressWarnings("unchecked")
     85     public void testConstructor() {
     86         Yaml yaml = new Yaml(new DiceConstructor());
     87         Object data = yaml.load("{initial hit points: !dice '8d4'}");
     88         Map<String, Dice> map = (Map<String, Dice>) data;
     89         assertEquals(new Dice(8, 4), map.get("initial hit points"));
     90     }
     91 
     92     // the tag must start with a digit
     93     @SuppressWarnings("unchecked")
     94     public void testImplicitResolver() {
     95         Yaml yaml = new Yaml(new DiceConstructor(), new DiceRepresenter());
     96         // the tag must start with a digit
     97         yaml.addImplicitResolver(new Tag("!dice"), Pattern.compile("\\d+d\\d+"), "123456789");
     98         // dump
     99         Map<String, Dice> treasure = new HashMap<String, Dice>();
    100         treasure.put("treasure", new Dice(10, 20));
    101         String output = yaml.dump(treasure);
    102         assertEquals("{treasure: 10d20}\n", output);
    103         // load
    104         Object data = yaml.load("{damage: 5d10}");
    105         Map<String, Dice> map = (Map<String, Dice>) data;
    106         assertEquals(new Dice(5, 10), map.get("damage"));
    107     }
    108 
    109     // the tag may start with anything
    110     @SuppressWarnings("unchecked")
    111     public void testImplicitResolverWithNull() {
    112         Yaml yaml = new Yaml(new DiceConstructor(), new DiceRepresenter());
    113         // the tag may start with anything
    114         yaml.addImplicitResolver(new Tag("!dice"), Pattern.compile("\\d+d\\d+"), null);
    115         // dump
    116         Map<String, Dice> treasure = new HashMap<String, Dice>();
    117         treasure.put("treasure", new Dice(10, 20));
    118         String output = yaml.dump(treasure);
    119         assertEquals("{treasure: 10d20}\n", output);
    120         // load
    121         Object data = yaml.load("{damage: 5d10}");
    122         Map<String, Dice> map = (Map<String, Dice>) data;
    123         assertEquals(new Dice(5, 10), map.get("damage"));
    124     }
    125 
    126     static class DiceBean {
    127         public Dice treasure;
    128 
    129         @Override
    130         public boolean equals(Object o) {
    131             if (this == o)
    132                 return true;
    133             if (!(o instanceof DiceBean))
    134                 return false;
    135 
    136             DiceBean diceBean = (DiceBean) o;
    137             if (treasure != null ? !treasure.equals(diceBean.treasure) : diceBean.treasure != null)
    138                 return false;
    139             return true;
    140         }
    141 
    142         @Override
    143         public int hashCode() {
    144             return treasure != null ? treasure.hashCode() : 0;
    145         }
    146     }
    147 
    148     public void testImplicitResolverJavaBean() {
    149         Yaml yaml = new Yaml(new DiceConstructor(), new DiceRepresenter());
    150         // the tag must start with a digit
    151         yaml.addImplicitResolver(new Tag("!dice"), Pattern.compile("\\d+d\\d+"), "123456789");
    152         // dump
    153         DiceBean bean = new DiceBean();
    154         bean.treasure = new Dice(10, 20);
    155         String output = yaml.dump(bean);
    156         assertEquals("!!examples.DiceExampleTest$DiceBean {treasure: 10d20}\n", output);
    157         // load
    158         Object loaded = yaml.load(output);
    159         assertEquals(loaded, bean);
    160     }
    161 }
    162