aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/examples/AnyObjectExampleTest.java50
-rw-r--r--src/test/java/examples/CollectionStyleTest.java28
-rw-r--r--src/test/java/examples/CustomConstructor.java22
-rw-r--r--src/test/java/examples/CustomListExampleTest.java31
-rw-r--r--src/test/java/examples/CustomMapExampleTest.java36
-rw-r--r--src/test/java/examples/Dice.java41
-rw-r--r--src/test/java/examples/DiceExampleTest.java97
-rw-r--r--src/test/java/examples/DumpExampleTest.java128
-rw-r--r--src/test/java/examples/Hero.java30
-rw-r--r--src/test/java/examples/LoadExampleTest.java59
-rw-r--r--src/test/java/examples/SafeConstructorExampleTest.java42
-rw-r--r--src/test/java/examples/SpringTest.java21
-rw-r--r--src/test/java/org/pyyaml/AnInstance.java34
-rw-r--r--src/test/java/org/pyyaml/CanonicalException.java19
-rw-r--r--src/test/java/org/pyyaml/CanonicalLoader.java72
-rw-r--r--src/test/java/org/pyyaml/CanonicalParser.java198
-rw-r--r--src/test/java/org/pyyaml/CanonicalScanner.java301
-rw-r--r--src/test/java/org/pyyaml/PyCanonicalTest.java53
-rw-r--r--src/test/java/org/pyyaml/PyEmitterTest.java284
-rw-r--r--src/test/java/org/pyyaml/PyErrorsTest.java120
-rw-r--r--src/test/java/org/pyyaml/PyImportTest.java128
-rw-r--r--src/test/java/org/pyyaml/PyMarkTest.java45
-rw-r--r--src/test/java/org/pyyaml/PyReaderTest.java36
-rw-r--r--src/test/java/org/pyyaml/PyRecursiveTest.java63
-rw-r--r--src/test/java/org/pyyaml/PyStructureTest.java287
-rw-r--r--src/test/java/org/pyyaml/PyTokensTest.java140
-rw-r--r--src/test/java/org/yaml/snakeyaml/Address.java11
-rw-r--r--src/test/java/org/yaml/snakeyaml/BinaryBean.java26
-rw-r--r--src/test/java/org/yaml/snakeyaml/BinaryJavaBeanTest.java20
-rw-r--r--src/test/java/org/yaml/snakeyaml/Chapter2_1Test.java96
-rw-r--r--src/test/java/org/yaml/snakeyaml/Chapter2_2Test.java101
-rw-r--r--src/test/java/org/yaml/snakeyaml/Chapter2_3Test.java120
-rw-r--r--src/test/java/org/yaml/snakeyaml/Chapter2_4Test.java171
-rw-r--r--src/test/java/org/yaml/snakeyaml/Chapter2_5Test.java52
-rw-r--r--src/test/java/org/yaml/snakeyaml/DumperOptionsTest.java261
-rw-r--r--src/test/java/org/yaml/snakeyaml/DumperTest.java82
-rw-r--r--src/test/java/org/yaml/snakeyaml/EnumBean.java36
-rw-r--r--src/test/java/org/yaml/snakeyaml/EnumTest.java175
-rw-r--r--src/test/java/org/yaml/snakeyaml/Example2_24Test.java234
-rw-r--r--src/test/java/org/yaml/snakeyaml/Example2_27Test.java35
-rw-r--r--src/test/java/org/yaml/snakeyaml/Invoice.java18
-rw-r--r--src/test/java/org/yaml/snakeyaml/JavaBeanParserTest.java95
-rw-r--r--src/test/java/org/yaml/snakeyaml/ParallelTest.java83
-rw-r--r--src/test/java/org/yaml/snakeyaml/Person.java10
-rw-r--r--src/test/java/org/yaml/snakeyaml/Product.java11
-rw-r--r--src/test/java/org/yaml/snakeyaml/StressTest.java60
-rw-r--r--src/test/java/org/yaml/snakeyaml/Suit.java8
-rw-r--r--src/test/java/org/yaml/snakeyaml/TypeDescriptionTest.java21
-rw-r--r--src/test/java/org/yaml/snakeyaml/Util.java39
-rw-r--r--src/test/java/org/yaml/snakeyaml/YamlDocument.java71
-rw-r--r--src/test/java/org/yaml/snakeyaml/YamlStream.java83
-rw-r--r--src/test/java/org/yaml/snakeyaml/YamlTest.java18
-rw-r--r--src/test/java/org/yaml/snakeyaml/composer/ComposerImplTest.java37
-rw-r--r--src/test/java/org/yaml/snakeyaml/constructor/ArrayTagsTest.java89
-rw-r--r--src/test/java/org/yaml/snakeyaml/constructor/BeanConstructorTest.java228
-rw-r--r--src/test/java/org/yaml/snakeyaml/constructor/Car.java27
-rw-r--r--src/test/java/org/yaml/snakeyaml/constructor/Child1.java16
-rw-r--r--src/test/java/org/yaml/snakeyaml/constructor/ClassTagsTest.java101
-rw-r--r--src/test/java/org/yaml/snakeyaml/constructor/ConstructorMappingTest.java55
-rw-r--r--src/test/java/org/yaml/snakeyaml/constructor/ConstructorSequenceTest.java74
-rw-r--r--src/test/java/org/yaml/snakeyaml/constructor/ConstructorTest.java89
-rw-r--r--src/test/java/org/yaml/snakeyaml/constructor/ImplicitTagsTest.java149
-rw-r--r--src/test/java/org/yaml/snakeyaml/constructor/MyCar.java37
-rw-r--r--src/test/java/org/yaml/snakeyaml/constructor/MyWheel.java49
-rw-r--r--src/test/java/org/yaml/snakeyaml/constructor/Parent1.java26
-rw-r--r--src/test/java/org/yaml/snakeyaml/constructor/Person.java51
-rw-r--r--src/test/java/org/yaml/snakeyaml/constructor/SafeConstructorTest.java39
-rw-r--r--src/test/java/org/yaml/snakeyaml/constructor/TestBean.java71
-rw-r--r--src/test/java/org/yaml/snakeyaml/constructor/TestBean1.java192
-rw-r--r--src/test/java/org/yaml/snakeyaml/constructor/TypeSafeCollectionsTest.java82
-rw-r--r--src/test/java/org/yaml/snakeyaml/constructor/Wheel.java44
-rw-r--r--src/test/java/org/yaml/snakeyaml/emitter/EmitterTest.java82
-rw-r--r--src/test/java/org/yaml/snakeyaml/emitter/EventConstructor.java106
-rw-r--r--src/test/java/org/yaml/snakeyaml/emitter/EventsLoader.java13
-rw-r--r--src/test/java/org/yaml/snakeyaml/error/MarkTest.java25
-rw-r--r--src/test/java/org/yaml/snakeyaml/error/MarkedYAMLExceptionTest.java27
-rw-r--r--src/test/java/org/yaml/snakeyaml/events/ScalarEventTest.java27
-rw-r--r--src/test/java/org/yaml/snakeyaml/introspector/MethodPropertyTest.java22
-rw-r--r--src/test/java/org/yaml/snakeyaml/nodes/NodeTest.java28
-rw-r--r--src/test/java/org/yaml/snakeyaml/nodes/ScalarNodeTest.java26
-rw-r--r--src/test/java/org/yaml/snakeyaml/nodes/SequenceNodeTest.java16
-rw-r--r--src/test/java/org/yaml/snakeyaml/parser/ParserImplTest.java88
-rw-r--r--src/test/java/org/yaml/snakeyaml/reader/IoReaderTest.java25
-rw-r--r--src/test/java/org/yaml/snakeyaml/reader/ReaderBomTest.java101
-rw-r--r--src/test/java/org/yaml/snakeyaml/reader/ReaderStringTest.java61
-rw-r--r--src/test/java/org/yaml/snakeyaml/representer/RepresentTest.java83
-rw-r--r--src/test/java/org/yaml/snakeyaml/representer/RepresenterTest.java131
-rw-r--r--src/test/java/org/yaml/snakeyaml/representer/SafeRepresenterTest.java105
-rw-r--r--src/test/java/org/yaml/snakeyaml/resolver/RagelMachine.java317
-rw-r--r--src/test/java/org/yaml/snakeyaml/resolver/RagelMachineTest.java104
-rw-r--r--src/test/java/org/yaml/snakeyaml/resolver/ResolverTest.java141
-rw-r--r--src/test/java/org/yaml/snakeyaml/resolver/ResolverTupleTest.java16
-rw-r--r--src/test/java/org/yaml/snakeyaml/scanner/ScannerImplTest.java47
-rw-r--r--src/test/java/org/yaml/snakeyaml/scanner/SimpleKeyTest.java14
-rw-r--r--src/test/java/org/yaml/snakeyaml/serializer/SerializerTest.java89
-rw-r--r--src/test/java/org/yaml/snakeyaml/tokens/AliasTokenTest.java29
-rw-r--r--src/test/java/org/yaml/snakeyaml/tokens/AnchorTokenTest.java23
-rw-r--r--src/test/java/org/yaml/snakeyaml/tokens/BlockEndTokenTest.java23
-rw-r--r--src/test/java/org/yaml/snakeyaml/tokens/BlockEntryTokenTest.java18
-rw-r--r--src/test/java/org/yaml/snakeyaml/tokens/BlockSequenceStartTokenTest.java17
-rw-r--r--src/test/java/org/yaml/snakeyaml/tokens/DirectiveTokenTest.java56
-rw-r--r--src/test/java/org/yaml/snakeyaml/tokens/DocumentEndTokenTest.java17
-rw-r--r--src/test/java/org/yaml/snakeyaml/tokens/DocumentStartTokenTest.java17
-rw-r--r--src/test/java/org/yaml/snakeyaml/tokens/FlowEntryTokenTest.java17
-rw-r--r--src/test/java/org/yaml/snakeyaml/tokens/FlowMappingStartTokenTest.java17
-rw-r--r--src/test/java/org/yaml/snakeyaml/tokens/FlowSequenceStartTokenTest.java17
-rw-r--r--src/test/java/org/yaml/snakeyaml/tokens/StreamStartTokenTest.java17
-rw-r--r--src/test/java/org/yaml/snakeyaml/tokens/TagTokenTest.java33
-rw-r--r--src/test/java/org/yaml/snakeyaml/types/AbstractTest.java36
-rw-r--r--src/test/java/org/yaml/snakeyaml/types/BinaryTagTest.java64
-rw-r--r--src/test/java/org/yaml/snakeyaml/types/BoolTagTest.java59
-rw-r--r--src/test/java/org/yaml/snakeyaml/types/FloatTagTest.java55
-rw-r--r--src/test/java/org/yaml/snakeyaml/types/IntTagTest.java55
-rw-r--r--src/test/java/org/yaml/snakeyaml/types/MapTagTest.java59
-rw-r--r--src/test/java/org/yaml/snakeyaml/types/MergeTagTest.java59
-rw-r--r--src/test/java/org/yaml/snakeyaml/types/NullTagTest.java73
-rw-r--r--src/test/java/org/yaml/snakeyaml/types/OmapTagTest.java35
-rw-r--r--src/test/java/org/yaml/snakeyaml/types/PairsTagTest.java59
-rw-r--r--src/test/java/org/yaml/snakeyaml/types/SeqTagTest.java70
-rw-r--r--src/test/java/org/yaml/snakeyaml/types/SetTagTest.java33
-rw-r--r--src/test/java/org/yaml/snakeyaml/types/StrTagTest.java130
-rw-r--r--src/test/java/org/yaml/snakeyaml/types/TimestampTagTest.java93
-rw-r--r--src/test/java/org/yaml/snakeyaml/types/ValueTagTest.java49
123 files changed, 8682 insertions, 0 deletions
diff --git a/src/test/java/examples/AnyObjectExampleTest.java b/src/test/java/examples/AnyObjectExampleTest.java
new file mode 100644
index 00000000..9a599d87
--- /dev/null
+++ b/src/test/java/examples/AnyObjectExampleTest.java
@@ -0,0 +1,50 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package examples;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.Util;
+import org.yaml.snakeyaml.Yaml;
+
+public class AnyObjectExampleTest extends TestCase {
+ @SuppressWarnings("unchecked")
+ public void testLoad() throws IOException {
+ String doc = Util.getLocalResource("examples/any-object-example.yaml");
+ System.out.println(doc);
+ Yaml yaml = new Yaml();
+ Map<String, Object> object = (Map<String, Object>) yaml.load(doc);
+ System.out.println(object);
+ assertEquals(6, object.size());
+ assertEquals("[null, null]", object.get("none").toString());
+ List list1 = (List) object.get("none");
+ assertEquals(2, list1.size());
+ for (Object object2 : list1) {
+ assertNull(object2);
+ }
+ //
+ assertEquals("[true, false, true, false]", object.get("bool").toString());
+ assertEquals(4, ((List) object.get("bool")).size());
+ //
+ assertEquals(new Integer(42), object.get("int"));
+ assertEquals(new Double(3.14159), object.get("float"));
+ //
+ assertEquals("[LITE, RES_ACID, SUS_DEXT]", object.get("list").toString());
+ List list2 = (List) object.get("list");
+ assertEquals(3, list2.size());
+ for (Object object2 : list2) {
+ assertEquals(object2.toString(), object2.toString().toUpperCase());
+ }
+ //
+ assertEquals("{hp=13, sp=5}", object.get("dict").toString());
+ Map<String, Integer> map = (Map<String, Integer>) object.get("dict");
+ assertEquals(2, map.keySet().size());
+ assertEquals(new Integer(13), map.get("hp"));
+ assertEquals(new Integer(5), map.get("sp"));
+ }
+}
diff --git a/src/test/java/examples/CollectionStyleTest.java b/src/test/java/examples/CollectionStyleTest.java
new file mode 100644
index 00000000..4529f993
--- /dev/null
+++ b/src/test/java/examples/CollectionStyleTest.java
@@ -0,0 +1,28 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package examples;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.Yaml;
+
+public class CollectionStyleTest extends TestCase {
+ public void testNestedStyle() {
+ Yaml yaml = new Yaml();
+ String document = " a: 1\n b:\n c: 3\n d: 4\n";
+ System.out.println(document);
+ System.out.println(yaml.dump(yaml.load(document)));
+ assertEquals("a: 1\nb: {c: 3, d: 4}\n", yaml.dump(yaml.load(document)));
+ }
+
+ public void testNestedStyle2() {
+ DumperOptions options = new DumperOptions();
+ options.setDefaultFlowStyle(DumperOptions.DefaultFlowStyle.BLOCK);
+ Yaml yaml = new Yaml(options);
+ String document = " a: 1\n b:\n c: 3\n d: 4\n";
+ System.out.println(yaml.dump(yaml.load(document)));
+ assertEquals("a: 1\nb:\n c: 3\n d: 4\n", yaml.dump(yaml.load(document)));
+ }
+}
diff --git a/src/test/java/examples/CustomConstructor.java b/src/test/java/examples/CustomConstructor.java
new file mode 100644
index 00000000..a057fa27
--- /dev/null
+++ b/src/test/java/examples/CustomConstructor.java
@@ -0,0 +1,22 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package examples;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.yaml.snakeyaml.Invoice;
+import org.yaml.snakeyaml.constructor.Constructor;
+
+public class CustomConstructor extends Constructor {
+
+ public CustomConstructor() {
+ super(Invoice.class);
+ }
+
+ @Override
+ protected List<Object> createDefaultList(int initSize) {
+ return new ArrayList<Object>(initSize);
+ }
+} \ No newline at end of file
diff --git a/src/test/java/examples/CustomListExampleTest.java b/src/test/java/examples/CustomListExampleTest.java
new file mode 100644
index 00000000..dc4fae51
--- /dev/null
+++ b/src/test/java/examples/CustomListExampleTest.java
@@ -0,0 +1,31 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package examples;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.Loader;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.Constructor;
+
+public class CustomListExampleTest extends TestCase {
+ @SuppressWarnings("unchecked")
+ public void testList() throws IOException {
+ Loader loader = new Loader(new CustomConstructor());
+ Yaml yaml = new Yaml(loader);
+ List<Integer> data = (List<Integer>) yaml.load("[1, 2, 3]");
+ assertTrue(data instanceof ArrayList);
+ }
+
+ class CustomConstructor extends Constructor {
+ @Override
+ protected List<Object> createDefaultList(int initSize) {
+ return new ArrayList<Object>(initSize);
+ }
+ }
+}
diff --git a/src/test/java/examples/CustomMapExampleTest.java b/src/test/java/examples/CustomMapExampleTest.java
new file mode 100644
index 00000000..624cdfab
--- /dev/null
+++ b/src/test/java/examples/CustomMapExampleTest.java
@@ -0,0 +1,36 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package examples;
+
+import java.io.IOException;
+import java.util.Map;
+import java.util.TreeMap;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.Loader;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.Constructor;
+
+public class CustomMapExampleTest extends TestCase {
+ @SuppressWarnings("unchecked")
+ public void testMap() throws IOException {
+ Loader loader = new Loader(new CustomConstructor());
+ Yaml yaml = new Yaml(loader);
+ Map data = (Map) yaml.load("{2: '222', 1: '111', 3: '333'}");
+ assertTrue(data instanceof TreeMap);
+ Object[] keys = data.keySet().toArray();
+ // must be sorted
+ assertEquals(new Integer(1), keys[0]);
+ assertEquals(new Integer(2), keys[1]);
+ assertEquals(new Integer(3), keys[2]);
+ }
+
+ class CustomConstructor extends Constructor {
+ @Override
+ protected Map<Object, Object> createDefaultMap() {
+ return new TreeMap<Object, Object>();
+ }
+ }
+}
diff --git a/src/test/java/examples/Dice.java b/src/test/java/examples/Dice.java
new file mode 100644
index 00000000..25a24768
--- /dev/null
+++ b/src/test/java/examples/Dice.java
@@ -0,0 +1,41 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package examples;
+
+public class Dice {
+ private Integer a;
+ private Integer b;
+
+ public Dice(Integer a, Integer b) {
+ super();
+ this.a = a;
+ this.b = b;
+ }
+
+ public Integer getA() {
+ return a;
+ }
+
+ public Integer getB() {
+ return b;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof Dice) {
+ return toString().equals(obj.toString());
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return toString().hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return "Dice " + a + "d" + b;
+ }
+}
diff --git a/src/test/java/examples/DiceExampleTest.java b/src/test/java/examples/DiceExampleTest.java
new file mode 100644
index 00000000..f0ff3728
--- /dev/null
+++ b/src/test/java/examples/DiceExampleTest.java
@@ -0,0 +1,97 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package examples;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.Dumper;
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.Loader;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.Construct;
+import org.yaml.snakeyaml.constructor.Constructor;
+import org.yaml.snakeyaml.nodes.Node;
+import org.yaml.snakeyaml.nodes.ScalarNode;
+import org.yaml.snakeyaml.representer.Represent;
+import org.yaml.snakeyaml.representer.Representer;
+
+public class DiceExampleTest extends TestCase {
+ public void testRepresenter() throws IOException {
+ Dice dice = new Dice(3, 6);
+ Yaml yaml = new Yaml();
+ String output = yaml.dump(dice);
+ System.out.println(output);
+ assertEquals("!!examples.Dice {a: 3, b: 6}\n", output);
+ }
+
+ public void testDiceRepresenter() throws IOException {
+ Dice dice = new Dice(3, 6);
+ Map<String, Dice> data = new HashMap<String, Dice>();
+ data.put("gold", dice);
+ Yaml yaml = new Yaml(new Dumper(new DiceRepresenter(), new DumperOptions()));
+ String output = yaml.dump(data);
+ System.out.println(output);
+ assertEquals("{gold: !dice '3d6'}\n", output);
+ }
+
+ class DiceRepresenter extends Representer {
+ public DiceRepresenter() {
+ this.representers.put(Dice.class, new RepresentDice());
+ }
+
+ private class RepresentDice implements Represent {
+ public Node representData(Object data) {
+ Dice dice = (Dice) data;
+ String value = dice.getA() + "d" + dice.getB();
+ return representScalar("!dice", value);
+ }
+ }
+ }
+
+ class DiceConstructor extends Constructor {
+ public DiceConstructor() {
+ this.yamlConstructors.put("!dice", new ConstructDice());
+ }
+
+ private class ConstructDice implements Construct {
+ public Object construct(Node node) {
+ String val = (String) constructScalar((ScalarNode) node);
+ int position = val.indexOf('d');
+ Integer a = Integer.parseInt(val.substring(0, position));
+ Integer b = Integer.parseInt(val.substring(position + 1));
+ return new Dice(a, b);
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testConstructor() throws IOException {
+ Yaml yaml = new Yaml(new Loader(new DiceConstructor()));
+ Object data = yaml.load("{initial hit points: !dice '8d4'}");
+ Map<String, Dice> map = (Map<String, Dice>) data;
+ assertEquals(new Dice(8, 4), map.get("initial hit points"));
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testImplicitResolver() throws IOException {
+ Yaml yaml = new Yaml(new Loader(new DiceConstructor()), new Dumper(new DiceRepresenter(),
+ new DumperOptions()));
+ yaml.addImplicitResolver("!dice", Pattern.compile("\\d+d\\d+"), "123456789");
+ // dump
+ Map<String, Dice> treasure = (Map<String, Dice>) new HashMap<String, Dice>();
+ treasure.put("treasure", new Dice(10, 20));
+ String output = yaml.dump(treasure);
+ System.out.println(output);
+ assertEquals("{treasure: 10d20}\n", output);
+ // load
+ Object data = yaml.load("{damage: 5d10}");
+ Map<String, Dice> map = (Map<String, Dice>) data;
+ assertEquals(new Dice(5, 10), map.get("damage"));
+ }
+}
diff --git a/src/test/java/examples/DumpExampleTest.java b/src/test/java/examples/DumpExampleTest.java
new file mode 100644
index 00000000..e44ce842
--- /dev/null
+++ b/src/test/java/examples/DumpExampleTest.java
@@ -0,0 +1,128 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package examples;
+
+import java.io.StringWriter;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.Yaml;
+
+public class DumpExampleTest extends TestCase {
+ public void testDump() {
+ Map<String, Object> data = new HashMap<String, Object>();
+ data.put("name", "Silenthand Olleander");
+ data.put("race", "Human");
+ data.put("traits", new String[] { "ONE_HAND", "ONE_EYE" });
+ Yaml yaml = new Yaml();
+ String output = yaml.dump(data);
+ System.out.println(output);
+ assertTrue(output.contains("name: Silenthand Olleander"));
+ assertTrue(output.contains("race: Human"));
+ assertTrue(output.contains("traits: [ONE_HAND, ONE_EYE]"));
+ }
+
+ public void testDumpWriter() {
+ Map<String, Object> data = new HashMap<String, Object>();
+ data.put("name", "Silenthand Olleander");
+ data.put("race", "Human");
+ data.put("traits", new String[] { "ONE_HAND", "ONE_EYE" });
+ Yaml yaml = new Yaml();
+ StringWriter writer = new StringWriter();
+ yaml.dump(data, writer);
+ System.out.println(writer.toString());
+ assertTrue(writer.toString().contains("name: Silenthand Olleander"));
+ assertTrue(writer.toString().contains("race: Human"));
+ assertTrue(writer.toString().contains("traits: [ONE_HAND, ONE_EYE]"));
+ }
+
+ public void testDumpMany() {
+ List<Integer> docs = new LinkedList<Integer>();
+ for (int i = 1; i < 4; i++) {
+ docs.add(i);
+ }
+ DumperOptions options = new DumperOptions();
+ options.setExplicitStart(true);
+ Yaml yaml = new Yaml(options);
+ System.out.println(yaml.dump(docs));
+ System.out.println(yaml.dumpAll(docs.iterator()));
+ }
+
+ public void testDumpCustomJavaClass() {
+ Hero hero = new Hero("Galain Ysseleg", -3, 2);
+ Yaml yaml = new Yaml();
+ String output = yaml.dump(hero);
+ System.out.println(output);
+ assertEquals("!!examples.Hero {hp: -3, name: Galain Ysseleg, sp: 2}\n", output);
+ }
+
+ public void testDumperOptions() {
+ List<Integer> data = new LinkedList<Integer>();
+ for (int i = 0; i < 50; i++) {
+ data.add(i);
+ }
+ Yaml yaml = new Yaml();
+ String output = yaml.dump(data);
+ System.out.println(output);
+ assertTrue(output.contains("[0, 1, 2, 3, 4, 5, 6, 7, 8"));
+ //
+ DumperOptions options = new DumperOptions();
+ options.setWidth(50);
+ options.setIndent(4);
+ yaml = new Yaml(options);
+ output = yaml.dump(data);
+ System.out.println(output);
+ }
+
+ public void testDumperOptionsCanonical() {
+ List<Integer> data = new LinkedList<Integer>();
+ for (int i = 0; i < 5; i++) {
+ data.add(i);
+ }
+ DumperOptions options = new DumperOptions();
+ options.setCanonical(true);
+ Yaml yaml = new Yaml(options);
+ String output = yaml.dump(data);
+ System.out.println(output);
+ assertTrue(output.contains("---"));
+ assertTrue(output.contains("!!seq ["));
+ assertTrue(output.contains("!!int \"3\","));
+ }
+
+ public void testDumperOptionsFlowStyle() {
+ List<Integer> data = new LinkedList<Integer>();
+ for (int i = 0; i < 5; i++) {
+ data.add(i);
+ }
+ DumperOptions options = new DumperOptions();
+ options.setDefaultFlowStyle(DumperOptions.DefaultFlowStyle.BLOCK);
+ Yaml yaml = new Yaml(options);
+ String output = yaml.dump(data);
+ System.out.println(output);
+ assertTrue(output.contains("- 0\n"));
+ assertTrue(output.contains("- 1\n"));
+ assertTrue(output.contains("- 4\n"));
+ }
+
+ public void testDumperOptionsStyle() {
+ List<Integer> data = new LinkedList<Integer>();
+ for (int i = 0; i < 5; i++) {
+ data.add(i);
+ }
+ DumperOptions options = new DumperOptions();
+ options.setDefaultStyle(DumperOptions.DefaultScalarStyle.DOUBLE_QUOTED);
+ Yaml yaml = new Yaml(options);
+ String output = yaml.dump(data);
+ System.out.println(output);
+ assertTrue(output.contains("- !!int \"0\""));
+ assertTrue(output.contains("- !!int \"1\""));
+ assertTrue(output.contains("- !!int \"4\""));
+ }
+
+}
diff --git a/src/test/java/examples/Hero.java b/src/test/java/examples/Hero.java
new file mode 100644
index 00000000..6cdf874a
--- /dev/null
+++ b/src/test/java/examples/Hero.java
@@ -0,0 +1,30 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package examples;
+
+public class Hero {
+ private String name;
+ private Integer sp;
+ private Integer hp;
+
+ public Hero(String name, Integer hp, Integer sp) {
+ super();
+ this.name = name;
+ this.sp = sp;
+ this.hp = hp;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public Integer getSp() {
+ return sp;
+ }
+
+ public Integer getHp() {
+ return hp;
+ }
+
+}
diff --git a/src/test/java/examples/LoadExampleTest.java b/src/test/java/examples/LoadExampleTest.java
new file mode 100644
index 00000000..652c5d51
--- /dev/null
+++ b/src/test/java/examples/LoadExampleTest.java
@@ -0,0 +1,59 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package examples;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.Yaml;
+
+public class LoadExampleTest extends TestCase {
+ @SuppressWarnings("unchecked")
+ public void testLoad() {
+ Yaml yaml = new Yaml();
+ String document = "\n- Hesperiidae\n- Papilionidae\n- Apatelodidae\n- Epiplemidae";
+ System.out.println(document);
+ List<String> list = (List<String>) yaml.load(document);
+ System.out.println(list);
+ assertEquals("[Hesperiidae, Papilionidae, Apatelodidae, Epiplemidae]", list.toString());
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testLoadFromString() {
+ Yaml yaml = new Yaml();
+ String document = "hello: 25";
+ Map map = (Map) yaml.load(document);
+ assertEquals("{hello=25}", map.toString());
+ assertEquals(new Integer(25), map.get("hello"));
+ }
+
+ public void testLoadFromStream() throws FileNotFoundException {
+ InputStream input = new FileInputStream(new File("src/test/resources/reader/utf-8.txt"));
+ Yaml yaml = new Yaml();
+ Object data = yaml.load(input);
+ assertEquals("test", data);
+ //
+ data = yaml.load(new ByteArrayInputStream("test2".getBytes()));
+ assertEquals("test2", data);
+ }
+
+ public void testLoadManyDocuments() throws FileNotFoundException {
+ InputStream input = new FileInputStream(new File(
+ "src/test/resources/specification/example2_28.yaml"));
+ Yaml yaml = new Yaml();
+ int counter = 0;
+ for (Object data : yaml.loadAll(input)) {
+ System.out.println(data);
+ counter++;
+ }
+ assertEquals(3, counter);
+ }
+}
diff --git a/src/test/java/examples/SafeConstructorExampleTest.java b/src/test/java/examples/SafeConstructorExampleTest.java
new file mode 100644
index 00000000..34f5a7dd
--- /dev/null
+++ b/src/test/java/examples/SafeConstructorExampleTest.java
@@ -0,0 +1,42 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package examples;
+
+import java.io.IOException;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.Loader;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.SafeConstructor;
+
+public class SafeConstructorExampleTest extends TestCase {
+ @SuppressWarnings("unchecked")
+ public void testConstruct() throws IOException {
+ String doc = "- 5\n- Person\n- true";
+ Loader loader = new Loader(new SafeConstructor());
+ Yaml yaml = new Yaml(loader);
+ List<Object> list = (List<Object>) yaml.load(doc);
+ System.out.println(list);
+ assertEquals(3, list.size());
+ assertEquals(new Integer(5), list.get(0));
+ assertEquals("Person", list.get(1));
+ assertEquals(Boolean.TRUE, list.get(2));
+ }
+
+ public void testSafeConstruct() throws IOException {
+ String doc = "- 5\n- !org.yaml.snakeyaml.constructor.Person\n firstName: Andrey\n age: 99\n- true";
+ Loader loader = new Loader(new SafeConstructor());
+ Yaml yaml = new Yaml(loader);
+ try {
+ yaml.load(doc);
+ fail("Custom Java classes should not be created.");
+ } catch (Exception e) {
+ assertEquals(
+ "null; could not determine a constructor for the tag !org.yaml.snakeyaml.constructor.Person",
+ e.getMessage());
+ }
+ }
+}
diff --git a/src/test/java/examples/SpringTest.java b/src/test/java/examples/SpringTest.java
new file mode 100644
index 00000000..fdead4fd
--- /dev/null
+++ b/src/test/java/examples/SpringTest.java
@@ -0,0 +1,21 @@
+package examples;
+
+import junit.framework.TestCase;
+
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.yaml.snakeyaml.Yaml;
+
+public class SpringTest extends TestCase {
+ public void testSimple() {
+ ApplicationContext context = new ClassPathXmlApplicationContext("examples/spring.xml");
+ Yaml yaml = (Yaml) context.getBean("standardYaml");
+ assertNotNull(yaml);
+ //
+ yaml = (Yaml) context.getBean("javabeanYaml");
+ assertNotNull(yaml);
+ //
+ yaml = (Yaml) context.getBean("snakeYaml");
+ assertNotNull(yaml);
+ }
+} \ No newline at end of file
diff --git a/src/test/java/org/pyyaml/AnInstance.java b/src/test/java/org/pyyaml/AnInstance.java
new file mode 100644
index 00000000..655360dc
--- /dev/null
+++ b/src/test/java/org/pyyaml/AnInstance.java
@@ -0,0 +1,34 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.pyyaml;
+
+public class AnInstance {
+ private Object foo;
+ private Object bar;
+
+ public AnInstance() {
+ }
+
+ public AnInstance(Object foo, Object bar) {
+ this.foo = foo;
+ this.bar = bar;
+ }
+
+ public Object getFoo() {
+ return foo;
+ }
+
+ public void setFoo(Object foo) {
+ this.foo = foo;
+ }
+
+ public Object getBar() {
+ return bar;
+ }
+
+ public void setBar(Object bar) {
+ this.bar = bar;
+ }
+
+} \ No newline at end of file
diff --git a/src/test/java/org/pyyaml/CanonicalException.java b/src/test/java/org/pyyaml/CanonicalException.java
new file mode 100644
index 00000000..4bec5757
--- /dev/null
+++ b/src/test/java/org/pyyaml/CanonicalException.java
@@ -0,0 +1,19 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.pyyaml;
+
+import org.yaml.snakeyaml.error.YAMLException;
+
+public class CanonicalException extends YAMLException {
+
+ private static final long serialVersionUID = -6489045150083747626L;
+
+ public CanonicalException(String message) {
+ super(message);
+ }
+
+ public CanonicalException(Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/src/test/java/org/pyyaml/CanonicalLoader.java b/src/test/java/org/pyyaml/CanonicalLoader.java
new file mode 100644
index 00000000..6d54306c
--- /dev/null
+++ b/src/test/java/org/pyyaml/CanonicalLoader.java
@@ -0,0 +1,72 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.pyyaml;
+
+import java.io.IOException;
+import java.util.Iterator;
+
+import org.yaml.snakeyaml.Loader;
+import org.yaml.snakeyaml.composer.Composer;
+import org.yaml.snakeyaml.error.YAMLException;
+
+public class CanonicalLoader extends Loader {
+ @Override
+ public Object load(java.io.Reader yaml) {
+ try {
+ int ch = yaml.read();
+ StringBuffer buffer = new StringBuffer();
+ while (ch != -1) {
+ buffer.append((char) ch);
+ ch = yaml.read();
+ }
+ Composer composer = new Composer(new CanonicalParser(buffer.toString()), resolver);
+ constructor.setComposer(composer);
+ return constructor.getSingleData();
+ } catch (IOException e) {
+ throw new YAMLException(e);
+ }
+ }
+
+ public Iterable<Object> loadAll(java.io.Reader yaml) {
+ try {
+ int ch = yaml.read();
+ StringBuffer buffer = new StringBuffer();
+ while (ch != -1) {
+ buffer.append((char) ch);
+ ch = yaml.read();
+ }
+ Composer composer = new Composer(new CanonicalParser(buffer.toString()), resolver);
+ this.constructor.setComposer(composer);
+ Iterator<Object> result = new Iterator<Object>() {
+ public boolean hasNext() {
+ return constructor.checkData();
+ }
+
+ public Object next() {
+ return constructor.getData();
+ }
+
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ };
+ return new YamlIterable(result);
+ } catch (IOException e) {
+ throw new YAMLException(e);
+ }
+ }
+
+ private class YamlIterable implements Iterable<Object> {
+ private Iterator<Object> iterator;
+
+ public YamlIterable(Iterator<Object> iterator) {
+ this.iterator = iterator;
+ }
+
+ public Iterator<Object> iterator() {
+ return iterator;
+ }
+
+ }
+}
diff --git a/src/test/java/org/pyyaml/CanonicalParser.java b/src/test/java/org/pyyaml/CanonicalParser.java
new file mode 100644
index 00000000..f3a302f3
--- /dev/null
+++ b/src/test/java/org/pyyaml/CanonicalParser.java
@@ -0,0 +1,198 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.pyyaml;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.yaml.snakeyaml.events.AliasEvent;
+import org.yaml.snakeyaml.events.DocumentEndEvent;
+import org.yaml.snakeyaml.events.DocumentStartEvent;
+import org.yaml.snakeyaml.events.Event;
+import org.yaml.snakeyaml.events.MappingEndEvent;
+import org.yaml.snakeyaml.events.MappingStartEvent;
+import org.yaml.snakeyaml.events.ScalarEvent;
+import org.yaml.snakeyaml.events.SequenceEndEvent;
+import org.yaml.snakeyaml.events.SequenceStartEvent;
+import org.yaml.snakeyaml.events.StreamEndEvent;
+import org.yaml.snakeyaml.events.StreamStartEvent;
+import org.yaml.snakeyaml.parser.Parser;
+import org.yaml.snakeyaml.tokens.AliasToken;
+import org.yaml.snakeyaml.tokens.AnchorToken;
+import org.yaml.snakeyaml.tokens.DirectiveToken;
+import org.yaml.snakeyaml.tokens.DocumentStartToken;
+import org.yaml.snakeyaml.tokens.FlowEntryToken;
+import org.yaml.snakeyaml.tokens.FlowMappingEndToken;
+import org.yaml.snakeyaml.tokens.FlowMappingStartToken;
+import org.yaml.snakeyaml.tokens.FlowSequenceEndToken;
+import org.yaml.snakeyaml.tokens.FlowSequenceStartToken;
+import org.yaml.snakeyaml.tokens.KeyToken;
+import org.yaml.snakeyaml.tokens.ScalarToken;
+import org.yaml.snakeyaml.tokens.StreamEndToken;
+import org.yaml.snakeyaml.tokens.StreamStartToken;
+import org.yaml.snakeyaml.tokens.TagToken;
+import org.yaml.snakeyaml.tokens.Token;
+import org.yaml.snakeyaml.tokens.ValueToken;
+
+public class CanonicalParser implements Parser {
+ private LinkedList<Event> events;
+ private boolean parsed;
+ private CanonicalScanner scanner;
+
+ public CanonicalParser(String data) {
+ events = new LinkedList<Event>();
+ parsed = false;
+ scanner = new CanonicalScanner(data);
+ }
+
+ // stream: STREAM-START document* STREAM-END
+ private void parseStream() {
+ scanner.getToken(StreamStartToken.class);
+ events.add(new StreamStartEvent(null, null));
+ while (!scanner.checkToken(StreamEndToken.class)) {
+ List<Class<? extends Token>> list = new ArrayList<Class<? extends Token>>();
+ list.add(DirectiveToken.class);
+ list.add(DocumentStartToken.class);
+ if (scanner.checkToken(list)) {
+ parseDocument();
+ } else {
+ throw new CanonicalException("document is expected, got " + scanner.tokens.get(0));
+ }
+ }
+ scanner.getToken(StreamEndToken.class);
+ events.add(new StreamEndEvent(null, null));
+ }
+
+ // document: DIRECTIVE? DOCUMENT-START node
+ private void parseDocument() {
+ if (scanner.checkToken(DirectiveToken.class)) {
+ scanner.getToken(DirectiveToken.class);
+ }
+ scanner.getToken(DocumentStartToken.class);
+ events.add(new DocumentStartEvent(null, null, true, new Integer[] { 1, 1 }, null));
+ parseNode();
+ events.add(new DocumentEndEvent(null, null, true));
+ }
+
+ // node: ALIAS | ANCHOR? TAG? (SCALAR|sequence|mapping)
+ private void parseNode() {
+ if (scanner.checkToken(AliasToken.class)) {
+ AliasToken token = (AliasToken) scanner.getToken();
+ events.add(new AliasEvent(token.getValue(), null, null));
+ } else {
+ String anchor = null;
+ if (scanner.checkToken(AnchorToken.class)) {
+ AnchorToken token = (AnchorToken) scanner.getToken();
+ anchor = token.getValue();
+ }
+ String tag = null;
+ if (scanner.checkToken(TagToken.class)) {
+ TagToken token = (TagToken) scanner.getToken();
+ tag = token.getValue()[0] + token.getValue()[1];
+ }
+ if (scanner.checkToken(ScalarToken.class)) {
+ ScalarToken token = (ScalarToken) scanner.getToken();
+ events.add(new ScalarEvent(anchor, tag, new boolean[] { false, false }, token
+ .getValue(), null, null, null));
+ } else if (scanner.checkToken(FlowSequenceStartToken.class)) {
+ events.add(new SequenceStartEvent(anchor, tag, false, null, null, null));
+ parseSequence();
+ } else if (scanner.checkToken(FlowMappingStartToken.class)) {
+ events.add(new MappingStartEvent(anchor, tag, false, null, null, null));
+ parseMapping();
+ } else {
+ throw new CanonicalException("SCALAR, '[', or '{' is expected, got "
+ + scanner.tokens.get(0));
+ }
+ }
+ }
+
+ // sequence: SEQUENCE-START (node (ENTRY node)*)? ENTRY? SEQUENCE-END
+ private void parseSequence() {
+ scanner.getToken(FlowSequenceStartToken.class);
+ if (!scanner.checkToken(FlowSequenceEndToken.class)) {
+ parseNode();
+ while (!scanner.checkToken(FlowSequenceEndToken.class)) {
+ scanner.getToken(FlowEntryToken.class);
+ if (!scanner.checkToken(FlowSequenceEndToken.class)) {
+ parseNode();
+ }
+ }
+ }
+ scanner.getToken(FlowSequenceEndToken.class);
+ events.add(new SequenceEndEvent(null, null));
+ }
+
+ // mapping: MAPPING-START (map_entry (ENTRY map_entry)*)? ENTRY? MAPPING-END
+ private void parseMapping() {
+ scanner.getToken(FlowMappingStartToken.class);
+ if (!scanner.checkToken(FlowMappingEndToken.class)) {
+ parseMapEntry();
+ while (!scanner.checkToken(FlowMappingEndToken.class)) {
+ scanner.getToken(FlowEntryToken.class);
+ if (!scanner.checkToken(FlowMappingEndToken.class)) {
+ parseMapEntry();
+ }
+ }
+ }
+ scanner.getToken(FlowMappingEndToken.class);
+ events.add(new MappingEndEvent(null, null));
+ }
+
+ // map_entry: KEY node VALUE node
+ private void parseMapEntry() {
+ scanner.getToken(KeyToken.class);
+ parseNode();
+ scanner.getToken(ValueToken.class);
+ parseNode();
+ }
+
+ public void parse() {
+ parseStream();
+ parsed = true;
+ }
+
+ public Event getEvent() {
+ if (!parsed) {
+ parse();
+ }
+ return events.removeFirst();
+ }
+
+ public boolean checkEvent(List<Class<? extends Event>> choices) {
+ if (!parsed) {
+ parse();
+ }
+ if (!events.isEmpty()) {
+ if (choices.isEmpty()) {
+ return true;
+ }
+ for (Class<? extends Event> class1 : choices) {
+ if (class1.isInstance(events.peek())) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public boolean checkEvent(Class<? extends Event> choice) {
+ List<Class<? extends Event>> list = new ArrayList<Class<? extends Event>>(1);
+ list.add(choice);
+ return checkEvent(list);
+ }
+
+ public Event peekEvent() {
+ if (!parsed) {
+ parse();
+ }
+ if (events.isEmpty()) {
+ return null;
+ } else {
+ return events.get(0);
+ }
+ }
+
+}
diff --git a/src/test/java/org/pyyaml/CanonicalScanner.java b/src/test/java/org/pyyaml/CanonicalScanner.java
new file mode 100644
index 00000000..146cdf98
--- /dev/null
+++ b/src/test/java/org/pyyaml/CanonicalScanner.java
@@ -0,0 +1,301 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.pyyaml;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.yaml.snakeyaml.error.Mark;
+import org.yaml.snakeyaml.scanner.Scanner;
+import org.yaml.snakeyaml.scanner.ScannerImpl;
+import org.yaml.snakeyaml.tokens.AliasToken;
+import org.yaml.snakeyaml.tokens.AnchorToken;
+import org.yaml.snakeyaml.tokens.DirectiveToken;
+import org.yaml.snakeyaml.tokens.DocumentStartToken;
+import org.yaml.snakeyaml.tokens.FlowEntryToken;
+import org.yaml.snakeyaml.tokens.FlowMappingEndToken;
+import org.yaml.snakeyaml.tokens.FlowMappingStartToken;
+import org.yaml.snakeyaml.tokens.FlowSequenceEndToken;
+import org.yaml.snakeyaml.tokens.FlowSequenceStartToken;
+import org.yaml.snakeyaml.tokens.KeyToken;
+import org.yaml.snakeyaml.tokens.ScalarToken;
+import org.yaml.snakeyaml.tokens.StreamEndToken;
+import org.yaml.snakeyaml.tokens.StreamStartToken;
+import org.yaml.snakeyaml.tokens.TagToken;
+import org.yaml.snakeyaml.tokens.Token;
+import org.yaml.snakeyaml.tokens.ValueToken;
+
+public class CanonicalScanner implements Scanner {
+ private static final String DIRECTIVE = "%YAML 1.1";
+ private final static Map<Character, Integer> QUOTE_CODES = ScannerImpl.ESCAPE_CODES;
+
+ private final static Map<Character, String> QUOTE_REPLACES = ScannerImpl.ESCAPE_REPLACEMENTS;
+
+ private String data;
+ private int index;
+ public LinkedList<Token> tokens;
+ private boolean scanned;
+ private Mark mark;
+
+ public CanonicalScanner(String data) {
+ this.data = data + "\0";
+ this.index = 0;
+ this.tokens = new LinkedList<Token>();
+ this.scanned = false;
+ this.mark = new Mark("test", 0, 0, 0, data, 0);
+ }
+
+ public boolean checkToken(List<Class<? extends Token>> choices) {
+ if (!scanned) {
+ scan();
+ }
+ if (!tokens.isEmpty()) {
+ if (choices.isEmpty()) {
+ return true;
+ }
+ Token first = this.tokens.get(0);
+ for (Class<? extends Token> choice : choices) {
+ if (choice.isInstance(first)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public boolean checkToken(Class<? extends Token> choice) {
+ List<Class<? extends Token>> list = new ArrayList<Class<? extends Token>>();
+ list.add(choice);
+ return checkToken(list);
+ }
+
+ public Token peekToken() {
+ if (!scanned) {
+ scan();
+ }
+ if (!tokens.isEmpty()) {
+ Token first = this.tokens.get(0);
+ return first;
+ }
+ return null;
+ }
+
+ public Token getToken() {
+ if (!scanned) {
+ scan();
+ }
+ Token token = this.tokens.poll();
+ return token;
+ }
+
+ public Token getToken(Class<? extends Token> choice) {
+ Token token = getToken();
+ if (choice != null && !choice.isInstance(token)) {
+ throw new CanonicalException("unexpected token " + token);
+ }
+ return token;
+ }
+
+ private void scan() {
+ this.tokens.add(new StreamStartToken(mark, mark));
+ boolean stop = false;
+ while (!stop) {
+ findToken();
+ char ch = data.charAt(index);
+ switch (ch) {
+ case '\0':
+ tokens.add(new StreamEndToken(mark, mark));
+ stop = true;
+ break;
+
+ case '%':
+ tokens.add(scanDirective());
+ break;
+
+ case '-':
+ if ("---".equals(data.substring(index, index + 3))) {
+ index += 3;
+ tokens.add(new DocumentStartToken(mark, mark));
+ }
+ break;
+
+ case '[':
+ index++;
+ tokens.add(new FlowSequenceStartToken(mark, mark));
+ break;
+
+ case '{':
+ index++;
+ tokens.add(new FlowMappingStartToken(mark, mark));
+ break;
+
+ case ']':
+ index++;
+ tokens.add(new FlowSequenceEndToken(mark, mark));
+ break;
+
+ case '}':
+ index++;
+ tokens.add(new FlowMappingEndToken(mark, mark));
+ break;
+
+ case '?':
+ index++;
+ tokens.add(new KeyToken(mark, mark));
+ break;
+
+ case ':':
+ index++;
+ tokens.add(new ValueToken(mark, mark));
+ break;
+
+ case ',':
+ index++;
+ tokens.add(new FlowEntryToken(mark, mark));
+ break;
+
+ case '*':
+ tokens.add(scanAlias());
+ break;
+
+ case '&':
+ tokens.add(scanAlias());
+ break;
+
+ case '!':
+ tokens.add(scanTag());
+ break;
+
+ case '"':
+ tokens.add(scanScalar());
+ break;
+
+ default:
+ throw new CanonicalException("invalid token");
+ }
+ }
+ scanned = true;
+ }
+
+ private Token scanDirective() {
+ String chunk1 = data.substring(index, index + DIRECTIVE.length());
+ char chunk2 = data.charAt(index + DIRECTIVE.length());
+ if (DIRECTIVE.equals(chunk1) && "\n\0".indexOf(chunk2) != -1) {
+ index += DIRECTIVE.length();
+ List<Integer> implicit = new ArrayList<Integer>(2);
+ implicit.add(new Integer(1));
+ implicit.add(new Integer(1));
+ return new DirectiveToken("YAML", implicit, mark, mark);
+ } else {
+ throw new CanonicalException("invalid directive");
+ }
+ }
+
+ private Token scanAlias() {
+ boolean isTokenClassAlias;
+ if (data.charAt(index) == '*') {
+ isTokenClassAlias = true;
+ } else {
+ isTokenClassAlias = false;
+ }
+ index++;
+ int start = index;
+ while (", \n\0".indexOf(data.charAt(index)) == -1) {
+ index++;
+ }
+ String value = data.substring(start, index);
+ Token token;
+ if (isTokenClassAlias) {
+ token = new AliasToken(value, mark, mark);
+ } else {
+ token = new AnchorToken(value, mark, mark);
+ }
+ return token;
+ }
+
+ private Token scanTag() {
+ index++;
+ int start = index;
+ while (" \n\0".indexOf(data.charAt(index)) == -1) {
+ index++;
+ }
+ String value = data.substring(start, index);
+ if (value.length() == 0) {
+ value = "!";
+ } else if (value.charAt(0) == '!') {
+ value = "tag:yaml.org,2002:" + value.substring(1);
+ } else if (value.charAt(0) == '<' && value.charAt(value.length() - 1) == '>') {
+ value = value.substring(1, value.length() - 1);
+ } else {
+ value = "!" + value;
+ }
+ return new TagToken(new String[] { "", value }, mark, mark);
+ }
+
+ private Token scanScalar() {
+ index++;
+ StringBuffer chunks = new StringBuffer();
+ int start = index;
+ boolean ignoreSpaces = false;
+ while (data.charAt(index) != '"') {
+ if (data.charAt(index) == '\\') {
+ ignoreSpaces = false;
+ chunks.append(data.substring(start, index));
+ index++;
+ char ch = data.charAt(index);
+ index++;
+ if (ch == '\n') {
+ ignoreSpaces = true;
+ } else if (QUOTE_CODES.keySet().contains(ch)) {
+ int length = QUOTE_CODES.get(ch);
+ int code = Integer.parseInt(data.substring(index, index + length), 16);
+ chunks.append(String.valueOf((char) code));
+ index += length;
+ } else {
+ if (!QUOTE_REPLACES.keySet().contains(ch)) {
+ throw new CanonicalException("invalid escape code");
+ }
+ chunks.append(QUOTE_REPLACES.get(ch));
+ }
+ start = index;
+ } else if (data.charAt(index) == '\n') {
+ chunks.append(data.substring(start, index));
+ chunks.append(" ");
+ index++;
+ start = index;
+ ignoreSpaces = true;
+ } else if (ignoreSpaces && data.charAt(index) == ' ') {
+ index++;
+ start = index;
+ } else {
+ ignoreSpaces = false;
+ index++;
+ }
+ }
+ chunks.append(data.substring(start, index));
+ index++;
+ return new ScalarToken(chunks.toString(), mark, mark, false);
+ }
+
+ private void findToken() {
+ boolean found = false;
+ while (!found) {
+ while (" \t".indexOf(data.charAt(index)) != -1) {
+ index++;
+ }
+ if (data.charAt(index) == '#') {
+ while (data.charAt(index) != '\n') {
+ index++;
+ }
+ }
+ if (data.charAt(index) == '\n') {
+ index++;
+ } else {
+ found = true;
+ }
+ }
+ }
+}
diff --git a/src/test/java/org/pyyaml/PyCanonicalTest.java b/src/test/java/org/pyyaml/PyCanonicalTest.java
new file mode 100644
index 00000000..41a9e8e2
--- /dev/null
+++ b/src/test/java/org/pyyaml/PyCanonicalTest.java
@@ -0,0 +1,53 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.pyyaml;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.yaml.snakeyaml.events.Event;
+import org.yaml.snakeyaml.tokens.Token;
+
+/**
+ * @see imported from PyYAML
+ */
+public class PyCanonicalTest extends PyImportTest {
+
+ public void testCanonicalScanner() throws IOException {
+ File[] files = getStreamsByExtension(".canonical");
+ assertTrue("No test files found.", files.length > 0);
+ for (int i = 0; i < files.length; i++) {
+ List<Token> tokens = canonicalScan(new FileInputStream(files[i]));
+ assertFalse(tokens.isEmpty());
+ }
+ }
+
+ private List<Token> canonicalScan(InputStream input) throws IOException {
+ int ch = input.read();
+ StringBuffer buffer = new StringBuffer();
+ while (ch != -1) {
+ buffer.append((char) ch);
+ ch = input.read();
+ }
+ CanonicalScanner scanner = new CanonicalScanner(buffer.toString());
+ List<Token> result = new LinkedList<Token>();
+ while (scanner.peekToken() != null) {
+ result.add(scanner.getToken());
+ }
+ return result;
+ }
+
+ public void testCanonicalParser() throws IOException {
+ File[] files = getStreamsByExtension(".canonical");
+ assertTrue("No test files found.", files.length > 0);
+ for (int i = 0; i < files.length; i++) {
+ List<Event> tokens = canonicalParse(new FileInputStream(files[i]));
+ assertFalse(tokens.isEmpty());
+ }
+ }
+}
diff --git a/src/test/java/org/pyyaml/PyEmitterTest.java b/src/test/java/org/pyyaml/PyEmitterTest.java
new file mode 100644
index 00000000..f2de9a65
--- /dev/null
+++ b/src/test/java/org/pyyaml/PyEmitterTest.java
@@ -0,0 +1,284 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.pyyaml;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.Loader;
+import org.yaml.snakeyaml.emitter.Emitter;
+import org.yaml.snakeyaml.emitter.EventsLoader;
+import org.yaml.snakeyaml.events.CollectionStartEvent;
+import org.yaml.snakeyaml.events.Event;
+import org.yaml.snakeyaml.events.MappingStartEvent;
+import org.yaml.snakeyaml.events.NodeEvent;
+import org.yaml.snakeyaml.events.ScalarEvent;
+import org.yaml.snakeyaml.events.SequenceStartEvent;
+import org.yaml.snakeyaml.parser.Parser;
+import org.yaml.snakeyaml.parser.ParserImpl;
+import org.yaml.snakeyaml.reader.Reader;
+import org.yaml.snakeyaml.reader.UnicodeReader;
+
+/**
+ * @see imported from PyYAML
+ */
+public class PyEmitterTest extends PyImportTest {
+ public void testEmitterOnData() throws IOException {
+ _testEmitter(".data", false);
+ }
+
+ public void testEmitterOnCanonicalNormally() throws IOException {
+ _testEmitter(".canonical", false);
+ }
+
+ public void testEmitterOnCanonicalCanonically() throws IOException {
+ _testEmitter(".canonical", true);
+ }
+
+ private void _testEmitter(String mask, boolean canonical) throws IOException {
+ File[] files = getStreamsByExtension(mask, true);
+ assertTrue("No test files found.", files.length > 0);
+ for (File file : files) {
+ // if (!file.getName().contains("spec-06-01.canonical")) {
+ // continue;
+ // }
+ try {
+ List<Event> events = parse(new FileInputStream(file));
+ //
+ StringWriter stream = new StringWriter();
+ DumperOptions options = new DumperOptions();
+ options.setCanonical(canonical);
+ Emitter emitter = new Emitter(stream, options);
+ for (Event event : events) {
+ emitter.emit(event);
+ }
+ //
+ String data = stream.toString();
+ List<Event> newEvents = new LinkedList<Event>();
+ Reader reader = new Reader(data);
+ Parser parser = new ParserImpl(reader);
+ while (parser.peekEvent() != null) {
+ Event event = parser.getEvent();
+ newEvents.add(event);
+ }
+ // check
+ assertEquals(events.size(), newEvents.size());
+ Iterator<Event> iter1 = events.iterator();
+ Iterator<Event> iter2 = newEvents.iterator();
+ while (iter1.hasNext()) {
+ Event event = iter1.next();
+ Event newEvent = iter2.next();
+ assertEquals(event.getClass().getName(), newEvent.getClass().getName());
+ if (event instanceof NodeEvent) {
+ NodeEvent e1 = (NodeEvent) event;
+ NodeEvent e2 = (NodeEvent) newEvent;
+ assertEquals(e1.getAnchor(), e2.getAnchor());
+ }
+ if (event instanceof CollectionStartEvent) {
+ CollectionStartEvent e1 = (CollectionStartEvent) event;
+ CollectionStartEvent e2 = (CollectionStartEvent) newEvent;
+ assertEquals(e1.getTag(), e2.getTag());
+ }
+ if (event instanceof ScalarEvent) {
+ ScalarEvent e1 = (ScalarEvent) event;
+ ScalarEvent e2 = (ScalarEvent) newEvent;
+ boolean[] implicit1 = e1.getImplicit();
+ boolean[] implicit2 = e2.getImplicit();
+ if (!implicit1[0] && !implicit1[1] && !implicit2[0] && !implicit2[1]) {
+ assertEquals(e1.getTag(), e2.getTag());
+ }
+ assertEquals(e1.getValue(), e2.getValue());
+ }
+ }
+ } catch (Exception e) {
+ System.out.println("Failed File: " + file);
+ // fail("Failed File: " + file + "; " + e.getMessage());
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testEmitterStyles() throws IOException {
+ File[] canonicalFiles = getStreamsByExtension(".canonical", false);
+ assertTrue("No test files found.", canonicalFiles.length > 0);
+ File[] dataFiles = getStreamsByExtension(".data", true);
+ assertTrue("No test files found.", dataFiles.length > 0);
+ List<File> allFiles = new LinkedList(Arrays.asList(canonicalFiles));
+ allFiles.addAll(Arrays.asList(dataFiles));
+ for (File file : allFiles) {
+ try {
+ List<Event> events = new LinkedList<Event>();
+ Reader reader = new Reader(new UnicodeReader(new FileInputStream(file)));
+ Parser parser = new ParserImpl(reader);
+ while (parser.peekEvent() != null) {
+ Event event = parser.getEvent();
+ events.add(event);
+ }
+ //
+ for (Boolean flowStyle : new Boolean[] { Boolean.FALSE, Boolean.TRUE }) {
+ for (DumperOptions.DefaultScalarStyle style : DumperOptions.DefaultScalarStyle
+ .values()) {
+ List<Event> styledEvents = new LinkedList<Event>();
+ for (Event event : events) {
+ if (event instanceof ScalarEvent) {
+ ScalarEvent scalar = (ScalarEvent) event;
+ event = new ScalarEvent(scalar.getAnchor(), scalar.getTag(), scalar
+ .getImplicit(), scalar.getValue(), scalar.getStartMark(),
+ scalar.getEndMark(), style.getChar());
+ } else if (event instanceof SequenceStartEvent) {
+ SequenceStartEvent seqStart = (SequenceStartEvent) event;
+ event = new SequenceStartEvent(seqStart.getAnchor(), seqStart
+ .getTag(), seqStart.getImplicit(), seqStart.getStartMark(),
+ seqStart.getEndMark(), flowStyle);
+ } else if (event instanceof MappingStartEvent) {
+ MappingStartEvent mapStart = (MappingStartEvent) event;
+ event = new MappingStartEvent(mapStart.getAnchor(), mapStart
+ .getTag(), mapStart.getImplicit(), mapStart.getStartMark(),
+ mapStart.getEndMark(), flowStyle);
+ }
+ styledEvents.add(event);
+ }
+ // emit
+ String data = emit(styledEvents);
+ List<Event> newEvents = parse(data);
+ assertEquals("Events must not change. File: " + file, events.size(),
+ newEvents.size());
+ Iterator<Event> oldIter = events.iterator();
+ Iterator<Event> newIter = newEvents.iterator();
+ while (oldIter.hasNext()) {
+ Event event = oldIter.next();
+ Event newEvent = newIter.next();
+ assertEquals(event.getClass(), newEvent.getClass());
+ if (event instanceof NodeEvent) {
+ assertEquals(((NodeEvent) event).getAnchor(),
+ ((NodeEvent) newEvent).getAnchor());
+ }
+ if (event instanceof CollectionStartEvent) {
+ assertEquals(((CollectionStartEvent) event).getTag(),
+ ((CollectionStartEvent) newEvent).getTag());
+ }
+ if (event instanceof ScalarEvent) {
+ ScalarEvent scalarOld = (ScalarEvent) event;
+ ScalarEvent scalarNew = (ScalarEvent) newEvent;
+ boolean[] oldImplicit = scalarOld.getImplicit();
+ boolean[] newImplicit = scalarNew.getImplicit();
+ if (!oldImplicit[0] && !oldImplicit[1] && !newImplicit[0]
+ && !newImplicit[1]) {
+ assertEquals(scalarOld.getTag(), scalarNew.getTag());
+ }
+ assertEquals(scalarOld.getValue(), scalarNew.getValue());
+ }
+ }
+ }
+ }
+
+ } catch (Exception e) {
+ System.out.println("Failed File: " + file);
+ // fail("Failed File: " + file + "; " + e.getMessage());
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ private String emit(List<Event> events) throws IOException {
+ StringWriter writer = new StringWriter();
+ Emitter emitter = new Emitter(writer, new DumperOptions());
+ for (Event event : events) {
+ emitter.emit(event);
+ }
+ return writer.toString();
+ }
+
+ private List<Event> parse(String data) {
+ ParserImpl parser = new ParserImpl(new Reader(data));
+ List<Event> newEvents = new LinkedList<Event>();
+ while (parser.peekEvent() != null) {
+ newEvents.add(parser.getEvent());
+ }
+ return newEvents;
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testEmitterEvents() throws IOException {
+ File[] files = getStreamsByExtension(".events", false);
+ assertTrue("No test files found.", files.length > 0);
+ for (File file : files) {
+ // if (!file.getName().contains("spec-06-01.canonical")) {
+ // continue;
+ // }
+ try {
+ Loader loader = new EventsLoader();
+ List<Event> events = new LinkedList<Event>();
+ String content = getResource(file.getName());
+ events = (List<Event>) load(loader, content);
+ //
+ StringWriter stream = new StringWriter();
+ Emitter emitter = new Emitter(stream, new DumperOptions());
+ for (Event event : events) {
+ emitter.emit(event);
+ }
+ //
+ String data = stream.toString();
+ List<Event> newEvents = new LinkedList<Event>();
+ Reader reader = new Reader(data);
+ Parser parser = new ParserImpl(reader);
+ while (parser.peekEvent() != null) {
+ Event event = parser.getEvent();
+ newEvents.add(event);
+ }
+ // check
+ assertEquals(events.size(), newEvents.size());
+ Iterator<Event> iter1 = events.iterator();
+ Iterator<Event> iter2 = newEvents.iterator();
+ while (iter1.hasNext()) {
+ Event event = iter1.next();
+ Event newEvent = iter2.next();
+ assertEquals(event.getClass().getName(), newEvent.getClass().getName());
+ if (event instanceof NodeEvent) {
+ NodeEvent e1 = (NodeEvent) event;
+ NodeEvent e2 = (NodeEvent) newEvent;
+ assertEquals(e1.getAnchor(), e2.getAnchor());
+ }
+ if (event instanceof CollectionStartEvent) {
+ CollectionStartEvent e1 = (CollectionStartEvent) event;
+ CollectionStartEvent e2 = (CollectionStartEvent) newEvent;
+ assertEquals(e1.getTag(), e2.getTag());
+ }
+ if (event instanceof ScalarEvent) {
+ ScalarEvent e1 = (ScalarEvent) event;
+ ScalarEvent e2 = (ScalarEvent) newEvent;
+ boolean[] implicit1 = e1.getImplicit();
+ boolean[] implicit2 = e2.getImplicit();
+ if (implicit1[0] == implicit2[0] && implicit1[1] == implicit2[1]) {
+
+ } else {
+ if ((e1.getTag() == null || e2.getTag() == null)
+ || e1.getTag().equals(e2.getTag())) {
+
+ } else {
+ System.out.println("tag1: " + e1.getTag());
+ System.out.println("tag2: " + e2.getTag());
+ fail("in file: " + file);
+ }
+ }
+ assertEquals(e1.getValue(), e2.getValue());
+ }
+ }
+ } catch (Exception e) {
+ System.out.println("Failed File: " + file);
+ // fail("Failed File: " + file + "; " + e.getMessage());
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+}
diff --git a/src/test/java/org/pyyaml/PyErrorsTest.java b/src/test/java/org/pyyaml/PyErrorsTest.java
new file mode 100644
index 00000000..8eb46962
--- /dev/null
+++ b/src/test/java/org/pyyaml/PyErrorsTest.java
@@ -0,0 +1,120 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.pyyaml;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.Loader;
+import org.yaml.snakeyaml.constructor.Constructor;
+import org.yaml.snakeyaml.emitter.Emitter;
+import org.yaml.snakeyaml.emitter.EventConstructor;
+import org.yaml.snakeyaml.error.YAMLException;
+import org.yaml.snakeyaml.events.Event;
+
+/**
+ * @see imported from PyYAML
+ */
+public class PyErrorsTest extends PyImportTest {
+ private boolean skip(String filename) {
+ List<String> failures = new ArrayList<String>();
+ // in python list cannot be a key in a dictionary.
+ failures.add("unacceptable-key.loader-error");
+ for (String name : failures) {
+ if (name.equals(filename)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void testLoaderErrors() throws FileNotFoundException {
+ File[] files = getStreamsByExtension(".loader-error");
+ assertTrue("No test files found.", files.length > 0);
+ for (int i = 0; i < files.length; i++) {
+ if (skip(files[i].getName())) {
+ continue;
+ }
+ try {
+ for (Object document : loadAll(new FileInputStream(files[i]))) {
+ assertNotNull("File " + files[i], document);
+ }
+ fail("Loading must fail for " + files[i].getAbsolutePath());
+ // System.err.println("Loading must fail for " +
+ // files[i].getAbsolutePath());
+ } catch (Exception e) {
+ assertTrue(true);
+ }
+ }
+ }
+
+ public void testLoaderStringErrors() throws FileNotFoundException {
+ File[] files = getStreamsByExtension(".loader-error");
+ assertTrue("No test files found.", files.length > 0);
+ for (int i = 0; i < files.length; i++) {
+ if (skip(files[i].getName())) {
+ continue;
+ }
+ try {
+ String content = getResource(files[i].getName());
+ for (Object document : loadAll(content.trim())) {
+ assertNotNull(document);
+ }
+ fail("Loading must fail for " + files[i].getAbsolutePath());
+ // System.err.println("Loading must fail for " +
+ // files[i].getAbsolutePath());
+ } catch (Exception e) {
+ assertTrue(true);
+ }
+ }
+ }
+
+ public void testLoaderSingleErrors() throws FileNotFoundException {
+ File[] files = getStreamsByExtension(".single-loader-error");
+ assertTrue("No test files found.", files.length > 0);
+ for (int i = 0; i < files.length; i++) {
+ try {
+ String content = getResource(files[i].getName());
+ load(content.trim());
+ fail("Loading must fail for " + files[i].getAbsolutePath());
+ // multiple documents must not be accepted
+ System.err.println("Loading must fail for " + files[i].getAbsolutePath());
+ } catch (YAMLException e) {
+ assertTrue(true);
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testEmitterErrors() {
+ File[] files = getStreamsByExtension(".emitter-error");
+ assertTrue("No test files found.", files.length > 0);
+ for (int i = 0; i < files.length; i++) {
+ Constructor constructor = new EventConstructor();
+ Loader loader = new Loader(constructor);
+ String content = getResource(files[i].getName());
+ List<Event> document = (List<Event>) load(loader, content.trim());
+ Writer writer = new StringWriter();
+ Emitter emitter = new Emitter(writer, new DumperOptions());
+ try {
+ for (Event event : document) {
+ emitter.emit(event);
+ }
+ fail("Loading must fail for " + files[i].getAbsolutePath());
+ // System.err.println("Loading must fail for " +
+ // files[i].getAbsolutePath());
+ } catch (Exception e) {
+ assertTrue(true);
+ }
+ }
+ }
+
+ // testDumperErrors() is implemented in SerializerTest.java
+}
diff --git a/src/test/java/org/pyyaml/PyImportTest.java b/src/test/java/org/pyyaml/PyImportTest.java
new file mode 100644
index 00000000..5bc7fe77
--- /dev/null
+++ b/src/test/java/org/pyyaml/PyImportTest.java
@@ -0,0 +1,128 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.pyyaml;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.LinkedList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.Loader;
+import org.yaml.snakeyaml.Util;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.events.Event;
+import org.yaml.snakeyaml.parser.Parser;
+import org.yaml.snakeyaml.parser.ParserImpl;
+import org.yaml.snakeyaml.reader.Reader;
+import org.yaml.snakeyaml.reader.UnicodeReader;
+
+public abstract class PyImportTest extends TestCase {
+ public static final String PATH = "pyyaml";
+
+ protected Object load(String data) {
+ Yaml yaml = new Yaml();
+ Object obj = yaml.load(data);
+ return obj;
+ }
+
+ protected Object load(Loader loader, String data) {
+ Yaml yaml = new Yaml(loader);
+ Object obj = yaml.load(data);
+ return obj;
+ }
+
+ protected Iterable<Object> loadAll(InputStream data) {
+ Yaml yaml = new Yaml();
+ return yaml.loadAll(data);
+ }
+
+ protected Iterable<Object> loadAll(String data) {
+ Yaml yaml = new Yaml();
+ return yaml.loadAll(data);
+ }
+
+ protected Iterable<Object> loadAll(Loader loader, String data) {
+ Yaml yaml = new Yaml(loader);
+ return yaml.loadAll(data);
+ }
+
+ protected String getResource(String theName) {
+ try {
+ String content;
+ content = Util.getLocalResource(PATH + File.separator + theName);
+ return content;
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ protected File[] getStreamsByExtension(String extention) {
+ return getStreamsByExtension(extention, false);
+ }
+
+ protected File[] getStreamsByExtension(String extention, boolean onlyIfCanonicalPresent) {
+ File file = new File("src/test/resources/pyyaml");
+ assertTrue("Folder not found: " + file.getAbsolutePath(), file.exists());
+ assertTrue(file.isDirectory());
+ File[] files = file.listFiles(new PyFilenameFilter(extention, onlyIfCanonicalPresent));
+ return files;
+ }
+
+ protected File getFileByName(String name) {
+ File file = new File("src/test/resources/pyyaml/" + name);
+ assertTrue("Folder not found: " + file.getAbsolutePath(), file.exists());
+ assertTrue(file.isFile());
+ return file;
+ }
+
+ protected List<Event> canonicalParse(InputStream input2) throws IOException {
+ Reader reader = new Reader(new UnicodeReader(input2));
+ StringBuffer buffer = new StringBuffer();
+ while (reader.peek() != '\0') {
+ buffer.append(reader.peek());
+ reader.forward();
+ }
+ CanonicalParser parser = new CanonicalParser(buffer.toString());
+ List<Event> result = new LinkedList<Event>();
+ while (parser.peekEvent() != null) {
+ result.add(parser.getEvent());
+ }
+ return result;
+ }
+
+ protected List<Event> parse(InputStream input) throws IOException {
+ Reader reader = new Reader(new UnicodeReader(input));
+ Parser parser = new ParserImpl(reader);
+ List<Event> result = new LinkedList<Event>();
+ while (parser.peekEvent() != null) {
+ result.add(parser.getEvent());
+ }
+ return result;
+ }
+
+ private class PyFilenameFilter implements FilenameFilter {
+ private String extension;
+ private boolean onlyIfCanonicalPresent;
+
+ public PyFilenameFilter(String extension, boolean onlyIfCanonicalPresent) {
+ this.extension = extension;
+ this.onlyIfCanonicalPresent = onlyIfCanonicalPresent;
+ }
+
+ public boolean accept(File dir, String name) {
+ int position = name.lastIndexOf('.');
+ String canonicalFileName = name.substring(0, position) + ".canonical";
+ File canonicalFile = new File(dir, canonicalFileName);
+ if (onlyIfCanonicalPresent && !canonicalFile.exists()) {
+ return false;
+ } else {
+ return name.endsWith(extension);
+ }
+ }
+ }
+}
diff --git a/src/test/java/org/pyyaml/PyMarkTest.java b/src/test/java/org/pyyaml/PyMarkTest.java
new file mode 100644
index 00000000..fe078385
--- /dev/null
+++ b/src/test/java/org/pyyaml/PyMarkTest.java
@@ -0,0 +1,45 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.pyyaml;
+
+import org.yaml.snakeyaml.error.Mark;
+
+/**
+ * @see imported from PyYAML
+ */
+public class PyMarkTest extends PyImportTest {
+
+ public void testMarks() {
+ String content = getResource("test_mark.marks");
+ String[] inputs = content.split("---\n");
+ for (int i = 1; i < inputs.length; i++) {
+ String input = inputs[i];
+ int index = 0;
+ int line = 0;
+ int column = 0;
+ while (input.charAt(index) != '*') {
+ if (input.charAt(index) != '\n') {
+ line += 1;
+ column = 0;
+ } else {
+ column += 1;
+ }
+ index += 1;
+ }
+ Mark mark = new Mark("testMarks", index, line, column, input, index);
+ String snippet = mark.get_snippet(2, 79);
+ assertTrue("Must only have one '\n'.", snippet.indexOf("\n") > -1);
+ assertEquals("Must only have only one '\n'.", snippet.indexOf("\n"), snippet
+ .lastIndexOf("\n"));
+ String[] lines = snippet.split("\n");
+ String data = lines[0];
+ String pointer = lines[1];
+ assertTrue("Mark must be restricted: " + data, data.length() < 82);
+ int dataPosition = data.indexOf("*");
+ int pointerPosition = pointer.indexOf("^");
+ assertEquals("Pointer should coincide with '*':\n " + snippet, dataPosition,
+ pointerPosition);
+ }
+ }
+}
diff --git a/src/test/java/org/pyyaml/PyReaderTest.java b/src/test/java/org/pyyaml/PyReaderTest.java
new file mode 100644
index 00000000..c9891d76
--- /dev/null
+++ b/src/test/java/org/pyyaml/PyReaderTest.java
@@ -0,0 +1,36 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.pyyaml;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+
+import org.yaml.snakeyaml.reader.Reader;
+import org.yaml.snakeyaml.reader.ReaderException;
+import org.yaml.snakeyaml.reader.UnicodeReader;
+
+/**
+ * @see imported from PyYAML
+ */
+public class PyReaderTest extends PyImportTest {
+
+ public void testReaderUnicodeErrors() throws IOException {
+ File[] inputs = getStreamsByExtension(".stream-error");
+ for (int i = 0; i < inputs.length; i++) {
+ Reader stream = new Reader(new UnicodeReader(new FileInputStream(inputs[i])));
+ try {
+ while (stream.peek() != '\u0000') {
+ stream.forward();
+ }
+ fail("Invalid stream must not be accepted: " + inputs[i].getAbsolutePath()
+ + "; encoding=" + stream.getEncoding());
+ } catch (ReaderException e) {
+ System.out.println(e.toString());
+ assertTrue(true);
+ }
+ }
+ }
+
+}
diff --git a/src/test/java/org/pyyaml/PyRecursiveTest.java b/src/test/java/org/pyyaml/PyRecursiveTest.java
new file mode 100644
index 00000000..14fb5d51
--- /dev/null
+++ b/src/test/java/org/pyyaml/PyRecursiveTest.java
@@ -0,0 +1,63 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.pyyaml;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.ConstructorException;
+
+public class PyRecursiveTest extends TestCase {
+
+ @SuppressWarnings("unchecked")
+ public void testDict() {
+ Map<AnInstance, AnInstance> value = new HashMap<AnInstance, AnInstance>();
+ AnInstance instance = new AnInstance(value, value);
+ value.put(instance, instance);
+ Yaml yaml = new Yaml();
+ try {
+ String output1 = yaml.dump(value);
+ Map<AnInstance, AnInstance> value2 = (Map<AnInstance, AnInstance>) yaml.load(output1);
+ assertEquals(value, value2);
+ } catch (ConstructorException e) {
+ // TODO recursive objects are not allowed
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testList() {
+ List value = new ArrayList();
+ value.add(value);
+ Yaml yaml = new Yaml();
+ try {
+ String output1 = yaml.dump(value);
+ System.out.println(output1);
+ List value2 = (List) yaml.load(output1);
+ assertEquals(value, value2);
+ } catch (ConstructorException e) {
+ // TODO recursive objects are not allowed
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testSet() {
+ Set value = new HashSet();
+ value.add(new AnInstance(value, value));
+ Yaml yaml = new Yaml();
+ try {
+ String output1 = yaml.dump(value);
+ List value2 = (List) yaml.load(output1);
+ assertEquals(value, value2);
+ } catch (ConstructorException e) {
+ // TODO recursive objects are not allowed
+ }
+ }
+}
diff --git a/src/test/java/org/pyyaml/PyStructureTest.java b/src/test/java/org/pyyaml/PyStructureTest.java
new file mode 100644
index 00000000..0362ee5c
--- /dev/null
+++ b/src/test/java/org/pyyaml/PyStructureTest.java
@@ -0,0 +1,287 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.pyyaml;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.yaml.snakeyaml.Loader;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.composer.Composer;
+import org.yaml.snakeyaml.constructor.Construct;
+import org.yaml.snakeyaml.constructor.Constructor;
+import org.yaml.snakeyaml.events.AliasEvent;
+import org.yaml.snakeyaml.events.CollectionStartEvent;
+import org.yaml.snakeyaml.events.Event;
+import org.yaml.snakeyaml.events.ScalarEvent;
+import org.yaml.snakeyaml.nodes.MappingNode;
+import org.yaml.snakeyaml.nodes.Node;
+import org.yaml.snakeyaml.nodes.ScalarNode;
+import org.yaml.snakeyaml.nodes.SequenceNode;
+import org.yaml.snakeyaml.parser.ParserImpl;
+import org.yaml.snakeyaml.reader.Reader;
+import org.yaml.snakeyaml.reader.UnicodeReader;
+import org.yaml.snakeyaml.resolver.Resolver;
+
+/**
+ * @see imported from PyYAML
+ */
+public class PyStructureTest extends PyImportTest {
+
+ private void compareEvents(List<Event> events1, List<Event> events2, boolean full) {
+ assertEquals(events1.size(), events2.size());
+ Iterator<Event> iter1 = events1.iterator();
+ Iterator<Event> iter2 = events2.iterator();
+ while (iter1.hasNext()) {
+ Event event1 = iter1.next();
+ Event event2 = iter2.next();
+ assertEquals(event1.getClass(), event2.getClass());
+ if (event1 instanceof AliasEvent && full) {
+ assertEquals(((AliasEvent) event1).getAnchor(), ((AliasEvent) event2).getAnchor());
+ }
+ if (event1 instanceof CollectionStartEvent) {
+ String tag1 = ((CollectionStartEvent) event1).getTag();
+ String tag2 = ((CollectionStartEvent) event1).getTag();
+ if (tag1 != null && !"!".equals(tag1) && tag2 != null && !"!".equals(tag1)) {
+ assertEquals(tag1, tag2);
+ }
+ }
+ if (event1 instanceof ScalarEvent) {
+ ScalarEvent scalar1 = (ScalarEvent) event1;
+ ScalarEvent scalar2 = (ScalarEvent) event2;
+ boolean[] oldImplicit = scalar1.getImplicit();
+ boolean[] newImplicit = scalar2.getImplicit();
+ if (!oldImplicit[0] && !oldImplicit[1] && !newImplicit[0] && !newImplicit[1]) {
+ assertEquals(scalar1.getTag(), scalar2.getTag());
+ }
+ assertEquals(scalar1.getValue(), scalar2.getValue());
+ }
+ }
+ }
+
+ public void testParser() throws IOException {
+ File[] files = getStreamsByExtension(".data", true);
+ assertTrue("No test files found.", files.length > 0);
+ for (File file : files) {
+ if (!file.getName().contains("scan-line-b")) {
+ continue;
+ }
+ try {
+ List<Event> events1 = parse(new FileInputStream(file));
+ assertFalse(events1.isEmpty());
+ int index = file.getAbsolutePath().lastIndexOf('.');
+ String canonicalName = file.getAbsolutePath().substring(0, index) + ".canonical";
+ File canonical = new File(canonicalName);
+ List<Event> events2 = canonicalParse(new FileInputStream(canonical));
+ assertFalse(events2.isEmpty());
+ System.out.println("try:" + file);
+ compareEvents(events1, events2, false);
+ } catch (Exception e) {
+ System.out.println("Failed File: " + file);
+ // fail("Failed File: " + file + "; " + e.getMessage());
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ public void testParserOnCanonical() throws IOException {
+ File[] canonicalFiles = getStreamsByExtension(".canonical", false);
+ assertTrue("No test files found.", canonicalFiles.length > 0);
+ for (File file : canonicalFiles) {
+ try {
+ List<Event> events1 = parse(new FileInputStream(file));
+ assertFalse(events1.isEmpty());
+ List<Event> events2 = canonicalParse(new FileInputStream(file));
+ assertFalse(events2.isEmpty());
+ compareEvents(events1, events2, true);
+ } catch (Exception e) {
+ System.out.println("Failed File: " + file);
+ // fail("Failed File: " + file + "; " + e.getMessage());
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ private void compareNodes(Node node1, Node node2) {
+ assertEquals(node1.getClass(), node2.getClass());
+ if (node1 instanceof ScalarNode) {
+ ScalarNode scalar1 = (ScalarNode) node1;
+ ScalarNode scalar2 = (ScalarNode) node2;
+ assertEquals(scalar1.getTag(), scalar2.getTag());
+ assertEquals(scalar1.getValue(), scalar2.getValue());
+ } else {
+ if (node1 instanceof SequenceNode) {
+ SequenceNode seq1 = (SequenceNode) node1;
+ SequenceNode seq2 = (SequenceNode) node2;
+ assertEquals(seq1.getTag(), seq2.getTag());
+ assertEquals(seq1.getValue().size(), seq2.getValue().size());
+ Iterator<Node> iter2 = seq2.getValue().iterator();
+ for (Node child1 : seq1.getValue()) {
+ Node child2 = iter2.next();
+ compareNodes(child1, child2);
+ }
+ } else {
+ MappingNode seq1 = (MappingNode) node1;
+ MappingNode seq2 = (MappingNode) node2;
+ assertEquals(seq1.getTag(), seq2.getTag());
+ assertEquals(seq1.getValue().size(), seq2.getValue().size());
+ Iterator<Node[]> iter2 = seq2.getValue().iterator();
+ for (Node[] child1 : seq1.getValue()) {
+ Node[] child2 = iter2.next();
+ compareNodes(child1[0], child2[0]);// keys
+ compareNodes(child1[1], child2[1]);// values
+ }
+ }
+ }
+ }
+
+ public void testComposer() throws IOException {
+ File[] files = getStreamsByExtension(".data", true);
+ assertTrue("No test files found.", files.length > 0);
+ for (File file : files) {
+ try {
+ List<Node> events1 = compose_all(new FileInputStream(file));
+ int index = file.getAbsolutePath().lastIndexOf('.');
+ String canonicalName = file.getAbsolutePath().substring(0, index) + ".canonical";
+ File canonical = new File(canonicalName);
+ List<Node> events2 = canonical_compose_all(new FileInputStream(canonical));
+ assertEquals(events1.size(), events2.size());
+ Iterator<Node> iter1 = events1.iterator();
+ Iterator<Node> iter2 = events2.iterator();
+ while (iter1.hasNext()) {
+ compareNodes(iter1.next(), iter2.next());
+ }
+ } catch (Exception e) {
+ System.out.println("Failed File: " + file);
+ // fail("Failed File: " + file + "; " + e.getMessage());
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ private List<Node> compose_all(InputStream file) {
+ Composer composer = new Composer(new ParserImpl(new Reader(new UnicodeReader(file))),
+ new Resolver());
+ List<Node> documents = new LinkedList<Node>();
+ while (composer.checkNode()) {
+ documents.add(composer.getNode());
+ }
+ return documents;
+ }
+
+ private List<Node> canonical_compose_all(InputStream file) {
+ Reader reader = new Reader(new UnicodeReader(file));
+ StringBuffer buffer = new StringBuffer();
+ while (reader.peek() != '\0') {
+ buffer.append(reader.peek());
+ reader.forward();
+ }
+ CanonicalParser parser = new CanonicalParser(buffer.toString());
+ Composer composer = new Composer(parser, new Resolver());
+ List<Node> documents = new LinkedList<Node>();
+ while (composer.checkNode()) {
+ documents.add(composer.getNode());
+ }
+ return documents;
+ }
+
+ class MyLoader extends Loader {
+ public MyLoader() {
+ super(new MyConstructor());
+ }
+ }
+
+ class CanonicalLoader extends Loader {
+ public CanonicalLoader() {
+ super(new MyConstructor());
+ }
+
+ @Override
+ public Iterable<Object> loadAll(java.io.Reader yaml) {
+ Reader reader = new Reader(yaml);
+ StringBuffer buffer = new StringBuffer();
+ while (reader.peek() != '\0') {
+ buffer.append(reader.peek());
+ reader.forward();
+ }
+ CanonicalParser parser = new CanonicalParser(buffer.toString());
+ Composer composer = new Composer(parser, resolver);
+ this.constructor.setComposer(composer);
+ Iterator<Object> result = new Iterator<Object>() {
+ public boolean hasNext() {
+ return constructor.checkData();
+ }
+
+ public Object next() {
+ return constructor.getData();
+ }
+
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ };
+ return new YamlIterable(result);
+ }
+
+ private class YamlIterable implements Iterable<Object> {
+ private Iterator<Object> iterator;
+
+ public YamlIterable(Iterator<Object> iterator) {
+ this.iterator = iterator;
+ }
+
+ public Iterator<Object> iterator() {
+ return iterator;
+ }
+
+ }
+
+ }
+
+ private class MyConstructor extends Constructor {
+ public MyConstructor() {
+ this.yamlConstructors.put(null, new ConstructUndefined());
+ }
+
+ private class ConstructUndefined implements Construct {
+ public Object construct(Node node) {
+ return constructScalar((ScalarNode) node);
+ }
+ }
+ }
+
+ public void testConstructor() throws IOException {
+ File[] files = getStreamsByExtension(".data", true);
+ assertTrue("No test files found.", files.length > 0);
+ Yaml myYaml = new Yaml(new MyLoader());
+ Yaml canonicalYaml = new Yaml(new CanonicalLoader());
+ for (File file : files) {
+ try {
+ Iterable<Object> documents1 = myYaml.loadAll(new FileInputStream(file));
+ int index = file.getAbsolutePath().lastIndexOf('.');
+ String canonicalName = file.getAbsolutePath().substring(0, index) + ".canonical";
+ File canonical = new File(canonicalName);
+ Iterable<Object> documents2 = canonicalYaml.loadAll(new FileInputStream(canonical));
+ Iterator<Object> iter2 = documents2.iterator();
+ for (Object object1 : documents1) {
+ Object object2 = iter2.next();
+ if (object2 != null) {
+ assertFalse(System.identityHashCode(object1) == System
+ .identityHashCode(object2));
+ }
+ assertEquals("" + object1, object1, object2);
+ }
+ } catch (Exception e) {
+ System.out.println("Failed File: " + file);
+ // fail("Failed File: " + file + "; " + e.getMessage());
+ throw new RuntimeException(e);
+ }
+ }
+ }
+}
diff --git a/src/test/java/org/pyyaml/PyTokensTest.java b/src/test/java/org/pyyaml/PyTokensTest.java
new file mode 100644
index 00000000..42f65948
--- /dev/null
+++ b/src/test/java/org/pyyaml/PyTokensTest.java
@@ -0,0 +1,140 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.pyyaml;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.yaml.snakeyaml.reader.Reader;
+import org.yaml.snakeyaml.reader.UnicodeReader;
+import org.yaml.snakeyaml.scanner.Scanner;
+import org.yaml.snakeyaml.scanner.ScannerImpl;
+import org.yaml.snakeyaml.tokens.AliasToken;
+import org.yaml.snakeyaml.tokens.AnchorToken;
+import org.yaml.snakeyaml.tokens.BlockEndToken;
+import org.yaml.snakeyaml.tokens.BlockEntryToken;
+import org.yaml.snakeyaml.tokens.BlockMappingStartToken;
+import org.yaml.snakeyaml.tokens.BlockSequenceStartToken;
+import org.yaml.snakeyaml.tokens.DirectiveToken;
+import org.yaml.snakeyaml.tokens.DocumentEndToken;
+import org.yaml.snakeyaml.tokens.DocumentStartToken;
+import org.yaml.snakeyaml.tokens.FlowEntryToken;
+import org.yaml.snakeyaml.tokens.FlowMappingEndToken;
+import org.yaml.snakeyaml.tokens.FlowMappingStartToken;
+import org.yaml.snakeyaml.tokens.FlowSequenceEndToken;
+import org.yaml.snakeyaml.tokens.FlowSequenceStartToken;
+import org.yaml.snakeyaml.tokens.KeyToken;
+import org.yaml.snakeyaml.tokens.ScalarToken;
+import org.yaml.snakeyaml.tokens.StreamEndToken;
+import org.yaml.snakeyaml.tokens.StreamStartToken;
+import org.yaml.snakeyaml.tokens.TagToken;
+import org.yaml.snakeyaml.tokens.Token;
+import org.yaml.snakeyaml.tokens.ValueToken;
+
+/**
+ * @see imported from PyYAML
+ */
+public class PyTokensTest extends PyImportTest {
+
+ @SuppressWarnings("unchecked")
+ public void testTokens() throws FileNotFoundException {
+ Map<Class, String> replaces = new HashMap<Class, String>();
+ replaces.put(DirectiveToken.class, "%");
+ replaces.put(DocumentStartToken.class, "---");
+ replaces.put(DocumentEndToken.class, "...");
+ replaces.put(AliasToken.class, "*");
+ replaces.put(AnchorToken.class, "&");
+ replaces.put(TagToken.class, "!");
+ replaces.put(ScalarToken.class, "_");
+ replaces.put(BlockSequenceStartToken.class, "[[");
+ replaces.put(BlockMappingStartToken.class, "{{");
+ replaces.put(BlockEndToken.class, "]}");
+ replaces.put(FlowSequenceStartToken.class, "[");
+ replaces.put(FlowSequenceEndToken.class, "]");
+ replaces.put(FlowMappingStartToken.class, "{");
+ replaces.put(FlowMappingEndToken.class, "}");
+ replaces.put(BlockEntryToken.class, ",");
+ replaces.put(FlowEntryToken.class, ",");
+ replaces.put(KeyToken.class, "?");
+ replaces.put(ValueToken.class, ":");
+ //
+ File[] tokensFiles = getStreamsByExtension(".tokens");
+ assertTrue("No test files found.", tokensFiles.length > 0);
+ for (int i = 0; i < tokensFiles.length; i++) {
+ String name = tokensFiles[i].getName();
+ int position = name.lastIndexOf('.');
+ String dataName = name.substring(0, position) + ".data";
+ //
+ String tokenFileData = getResource(name);
+ String[] split = tokenFileData.split("\\s+");
+ List<String> tokens2 = new LinkedList<String>();
+ for (int j = 0; j < split.length; j++) {
+ tokens2.add(split[j]);
+ }
+ //
+ List<String> tokens1 = new LinkedList<String>();
+ Reader reader = new Reader(new UnicodeReader(new FileInputStream(
+ getFileByName(dataName))));
+ Scanner scanner = new ScannerImpl(reader);
+ try {
+ while (scanner.checkToken(new ArrayList<Class<? extends Token>>())) {
+ Token token = scanner.getToken();
+ if (!(token instanceof StreamStartToken || token instanceof StreamEndToken)) {
+ String replacement = replaces.get(token.getClass());
+ tokens1.add(replacement);
+ }
+ }
+ // System.out.println("File name: \n" +
+ // tokensFiles[i].getName());
+ // Iterator iter = tokens2.iterator();
+ // for (String string : tokens1) {
+ // String str2 = (String) iter.next();
+ // System.out.println(string + "=" + str2);
+ // }
+ assertEquals(tokenFileData, tokens1.size(), tokens2.size());
+ assertEquals(tokens1, tokens2);
+ } catch (RuntimeException e) {
+ System.out.println("File name: \n" + tokensFiles[i].getName());
+ String data = getResource(tokensFiles[i].getName());
+ System.out.println("Data: \n" + data);
+ System.out.println("Tokens:");
+ for (String token : tokens1) {
+ System.out.println(token);
+ }
+ fail("Cannot scan: " + tokensFiles[i]);
+ }
+ }
+ }
+
+ public void testScanner() throws FileNotFoundException {
+ File[] files = getStreamsByExtension(".data", true);
+ assertTrue("No test files found.", files.length > 0);
+ for (File file : files) {
+ List<String> tokens = new LinkedList<String>();
+ Reader reader = new Reader(new UnicodeReader(new FileInputStream(file)));
+ Scanner scanner = new ScannerImpl(reader);
+ try {
+ while (scanner.checkToken(new ArrayList<Class<? extends Token>>())) {
+ Token token = scanner.getToken();
+ tokens.add(token.getClass().getName());
+ }
+ } catch (RuntimeException e) {
+ System.out.println("File name: \n" + file.getName());
+ String data = getResource(file.getName());
+ System.out.println("Data: \n" + data);
+ System.out.println("Tokens:");
+ for (String token : tokens) {
+ System.out.println(token);
+ }
+ fail("Cannot scan: " + file + "; " + e.getMessage());
+ }
+ }
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/Address.java b/src/test/java/org/yaml/snakeyaml/Address.java
new file mode 100644
index 00000000..e18fb5d0
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/Address.java
@@ -0,0 +1,11 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml;
+
+public class Address {
+ public String lines;
+ public String city;
+ public String state;
+ public String postal;
+} \ No newline at end of file
diff --git a/src/test/java/org/yaml/snakeyaml/BinaryBean.java b/src/test/java/org/yaml/snakeyaml/BinaryBean.java
new file mode 100644
index 00000000..026b1519
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/BinaryBean.java
@@ -0,0 +1,26 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml;
+
+public class BinaryBean {
+ byte[] data;
+ int id;
+
+ public byte[] getData() {
+ return data;
+ }
+
+ public void setData(byte[] data) {
+ this.data = data;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+} \ No newline at end of file
diff --git a/src/test/java/org/yaml/snakeyaml/BinaryJavaBeanTest.java b/src/test/java/org/yaml/snakeyaml/BinaryJavaBeanTest.java
new file mode 100644
index 00000000..7121c375
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/BinaryJavaBeanTest.java
@@ -0,0 +1,20 @@
+package org.yaml.snakeyaml;
+
+import junit.framework.TestCase;
+
+public class BinaryJavaBeanTest extends TestCase {
+ public void testBeanTest() {
+ BinaryBean bean = new BinaryBean();
+ bean.setId(1);
+ byte[] bytes = new byte[] { 1, 7, 9, 31, 65 };
+ bean.setData(bytes);
+ Yaml yaml = new Yaml();
+ String output = yaml.dump(bean);
+ String etalon = "!!org.yaml.snakeyaml.BinaryBean\ndata: !!binary |-\n AQcJH0E=\nid: 1\n";
+ assertEquals(etalon, output);
+ // load
+ BinaryBean bean2 = (BinaryBean) yaml.load(output);
+ assertEquals(1, bean2.getId());
+ assertEquals(new String(bytes), new String(bean2.getData()));
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/Chapter2_1Test.java b/src/test/java/org/yaml/snakeyaml/Chapter2_1Test.java
new file mode 100644
index 00000000..c66dfe0e
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/Chapter2_1Test.java
@@ -0,0 +1,96 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml;
+
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+/**
+ * Test Chapter 2.1 from the YAML specification
+ *
+ * @author py4fun
+ * @see http://yaml.org/spec/1.1/
+ */
+public class Chapter2_1Test extends TestCase {
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_1() {
+ YamlDocument document = new YamlDocument("example2_1.yaml");
+ List<String> list = (List<String>) document.getNativeData();
+ assertEquals(3, list.size());
+ assertEquals("Mark McGwire", list.get(0));
+ assertEquals("Sammy Sosa", list.get(1));
+ assertEquals("Ken Griffey", list.get(2));
+ assertEquals("[Mark McGwire, Sammy Sosa, Ken Griffey]\n", document.getPresentation());
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_2() {
+ YamlDocument document = new YamlDocument("example2_2.yaml");
+ Map<String, Object> map = (Map<String, Object>) document.getNativeData();
+ assertEquals(3, map.size());
+ assertEquals("Expect 65 to be a Integer", Integer.class, map.get("hr").getClass());
+ assertEquals(new Integer(65), map.get("hr"));
+ assertEquals(new Float(0.278), new Float("0.278"));
+ assertEquals("Expect 0.278 to be a Float", Double.class, map.get("avg").getClass());
+ assertEquals(new Double(0.278), map.get("avg"));
+ assertEquals("Expect 147 to be an Integer", Integer.class, map.get("rbi").getClass());
+ assertEquals(new Integer(147), map.get("rbi"));
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_3() {
+ YamlDocument document = new YamlDocument("example2_3.yaml");
+ Map<String, List<String>> map = (Map<String, List<String>>) document.getNativeData();
+ assertEquals(2, map.size());
+ List<String> list1 = map.get("american");
+ assertEquals(3, list1.size());
+ assertEquals("Boston Red Sox", list1.get(0));
+ assertEquals("Detroit Tigers", list1.get(1));
+ assertEquals("New York Yankees", list1.get(2));
+ List<String> list2 = map.get("national");
+ assertEquals(3, list2.size());
+ assertEquals("New York Mets", list2.get(0));
+ assertEquals("Chicago Cubs", list2.get(1));
+ assertEquals("Atlanta Braves", list2.get(2));
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_4() {
+ YamlDocument document = new YamlDocument("example2_4.yaml");
+ List<Map<String, Object>> list = (List<Map<String, Object>>) document.getNativeData();
+ assertEquals(2, list.size());
+ Map<String, Object> map1 = list.get(0);
+ assertEquals(3, map1.size());
+ assertEquals("Mark McGwire", map1.get("name"));
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_5() {
+ YamlDocument document = new YamlDocument("example2_5.yaml");
+ List<List<Object>> list = (List<List<Object>>) document.getNativeData();
+ assertEquals(3, list.size());
+ List<Object> list1 = list.get(0);
+ assertEquals(3, list1.size());
+ assertEquals("name", list1.get(0));
+ assertEquals("hr", list1.get(1));
+ assertEquals("avg", list1.get(2));
+ assertEquals(3, list.get(1).size());
+ assertEquals(3, list.get(2).size());
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_6() {
+ YamlDocument document = new YamlDocument("example2_6.yaml");
+ Map<String, Map<String, Object>> map = (Map<String, Map<String, Object>>) document
+ .getNativeData();
+ assertEquals(2, map.size());
+ Map<String, Object> map1 = map.get("Mark McGwire");
+ assertEquals(2, map1.size());
+ Map<String, Object> map2 = map.get("Sammy Sosa");
+ assertEquals(2, map2.size());
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/Chapter2_2Test.java b/src/test/java/org/yaml/snakeyaml/Chapter2_2Test.java
new file mode 100644
index 00000000..1e166ee7
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/Chapter2_2Test.java
@@ -0,0 +1,101 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml;
+
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+/**
+ * Test Chapter 2.2 from the YAML specification
+ *
+ * @author py4fun
+ * @see http://yaml.org/spec/1.1/
+ */
+public class Chapter2_2Test extends TestCase {
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_7() {
+ YamlStream resource = new YamlStream("example2_7.yaml");
+ List<Object> list = (List<Object>) resource.getNativeData();
+ assertEquals(2, list.size());
+ List<String> list1 = (List<String>) list.get(0);
+ assertEquals(3, list1.size());
+ assertEquals("Mark McGwire", list1.get(0));
+ assertEquals("Sammy Sosa", list1.get(1));
+ assertEquals("Ken Griffey", list1.get(2));
+ List<String> list2 = (List<String>) list.get(1);
+ assertEquals(2, list2.size());
+ assertEquals("Chicago Cubs", list2.get(0));
+ assertEquals("St Louis Cardinals", list2.get(1));
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_8() {
+ YamlStream resource = new YamlStream("example2_8.yaml");
+ List<Object> list = (List<Object>) resource.getNativeData();
+ assertEquals(2, list.size());
+ Map<String, String> map1 = (Map<String, String>) list.get(0);
+ assertEquals(3, map1.size());
+ assertEquals(new Integer(72200), map1.get("time"));
+ assertEquals("Sammy Sosa", map1.get("player"));
+ assertEquals("strike (miss)", map1.get("action"));
+ Map<String, String> map2 = (Map<String, String>) list.get(1);
+ assertEquals(3, map2.size());
+ assertEquals(new Integer(72227), map2.get("time"));
+ assertEquals("Sammy Sosa", map2.get("player"));
+ assertEquals("grand slam", map2.get("action"));
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_9() {
+ YamlDocument document = new YamlDocument("example2_9.yaml");
+ Map<String, Object> map = (Map<String, Object>) document.getNativeData();
+ assertEquals(map.toString(), 2, map.size());
+ List<String> list1 = (List<String>) map.get("hr");
+ assertEquals(2, list1.size());
+ assertEquals("Mark McGwire", list1.get(0));
+ assertEquals("Sammy Sosa", list1.get(1));
+ List<String> list2 = (List<String>) map.get("rbi");
+ assertEquals(2, list2.size());
+ assertEquals("Sammy Sosa", list2.get(0));
+ assertEquals("Ken Griffey", list2.get(1));
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_10() {
+ YamlDocument document = new YamlDocument("example2_10.yaml");
+ Map<String, Object> map = (Map<String, Object>) document.getNativeData();
+ assertEquals("Examples 2.9 and 2.10 must be identical.",
+ new YamlDocument("example2_9.yaml").getNativeData(), map);
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_11() {
+ YamlDocument document = new YamlDocument("example2_11.yaml");
+ Map<Object, Object> map = (Map<Object, Object>) document.getNativeData();
+ assertEquals(2, map.size());
+ for (Object key : map.keySet()) {
+ List<String> list = (List<String>) key;
+ assertEquals(2, list.size());
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_12() {
+ YamlDocument document = new YamlDocument("example2_12.yaml");
+ List<Map<Object, Object>> list = (List<Map<Object, Object>>) document.getNativeData();
+ assertEquals(3, list.size());
+ Map map1 = (Map) list.get(0);
+ assertEquals(2, map1.size());
+ assertEquals("Super Hoop", map1.get("item"));
+ Map map2 = (Map) list.get(1);
+ assertEquals(2, map2.size());
+ assertEquals("Basketball", map2.get("item"));
+ Map map3 = (Map) list.get(2);
+ assertEquals(2, map3.size());
+ assertEquals("Big Shoes", map3.get("item"));
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/Chapter2_3Test.java b/src/test/java/org/yaml/snakeyaml/Chapter2_3Test.java
new file mode 100644
index 00000000..74d9b537
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/Chapter2_3Test.java
@@ -0,0 +1,120 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+/**
+ * Test Chapter 2.3 from the YAML specification
+ *
+ * @author py4fun
+ * @see http://yaml.org/spec/1.1/
+ */
+public class Chapter2_3Test extends TestCase {
+
+ public void testExample_2_13() {
+ YamlDocument document = new YamlDocument("example2_13.yaml");
+ String data = (String) document.getNativeData();
+ assertEquals("\\//||\\/||\n// || ||__\n", data);
+ }
+
+ public void testExample_2_14() {
+ YamlDocument document = new YamlDocument("example2_14.yaml");
+ String data = (String) document.getNativeData();
+ assertEquals("Mark McGwire's year was crippled by a knee injury.", data);
+ }
+
+ public void testExample_2_15() {
+ String etalon = "Sammy Sosa completed another fine season with great stats.\n\n 63 Home Runs\n 0.288 Batting Average\n\nWhat a year!\n";
+ InputStream input = YamlDocument.class.getClassLoader().getResourceAsStream(
+ YamlDocument.ROOT + "example2_15.yaml");
+ Yaml yaml = new Yaml();
+ String data = (String) yaml.load(input);
+ assertEquals(etalon, data);
+ //
+ String dumped = yaml.dump(data);
+ assertTrue(dumped.contains("Sammy Sosa completed another fine season with great stats"));
+ assertEquals("Must be splitted into 2 lines.", 2, dumped.split("\n").length);
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_16() {
+ YamlDocument document = new YamlDocument("example2_16.yaml");
+ Map<String, String> map = (Map<String, String>) document.getNativeData();
+ assertEquals(map.toString(), 3, map.size());
+ assertEquals("Mark McGwire", map.get("name"));
+ assertEquals("Mark set a major league home run record in 1998.\n", map
+ .get("accomplishment"));
+ assertEquals("65 Home Runs\n0.278 Batting Average\n", map.get("stats"));
+
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_17() throws IOException {
+ YamlDocument document = new YamlDocument("example2_17.yaml", false);
+ Map<String, String> map = (Map<String, String>) document.getNativeData();
+ assertEquals(map.toString(), 6, map.size());
+ assertEquals("Sosa did fine.\u263A", map.get("unicode"));
+ assertEquals("\b1998\t1999\t2000\n", map.get("control"));
+ assertEquals("\r\n is \r\n", map.get("hexesc"));
+ assertEquals("\"Howdy!\" he cried.", map.get("single"));
+ assertEquals(" # not a 'comment'.", map.get("quoted"));
+ assertEquals("|\\-*-/|", map.get("tie-fighter"));
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_17_unicode() {
+ YamlDocument document = new YamlDocument("example2_17_unicode.yaml");
+ Map<String, String> map = (Map<String, String>) document.getNativeData();
+ assertEquals("Sosa did fine.\u263A", map.get("unicode"));
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_17_control() {
+ YamlDocument document = new YamlDocument("example2_17_control.yaml", false);
+ Map<String, String> map = (Map<String, String>) document.getNativeData();
+ assertEquals("\b1998\t1999\t2000\n", map.get("control"));
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_17_hexesc() {
+ YamlDocument document = new YamlDocument("example2_17_hexesc.yaml");
+ Map<String, String> map = (Map<String, String>) document.getNativeData();
+ assertEquals("\r\n is \r\n", map.get("hexesc"));
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_17_single() {
+ YamlDocument document = new YamlDocument("example2_17_single.yaml");
+ Map<String, String> map = (Map<String, String>) document.getNativeData();
+ assertEquals("\"Howdy!\" he cried.", map.get("single"));
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_17_quoted() {
+ YamlDocument document = new YamlDocument("example2_17_quoted.yaml");
+ Map<String, String> map = (Map<String, String>) document.getNativeData();
+ assertEquals(" # not a 'comment'.", map.get("quoted"));
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_17_tie_fighter() {
+ YamlDocument document = new YamlDocument("example2_17_tie_fighter.yaml");
+ Map<String, String> map = (Map<String, String>) document.getNativeData();
+ assertEquals("|\\-*-/|", map.get("tie-fighter"));
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_18() throws IOException {
+ YamlDocument document = new YamlDocument("example2_18.yaml");
+ Map<String, String> map = (Map<String, String>) document.getNativeData();
+ assertEquals(map.toString(), 2, map.size());
+ assertEquals("This unquoted scalar spans many lines.", map.get("plain"));
+ assertEquals("So does this quoted scalar.\n", map.get("quoted"));
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/Chapter2_4Test.java b/src/test/java/org/yaml/snakeyaml/Chapter2_4Test.java
new file mode 100644
index 00000000..2a2ce53c
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/Chapter2_4Test.java
@@ -0,0 +1,171 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TimeZone;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.constructor.Construct;
+import org.yaml.snakeyaml.constructor.Constructor;
+import org.yaml.snakeyaml.nodes.Node;
+import org.yaml.snakeyaml.nodes.ScalarNode;
+
+/**
+ * Test Chapter 2.4 from the YAML specification
+ *
+ * @author py4fun
+ * @see http://yaml.org/spec/1.1/
+ */
+public class Chapter2_4Test extends TestCase {
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_19() {
+ YamlDocument document = new YamlDocument("example2_19.yaml");
+ Map<String, Object> map = (Map<String, Object>) document.getNativeData();
+ assertEquals(5, map.size());
+ assertEquals("Expect 12345 to be an Integer.", Integer.class, map.get("canonical")
+ .getClass());
+ assertEquals(new Integer(12345), map.get("canonical"));
+ assertEquals(new Integer(12345), map.get("decimal"));
+ assertEquals(new Integer(3 * 3600 + 25 * 60 + 45), map.get("sexagesimal"));
+ assertEquals(new Integer(014), map.get("octal"));
+ assertEquals(new Integer(0xC), map.get("hexadecimal"));
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_20() {
+ YamlDocument document = new YamlDocument("example2_20.yaml");
+ Map<String, Object> map = (Map<String, Object>) document.getNativeData();
+ assertEquals(6, map.size());
+ assertEquals("Expect '1.23015e+3' to be a Double.", Double.class, map.get("canonical")
+ .getClass());
+ assertEquals(new Double(1230.15), map.get("canonical"));
+ assertEquals(new Double(12.3015e+02), map.get("exponential"));
+ assertEquals(new Double(20 * 60 + 30.15), map.get("sexagesimal"));
+ assertEquals(new Double(1230.15), map.get("fixed"));
+ assertEquals(Double.NEGATIVE_INFINITY, map.get("negative infinity"));
+ assertEquals(Double.NaN, map.get("not a number"));
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_21() {
+ YamlDocument document = new YamlDocument("example2_21.yaml");
+ Map<String, Object> map = (Map<String, Object>) document.getNativeData();
+ assertEquals(4, map.size());
+ assertNull("'~' must be parsed as 'null': " + map.get(null), map.get(null));
+ assertTrue((Boolean) map.get(Boolean.TRUE));
+ assertFalse((Boolean) map.get(Boolean.FALSE));
+ assertEquals("12345", map.get("string"));
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_22() {
+ YamlDocument document = new YamlDocument("example2_22.yaml");
+ Map<String, Object> map = (Map<String, Object>) document.getNativeData();
+ assertEquals(4, map.size());
+ assertEquals("Expect '2001-12-15T02:59:43.1Z' to be a Date.", Date.class, map.get(
+ "canonical").getClass());
+ Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+ cal.clear();
+ cal.set(Calendar.YEAR, 2001);
+ cal.set(Calendar.MONTH, 11); // Java's months are zero-based...
+ cal.set(Calendar.DAY_OF_MONTH, 15);
+ cal.set(Calendar.HOUR_OF_DAY, 2);
+ cal.set(Calendar.MINUTE, 59);
+ cal.set(Calendar.SECOND, 43);
+ cal.set(Calendar.MILLISECOND, 100);
+ Date date = cal.getTime();
+ assertEquals(date, map.get("canonical"));
+ assertEquals("Expect '2001-12-14t21:59:43.10-05:00' to be a Date.", Date.class, map.get(
+ "iso8601").getClass());
+ assertEquals("Expect '2001-12-14 21:59:43.10 -5' to be a Date.", Date.class, map.get(
+ "spaced").getClass());
+ assertEquals("Expect '2002-12-14' to be a Date.", Date.class, map.get("date").getClass());
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_23_non_date() {
+ try {
+ YamlDocument document = new YamlDocument("example2_23_non_date.yaml");
+ Map<String, Object> map = (Map<String, Object>) document.getNativeData();
+ assertEquals(1, map.size());
+ assertEquals("2002-04-28", map.get("not-date"));
+ } catch (RuntimeException e) {
+ fail("Cannot parse '!!str': 'not-date: !!str 2002-04-28'");
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_23_picture() throws Exception {
+ YamlDocument document = new YamlDocument("example2_23_picture.yaml", false);
+ Map<String, Object> map = (Map<String, Object>) document.getNativeData();
+ assertEquals(1, map.size());
+ byte[] picture = (byte[]) map.get("picture");
+ assertEquals((byte) 'G', picture[0]);
+ assertEquals((byte) 'I', picture[1]);
+ assertEquals((byte) 'F', picture[2]);
+ }
+
+ class SomethingConstructor extends Constructor {
+ public SomethingConstructor() {
+ this.yamlConstructors.put("!something", new ConstructSomething());
+ }
+
+ private class ConstructSomething implements Construct {
+ public Object construct(Node node) {
+ // convert to upper case
+ String val = (String) constructScalar((ScalarNode) node);
+ return val.toUpperCase().replace('\n', ' ').trim();
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_23() throws IOException {
+ YamlDocument document = new YamlDocument("example2_23.yaml", false,
+ new SomethingConstructor());
+ Map<String, Object> map = (Map<String, Object>) document.getNativeData();
+ assertEquals(3, map.size());
+ String special = (String) map.get("application specific tag");
+ assertEquals("THE SEMANTICS OF THE TAG ABOVE MAY BE DIFFERENT FOR DIFFERENT DOCUMENTS.",
+ special);
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_25() {
+ YamlDocument document = new YamlDocument("example2_25.yaml");
+ Set<String> set = (Set<String>) document.getNativeData();
+ assertEquals(3, set.size());
+ assertTrue(set.contains("Mark McGwire"));
+ assertTrue(set.contains("Sammy Sosa"));
+ assertTrue(set.contains("Ken Griff"));
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_26() {
+ YamlDocument document = new YamlDocument("example2_26.yaml");
+ Map<String, String> map = (Map<String, String>) document.getNativeData();
+ assertEquals(3, map.size());
+ assertTrue(map instanceof LinkedHashMap);
+ assertEquals(new Integer(65), map.get("Mark McGwire"));
+ assertEquals(new Integer(63), map.get("Sammy Sosa"));
+ assertEquals(new Integer(58), map.get("Ken Griffy"));
+ List list = new ArrayList();
+ for (String key : map.keySet()) {
+ list.add(key);
+ }
+ assertEquals("Mark McGwire", list.get(0));
+ assertEquals("Sammy Sosa", list.get(1));
+ assertEquals("Ken Griffy", list.get(2));
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/Chapter2_5Test.java b/src/test/java/org/yaml/snakeyaml/Chapter2_5Test.java
new file mode 100644
index 00000000..d80890ff
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/Chapter2_5Test.java
@@ -0,0 +1,52 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+/**
+ * Test Chapter 2.5 from the YAML specification
+ *
+ * @author py4fun
+ * @see http://yaml.org/spec/1.1/
+ */
+public class Chapter2_5Test extends TestCase {
+
+ @SuppressWarnings("unchecked")
+ public void testExample_2_28() {
+ YamlStream resource = new YamlStream("example2_28.yaml");
+ List<Object> list = (List<Object>) resource.getNativeData();
+ assertEquals(3, list.size());
+ Map<String, Object> data0 = (Map<String, Object>) list.get(0);
+ Date date = (Date) data0.get("Time");
+ assertEquals("Date: " + date, 1006545702000L, date.getTime());
+ assertEquals("ed", data0.get("User"));
+ assertEquals("This is an error message for the log file", data0.get("Warning"));
+ //
+ Map<String, Object> data1 = (Map<String, Object>) list.get(1);
+ Date date1 = (Date) data1.get("Time");
+ assertTrue("Date: " + date1, date1.after(date));
+ assertEquals("ed", data1.get("User"));
+ assertEquals("A slightly different error message.", data1.get("Warning"));
+ //
+ Map<String, Object> data3 = (Map<String, Object>) list.get(2);
+ Date date3 = (Date) data3.get("Date");
+ assertTrue("Date: " + date3, date3.after(date1));
+ assertEquals("ed", data3.get("User"));
+ assertEquals("Unknown variable \"bar\"", data3.get("Fatal"));
+ List<Map<String, String>> list3 = (List<Map<String, String>>) data3.get("Stack");
+ Map<String, String> map1 = list3.get(0);
+ assertEquals("TopClass.py", map1.get("file"));
+ assertEquals(new Integer(23), map1.get("line"));
+ assertEquals("x = MoreObject(\"345\\n\")\n", map1.get("code"));
+ Map<String, String> map2 = list3.get(1);
+ assertEquals("MoreClass.py", map2.get("file"));
+ assertEquals(new Integer(58), map2.get("line"));
+ assertEquals("foo = bar", map2.get("code"));
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/DumperOptionsTest.java b/src/test/java/org/yaml/snakeyaml/DumperOptionsTest.java
new file mode 100644
index 00000000..04d668d4
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/DumperOptionsTest.java
@@ -0,0 +1,261 @@
+package org.yaml.snakeyaml;
+
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.emitter.Emitter;
+import org.yaml.snakeyaml.error.YAMLException;
+
+public class DumperOptionsTest extends TestCase {
+
+ public void testDefaultStyle() {
+ DumperOptions options = new DumperOptions();
+ Yaml yaml = new Yaml(options);
+ assertEquals("abc\n", yaml.dump("abc"));
+ // string which looks like integer
+ assertEquals("'123'\n", yaml.dump("123"));
+ //
+ options.setDefaultStyle(DumperOptions.DefaultScalarStyle.DOUBLE_QUOTED);
+ yaml = new Yaml(options);
+ assertEquals("\"123\"\n", yaml.dump("123"));
+ //
+ options.setDefaultStyle(DumperOptions.DefaultScalarStyle.SINGLE_QUOTED);
+ yaml = new Yaml(options);
+ assertEquals("'123'\n", yaml.dump("123"));
+ //
+ options.setDefaultStyle(DumperOptions.DefaultScalarStyle.PLAIN);
+ yaml = new Yaml(options);
+ assertEquals("'123'\n", yaml.dump("123"));
+ assertEquals("abc\n", yaml.dump("abc"));
+ // null check
+ try {
+ options.setDefaultStyle(null);
+ fail("Null must not be accepted.");
+ } catch (NullPointerException e) {
+ assertEquals("Use DefaultScalarStyle enum.", e.getMessage());
+ }
+ }
+
+ public void testDefaultFlowStyle() {
+ Yaml yaml = new Yaml();
+ List<Integer> list = new LinkedList<Integer>();
+ list.add(1);
+ list.add(2);
+ list.add(3);
+ assertEquals("[1, 2, 3]\n", yaml.dump(list));
+ //
+ DumperOptions options = new DumperOptions();
+ options = new DumperOptions();
+ options.setDefaultFlowStyle(DumperOptions.DefaultFlowStyle.FLOW);
+ yaml = new Yaml(options);
+ assertEquals("[1, 2, 3]\n", yaml.dump(list));
+ //
+ options = new DumperOptions();
+ options.setDefaultFlowStyle(DumperOptions.DefaultFlowStyle.BLOCK);
+ yaml = new Yaml(options);
+ assertEquals("- 1\n- 2\n- 3\n", yaml.dump(list));
+ // null check
+ try {
+ options.setDefaultFlowStyle(null);
+ fail("Null must not be accepted.");
+ } catch (NullPointerException e) {
+ assertEquals("Use DefaultFlowStyle enum.", e.getMessage());
+ }
+ }
+
+ public void testDefaultFlowStyleNested() {
+ Yaml yaml = new Yaml();
+ List<Integer> list = new LinkedList<Integer>();
+ list.add(1);
+ list.add(2);
+ list.add(3);
+ Map<String, Object> map = new LinkedHashMap<String, Object>();
+ map.put("a", "b");
+ map.put("c", list);
+ assertEquals("a: b\nc: [1, 2, 3]\n", yaml.dump(map));
+ //
+ DumperOptions options = new DumperOptions();
+ options = new DumperOptions();
+ options.setDefaultFlowStyle(DumperOptions.DefaultFlowStyle.FLOW);
+ yaml = new Yaml(options);
+ assertEquals("{a: b, c: [1, 2, 3]}\n", yaml.dump(map));
+ //
+ options = new DumperOptions();
+ options.setDefaultFlowStyle(DumperOptions.DefaultFlowStyle.BLOCK);
+ yaml = new Yaml(options);
+ assertEquals("a: b\nc:\n- 1\n- 2\n- 3\n", yaml.dump(map));
+ }
+
+ public void testCanonical() {
+ Yaml yaml = new Yaml();
+ assertEquals("123\n", yaml.dump(123));
+ //
+ DumperOptions options = new DumperOptions();
+ options = new DumperOptions();
+ options.setCanonical(true);
+ yaml = new Yaml(options);
+ assertEquals("---\n!!int \"123\"\n", yaml.dump(123));
+ //
+ options = new DumperOptions();
+ options.setCanonical(false);
+ yaml = new Yaml(options);
+ assertEquals("123\n", yaml.dump(123));
+ }
+
+ public void testIndent() {
+ Yaml yaml = new Yaml();
+ List<Integer> list = new LinkedList<Integer>();
+ list.add(1);
+ list.add(2);
+ DumperOptions options = new DumperOptions();
+ options.setCanonical(true);
+ yaml = new Yaml(options);
+ assertEquals("---\n!!seq [\n !!int \"1\",\n !!int \"2\",\n]\n", yaml.dump(list));
+ //
+ options.setIndent(4);
+ yaml = new Yaml(options);
+ assertEquals("---\n!!seq [\n !!int \"1\",\n !!int \"2\",\n]\n", yaml.dump(list));
+ //
+ try {
+ options.setIndent(0);
+ fail();
+ } catch (YAMLException e) {
+ assertTrue(true);
+ }
+ try {
+ options.setIndent(-2);
+ fail();
+ } catch (YAMLException e) {
+ assertTrue(true);
+ }
+ try {
+ options.setIndent(11);
+ fail();
+ } catch (YAMLException e) {
+ assertTrue(true);
+ }
+ //
+ assertTrue(Emitter.MIN_INDENT > 0);
+ assertTrue(Emitter.MIN_INDENT < Emitter.MAX_INDENT);
+ assertTrue(Emitter.MAX_INDENT < 20);
+ }
+
+ public void testLineBreak() {
+ Yaml yaml = new Yaml();
+ List<Integer> list = new LinkedList<Integer>();
+ list.add(1);
+ list.add(2);
+ DumperOptions options = new DumperOptions();
+ options.setCanonical(true);
+ yaml = new Yaml(options);
+ assertEquals("---\n!!seq [\n !!int \"1\",\n !!int \"2\",\n]\n", yaml.dump(list));
+ //
+ options.setLineBreak(DumperOptions.LineBreak.WIN);
+ yaml = new Yaml(options);
+ String output = yaml.dump(list);
+ assertEquals("---\r\n!!seq [\r\n !!int \"1\",\r\n !!int \"2\",\r\n]\r\n", output);
+ // null check
+ try {
+ options.setLineBreak(null);
+ fail("Null must not be accepted.");
+ } catch (NullPointerException e) {
+ assertEquals("Specify line break.", e.getMessage());
+ }
+ }
+
+ public void testExplicitStart() {
+ Yaml yaml = new Yaml();
+ List<Integer> list = new LinkedList<Integer>();
+ list.add(1);
+ list.add(2);
+ list.add(3);
+ assertEquals("[1, 2, 3]\n", yaml.dump(list));
+ //
+ DumperOptions options = new DumperOptions();
+ options = new DumperOptions();
+ options.setExplicitStart(true);
+ yaml = new Yaml(options);
+ assertEquals("--- [1, 2, 3]\n", yaml.dump(list));
+ //
+ options.setExplicitEnd(true);
+ yaml = new Yaml(options);
+ assertEquals("--- [1, 2, 3]\n...\n", yaml.dump(list));
+ }
+
+ public void testVersion() {
+ Yaml yaml = new Yaml();
+ List<Integer> list = new LinkedList<Integer>();
+ list.add(1);
+ list.add(2);
+ list.add(3);
+ assertEquals("[1, 2, 3]\n", yaml.dump(list));
+ //
+ DumperOptions options = new DumperOptions();
+ options = new DumperOptions();
+ options.setVersion(DumperOptions.Version.V1_1);
+ yaml = new Yaml(options);
+ assertEquals("%YAML 1.1\n--- [1, 2, 3]\n", yaml.dump(list));
+ //
+ options.setVersion(DumperOptions.Version.V1_0);
+ yaml = new Yaml(options);
+ assertEquals("%YAML 1.0\n--- [1, 2, 3]\n", yaml.dump(list));
+ }
+
+ public void testTags() {
+ Yaml yaml = new Yaml();
+ List<Integer> list = new LinkedList<Integer>();
+ list.add(1);
+ list.add(2);
+ list.add(3);
+ assertEquals("[1, 2, 3]\n", yaml.dump(list));
+ //
+ DumperOptions options = new DumperOptions();
+ options = new DumperOptions();
+ Map<String, String> tags = new LinkedHashMap<String, String>();
+ tags.put("!foo!", "bar");
+ options.setTags(tags);
+ yaml = new Yaml(options);
+ assertEquals("%TAG !foo! bar\n--- [1, 2, 3]\n", yaml.dump(list));
+ //
+ options = new DumperOptions();
+ tags.put("!yaml!", "tag:yaml.org,2002:");
+ yaml = new Yaml(options);
+ assertEquals("foo\n", yaml.dump("foo"));
+ }
+
+ public void testAllowUnicode() {
+ Yaml yaml = new Yaml();
+ assertEquals("out: " + yaml.dump("\u00DCber"), "\u00DCber\n", yaml.dump("\u00DCber"));
+ //
+ DumperOptions options = new DumperOptions();
+ options = new DumperOptions();
+ options.setAllowUnicode(false);
+ yaml = new Yaml(options);
+ assertEquals("\"\\xdcber\"\n", yaml.dump("\u00DCber"));
+ }
+
+ public void testSetRootTag() {
+ DumperOptions options = new DumperOptions();
+ try {
+ options.setExplicitRoot(null);
+ fail("Root tag is required.");
+ } catch (NullPointerException e) {
+ assertEquals("Root tag must be specified.", e.getMessage());
+ }
+ }
+
+ public void testToString() {
+ DumperOptions.DefaultScalarStyle scalarStyle = DumperOptions.DefaultScalarStyle.LITERAL;
+ assertEquals("Scalar style: '|'", scalarStyle.toString());
+ //
+ DumperOptions.DefaultFlowStyle flowStyle = DumperOptions.DefaultFlowStyle.BLOCK;
+ assertEquals("Flow style: 'false'", flowStyle.toString());
+ //
+ DumperOptions.LineBreak lb = DumperOptions.LineBreak.LINUX;
+ assertEquals("Line break: LINUX", lb.toString());
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/DumperTest.java b/src/test/java/org/yaml/snakeyaml/DumperTest.java
new file mode 100644
index 00000000..ddbab0ee
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/DumperTest.java
@@ -0,0 +1,82 @@
+package org.yaml.snakeyaml;
+
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+import java.io.IOException;
+import java.io.Writer;
+import java.util.LinkedList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+public class DumperTest extends TestCase {
+
+ public void testDump1() {
+ DumperOptions options = new DumperOptions();
+ options.setDefaultStyle(DumperOptions.DefaultScalarStyle.DOUBLE_QUOTED);
+ options.setExplicitStart(true);
+ options.setExplicitEnd(true);
+ List<Integer> list = new LinkedList<Integer>();
+ for (int i = 0; i < 3; i++) {
+ list.add(i);
+ }
+ Yaml yaml = new Yaml(options);
+ String output = yaml.dump(list);
+ assertEquals("---\n- !!int \"0\"\n- !!int \"1\"\n- !!int \"2\"\n...\n", output);
+ }
+
+ public void testDump2() {
+ DumperOptions options = new DumperOptions();
+ options.setExplicitStart(true);
+ List<Integer> list = new LinkedList<Integer>();
+ for (int i = 0; i < 3; i++) {
+ list.add(i);
+ }
+ Yaml yaml = new Yaml(options);
+ String output = yaml.dump(list);
+ assertEquals("--- [0, 1, 2]\n", output);
+ }
+
+ public void testDump3() {
+ DumperOptions options = new DumperOptions();
+ options.setDefaultStyle(DumperOptions.DefaultScalarStyle.SINGLE_QUOTED);
+ List<Integer> list = new LinkedList<Integer>();
+ for (int i = 0; i < 3; i++) {
+ list.add(i);
+ }
+ Yaml yaml = new Yaml(options);
+ String output = yaml.dump(list);
+ assertEquals("- !!int '0'\n- !!int '1'\n- !!int '2'\n", output);
+ }
+
+ public void testDumpException() {
+ Yaml yaml = new Yaml();
+ Writer writer = new ExceptionWriter1();
+ try {
+ yaml.dump("aaa1234567890", writer);
+ fail("Exception must be thrown.");
+ } catch (Exception e) {
+ assertEquals("java.io.IOException: write test failure.", e.getMessage());
+ }
+ }
+
+ private class ExceptionWriter1 extends Writer {
+ @Override
+ public void write(String str) throws IOException {
+ throw new IOException("write test failure.");
+ }
+
+ @Override
+ public void close() throws IOException {
+ }
+
+ @Override
+ public void flush() throws IOException {
+ }
+
+ @Override
+ public void write(char[] cbuf, int off, int len) throws IOException {
+ }
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/EnumBean.java b/src/test/java/org/yaml/snakeyaml/EnumBean.java
new file mode 100644
index 00000000..c1bfb523
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/EnumBean.java
@@ -0,0 +1,36 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml;
+
+import java.util.LinkedHashMap;
+
+public class EnumBean {
+ private int id;
+ private Suit suit;
+ private LinkedHashMap<Suit, Integer> map = new LinkedHashMap<Suit, Integer>();
+
+ public LinkedHashMap<Suit, Integer> getMap() {
+ return map;
+ }
+
+ public void setMap(LinkedHashMap<Suit, Integer> map) {
+ this.map = map;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public Suit getSuit() {
+ return suit;
+ }
+
+ public void setSuit(Suit suit) {
+ this.suit = suit;
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/EnumTest.java b/src/test/java/org/yaml/snakeyaml/EnumTest.java
new file mode 100644
index 00000000..39dc0d93
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/EnumTest.java
@@ -0,0 +1,175 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.EnumMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.constructor.Constructor;
+
+public class EnumTest extends TestCase {
+ // Dumping
+ public void testDumpEnum() {
+ Yaml yaml = new Yaml();
+ String output = yaml.dump(Suit.CLUBS);
+ assertEquals("!!org.yaml.snakeyaml.Suit 'CLUBS'\n", output);
+ }
+
+ public void testDumpEnumArray() {
+ DumperOptions options = new DumperOptions();
+ options.setDefaultFlowStyle(DumperOptions.DefaultFlowStyle.BLOCK);
+ Yaml yaml = new Yaml(options);
+ String output = yaml.dump(Suit.values());
+ assertEquals(
+ "- !!org.yaml.snakeyaml.Suit 'CLUBS'\n- !!org.yaml.snakeyaml.Suit 'DIAMONDS'\n- !!org.yaml.snakeyaml.Suit 'HEARTS'\n- !!org.yaml.snakeyaml.Suit 'SPADES'\n",
+ output);
+ }
+
+ public void testDumpEnumList() {
+ DumperOptions options = new DumperOptions();
+ options.setDefaultFlowStyle(DumperOptions.DefaultFlowStyle.BLOCK);
+ Yaml yaml = new Yaml(options);
+ List<Suit> list = Arrays.asList(Suit.values());
+ String output = yaml.dump(list);
+ assertEquals(
+ "- !!org.yaml.snakeyaml.Suit 'CLUBS'\n- !!org.yaml.snakeyaml.Suit 'DIAMONDS'\n- !!org.yaml.snakeyaml.Suit 'HEARTS'\n- !!org.yaml.snakeyaml.Suit 'SPADES'\n",
+ output);
+ }
+
+ public void testDumpEnumListNoAnchor() {
+ DumperOptions options = new DumperOptions();
+ options.setDefaultFlowStyle(DumperOptions.DefaultFlowStyle.BLOCK);
+ Yaml yaml = new Yaml(options);
+ List<Suit> list = new ArrayList<Suit>(3);
+ list.add(Suit.CLUBS);
+ list.add(Suit.DIAMONDS);
+ list.add(Suit.CLUBS);
+ String output = yaml.dump(list);
+ assertEquals(
+ "- !!org.yaml.snakeyaml.Suit 'CLUBS'\n- !!org.yaml.snakeyaml.Suit 'DIAMONDS'\n- !!org.yaml.snakeyaml.Suit 'CLUBS'\n",
+ output);
+ }
+
+ public void testDumpEnumMap() {
+ DumperOptions options = new DumperOptions();
+ options.setDefaultFlowStyle(DumperOptions.DefaultFlowStyle.BLOCK);
+ Yaml yaml = new Yaml(options);
+ Map<String, Suit> map = new LinkedHashMap<String, Suit>();
+ map.put("c", Suit.CLUBS);
+ map.put("d", Suit.DIAMONDS);
+ String output = yaml.dump(map);
+ assertEquals(
+ "c: !!org.yaml.snakeyaml.Suit 'CLUBS'\nd: !!org.yaml.snakeyaml.Suit 'DIAMONDS'\n",
+ output);
+ }
+
+ public void testDumpEnumMap2() {
+ DumperOptions options = new DumperOptions();
+ options.setDefaultFlowStyle(DumperOptions.DefaultFlowStyle.BLOCK);
+ Yaml yaml = new Yaml(options);
+ Map<Suit, Integer> map = new EnumMap<Suit, Integer>(Suit.class);
+ map.put(Suit.CLUBS, 0);
+ map.put(Suit.DIAMONDS, 123);
+ String output = yaml.dump(map);
+ assertEquals(
+ "!!org.yaml.snakeyaml.Suit 'CLUBS': 0\n!!org.yaml.snakeyaml.Suit 'DIAMONDS': 123\n",
+ output);
+ }
+
+ public void testDumpEnumBean() {
+ DumperOptions options = new DumperOptions();
+ options.setDefaultFlowStyle(DumperOptions.DefaultFlowStyle.BLOCK);
+ Yaml yaml = new Yaml(options);
+ EnumBean bean = new EnumBean();
+ bean.setId(17);
+ bean.setSuit(Suit.SPADES);
+ LinkedHashMap<Suit, Integer> map = new LinkedHashMap<Suit, Integer>();
+ map.put(Suit.CLUBS, 1);
+ map.put(Suit.DIAMONDS, 2);
+ bean.setMap(map);
+ String output = yaml.dump(bean);
+ assertEquals(
+ "!!org.yaml.snakeyaml.EnumBean\nid: 17\nmap:\n !!org.yaml.snakeyaml.Suit 'CLUBS': 1\n !!org.yaml.snakeyaml.Suit 'DIAMONDS': 2\nsuit: SPADES\n",
+ output);
+ }
+
+ // Loading
+ public void testLoadEnum() {
+ Yaml yaml = new Yaml();
+ Suit suit = (Suit) yaml.load("!!org.yaml.snakeyaml.Suit 'CLUBS'\n");
+ assertEquals(Suit.CLUBS, suit);
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testLoadEnumList() {
+ Yaml yaml = new Yaml();
+ List<Suit> list = (List<Suit>) yaml
+ .load("- !!org.yaml.snakeyaml.Suit 'CLUBS'\n- !!org.yaml.snakeyaml.Suit 'DIAMONDS'\n- !!org.yaml.snakeyaml.Suit 'HEARTS'\n- !!org.yaml.snakeyaml.Suit 'SPADES'");
+ assertEquals(4, list.size());
+ assertEquals(Suit.CLUBS, list.get(0));
+ assertEquals(Suit.DIAMONDS, list.get(1));
+ assertEquals(Suit.HEARTS, list.get(2));
+ assertEquals(Suit.SPADES, list.get(3));
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testLoadEnumMap() {
+ Yaml yaml = new Yaml();
+ Map<Integer, Suit> map = (Map<Integer, Suit>) yaml
+ .load("1: !!org.yaml.snakeyaml.Suit 'HEARTS'\n2: !!org.yaml.snakeyaml.Suit 'DIAMONDS'");
+ assertEquals(2, map.size());
+ assertEquals(Suit.HEARTS, map.get(1));
+ assertEquals(Suit.DIAMONDS, map.get(2));
+ }
+
+ public void testLoadEnumBean() {
+ Yaml yaml = new Yaml();
+ EnumBean bean = (EnumBean) yaml
+ .load("!!org.yaml.snakeyaml.EnumBean\nid: 174\nmap:\n !!org.yaml.snakeyaml.Suit 'CLUBS': 1\n !!org.yaml.snakeyaml.Suit 'DIAMONDS': 2\nsuit: CLUBS");
+
+ LinkedHashMap<Suit, Integer> map = new LinkedHashMap<Suit, Integer>();
+ map.put(Suit.CLUBS, 1);
+ map.put(Suit.DIAMONDS, 2);
+
+ assertEquals(Suit.CLUBS, bean.getSuit());
+ assertEquals(174, bean.getId());
+ assertEquals(map, bean.getMap());
+ }
+
+ public void testLoadEnumBean2() {
+ Constructor c = new Constructor();
+ TypeDescription td = new TypeDescription(EnumBean.class);
+ td.putMapPropertyType("map", Suit.class, Object.class);
+ c.addTypeDescription(td);
+ Yaml yaml = new Yaml(new Loader(c));
+ EnumBean bean = (EnumBean) yaml
+ .load("!!org.yaml.snakeyaml.EnumBean\nid: 174\nmap:\n CLUBS: 1\n DIAMONDS: 2\nsuit: CLUBS");
+
+ LinkedHashMap<Suit, Integer> map = new LinkedHashMap<Suit, Integer>();
+ map.put(Suit.CLUBS, 1);
+ map.put(Suit.DIAMONDS, 2);
+
+ assertEquals(Suit.CLUBS, bean.getSuit());
+ assertEquals(174, bean.getId());
+ assertEquals(map, bean.getMap());
+ }
+
+ public void testLoadWrongEnum() {
+ Yaml yaml = new Yaml();
+ try {
+ yaml
+ .load("1: !!org.yaml.snakeyaml.Suit 'HEARTS'\n2: !!org.yaml.snakeyaml.Suit 'KOSYR'");
+ fail("KOSYR is not Suit");
+ } catch (Exception e) {
+ assertTrue("KOSYR must be reported", e.getMessage().contains(
+ "Unable to find enum value 'KOSYR' for enum"));
+ }
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/Example2_24Test.java b/src/test/java/org/yaml/snakeyaml/Example2_24Test.java
new file mode 100644
index 00000000..fbb0e214
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/Example2_24Test.java
@@ -0,0 +1,234 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.constructor.Construct;
+import org.yaml.snakeyaml.constructor.Constructor;
+import org.yaml.snakeyaml.nodes.MappingNode;
+import org.yaml.snakeyaml.nodes.Node;
+import org.yaml.snakeyaml.nodes.SequenceNode;
+import org.yaml.snakeyaml.representer.Represent;
+import org.yaml.snakeyaml.representer.Representer;
+
+/**
+ * Test Example 2.24 from the YAML specification
+ *
+ * @author py4fun
+ * @see http://yaml.org/spec/1.1/
+ */
+public class Example2_24Test extends TestCase {
+ class MyConstructor extends Constructor {
+ public MyConstructor() {
+ this.yamlConstructors.put("tag:clarkevans.com,2002:shape", new ConstructShape());
+ this.yamlConstructors.put("tag:clarkevans.com,2002:circle", new ConstructCircle());
+ this.yamlConstructors.put("tag:clarkevans.com,2002:line", new ConstructLine());
+ this.yamlConstructors.put("tag:clarkevans.com,2002:label", new ConstructLabel());
+ }
+
+ private class ConstructShape implements Construct {
+ @SuppressWarnings("unchecked")
+ public Object construct(Node node) {
+ SequenceNode snode = (SequenceNode) node;
+ List<Entity> values = (List<Entity>) constructSequence(snode);
+ Shape shape = new Shape(values);
+ return shape;
+ }
+ }
+
+ private class ConstructCircle implements Construct {
+ @SuppressWarnings("unchecked")
+ public Object construct(Node node) {
+ MappingNode mnode = (MappingNode) node;
+ Map values = (Map) constructMapping(mnode);
+ Circle circle = new Circle((Map) values.get("center"), (Integer) values
+ .get("radius"));
+ return circle;
+ }
+ }
+
+ private class ConstructLine implements Construct {
+ @SuppressWarnings("unchecked")
+ public Object construct(Node node) {
+ MappingNode mnode = (MappingNode) node;
+ Map values = (Map) constructMapping(mnode);
+ Line line = new Line((Map) values.get("start"), (Map) values.get("finish"));
+ return line;
+ }
+ }
+
+ private class ConstructLabel implements Construct {
+ @SuppressWarnings("unchecked")
+ public Object construct(Node node) {
+ MappingNode mnode = (MappingNode) node;
+ Map values = (Map) constructMapping(mnode);
+ Label label = new Label((Map) values.get("start"), (Integer) values.get("color"),
+ (String) values.get("text"));
+ return label;
+ }
+ }
+ }
+
+ class MyRepresenter extends Representer {
+ public MyRepresenter() {
+ this.representers.put(Shape.class, new RepresentShape());
+ this.representers.put(Circle.class, new RepresentCircle());
+ this.representers.put(Line.class, new RepresentLine());
+ this.representers.put(Label.class, new RepresentLabel());
+ this.representers.put(HexInteger.class, new RepresentHex());
+ }
+
+ private class RepresentShape implements Represent {
+ public Node representData(Object data) {
+ Shape shape = (Shape) data;
+ List<Entity> value = shape.getEntities();
+ return representSequence("!shape", value, Boolean.FALSE);
+ }
+ }
+
+ private class RepresentCircle implements Represent {
+ public Node representData(Object data) {
+ Circle circle = (Circle) data;
+ Map<String, Object> map = new TreeMap<String, Object>();
+ map.put("center", circle.getCenter());
+ map.put("radius", circle.getRadius());
+ return representMapping("!circle", map, Boolean.FALSE);
+ }
+ }
+
+ private class RepresentLine implements Represent {
+ public Node representData(Object data) {
+ Line line = (Line) data;
+ Map<String, Object> map = new TreeMap<String, Object>();
+ map.put("start", line.getStart());
+ map.put("finish", line.getFinish());
+ return representMapping("!line", map, Boolean.FALSE);
+ }
+ }
+
+ private class RepresentLabel implements Represent {
+ public Node representData(Object data) {
+ Label label = (Label) data;
+ Map<String, Object> map = new TreeMap<String, Object>();
+ map.put("start", label.getStart());
+ map.put("color", new HexInteger(label.getColor()));
+ map.put("text", label.getText());
+ return representMapping("!label", map, Boolean.FALSE);
+ }
+ }
+
+ private class RepresentHex implements Represent {
+ public Node representData(Object data) {
+ HexInteger hex = (HexInteger) data;
+ return representScalar("tag:yaml.org,2002:int", "0x"
+ + Integer.toHexString(hex.getColor()).toUpperCase(), null);
+ }
+ }
+ }
+
+ private class HexInteger {
+ private Integer color;
+
+ public HexInteger(Integer color) {
+ this.color = color;
+ }
+
+ public Integer getColor() {
+ return color;
+ }
+ }
+
+ private class Shape {
+ private List<Entity> entities;
+
+ public List<Entity> getEntities() {
+ return entities;
+ }
+
+ public Shape(List<Entity> entities) {
+ this.entities = entities;
+ }
+ }
+
+ private class Entity {
+ }
+
+ private class Circle extends Entity {
+ private Map<String, Integer> center;
+ private Integer radius;
+
+ public Circle(Map<String, Integer> center, Integer radius) {
+ this.center = center;
+ this.radius = radius;
+ }
+
+ public Map<String, Integer> getCenter() {
+ return center;
+ }
+
+ public Integer getRadius() {
+ return radius;
+ }
+ }
+
+ private class Line extends Entity {
+ private Map<String, Integer> start;
+ private Map<String, Integer> finish;
+
+ public Line(Map<String, Integer> start, Map<String, Integer> finish) {
+ this.start = start;
+ this.finish = finish;
+ }
+
+ public Map<String, Integer> getStart() {
+ return start;
+ }
+
+ public Map<String, Integer> getFinish() {
+ return finish;
+ }
+ }
+
+ private class Label extends Entity {
+ private Map<String, Integer> start;
+ private Integer color;
+ private String text;
+
+ public Label(Map<String, Integer> start, Integer color, String text) {
+ this.start = start;
+ this.color = color;
+ this.text = text;
+ }
+
+ public Map<String, Integer> getStart() {
+ return start;
+ }
+
+ public Integer getColor() {
+ return color;
+ }
+
+ public String getText() {
+ return text;
+ }
+ }
+
+ public void testExample_2_24() throws IOException {
+ Loader loader = new Loader(new MyConstructor());
+ Yaml yaml = new Yaml(loader);
+ Shape shape = (Shape) yaml.load(Util.getLocalResource("specification/example2_24.yaml"));
+ assertNotNull(shape);
+ Dumper dumper = new Dumper(new MyRepresenter(), new DumperOptions());
+ yaml = new Yaml(dumper);
+ String output = yaml.dump(shape);
+ String etalon = Util.getLocalResource("specification/example2_24_dumped.yaml");
+ assertEquals(etalon, output);
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/Example2_27Test.java b/src/test/java/org/yaml/snakeyaml/Example2_27Test.java
new file mode 100644
index 00000000..ec56fff7
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/Example2_27Test.java
@@ -0,0 +1,35 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml;
+
+import java.io.IOException;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.constructor.Constructor;
+
+/**
+ * Test Example 2.27 from the YAML specification
+ *
+ * @author py4fun
+ * @see http://yaml.org/spec/1.1/
+ */
+public class Example2_27Test extends TestCase {
+
+ public void testExample_2_27() throws IOException {
+ Loader loader = new Loader(new Constructor(Invoice.class));
+ Yaml yaml = new Yaml(loader);
+ Invoice invoice = (Invoice) yaml.load(Util
+ .getLocalResource("specification/example2_27.yaml"));
+ assertNotNull(invoice);
+ Person billTo = invoice.billTo;
+ assertEquals("Dumars", billTo.family);
+ Dumper dumper = new Dumper(new DumperOptions());
+ yaml = new Yaml(dumper);
+ String output = yaml.dump(invoice);
+ System.out.println(output);
+ String etalon = Util.getLocalResource("specification/example2_27_dumped.yaml");
+ assertEquals(etalon, output);
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/Invoice.java b/src/test/java/org/yaml/snakeyaml/Invoice.java
new file mode 100644
index 00000000..66c585be
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/Invoice.java
@@ -0,0 +1,18 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml;
+
+import java.util.List;
+
+public class Invoice {
+ public Integer invoice; // invoice
+ public String date; // date
+ public Person billTo;// bill-to
+ public Person shipTo;// ship-to
+ public List<Product> product;
+ public Float tax;
+ public Float total;
+ public String comments;
+
+} \ No newline at end of file
diff --git a/src/test/java/org/yaml/snakeyaml/JavaBeanParserTest.java b/src/test/java/org/yaml/snakeyaml/JavaBeanParserTest.java
new file mode 100644
index 00000000..2f2f18de
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/JavaBeanParserTest.java
@@ -0,0 +1,95 @@
+package org.yaml.snakeyaml;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.StringReader;
+
+import junit.framework.TestCase;
+
+public class JavaBeanParserTest extends TestCase {
+
+ public void testLoadString() {
+ Bean bean = new Bean();
+ bean.setId(3);
+ bean.setName("Test me.");
+ Yaml yaml = new Yaml();
+ String output = yaml.dump(bean);
+ assertEquals("!!org.yaml.snakeyaml.JavaBeanParserTest$Bean {id: 3, name: Test me.}\n",
+ output);
+ Bean parsed = JavaBeanParser.load(output, Bean.class);
+ assertEquals(3, parsed.getId());
+ assertEquals("Test me.", parsed.getName());
+ // Runtime definition is more important
+ Bean2 parsed2 = JavaBeanParser.load(output, Bean2.class);
+ assertEquals(3, parsed2.getId());
+ assertEquals("Test me.", parsed2.getName());
+ assertFalse(parsed2.isValid());
+ }
+
+ public void testLoadInputStream() {
+ String yaml = "!!org.yaml.snakeyaml.JavaBeanParserTest$Bean {id: 3, name: Test me.}\n";
+ InputStream input = new ByteArrayInputStream(yaml.getBytes());
+ Bean parsed = JavaBeanParser.load(input, Bean.class);
+ assertEquals(3, parsed.getId());
+ assertEquals("Test me.", parsed.getName());
+ }
+
+ public void testLoadReader() {
+ String yaml = "!!org.yaml.snakeyaml.JavaBeanParserTest$Bean {id: 3, name: Test me.}\n";
+ java.io.Reader input = new StringReader(yaml);
+ Bean parsed = JavaBeanParser.load(input, Bean.class);
+ assertEquals(3, parsed.getId());
+ assertEquals("Test me.", parsed.getName());
+ }
+
+ public static class Bean {
+ private String name;
+ private int id;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+ }
+
+ public static class Bean2 {
+ private String name;
+ private int id;
+ private boolean valid;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public boolean isValid() {
+ return valid;
+ }
+
+ public void setValid(boolean valid) {
+ this.valid = valid;
+ }
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/ParallelTest.java b/src/test/java/org/yaml/snakeyaml/ParallelTest.java
new file mode 100644
index 00000000..1de2f2b8
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/ParallelTest.java
@@ -0,0 +1,83 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml;
+
+import java.io.IOException;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.constructor.Constructor;
+import org.yaml.snakeyaml.error.YAMLException;
+
+/**
+ * Test that Yaml instances are independent and can be used in multiple threads.
+ */
+public class ParallelTest extends TestCase {
+ private int progress = 0;
+ private int MAX = 5;
+
+ public void testPerfomance() throws IOException {
+ String doc = Util.getLocalResource("specification/example2_27.yaml");
+ for (int i = 0; i < MAX; i++) {
+ Worker worker = new Worker(i, doc);
+ Thread thread = new Thread(worker);
+ thread.start();
+ }
+ while (progress < MAX - 1) {
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ fail(e.getMessage());
+ }
+ }
+ }
+
+ private class Worker implements Runnable {
+ private int id;
+ private String doc;
+
+ public Worker(int id, String doc) {
+ this.id = id;
+ this.doc = doc;
+ }
+
+ public void run() {
+ System.out.println("Started: " + id);
+ Loader loader = new Loader(new Constructor(Invoice.class));
+ Yaml yaml = new Yaml(loader);
+ long time1 = System.currentTimeMillis();
+ int cycles = 200;
+ for (int i = 0; i < cycles; i++) {
+ Invoice invoice = (Invoice) yaml.load(doc);
+ assertNotNull(invoice);
+ }
+ long time2 = System.currentTimeMillis();
+ float duration = (time2 - time1) / (float) cycles;
+ System.out.println("Duration of " + id + " was " + duration + " ms/load.");
+ progress++;
+ }
+ }
+
+ public void testSharedLoader() throws IOException {
+ Loader loader = new Loader(new Constructor(Invoice.class));
+ new Yaml(loader);
+ try {
+ new Yaml(loader);
+ fail("Loader cannot be shared.");
+ } catch (YAMLException e) {
+ assertEquals("Loader cannot be shared.", e.getMessage());
+ }
+ }
+
+ public void testSharedDumper() throws IOException {
+ Dumper dumper = new Dumper(new DumperOptions());
+ new Yaml(dumper);
+ try {
+ new Yaml(dumper);
+ fail("Dumper cannot be shared.");
+ } catch (YAMLException e) {
+ assertEquals("Dumper cannot be shared.", e.getMessage());
+ }
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/Person.java b/src/test/java/org/yaml/snakeyaml/Person.java
new file mode 100644
index 00000000..d231a18e
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/Person.java
@@ -0,0 +1,10 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml;
+
+public class Person {
+ public String given;
+ public String family;
+ public Address address;
+} \ No newline at end of file
diff --git a/src/test/java/org/yaml/snakeyaml/Product.java b/src/test/java/org/yaml/snakeyaml/Product.java
new file mode 100644
index 00000000..1417a680
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/Product.java
@@ -0,0 +1,11 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml;
+
+public class Product {
+ public String sku;
+ public Integer quantity;
+ public String description;
+ public Float price;
+} \ No newline at end of file
diff --git a/src/test/java/org/yaml/snakeyaml/StressTest.java b/src/test/java/org/yaml/snakeyaml/StressTest.java
new file mode 100644
index 00000000..708366ad
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/StressTest.java
@@ -0,0 +1,60 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml;
+
+import java.io.IOException;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.constructor.Constructor;
+
+public class StressTest extends TestCase {
+ String doc;
+
+ public void setUp() throws IOException {
+ doc = Util.getLocalResource("specification/example2_27.yaml");
+ }
+
+ public void testPerformance() throws IOException {
+ long time1 = System.currentTimeMillis();
+ new Yaml(new Loader(new Constructor(Invoice.class)));
+ long time2 = System.currentTimeMillis();
+ float duration = time2 - time1;
+ System.out.println("Init was " + duration + " ms.");
+
+ Yaml yaml = new Yaml(new Loader(new Constructor(Invoice.class)));
+ time1 = System.currentTimeMillis();
+ yaml.load(doc);
+ time2 = System.currentTimeMillis();
+ duration = time2 - time1;
+ System.out.println("\nSingle load was " + duration + " ms.");
+
+ yaml = new Yaml(new Loader(new Constructor(Invoice.class)));
+ int[] range = new int[] { 1000, 2000 };
+ System.out.println("\nOne instance.");
+ for (int number : range) {
+ time1 = System.currentTimeMillis();
+ for (int i = 0; i < number; i++) {
+ yaml.load(doc);
+ }
+ time2 = System.currentTimeMillis();
+ duration = (time2 - time1) / (float) number;
+ System.out.println("Duration for r=" + number + " was " + duration + " ms/load.");
+ assertTrue("duration=" + duration, duration < 5);
+ }
+
+ System.out.println("\nMany instances.");
+ for (int number : range) {
+ time1 = System.currentTimeMillis();
+ for (int i = 0; i < number; i++) {
+ yaml = new Yaml(new Loader(new Constructor(Invoice.class)));
+ yaml.load(doc);
+ }
+ time2 = System.currentTimeMillis();
+ duration = (time2 - time1) / (float) number;
+ System.out.println("Duration for r=" + number + " was " + duration + " ms/load.");
+ assertTrue("duration=" + duration, duration < 5);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/test/java/org/yaml/snakeyaml/Suit.java b/src/test/java/org/yaml/snakeyaml/Suit.java
new file mode 100644
index 00000000..9a409960
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/Suit.java
@@ -0,0 +1,8 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml;
+
+public enum Suit {
+ CLUBS, DIAMONDS, HEARTS, SPADES
+} \ No newline at end of file
diff --git a/src/test/java/org/yaml/snakeyaml/TypeDescriptionTest.java b/src/test/java/org/yaml/snakeyaml/TypeDescriptionTest.java
new file mode 100644
index 00000000..fe7d7be0
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/TypeDescriptionTest.java
@@ -0,0 +1,21 @@
+package org.yaml.snakeyaml;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.constructor.ArrayTagsTest.CarWithArray;
+
+public class TypeDescriptionTest extends TestCase {
+
+ public void testSetTag() {
+ TypeDescription descr = new TypeDescription(TypeDescriptionTest.class);
+ descr.setTag("!bla");
+ assertEquals("!bla", descr.getTag());
+ }
+
+ public void testToString() {
+ TypeDescription carDescription = new TypeDescription(CarWithArray.class, "!car");
+ assertEquals(
+ "TypeDescription for class org.yaml.snakeyaml.constructor.ArrayTagsTest$CarWithArray (tag='!car')",
+ carDescription.toString());
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/Util.java b/src/test/java/org/yaml/snakeyaml/Util.java
new file mode 100644
index 00000000..2c87874a
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/Util.java
@@ -0,0 +1,39 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class Util {
+
+ public static String getLocalResource(String theName) throws IOException {
+ InputStream input;
+ input = YamlDocument.class.getClassLoader().getResourceAsStream(theName);
+ if (input == null) {
+ throw new RuntimeException("Can not find " + theName);
+ }
+ BufferedInputStream is = new BufferedInputStream(input);
+ StringBuffer buf = new StringBuffer(3000);
+ int i;
+ try {
+ while ((i = is.read()) != -1) {
+ buf.append((char) i);
+ }
+ } finally {
+ is.close();
+ }
+ String resource = buf.toString();
+ // convert EOLs
+ String[] lines = resource.split("\\r?\\n");
+ StringBuffer buffer = new StringBuffer();
+ for (int j = 0; j < lines.length; j++) {
+ buffer.append(lines[j]);
+ buffer.append("\n");
+ }
+ return buffer.toString();
+ }
+
+}
diff --git a/src/test/java/org/yaml/snakeyaml/YamlDocument.java b/src/test/java/org/yaml/snakeyaml/YamlDocument.java
new file mode 100644
index 00000000..1b5443e8
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/YamlDocument.java
@@ -0,0 +1,71 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.Charset;
+
+import org.yaml.snakeyaml.constructor.Constructor;
+
+public class YamlDocument {
+ public static final String ROOT = "specification/";
+ private String source;
+ private String presentation;
+ private Object nativeData;
+
+ public YamlDocument(String sourceName, boolean check, Constructor constructor) {
+ InputStream input = YamlDocument.class.getClassLoader().getResourceAsStream(
+ ROOT + sourceName);
+ if (constructor == null) {
+ constructor = new Constructor();
+ }
+ Loader loader = new Loader(constructor);
+ Yaml yaml = new Yaml(loader);
+ nativeData = yaml.load(input);
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ Charset charset = Charset.forName("UTF-8");
+ yaml.dump(nativeData, new OutputStreamWriter(output, charset));
+ try {
+ presentation = output.toString(charset.name());
+ source = Util.getLocalResource(ROOT + sourceName);
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ // try to read generated presentation to prove that the presentation
+ // is identical to the source
+ Object result = yaml.load(presentation);
+ if (check && !nativeData.equals(result)) {
+ throw new RuntimeException("Generated presentation is not valid: " + presentation);
+ }
+ }
+
+ public YamlDocument(String sourceName, boolean check) {
+ this(sourceName, check, null);
+ }
+
+ public YamlDocument(String sourceName) {
+ this(sourceName, true);
+ }
+
+ public String getSource() {
+ return source;
+ }
+
+ public String getPresentation() {
+ return presentation;
+ }
+
+ public Object getNativeData() {
+ if (nativeData == null) {
+ throw new NullPointerException("No object is parsed.");
+ }
+ return nativeData;
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/YamlStream.java b/src/test/java/org/yaml/snakeyaml/YamlStream.java
new file mode 100644
index 00000000..e4e9e099
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/YamlStream.java
@@ -0,0 +1,83 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml;
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.AssertionFailedError;
+
+public class YamlStream {
+ private List<Object> nativeData = new ArrayList<Object>();
+
+ @SuppressWarnings("unchecked")
+ public YamlStream(String sourceName) {
+ InputStream input = YamlDocument.class.getClassLoader().getResourceAsStream(
+ YamlDocument.ROOT + sourceName);
+ Yaml yaml = new Yaml();
+ for (Object document : yaml.loadAll(input)) {
+ nativeData.add(document);
+ }
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ yaml.dumpAll(nativeData.iterator(), new OutputStreamWriter(output));
+ String presentation;
+ try {
+ presentation = output.toString("UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ }
+ // try to read generated presentation to prove that the presentation
+ // is identical to the source
+ List<Object> parsedNativeData = new ArrayList<Object>();
+ for (Object document : yaml.loadAll(presentation)) {
+ parsedNativeData.add(document);
+ }
+ if (nativeData.getClass() != parsedNativeData.getClass()) {
+ throw new AssertionFailedError("Different class: " + parsedNativeData.getClass());
+ }
+ if (nativeData.size() != parsedNativeData.size()) {
+ throw new AssertionFailedError("Different size.");
+ }
+ Iterator piterator = parsedNativeData.iterator();
+ Iterator niterator = nativeData.iterator();
+ while (piterator.hasNext()) {
+ Object obj1 = niterator.next();
+ Object obj2 = piterator.next();
+ if (obj1 instanceof Map) {
+ Map map1 = (Map) obj1;
+ Map map2 = (Map) obj2;
+ if (!map1.keySet().equals(map2.keySet())) {
+ throw new AssertionFailedError("Keyset: " + map1.keySet() + "; but was: "
+ + map2.keySet());
+ }
+ for (Iterator iterator = map1.keySet().iterator(); iterator.hasNext();) {
+ Object key = (Object) iterator.next();
+ Object o1 = map1.get(key);
+ Object o2 = map2.get(key);
+ if (!o1.equals(o2)) {
+ throw new AssertionFailedError("Values: " + o1 + "; but was: " + o2);
+ }
+ }
+ }
+ if (!obj1.equals(obj2)) {
+ throw new AssertionFailedError("Expected: " + obj1 + "; but was: " + obj2);
+ }
+ }
+ if (!parsedNativeData.equals(nativeData)) {
+ throw new AssertionFailedError("Generated presentation is not the same: "
+ + presentation);
+ }
+ }
+
+ public List<Object> getNativeData() {
+ return nativeData;
+ }
+
+}
diff --git a/src/test/java/org/yaml/snakeyaml/YamlTest.java b/src/test/java/org/yaml/snakeyaml/YamlTest.java
new file mode 100644
index 00000000..0041199e
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/YamlTest.java
@@ -0,0 +1,18 @@
+package org.yaml.snakeyaml;
+
+import junit.framework.TestCase;
+
+public class YamlTest extends TestCase {
+
+ public void testSetNoName() {
+ Yaml yaml = new Yaml();
+ assertTrue(yaml.toString().matches("Yaml:\\d+"));
+ }
+
+ public void testSetName() {
+ Yaml yaml = new Yaml();
+ yaml.setName("REST");
+ assertEquals("REST", yaml.getName());
+ assertEquals("REST", yaml.toString());
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/composer/ComposerImplTest.java b/src/test/java/org/yaml/snakeyaml/composer/ComposerImplTest.java
new file mode 100644
index 00000000..5633c1ca
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/composer/ComposerImplTest.java
@@ -0,0 +1,37 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.composer;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.nodes.MappingNode;
+import org.yaml.snakeyaml.nodes.Node;
+import org.yaml.snakeyaml.parser.Parser;
+import org.yaml.snakeyaml.parser.ParserImpl;
+import org.yaml.snakeyaml.reader.Reader;
+import org.yaml.snakeyaml.resolver.Resolver;
+
+public class ComposerImplTest extends TestCase {
+
+ public void testGetNode() {
+ String data = "american:\n - Boston Red Sox";
+ Node node = compose(data);
+ assertNotNull(node);
+ assertTrue(node instanceof MappingNode);
+ // System.out.println(node);
+ String data2 = "---\namerican:\n- Boston Red Sox";
+ Node node2 = compose(data2);
+ assertNotNull(node2);
+ assertFalse(node.equals(node2));
+ }
+
+ private Node compose(String data) {
+ Reader reader = new Reader(data);
+ Parser parser = new ParserImpl(reader);
+ Resolver resolver = new Resolver();
+ Composer composer = new Composer(parser, resolver);
+ Node node = composer.getSingleNode();
+ return node;
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/constructor/ArrayTagsTest.java b/src/test/java/org/yaml/snakeyaml/constructor/ArrayTagsTest.java
new file mode 100644
index 00000000..5576b365
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/constructor/ArrayTagsTest.java
@@ -0,0 +1,89 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.constructor;
+
+import java.io.IOException;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.Loader;
+import org.yaml.snakeyaml.TypeDescription;
+import org.yaml.snakeyaml.Util;
+import org.yaml.snakeyaml.Yaml;
+
+public class ArrayTagsTest extends TestCase {
+
+ public void testDefaultRepresenter() throws IOException {
+ CarWithArray car = new CarWithArray();
+ car.setPlate("12-XP-F4");
+ Wheel[] wheels = new Wheel[5];
+ for (int i = 1; i < 6; i++) {
+ Wheel wheel = new Wheel();
+ wheel.setId(i);
+ wheels[i - 1] = wheel;
+ }
+ car.setWheels(wheels);
+ assertEquals(Util.getLocalResource("constructor/cararray-with-tags.yaml"), new Yaml()
+ .dump(car));
+ }
+
+ public void testLoadClassTag() throws IOException {
+ Constructor constructor = new Constructor();
+ constructor.addTypeDescription(new TypeDescription(Car.class, "!car"));
+ Loader loader = new Loader(constructor);
+ Yaml yaml = new Yaml(loader);
+ Car car = (Car) yaml.load(Util.getLocalResource("constructor/car-without-tags.yaml"));
+ assertEquals("12-XP-F4", car.getPlate());
+ List<Wheel> wheels = car.getWheels();
+ assertNotNull(wheels);
+ assertEquals(5, wheels.size());
+ }
+
+ public void testNullDescription() throws IOException {
+ Constructor constructor = new Constructor();
+ try {
+ constructor.addTypeDescription(null);
+ fail("Description is required.");
+ } catch (Exception e) {
+ assertEquals("TypeDescription is required.", e.getMessage());
+ }
+ }
+
+ public void testLoadClassNoRoot() throws IOException {
+ Constructor constructor = new Constructor();
+ TypeDescription carDescription = new TypeDescription(CarWithArray.class);
+ carDescription.setRoot(true);
+ constructor.addTypeDescription(carDescription);
+ Loader loader = new Loader(constructor);
+ Yaml yaml = new Yaml(loader);
+ CarWithArray car = (CarWithArray) yaml.load(Util
+ .getLocalResource("constructor/car-no-root-class.yaml"));
+ assertEquals("12-XP-F4", car.getPlate());
+ Wheel[] wheels = car.getWheels();
+ assertNotNull(wheels);
+ assertEquals(5, wheels.length);
+ }
+
+ public static class CarWithArray {
+ private String plate;
+ private Wheel[] wheels;
+
+ public String getPlate() {
+ return plate;
+ }
+
+ public void setPlate(String plate) {
+ this.plate = plate;
+ }
+
+ public Wheel[] getWheels() {
+ return wheels;
+ }
+
+ public void setWheels(Wheel[] wheels) {
+ this.wheels = wheels;
+ }
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/constructor/BeanConstructorTest.java b/src/test/java/org/yaml/snakeyaml/constructor/BeanConstructorTest.java
new file mode 100644
index 00000000..57d273c5
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/constructor/BeanConstructorTest.java
@@ -0,0 +1,228 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.constructor;
+
+import java.io.IOException;
+import java.math.BigInteger;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.Loader;
+import org.yaml.snakeyaml.Util;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.error.YAMLException;
+
+public class BeanConstructorTest extends TestCase {
+
+ public void testPrimitivesConstructor() throws IOException {
+ Loader loader = new Loader(new Constructor(TestBean1.class));
+ Yaml yaml = new Yaml(loader);
+ String document = Util.getLocalResource("constructor/test-primitives1.yaml");
+ System.out.println(document);
+ TestBean1 result = (TestBean1) yaml.load(document);
+ assertNotNull(result);
+ assertEquals(new Byte((byte) 1), result.getByteClass());
+ assertEquals((byte) -3, result.getBytePrimitive());
+ assertEquals(new Short((short) 0), result.getShortClass());
+ assertEquals((short) -13, result.getShortPrimitive());
+ assertEquals(new Integer(5), result.getInteger());
+ assertEquals(17, result.getIntPrimitive());
+ assertEquals("the text", result.getText());
+ assertEquals("13", result.getId());
+ assertEquals(new Long(11111111111L), result.getLongClass());
+ assertEquals(9999999999L, result.getLongPrimitive());
+ assertEquals(Boolean.TRUE, result.getBooleanClass());
+ assertTrue(result.isBooleanPrimitive());
+ assertEquals(new Character('2'), result.getCharClass());
+ assertEquals('#', result.getCharPrimitive());
+ assertEquals(new BigInteger("1234567890123456789012345678901234567890"), result
+ .getBigInteger());
+ assertEquals(new Float(2), result.getFloatClass());
+ assertEquals(new Float(3.1416), result.getFloatPrimitive());
+ assertEquals(new Double(4), result.getDoubleClass());
+ assertEquals(new Double(11200), result.getDoublePrimitive());
+ assertEquals(1199836800000L, result.getDate().getTime());
+ assertEquals("public", result.publicField);
+ //
+ DumperOptions options = new DumperOptions();
+ options.setDefaultFlowStyle(DumperOptions.DefaultFlowStyle.BLOCK);
+ Yaml yamlToDump = new Yaml(options);
+ String output = yamlToDump.dump(result);
+ System.out.println(output);
+ TestBean1 result2 = (TestBean1) yaml.load(output);
+ assertNotNull(result2);
+ TestBean1 result3 = (TestBean1) new Yaml().load(output);
+ assertNotNull(result3);
+ }
+
+ public void testNoClassConstructor() {
+ try {
+ new Loader(new Constructor((Class<? extends Object>) null));
+ fail("Class must be provided.");
+ } catch (NullPointerException e) {
+ assertEquals("Root type must be provided.", e.getMessage());
+ }
+ }
+
+ public void testNoClassConstructorString() throws ClassNotFoundException {
+ try {
+ new Loader(new Constructor((String) null));
+ fail("Class must be provided.");
+ } catch (NullPointerException e) {
+ assertEquals("Root type must be provided.", e.getMessage());
+ }
+ }
+
+ public void testNoClassConstructorEmptyString() throws ClassNotFoundException {
+ try {
+ new Loader(new Constructor(" "));
+ fail("Class must be provided.");
+ } catch (YAMLException e) {
+ assertEquals("Root type must be provided.", e.getMessage());
+ }
+ }
+
+ public void testCharacter() throws IOException {
+ Loader loader = new Loader(new Constructor(TestBean1.class));
+ Yaml yaml = new Yaml(loader);
+ String document = "charClass: id";
+ try {
+ yaml.load(document);
+ fail("Only one char must be allowed.");
+ } catch (Exception e) {
+ assertTrue(e.getMessage(), e.getMessage().contains(
+ "Invalid node Character: 'id'; length: 2"));
+ }
+ document = "charClass: #";
+ try {
+ yaml.load(document);
+ fail("Only one char must be allowed.");
+ } catch (Exception e) {
+ assertTrue(e.getMessage(), e.getMessage().contains(
+ "Invalid node Character: ''; length: 0"));
+ }
+ document = "charClass: ''";
+ try {
+ yaml.load(document);
+ fail("Only one char must be allowed.");
+ } catch (Exception e) {
+ assertTrue(e.getMessage(), e.getMessage().contains(
+ "Invalid node Character: ''; length: 0"));
+ }
+ document = "charClass:\n";
+ try {
+ yaml.load(document);
+ fail("Only one char must be allowed.");
+ } catch (Exception e) {
+ assertTrue(e.getMessage(), e.getMessage().contains(
+ "Invalid node Character: ''; length: 0"));
+ }
+
+ }
+
+ public void testNoEmptyConstructor() throws IOException {
+ Loader loader = new Loader(new Constructor(TestBean2.class));
+ Yaml yaml = new Yaml(loader);
+ String document = "text: qwerty";
+ try {
+ yaml.load(document);
+ fail("No empty constructor available");
+ } catch (Exception e) {
+ assertTrue(e.getMessage(), e.getMessage().contains("InstantiationException"));
+ }
+ }
+
+ private class TestBean2 {
+ private String text;
+
+ public TestBean2(String text) {
+ this.text = text;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+ }
+
+ public void testPrivateMethod() throws IOException {
+ Loader loader = new Loader(new Constructor(TestBean3.class));
+ Yaml yaml = new Yaml(loader);
+ String document = "text: qwerty";
+ try {
+ yaml.load(document);
+ fail("Private method cannot be called.");
+ } catch (Exception e) {
+ assertTrue(e.getMessage(), e.getMessage().contains("InstantiationException"));
+ }
+ }
+
+ private class TestBean3 {
+ private String text;
+
+ public TestBean3() {
+ setText("123");
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ private void setText(String text) {
+ this.text = text;
+ }
+ }
+
+ public void testKeyNotScalar() throws IOException {
+ Loader loader = new Loader(new Constructor(TestBean1.class));
+ Yaml yaml = new Yaml(loader);
+ String document = "[1, 2]: qwerty";
+ try {
+ yaml.load(document);
+ fail("Keys must be scalars.");
+ } catch (Exception e) {
+ assertTrue(e.getMessage(), e.getMessage().contains("Keys must be scalars but found"));
+ }
+ }
+
+ public void testInvalidKey() throws IOException {
+ Loader loader = new Loader(new Constructor(TestBean1.class));
+ Yaml yaml = new Yaml(loader);
+ String document = "something: qwerty";
+ try {
+ yaml.load(document);
+ fail("Non-existing property must fail.");
+ } catch (Exception e) {
+ assertTrue(e.getMessage(), e.getMessage().contains(
+ "Unable to find property 'something'"));
+ }
+ }
+
+ public void testStaticField() throws IOException {
+ Loader loader = new Loader(new Constructor(TestBean1.class));
+ Yaml yaml = new Yaml(loader);
+ String document = "staticInteger: 123";
+ try {
+ yaml.load(document);
+ fail("Staic variables must not be used.");
+ } catch (Exception e) {
+ assertTrue(e.getMessage(), e.getMessage().contains(
+ "Unable to find property 'staticInteger'"));
+ }
+ }
+
+ public void testScalarContructor() throws IOException {
+ Loader loader = new Loader(new Constructor(Parent1.class));
+ Yaml yaml = new Yaml(loader);
+ String document = "id: 123\nchild: 25";
+ Parent1 parent = (Parent1) yaml.load(document);
+ assertEquals("123", parent.getId());
+ Child1 child = parent.getChild();
+ assertEquals(new Integer(25), child.getCode());
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/constructor/Car.java b/src/test/java/org/yaml/snakeyaml/constructor/Car.java
new file mode 100644
index 00000000..5e5b6f18
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/constructor/Car.java
@@ -0,0 +1,27 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.constructor;
+
+import java.util.List;
+
+public class Car {
+ private String plate;
+ private List<Wheel> wheels;
+
+ public String getPlate() {
+ return plate;
+ }
+
+ public void setPlate(String plate) {
+ this.plate = plate;
+ }
+
+ public List<Wheel> getWheels() {
+ return wheels;
+ }
+
+ public void setWheels(List<Wheel> wheels) {
+ this.wheels = wheels;
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/constructor/Child1.java b/src/test/java/org/yaml/snakeyaml/constructor/Child1.java
new file mode 100644
index 00000000..eac79867
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/constructor/Child1.java
@@ -0,0 +1,16 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.constructor;
+
+public class Child1 {
+ private Integer code;
+
+ public Child1(Integer code) {
+ this.code = code;
+ }
+
+ public Integer getCode() {
+ return code;
+ }
+} \ No newline at end of file
diff --git a/src/test/java/org/yaml/snakeyaml/constructor/ClassTagsTest.java b/src/test/java/org/yaml/snakeyaml/constructor/ClassTagsTest.java
new file mode 100644
index 00000000..4bc80c0b
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/constructor/ClassTagsTest.java
@@ -0,0 +1,101 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.constructor;
+
+import java.io.IOException;
+import java.util.LinkedList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.Dumper;
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.Loader;
+import org.yaml.snakeyaml.TypeDescription;
+import org.yaml.snakeyaml.Util;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.error.YAMLException;
+import org.yaml.snakeyaml.representer.Representer;
+
+public class ClassTagsTest extends TestCase {
+
+ public void testDefaultRepresenter() throws IOException {
+ Car car = new Car();
+ car.setPlate("12-XP-F4");
+ List<Wheel> wheels = new LinkedList<Wheel>();
+ for (int i = 1; i < 6; i++) {
+ Wheel wheel = new Wheel();
+ wheel.setId(i);
+ wheels.add(wheel);
+ }
+ car.setWheels(wheels);
+ assertEquals(Util.getLocalResource("constructor/car-with-tags.yaml"), new Yaml().dump(car));
+ }
+
+ public void testDumpClassTag() throws IOException {
+ Car car = new Car();
+ car.setPlate("12-XP-F4");
+ List<Wheel> wheels = new LinkedList<Wheel>();
+ for (int i = 1; i < 6; i++) {
+ Wheel wheel = new Wheel();
+ wheel.setId(i);
+ wheels.add(wheel);
+ }
+ car.setWheels(wheels);
+ Representer representer = new Representer();
+ representer.addTypeDescription(new TypeDescription(Car.class, "!car"));
+ representer.addTypeDescription(new TypeDescription(Wheel.class, "tag:yaml.org,2002:map"));
+ Dumper dumper = new Dumper(representer, new DumperOptions());
+ Yaml yaml = new Yaml(dumper);
+ String output = yaml.dump(car);
+ assertEquals(Util.getLocalResource("constructor/car-without-tags.yaml"), output);
+ }
+
+ public void testLoadUnknounClassTag() throws IOException {
+ try {
+ Yaml yaml = new Yaml();
+ yaml.load(Util.getLocalResource("constructor/car-without-tags.yaml"));
+ fail("Must fail because of unknown tag: !car");
+ } catch (YAMLException e) {
+ assertTrue(e.getMessage().contains("Unknown tag: !car"));
+ }
+
+ }
+
+ public void testLoadClassTag() throws IOException {
+ Constructor constructor = new Constructor();
+ constructor.addTypeDescription(new TypeDescription(Car.class, "!car"));
+ Loader loader = new Loader(constructor);
+ Yaml yaml = new Yaml(loader);
+ Car car = (Car) yaml.load(Util.getLocalResource("constructor/car-without-tags.yaml"));
+ assertEquals("12-XP-F4", car.getPlate());
+ List<Wheel> wheels = car.getWheels();
+ assertNotNull(wheels);
+ assertEquals(5, wheels.size());
+ }
+
+ public void testNullDescription() throws IOException {
+ Constructor constructor = new Constructor();
+ try {
+ constructor.addTypeDescription(null);
+ fail("Description is required.");
+ } catch (Exception e) {
+ assertEquals("TypeDescription is required.", e.getMessage());
+ }
+ }
+
+ public void testLoadClassNoRoot() throws IOException {
+ Constructor constructor = new Constructor();
+ TypeDescription carDescription = new TypeDescription(Car.class);
+ carDescription.setRoot(true);
+ constructor.addTypeDescription(carDescription);
+ Loader loader = new Loader(constructor);
+ Yaml yaml = new Yaml(loader);
+ Car car = (Car) yaml.load(Util.getLocalResource("constructor/car-no-root-class.yaml"));
+ assertEquals("12-XP-F4", car.getPlate());
+ List<Wheel> wheels = car.getWheels();
+ assertNotNull(wheels);
+ assertEquals(5, wheels.size());
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/constructor/ConstructorMappingTest.java b/src/test/java/org/yaml/snakeyaml/constructor/ConstructorMappingTest.java
new file mode 100644
index 00000000..3bdd6adb
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/constructor/ConstructorMappingTest.java
@@ -0,0 +1,55 @@
+package org.yaml.snakeyaml.constructor;
+
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.TreeMap;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.composer.Composer;
+import org.yaml.snakeyaml.parser.Parser;
+import org.yaml.snakeyaml.parser.ParserImpl;
+import org.yaml.snakeyaml.reader.Reader;
+import org.yaml.snakeyaml.resolver.Resolver;
+
+public class ConstructorMappingTest extends TestCase {
+
+ @SuppressWarnings("unchecked")
+ public void testGetDefaultMap() {
+ String data = "{ one: 1, two: 2, three: 3 }";
+ Map<Object, Object> map = (Map<Object, Object>) construct(new CustomConstructor(), data);
+ assertNotNull(map);
+ assertTrue(map.getClass().toString(), map instanceof TreeMap);
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testGetLinkedList() {
+ String data = "{ one: 1, two: 2, three: 3 }";
+ Map<Object, Object> map = (Map<Object, Object>) construct(data);
+ assertNotNull(map);
+ assertTrue(map.getClass().toString(), map instanceof LinkedHashMap);
+ }
+
+ private Object construct(String data) {
+ return construct(new Constructor(), data);
+ }
+
+ private Object construct(Constructor constructor, String data) {
+ Reader reader = new Reader(data);
+ Parser parser = new ParserImpl(reader);
+ Resolver resolver = new Resolver();
+ Composer composer = new Composer(parser, resolver);
+ constructor.setComposer(composer);
+ return constructor.getSingleData();
+ }
+
+ class CustomConstructor extends Constructor {
+ @Override
+ protected Map<Object, Object> createDefaultMap() {
+ return new TreeMap<Object, Object>();
+ }
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/constructor/ConstructorSequenceTest.java b/src/test/java/org/yaml/snakeyaml/constructor/ConstructorSequenceTest.java
new file mode 100644
index 00000000..5bc744a9
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/constructor/ConstructorSequenceTest.java
@@ -0,0 +1,74 @@
+package org.yaml.snakeyaml.constructor;
+
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.composer.Composer;
+import org.yaml.snakeyaml.parser.Parser;
+import org.yaml.snakeyaml.parser.ParserImpl;
+import org.yaml.snakeyaml.reader.Reader;
+import org.yaml.snakeyaml.resolver.Resolver;
+
+public class ConstructorSequenceTest extends TestCase {
+
+ public void testGetList() {
+ String data = "[ 1, 2, 3 ]";
+ List<Object> list = construct(new CustomConstructor(), data);
+ assertNotNull(list);
+ assertTrue(list.getClass().toString(), list instanceof ArrayList);
+ }
+
+ public void testGetLinkedList() {
+ String data = "[ 1, 2, 3 ]";
+ List<Object> list = construct(data);
+ assertNotNull(list);
+ assertTrue(list.getClass().toString(), list instanceof LinkedList);
+ }
+
+ public void testDumpList() {
+ List<Integer> l = new ArrayList<Integer>(2);
+ l.add(1);
+ l.add(2);
+ Yaml yaml = new Yaml();
+ String result = yaml.dump(l);
+ assertEquals("[1, 2]\n", result);
+ }
+
+ public void testDumpListSameIntegers() {
+ List<Integer> l = new ArrayList<Integer>(2);
+ l.add(1);
+ l.add(1);
+ Yaml yaml = new Yaml();
+ String result = yaml.dump(l);
+ assertEquals("[1, 1]\n", result);
+ }
+
+ private List<Object> construct(String data) {
+ return construct(new Constructor(), data);
+ }
+
+ @SuppressWarnings("unchecked")
+ private List<Object> construct(Constructor constructor, String data) {
+ Reader reader = new Reader(data);
+ Parser parser = new ParserImpl(reader);
+ Resolver resolver = new Resolver();
+ Composer composer = new Composer(parser, resolver);
+ constructor.setComposer(composer);
+ List result = (List) constructor.getSingleData();
+ return result;
+ }
+
+ class CustomConstructor extends Constructor {
+ @Override
+ protected List<Object> createDefaultList(int initSize) {
+ return new ArrayList<Object>(initSize);
+ }
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/constructor/ConstructorTest.java b/src/test/java/org/yaml/snakeyaml/constructor/ConstructorTest.java
new file mode 100644
index 00000000..9ee76be5
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/constructor/ConstructorTest.java
@@ -0,0 +1,89 @@
+package org.yaml.snakeyaml.constructor;
+
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.TimeZone;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.Yaml;
+
+public class ConstructorTest extends TestCase {
+
+ @SuppressWarnings("unchecked")
+ public void testMapOrder() {
+ String data = "one: zzz\ntwo: ccc\nthree: bbb\nfour: aaa";
+ Object map = construct(data);
+ assertNotNull(map);
+ assertTrue(map.getClass().toString(), map instanceof LinkedHashMap);
+ Map<String, String> m = (Map<String, String>) map;
+ assertEquals(4, m.keySet().size());
+ Iterator<String> iter = m.keySet().iterator();
+ assertEquals("one", iter.next());
+ assertEquals("two", iter.next());
+ assertEquals("three", iter.next());
+ assertEquals("four", iter.next());
+ }
+
+ /**
+ * create JavaBean
+ */
+ public void testGetBeanAssumeClass() {
+ String data = "--- !!org.yaml.snakeyaml.constructor.Person\nfirstName: Andrey\nage: 99";
+ Object obj = construct(data);
+ assertNotNull(obj);
+ assertTrue("Unexpected: " + obj.getClass().toString(), obj instanceof Person);
+ Person person = (Person) obj;
+ assertEquals("Andrey", person.getFirstName());
+ assertNull(person.getLastName());
+ assertEquals(99, person.getAge().intValue());
+ }
+
+ /**
+ * create instance using constructor arguments
+ */
+ public void testGetConstructorBean() {
+ String data = "--- !!org.yaml.snakeyaml.constructor.Person [ Andrey, Somov, 99 ]";
+ Object obj = construct(data);
+ assertNotNull(obj);
+ assertTrue(obj.getClass().toString(), obj instanceof Person);
+ Person person = (Person) obj;
+ assertEquals("Andrey", person.getFirstName());
+ assertEquals("Somov", person.getLastName());
+ assertEquals(99, person.getAge().intValue());
+ }
+
+ /**
+ * create instance using scalar argument
+ */
+ public void testGetConstructorFromScalar() {
+ String data = "--- !!org.yaml.snakeyaml.constructor.Person 'Somov'";
+ Object obj = construct(data);
+ assertNotNull(obj);
+ assertTrue(obj.getClass().toString(), obj instanceof Person);
+ Person person = (Person) obj;
+ assertNull("Andrey", person.getFirstName());
+ assertEquals("Somov", person.getLastName());
+ assertNull(person.getAge());
+ }
+
+ public void testJavaBeanLoad() {
+ java.util.Calendar cal = java.util.Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+ cal.clear();
+ cal.set(1982, 5 - 1, 3); // Java's months are zero-based...
+
+ TestBean expected = new TestBean("Ola Bini", 24, cal.getTime());
+ assertEquals(
+ expected,
+ construct("--- !!org.yaml.snakeyaml.constructor.TestBean\nname: Ola Bini\nage: 24\nborn: 1982-05-03\n"));
+ }
+
+ private Object construct(String data) {
+ Yaml yaml = new Yaml();
+ return yaml.load(data);
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/constructor/ImplicitTagsTest.java b/src/test/java/org/yaml/snakeyaml/constructor/ImplicitTagsTest.java
new file mode 100644
index 00000000..ade54ddc
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/constructor/ImplicitTagsTest.java
@@ -0,0 +1,149 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.constructor;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.Dumper;
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.Loader;
+import org.yaml.snakeyaml.TypeDescription;
+import org.yaml.snakeyaml.Util;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.representer.Representer;
+
+public class ImplicitTagsTest extends TestCase {
+
+ public void testDefaultRepresenter() throws IOException {
+ CarWithWheel car1 = new CarWithWheel();
+ car1.setPlate("12-XP-F4");
+ Wheel wheel = new Wheel();
+ wheel.setId(2);
+ car1.setWheel(wheel);
+ Map<String, Integer> map = new HashMap<String, Integer>();
+ map.put("id", 3);
+ car1.setMap(map);
+ car1.setPart(new Wheel(4));
+ car1.setYear("2008");
+ String carYaml1 = new Yaml().dump(car1);
+ assertEquals(Util.getLocalResource("constructor/carwheel-without-tags.yaml"), carYaml1);
+ CarWithWheel car2 = (CarWithWheel) new Yaml().load(carYaml1);
+ String carYaml2 = new Yaml().dump(car2);
+ assertEquals(carYaml1, carYaml2);
+ }
+
+ public void testNoRootTag() throws IOException {
+ CarWithWheel car1 = new CarWithWheel();
+ car1.setPlate("12-XP-F4");
+ Wheel wheel = new Wheel();
+ wheel.setId(2);
+ car1.setWheel(wheel);
+ Map<String, Integer> map = new HashMap<String, Integer>();
+ map.put("id", 3);
+ car1.setMap(map);
+ car1.setYear("2008");
+ DumperOptions options = new DumperOptions();
+ options.setExplicitRoot("tag:yaml.org,2002:map");
+ String carYaml1 = new Yaml(options).dump(car1);
+ assertEquals(Util.getLocalResource("constructor/car-without-root-tag.yaml"), carYaml1);
+ //
+ Constructor contructor = new Constructor(CarWithWheel.class);
+ Loader loader = new Loader(contructor);
+ CarWithWheel car2 = (CarWithWheel) new Yaml(loader).load(carYaml1);
+ String carYaml2 = new Yaml(options).dump(car2);
+ assertEquals(carYaml1, carYaml2);
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testRootMap() throws IOException {
+ Map<Object, Object> car1 = new HashMap<Object, Object>();
+ car1.put("plate", "12-XP-F4");
+ Wheel wheel = new Wheel();
+ wheel.setId(2);
+ car1.put("wheel", wheel);
+ Map<String, Integer> map = new HashMap<String, Integer>();
+ map.put("id", 3);
+ car1.put("map", map);
+ String carYaml1 = new Yaml().dump(car1);
+ assertEquals(Util.getLocalResource("constructor/carwheel-root-map.yaml"), carYaml1);
+ Map<Object, Object> car2 = (Map<Object, Object>) new Yaml().load(carYaml1);
+ assertEquals(car1, car2);
+ assertEquals(carYaml1, new Yaml().dump(car2));
+ }
+
+ public void testLoadClassTag() throws IOException {
+ Constructor constructor = new Constructor();
+ constructor.addTypeDescription(new TypeDescription(Car.class, "!car"));
+ Loader loader = new Loader(constructor);
+ Yaml yaml = new Yaml(loader);
+ Car car = (Car) yaml.load(Util.getLocalResource("constructor/car-without-tags.yaml"));
+ assertEquals("12-XP-F4", car.getPlate());
+ List<Wheel> wheels = car.getWheels();
+ assertNotNull(wheels);
+ assertEquals(5, wheels.size());
+ //
+ String carYaml1 = new Yaml().dump(car);
+ assertTrue(carYaml1.startsWith("!!org.yaml.snakeyaml.constructor.Car"));
+ //
+ Representer representer = new Representer();
+ representer.addTypeDescription(new TypeDescription(Car.class, "!car"));
+ Dumper dumper = new Dumper(representer, new DumperOptions());
+ yaml = new Yaml(dumper);
+ String carYaml2 = yaml.dump(car);
+ assertEquals(Util.getLocalResource("constructor/car-without-tags.yaml"), carYaml2);
+ }
+
+ public static class CarWithWheel {
+ private String plate;
+ private String year;
+ private Wheel wheel;
+ private Object part;
+ private Map<String, Integer> map;
+
+ public String getPlate() {
+ return plate;
+ }
+
+ public void setPlate(String plate) {
+ this.plate = plate;
+ }
+
+ public Wheel getWheel() {
+ return wheel;
+ }
+
+ public void setWheel(Wheel wheel) {
+ this.wheel = wheel;
+ }
+
+ public Map<String, Integer> getMap() {
+ return map;
+ }
+
+ public void setMap(Map<String, Integer> map) {
+ this.map = map;
+ }
+
+ public Object getPart() {
+ return part;
+ }
+
+ public void setPart(Object part) {
+ this.part = part;
+ }
+
+ public String getYear() {
+ return year;
+ }
+
+ public void setYear(String year) {
+ this.year = year;
+ }
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/constructor/MyCar.java b/src/test/java/org/yaml/snakeyaml/constructor/MyCar.java
new file mode 100644
index 00000000..c3107db1
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/constructor/MyCar.java
@@ -0,0 +1,37 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.constructor;
+
+import java.util.Date;
+import java.util.Map;
+
+public class MyCar {
+ private String plate;
+ private Map<MyWheel, Date> wheels;
+ private Map<String, Integer> windows;
+
+ public String getPlate() {
+ return plate;
+ }
+
+ public void setPlate(String plate) {
+ this.plate = plate;
+ }
+
+ public Map<MyWheel, Date> getWheels() {
+ return wheels;
+ }
+
+ public void setWheels(Map<MyWheel, Date> wheels) {
+ this.wheels = wheels;
+ }
+
+ public Map<String, Integer> getWindows() {
+ return windows;
+ }
+
+ public void setWindows(Map<String, Integer> windows) {
+ this.windows = windows;
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/constructor/MyWheel.java b/src/test/java/org/yaml/snakeyaml/constructor/MyWheel.java
new file mode 100644
index 00000000..b99a8983
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/constructor/MyWheel.java
@@ -0,0 +1,49 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.constructor;
+
+public class MyWheel {
+ private int id;
+ private String brand;
+
+ public MyWheel() {
+ brand = "Pirelli";
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ @Override
+ public String toString() {
+ return "Wheel id=" + id;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof MyWheel) {
+ MyWheel wheel = (MyWheel) obj;
+ return id == wheel.getId();
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ return new Integer(id).hashCode();
+ }
+
+ public String getBrand() {
+ return brand;
+ }
+
+ public void setBrand(String brand) {
+ this.brand = brand;
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/constructor/Parent1.java b/src/test/java/org/yaml/snakeyaml/constructor/Parent1.java
new file mode 100644
index 00000000..c3652f3f
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/constructor/Parent1.java
@@ -0,0 +1,26 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.constructor;
+
+public class Parent1 {
+ private String id;
+ private Child1 child;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public Child1 getChild() {
+ return child;
+ }
+
+ public void setChild(Child1 child) {
+ this.child = child;
+ }
+
+} \ No newline at end of file
diff --git a/src/test/java/org/yaml/snakeyaml/constructor/Person.java b/src/test/java/org/yaml/snakeyaml/constructor/Person.java
new file mode 100644
index 00000000..0067f4b4
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/constructor/Person.java
@@ -0,0 +1,51 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.constructor;
+
+/**
+ * Test JavaBean
+ */
+public class Person {
+ private String firstName;
+ private String lastName;
+ private Integer age;
+
+ public Person(String firstName, String lastName, Integer age) {
+ this.firstName = firstName;
+ this.lastName = lastName;
+ this.age = age;
+ }
+
+ public Person() {
+ }
+
+ public Person(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public Integer getAge() {
+ return age;
+ }
+
+ public void setAge(Integer age) {
+ this.age = age;
+ }
+
+}
diff --git a/src/test/java/org/yaml/snakeyaml/constructor/SafeConstructorTest.java b/src/test/java/org/yaml/snakeyaml/constructor/SafeConstructorTest.java
new file mode 100644
index 00000000..5b947a47
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/constructor/SafeConstructorTest.java
@@ -0,0 +1,39 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.constructor;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.Loader;
+import org.yaml.snakeyaml.Yaml;
+
+public class SafeConstructorTest extends TestCase {
+
+ public void testConstructFloat() {
+ Yaml yaml = new Yaml();
+ assertEquals(3.1416, yaml.load("+3.1416"));
+ assertEquals(Double.POSITIVE_INFINITY, yaml.load("+.inf"));
+ assertEquals(Double.POSITIVE_INFINITY, yaml.load(".inf"));
+ assertEquals(Double.NEGATIVE_INFINITY, yaml.load("-.inf"));
+ }
+
+ public void testSafeConstruct() {
+ Yaml yaml = new Yaml(new Loader(new SafeConstructor()));
+ assertEquals(3.1416, yaml.load("+3.1416"));
+ }
+
+ public void testSafeConstructJavaBean() {
+ Yaml yaml = new Yaml(new Loader(new SafeConstructor()));
+ String data = "--- !!org.yaml.snakeyaml.constructor.Person\nfirstName: Andrey\nage: 99";
+ try {
+ yaml.load(data);
+ fail("JavaBeans cannot be created by SafeConstructor.");
+ } catch (ConstructorException e) {
+ assertTrue(e
+ .getMessage()
+ .contains(
+ "could not determine a constructor for the tag tag:yaml.org,2002:org.yaml.snakeyaml.constructor.Person"));
+ }
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/constructor/TestBean.java b/src/test/java/org/yaml/snakeyaml/constructor/TestBean.java
new file mode 100644
index 00000000..47ef11ca
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/constructor/TestBean.java
@@ -0,0 +1,71 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.constructor;
+
+import java.util.Date;
+
+/**
+ * @author <a href="mailto:ola.bini@ki.se">Ola Bini</a>
+ */
+public class TestBean {
+ private String name;
+ private int age;
+ private Date born;
+
+ public TestBean() {
+ }
+
+ public TestBean(final String name, final int age, final Date born) {
+ this.name = name;
+ this.age = age;
+ this.born = born;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public Date getBorn() {
+ return born;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ public void setAge(final int age) {
+ this.age = age;
+ }
+
+ public void setBorn(final Date born) {
+ this.born = born;
+ }
+
+ public boolean equals(final Object other) {
+ boolean ret = this == other;
+ if (!ret && other instanceof TestBean) {
+ TestBean o = (TestBean) other;
+ ret = this.name == null ? o.name == null : this.name.equals(o.name)
+ && this.age == o.age && this.born == null ? o.born == null : this.born
+ .equals(o.born);
+ }
+ return ret;
+ }
+
+ public int hashCode() {
+ int val = 3;
+ val += 3 * (name == null ? 0 : name.hashCode());
+ val += 3 * age;
+ val += 3 * (born == null ? 0 : born.hashCode());
+ return val;
+ }
+
+ public String toString() {
+ return "#<org.jvyaml.TestBean name=\"" + name + "\" age=" + age + " born=\"" + born + "\">";
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/constructor/TestBean1.java b/src/test/java/org/yaml/snakeyaml/constructor/TestBean1.java
new file mode 100644
index 00000000..18ef9e0c
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/constructor/TestBean1.java
@@ -0,0 +1,192 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.constructor;
+
+import java.math.BigInteger;
+import java.util.Date;
+
+public class TestBean1 {
+ private String text;
+ private String id;
+ private Byte byteClass;
+ private byte bytePrimitive;
+ private Short shortClass;
+ private short shortPrimitive;
+ private Integer integer;
+ private int intPrimitive;
+ private Long longClass;
+ private long longPrimitive;
+ private Boolean booleanClass;
+ private boolean booleanPrimitive;
+ private Character charClass;
+ private char charPrimitive;
+ private BigInteger bigInteger;
+ private Float floatClass;
+ private float floatPrimitive;
+ private Double doubleClass;
+ private double doublePrimitive;
+ private Date date;
+ public String publicField;
+ static public Integer staticInteger;
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+
+ public Integer getInteger() {
+ return integer;
+ }
+
+ public void setInteger(Integer integer) {
+ this.integer = integer;
+ }
+
+ public int getIntPrimitive() {
+ return intPrimitive;
+ }
+
+ public void setIntPrimitive(int intPrimitive) {
+ this.intPrimitive = intPrimitive;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public Byte getByteClass() {
+ return byteClass;
+ }
+
+ public void setByteClass(Byte byteClass) {
+ this.byteClass = byteClass;
+ }
+
+ public byte getBytePrimitive() {
+ return bytePrimitive;
+ }
+
+ public void setBytePrimitive(byte bytePrimitive) {
+ this.bytePrimitive = bytePrimitive;
+ }
+
+ public Short getShortClass() {
+ return shortClass;
+ }
+
+ public void setShortClass(Short shortClass) {
+ this.shortClass = shortClass;
+ }
+
+ public short getShortPrimitive() {
+ return shortPrimitive;
+ }
+
+ public void setShortPrimitive(short shortPrimitive) {
+ this.shortPrimitive = shortPrimitive;
+ }
+
+ public Long getLongClass() {
+ return longClass;
+ }
+
+ public void setLongClass(Long longClass) {
+ this.longClass = longClass;
+ }
+
+ public long getLongPrimitive() {
+ return longPrimitive;
+ }
+
+ public void setLongPrimitive(long longPrimitive) {
+ this.longPrimitive = longPrimitive;
+ }
+
+ public Boolean getBooleanClass() {
+ return booleanClass;
+ }
+
+ public void setBooleanClass(Boolean booleanClass) {
+ this.booleanClass = booleanClass;
+ }
+
+ public boolean isBooleanPrimitive() {
+ return booleanPrimitive;
+ }
+
+ public void setBooleanPrimitive(boolean booleanPrimitive) {
+ this.booleanPrimitive = booleanPrimitive;
+ }
+
+ public Character getCharClass() {
+ return charClass;
+ }
+
+ public void setCharClass(Character charClass) {
+ this.charClass = charClass;
+ }
+
+ public char getCharPrimitive() {
+ return charPrimitive;
+ }
+
+ public void setCharPrimitive(char charPrimitive) {
+ this.charPrimitive = charPrimitive;
+ }
+
+ public BigInteger getBigInteger() {
+ return bigInteger;
+ }
+
+ public void setBigInteger(BigInteger bigInteger) {
+ this.bigInteger = bigInteger;
+ }
+
+ public Float getFloatClass() {
+ return floatClass;
+ }
+
+ public void setFloatClass(Float floatClass) {
+ this.floatClass = floatClass;
+ }
+
+ public float getFloatPrimitive() {
+ return floatPrimitive;
+ }
+
+ public void setFloatPrimitive(float floatPrimitive) {
+ this.floatPrimitive = floatPrimitive;
+ }
+
+ public Double getDoubleClass() {
+ return doubleClass;
+ }
+
+ public void setDoubleClass(Double doubleClass) {
+ this.doubleClass = doubleClass;
+ }
+
+ public double getDoublePrimitive() {
+ return doublePrimitive;
+ }
+
+ public void setDoublePrimitive(double doublePrimitive) {
+ this.doublePrimitive = doublePrimitive;
+ }
+
+ public Date getDate() {
+ return date;
+ }
+
+ public void setDate(Date date) {
+ this.date = date;
+ }
+} \ No newline at end of file
diff --git a/src/test/java/org/yaml/snakeyaml/constructor/TypeSafeCollectionsTest.java b/src/test/java/org/yaml/snakeyaml/constructor/TypeSafeCollectionsTest.java
new file mode 100644
index 00000000..3909325f
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/constructor/TypeSafeCollectionsTest.java
@@ -0,0 +1,82 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.constructor;
+
+import java.io.IOException;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.Dumper;
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.Loader;
+import org.yaml.snakeyaml.TypeDescription;
+import org.yaml.snakeyaml.Util;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.representer.Representer;
+
+public class TypeSafeCollectionsTest extends TestCase {
+
+ public void testTypeSafeList() throws IOException {
+ Constructor constructor = new Constructor(Car.class);
+ TypeDescription carDescription = new TypeDescription(Car.class);
+ carDescription.putListPropertyType("wheels", Wheel.class);
+ constructor.addTypeDescription(carDescription);
+ Loader loader = new Loader(constructor);
+ Yaml yaml = new Yaml(loader);
+ Car car = (Car) yaml.load(Util.getLocalResource("constructor/car-no-root-class.yaml"));
+ assertEquals("12-XP-F4", car.getPlate());
+ List<Wheel> wheels = car.getWheels();
+ assertNotNull(wheels);
+ assertEquals(5, wheels.size());
+ for (Wheel wheel : wheels) {
+ assertTrue(wheel.getId() > 0);
+ }
+ }
+
+ public void testTypeSafeMap() throws IOException {
+ Constructor constructor = new Constructor(MyCar.class);
+ TypeDescription carDescription = new TypeDescription(MyCar.class);
+ carDescription.putMapPropertyType("wheels", MyWheel.class, Object.class);
+ constructor.addTypeDescription(carDescription);
+ Loader loader = new Loader(constructor);
+ Yaml yaml = new Yaml(loader);
+ MyCar car = (MyCar) yaml.load(Util
+ .getLocalResource("constructor/car-no-root-class-map.yaml"));
+ assertEquals("00-FF-Q2", car.getPlate());
+ Map<MyWheel, Date> wheels = car.getWheels();
+ assertNotNull(wheels);
+ assertEquals(5, wheels.size());
+ for (MyWheel wheel : wheels.keySet()) {
+ assertTrue(wheel.getId() > 0);
+ Date date = wheels.get(wheel);
+ long time = date.getTime();
+ assertTrue("It must be midnight.", time % 10000 == 0);
+ }
+ }
+
+ public void test1() throws IOException {
+ Map<MyWheel, Date> wheels = new HashMap<MyWheel, Date>();
+ for (int i = 1; i < 6; i++) {
+ MyWheel mw = new MyWheel();
+ mw.setId(i);
+ if (i == 2) {
+ mw.setBrand("Michel");
+ }
+ wheels.put(mw, new Date());
+ }
+ MyCar c = new MyCar();
+ c.setPlate("00-FF-Q2");
+ c.setWheels(wheels);
+ Representer representer = new Representer();
+ representer.addTypeDescription(new TypeDescription(MyWheel.class, "tag:yaml.org,2002:map"));
+ Dumper dumper = new Dumper(representer, new DumperOptions());
+ Yaml yaml = new Yaml(dumper);
+ String output = yaml.dump(c);
+ System.out.println(output);
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/constructor/Wheel.java b/src/test/java/org/yaml/snakeyaml/constructor/Wheel.java
new file mode 100644
index 00000000..07e66f80
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/constructor/Wheel.java
@@ -0,0 +1,44 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.constructor;
+
+public class Wheel {
+ private int id;
+
+ public Wheel(int id) {
+ this.id = id;
+ }
+
+ public Wheel() {
+ this(0);
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ @Override
+ public String toString() {
+ return "Wheel id=" + id;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof Wheel) {
+ Wheel wheel = (Wheel) obj;
+ return id == wheel.getId();
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ return new Integer(id).hashCode();
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/emitter/EmitterTest.java b/src/test/java/org/yaml/snakeyaml/emitter/EmitterTest.java
new file mode 100644
index 00000000..1314fbb9
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/emitter/EmitterTest.java
@@ -0,0 +1,82 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.emitter;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.DumperOptions.DefaultScalarStyle;
+
+public class EmitterTest extends TestCase {
+
+ public void testWriteFolded() {
+ DumperOptions options = new DumperOptions();
+ options.setDefaultStyle(DefaultScalarStyle.FOLDED);
+ String folded = "0123456789 0123456789\n0123456789 0123456789";
+ Map<String, String> map = new LinkedHashMap<String, String>();
+ map.put("aaa", folded);
+ map.put("bbb", "\nbla-bla\n");
+ Yaml yaml = new Yaml(options);
+ String output = yaml.dump(map);
+ String etalon = "\"aaa\": >-\n 0123456789 0123456789\n\n 0123456789 0123456789\n\"bbb\": >2\n\n bla-bla\n";
+ assertEquals(etalon, output);
+ }
+
+ public void testWriteLiteral() {
+ DumperOptions options = new DumperOptions();
+ options.setDefaultStyle(DefaultScalarStyle.LITERAL);
+ String folded = "0123456789 0123456789 0123456789 0123456789";
+ Map<String, String> map = new LinkedHashMap<String, String>();
+ map.put("aaa", folded);
+ map.put("bbb", "\nbla-bla\n");
+ Yaml yaml = new Yaml(options);
+ String output = yaml.dump(map);
+ System.out.println(output);
+ String etalon = "\"aaa\": |-\n 0123456789 0123456789 0123456789 0123456789\n\"bbb\": |2\n\n bla-bla\n";
+ assertEquals(etalon, output);
+ }
+
+ public void testWritePlain() {
+ DumperOptions options = new DumperOptions();
+ options.setDefaultStyle(DefaultScalarStyle.PLAIN);
+ String folded = "0123456789 0123456789\n0123456789 0123456789";
+ Map<String, String> map = new LinkedHashMap<String, String>();
+ map.put("aaa", folded);
+ map.put("bbb", "\nbla-bla");
+ Yaml yaml = new Yaml(options);
+ String output = yaml.dump(map);
+ String etalon = "{aaa: '0123456789 0123456789\n\n 0123456789 0123456789', bbb: '\n\n bla-bla'}\n";
+ assertEquals(etalon, output);
+ }
+
+ public void testWriteSingleQuoted() {
+ DumperOptions options = new DumperOptions();
+ options.setDefaultStyle(DefaultScalarStyle.SINGLE_QUOTED);
+ String folded = "0123456789 0123456789\n0123456789 0123456789";
+ Map<String, String> map = new LinkedHashMap<String, String>();
+ map.put("aaa", folded);
+ map.put("bbb", "\nbla-bla");
+ Yaml yaml = new Yaml(options);
+ String output = yaml.dump(map);
+ String etalon = "'aaa': '0123456789 0123456789\n\n 0123456789 0123456789'\n'bbb': '\n\n bla-bla'\n";
+ assertEquals(etalon, output);
+ }
+
+ public void testWriteDoubleQuoted() {
+ DumperOptions options = new DumperOptions();
+ options.setDefaultStyle(DefaultScalarStyle.DOUBLE_QUOTED);
+ String folded = "0123456789 0123456789\n0123456789 0123456789";
+ Map<String, String> map = new LinkedHashMap<String, String>();
+ map.put("aaa", folded);
+ map.put("bbb", "\nbla-bla");
+ Yaml yaml = new Yaml(options);
+ String output = yaml.dump(map);
+ String etalon = "\"aaa\": \"0123456789 0123456789\\n0123456789 0123456789\"\n\"bbb\": \"\\nbla-bla\"\n";
+ assertEquals(etalon, output);
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/emitter/EventConstructor.java b/src/test/java/org/yaml/snakeyaml/emitter/EventConstructor.java
new file mode 100644
index 00000000..7309e1ad
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/emitter/EventConstructor.java
@@ -0,0 +1,106 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.emitter;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.yaml.snakeyaml.constructor.Construct;
+import org.yaml.snakeyaml.constructor.Constructor;
+import org.yaml.snakeyaml.events.AliasEvent;
+import org.yaml.snakeyaml.events.DocumentEndEvent;
+import org.yaml.snakeyaml.events.DocumentStartEvent;
+import org.yaml.snakeyaml.events.Event;
+import org.yaml.snakeyaml.events.MappingEndEvent;
+import org.yaml.snakeyaml.events.MappingStartEvent;
+import org.yaml.snakeyaml.events.ScalarEvent;
+import org.yaml.snakeyaml.events.SequenceEndEvent;
+import org.yaml.snakeyaml.events.SequenceStartEvent;
+import org.yaml.snakeyaml.events.StreamEndEvent;
+import org.yaml.snakeyaml.events.StreamStartEvent;
+import org.yaml.snakeyaml.nodes.MappingNode;
+import org.yaml.snakeyaml.nodes.Node;
+import org.yaml.snakeyaml.nodes.ScalarNode;
+
+public class EventConstructor extends Constructor {
+
+ public EventConstructor() {
+ this.yamlConstructors.put(null, new ConstructEvent());
+ }
+
+ private class ConstructEvent implements Construct {
+
+ @SuppressWarnings("unchecked")
+ public Object construct(Node node) {
+ Map mapping;
+ if (node instanceof ScalarNode) {
+ mapping = new HashMap();
+ } else {
+ mapping = constructMapping((MappingNode) node);
+ }
+ String className = node.getTag().substring(1) + "Event";
+ Event value;
+ if (className.equals("AliasEvent")) {
+ value = new AliasEvent((String) mapping.get("anchor"), null, null);
+ } else if (className.equals("ScalarEvent")) {
+ String tag = (String) mapping.get("tag");
+ String v = (String) mapping.get("value");
+ if (v == null) {
+ v = "";
+ }
+ List implicitList = (List) mapping.get("implicit");
+ boolean implicit[];
+ if (implicitList == null) {
+ implicit = new boolean[] { false, true };
+ } else {
+ implicit = new boolean[2];
+ implicit[0] = (Boolean) implicitList.get(0);
+ implicit[1] = (Boolean) implicitList.get(1);
+ }
+ value = new ScalarEvent((String) mapping.get("anchor"), tag, implicit, v, null,
+ null, null);
+ } else if (className.equals("SequenceStartEvent")) {
+ String tag = (String) mapping.get("tag");
+ Boolean implicit = (Boolean) mapping.get("implicit");
+ if (implicit == null) {
+ implicit = true;
+ }
+ value = new SequenceStartEvent((String) mapping.get("anchor"), tag, implicit, null,
+ null, false);
+ } else if (className.equals("MappingStartEvent")) {
+ String tag = (String) mapping.get("tag");
+ Boolean implicit = (Boolean) mapping.get("implicit");
+ if (implicit == null) {
+ implicit = true;
+ }
+ value = new MappingStartEvent((String) mapping.get("anchor"), tag, implicit, null,
+ null, false);
+ } else if (className.equals("DocumentEndEvent")) {
+ value = new DocumentEndEvent(null, null, false);
+ } else if (className.equals("DocumentStartEvent")) {
+ Map<String, String> tags = (Map<String, String>) mapping.get("tags");
+ List<Integer> versionList = (List<Integer>) mapping.get("version");
+ Integer[] version = null;
+ if (versionList != null) {
+ version = new Integer[2];
+ version[0] = versionList.get(0).intValue();
+ version[1] = versionList.get(1).intValue();
+ }
+ value = new DocumentStartEvent(null, null, false, version, tags);
+ } else if (className.equals("MappingEndEvent")) {
+ value = new MappingEndEvent(null, null);
+ } else if (className.equals("SequenceEndEvent")) {
+ value = new SequenceEndEvent(null, null);
+ } else if (className.equals("StreamEndEvent")) {
+ value = new StreamEndEvent(null, null);
+ } else if (className.equals("StreamStartEvent")) {
+ value = new StreamStartEvent(null, null);
+ } else {
+ throw new UnsupportedOperationException();
+ }
+ return value;
+ }
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/emitter/EventsLoader.java b/src/test/java/org/yaml/snakeyaml/emitter/EventsLoader.java
new file mode 100644
index 00000000..567f5290
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/emitter/EventsLoader.java
@@ -0,0 +1,13 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.emitter;
+
+import org.yaml.snakeyaml.Loader;
+
+public class EventsLoader extends Loader {
+
+ public EventsLoader() {
+ super(new EventConstructor());
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/error/MarkTest.java b/src/test/java/org/yaml/snakeyaml/error/MarkTest.java
new file mode 100644
index 00000000..40a88a74
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/error/MarkTest.java
@@ -0,0 +1,25 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.error;
+
+import junit.framework.TestCase;
+
+public class MarkTest extends TestCase {
+
+ public void testGet_snippet() {
+ Mark mark = new Mark("test1", 0, 0, 0, "*The first line.\nThe last line.", 0);
+ assertEquals(" *The first line.\n ^", mark.get_snippet());
+ mark = new Mark("test1", 9, 0, 0, "The first*line.\nThe last line.", 9);
+ assertEquals(" The first*line.\n ^", mark.get_snippet());
+ }
+
+ public void testToString() {
+ Mark mark = new Mark("test1", 0, 0, 0, "*The first line.\nThe last line.", 0);
+ String[] lines = mark.toString().split("\n");
+ assertEquals(" in \"test1\", line 0, column 0:", lines[0]);
+ assertEquals("*The first line.", lines[1].trim());
+ assertEquals("^", lines[2].trim());
+ }
+
+}
diff --git a/src/test/java/org/yaml/snakeyaml/error/MarkedYAMLExceptionTest.java b/src/test/java/org/yaml/snakeyaml/error/MarkedYAMLExceptionTest.java
new file mode 100644
index 00000000..dc6991cb
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/error/MarkedYAMLExceptionTest.java
@@ -0,0 +1,27 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.error;
+
+import junit.framework.TestCase;
+
+public class MarkedYAMLExceptionTest extends TestCase {
+
+ public void testToString1() {
+ Mark mark = new Mark("test1", 0, 0, 0, "*The first line.\nThe last line.", 0);
+ MarkedYAMLException exception = new MarkedYAMLException(null, null, "Error happened", mark);
+ assertTrue(exception.toString().contains("Error happened"));
+ assertTrue(exception.toString().contains("The first line"));
+ assertTrue(exception.toString().contains("\"test1\""));
+ }
+
+ public void testToString2() {
+ Mark mark = new Mark("search", 0, 0, 0, "*The first line.\nThe last line.", 0);
+ MarkedYAMLException exception = new MarkedYAMLException("See http://www.google.com", mark,
+ "Error2 happened", mark);
+ assertTrue(exception.toString().contains("Error2 happened"));
+ assertTrue(exception.toString().contains("The first line"));
+ assertTrue(exception.toString().contains("\"search\""));
+ }
+
+}
diff --git a/src/test/java/org/yaml/snakeyaml/events/ScalarEventTest.java b/src/test/java/org/yaml/snakeyaml/events/ScalarEventTest.java
new file mode 100644
index 00000000..2406ce03
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/events/ScalarEventTest.java
@@ -0,0 +1,27 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.events;
+
+import junit.framework.TestCase;
+
+public class ScalarEventTest extends TestCase {
+
+ public void testToString() {
+ boolean[] implicit = new boolean[2];
+ implicit[0] = true;
+ implicit[1] = true;
+ ScalarEvent event = new ScalarEvent("a2", "str", implicit, "text", null, null, '"');
+ assertEquals(
+ "<org.yaml.snakeyaml.events.ScalarEvent(anchor=a2, tag=str, implicit=[true, true], value=text)>",
+ event.toString());
+ }
+
+ public void testNotEqual() {
+ boolean[] implicit = new boolean[2];
+ implicit[0] = true;
+ implicit[1] = true;
+ ScalarEvent event = new ScalarEvent("a2", "str", implicit, "text", null, null, '"');
+ assertFalse(event.equals(event.toString()));
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/introspector/MethodPropertyTest.java b/src/test/java/org/yaml/snakeyaml/introspector/MethodPropertyTest.java
new file mode 100644
index 00000000..1bcb7dcf
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/introspector/MethodPropertyTest.java
@@ -0,0 +1,22 @@
+package org.yaml.snakeyaml.introspector;
+
+import java.beans.IntrospectionException;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.constructor.TestBean1;
+
+public class MethodPropertyTest extends TestCase {
+
+ public void testToString() throws IntrospectionException {
+ for (PropertyDescriptor property : Introspector.getBeanInfo(TestBean1.class)
+ .getPropertyDescriptors()) {
+ if (property.getName().equals("text")) {
+ MethodProperty prop = new MethodProperty(property);
+ assertEquals("text of class java.lang.String", prop.toString());
+ }
+ }
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/nodes/NodeTest.java b/src/test/java/org/yaml/snakeyaml/nodes/NodeTest.java
new file mode 100644
index 00000000..eb9d817c
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/nodes/NodeTest.java
@@ -0,0 +1,28 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.nodes;
+
+import junit.framework.TestCase;
+
+public class NodeTest extends TestCase {
+
+ public void testNode() {
+ try {
+ new ScalarNode("!foo", null, null, null, '"');
+ fail("Value must be required.");
+ } catch (Exception e) {
+ assertEquals("value in a Node is required.", e.getMessage());
+ }
+ }
+
+ public void testSetTag() {
+ try {
+ ScalarNode node = new ScalarNode("!foo", "Value1", null, null, '"');
+ node.setTag(null);
+ fail("Value must be required.");
+ } catch (Exception e) {
+ assertEquals("tag in a Node is required.", e.getMessage());
+ }
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/nodes/ScalarNodeTest.java b/src/test/java/org/yaml/snakeyaml/nodes/ScalarNodeTest.java
new file mode 100644
index 00000000..c5eb45df
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/nodes/ScalarNodeTest.java
@@ -0,0 +1,26 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.nodes;
+
+import junit.framework.TestCase;
+
+public class ScalarNodeTest extends TestCase {
+
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ public void testGetNodeId() {
+ Node node = new ScalarNode("str", "text", null, null, '>');
+ assertEquals(NodeId.scalar, node.getNodeId());
+ }
+
+ public void testToString() {
+ Node node = new ScalarNode("str", "text", null, null, '>');
+ assertTrue(node.toString().contains("ScalarNode"));
+ assertTrue(node.toString().contains("tag="));
+ assertTrue(node.toString().contains("value="));
+ }
+
+}
diff --git a/src/test/java/org/yaml/snakeyaml/nodes/SequenceNodeTest.java b/src/test/java/org/yaml/snakeyaml/nodes/SequenceNodeTest.java
new file mode 100644
index 00000000..d8a08afb
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/nodes/SequenceNodeTest.java
@@ -0,0 +1,16 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.nodes;
+
+import java.util.ArrayList;
+
+import junit.framework.TestCase;
+
+public class SequenceNodeTest extends TestCase {
+
+ public void testGetNodeId() {
+ SequenceNode node = new SequenceNode("!foo", new ArrayList<Node>(), null, null, true);
+ assertEquals(NodeId.sequence, node.getNodeId());
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/parser/ParserImplTest.java b/src/test/java/org/yaml/snakeyaml/parser/ParserImplTest.java
new file mode 100644
index 00000000..9e3f624c
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/parser/ParserImplTest.java
@@ -0,0 +1,88 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.parser;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.error.Mark;
+import org.yaml.snakeyaml.events.DocumentEndEvent;
+import org.yaml.snakeyaml.events.DocumentStartEvent;
+import org.yaml.snakeyaml.events.Event;
+import org.yaml.snakeyaml.events.MappingEndEvent;
+import org.yaml.snakeyaml.events.MappingStartEvent;
+import org.yaml.snakeyaml.events.ScalarEvent;
+import org.yaml.snakeyaml.events.SequenceEndEvent;
+import org.yaml.snakeyaml.events.SequenceStartEvent;
+import org.yaml.snakeyaml.events.StreamEndEvent;
+import org.yaml.snakeyaml.events.StreamStartEvent;
+import org.yaml.snakeyaml.reader.Reader;
+
+public class ParserImplTest extends TestCase {
+
+ public void testGetEvent() {
+ String data = "string: abcd";
+ Reader reader = new Reader(data);
+ Parser parser = new ParserImpl(reader);
+ Mark dummyMark = new Mark("dummy", 0, 0, 0, "", 0);
+ LinkedList<Event> etalonEvents = new LinkedList<Event>();
+ etalonEvents.add(new StreamStartEvent(dummyMark, dummyMark));
+ etalonEvents.add(new DocumentStartEvent(dummyMark, dummyMark, false, null, null));
+ etalonEvents.add(new MappingStartEvent(null, null, true, dummyMark, dummyMark,
+ Boolean.FALSE));
+ boolean[] implicit = { true, false };
+ etalonEvents.add(new ScalarEvent(null, null, implicit, "string", dummyMark, dummyMark,
+ (char) 0));
+ etalonEvents.add(new ScalarEvent(null, null, implicit, "abcd", dummyMark, dummyMark,
+ (char) 0));
+ etalonEvents.add(new MappingEndEvent(dummyMark, dummyMark));
+ etalonEvents.add(new DocumentEndEvent(dummyMark, dummyMark, false));
+ etalonEvents.add(new StreamEndEvent(dummyMark, dummyMark));
+ while (parser.checkEvent(new ArrayList<Class<? extends Event>>())) {
+ Event event = parser.getEvent();
+ if (etalonEvents.isEmpty()) {
+ fail("unexpected event: " + event);
+ }
+ assertEquals(etalonEvents.removeFirst(), event);
+ // System.out.println(event);
+ }
+ assertFalse("Must contain no more events: " + parser.getEvent(), parser
+ .checkEvent(new ArrayList<Class<? extends Event>>()));
+ }
+
+ public void testGetEvent2() {
+ String data = "american:\n - Boston Red Sox";
+ Reader reader = new Reader(data);
+ Parser parser = new ParserImpl(reader);
+ Mark dummyMark = new Mark("dummy", 0, 0, 0, "", 0);
+ LinkedList<Event> etalonEvents = new LinkedList<Event>();
+ etalonEvents.add(new StreamStartEvent(dummyMark, dummyMark));
+ etalonEvents.add(new DocumentStartEvent(dummyMark, dummyMark, false, null, null));
+ etalonEvents
+ .add(new MappingStartEvent(null, null, true, dummyMark, dummyMark, Boolean.TRUE));
+ boolean[] implicit = { true, false };
+ etalonEvents.add(new ScalarEvent(null, null, implicit, "american", dummyMark, dummyMark,
+ (char) 0));
+ etalonEvents.add(new SequenceStartEvent(null, null, true, dummyMark, dummyMark,
+ Boolean.FALSE));
+ etalonEvents.add(new ScalarEvent(null, null, implicit, "Boston Red Sox", dummyMark,
+ dummyMark, (char) 0));
+ etalonEvents.add(new SequenceEndEvent(dummyMark, dummyMark));
+ etalonEvents.add(new MappingEndEvent(dummyMark, dummyMark));
+ etalonEvents.add(new DocumentEndEvent(dummyMark, dummyMark, false));
+ etalonEvents.add(new StreamEndEvent(dummyMark, dummyMark));
+ while (parser.checkEvent(new ArrayList<Class<? extends Event>>())) {
+ Event event = parser.getEvent();
+ if (etalonEvents.isEmpty()) {
+ fail("unexpected event: " + event);
+ }
+ assertEquals(etalonEvents.removeFirst(), event);
+ // System.out.println(event);
+ }
+ assertFalse("Must contain no more events: " + parser.getEvent(), parser
+ .checkEvent(new ArrayList<Class<? extends Event>>()));
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/reader/IoReaderTest.java b/src/test/java/org/yaml/snakeyaml/reader/IoReaderTest.java
new file mode 100644
index 00000000..8a69beec
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/reader/IoReaderTest.java
@@ -0,0 +1,25 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.reader;
+
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.Yaml;
+
+public class IoReaderTest extends TestCase {
+
+ @SuppressWarnings("unchecked")
+ public void testCheckPrintable() throws IOException {
+ Yaml yaml = new Yaml();
+ java.io.Reader reader = null;
+ reader = new FileReader("src/test/resources/specification/example2_1.yaml");
+ List<String> list = (List<String>) yaml.load(reader);
+ reader.close();
+ assertEquals(3, list.size());
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/reader/ReaderBomTest.java b/src/test/java/org/yaml/snakeyaml/reader/ReaderBomTest.java
new file mode 100644
index 00000000..b5d6578c
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/reader/ReaderBomTest.java
@@ -0,0 +1,101 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.reader;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.nio.charset.Charset;
+
+import junit.framework.TestCase;
+
+public class ReaderBomTest extends TestCase {
+
+ public void testReader() throws IOException {
+ java.io.Reader input = new StringReader("test");
+ Reader reader = new Reader(input);
+ assertEquals('t', reader.peek());
+ reader.forward(1);
+ assertEquals('e', reader.peek());
+ reader.forward(1);
+ assertEquals('s', reader.peek());
+ reader.forward(1);
+ assertEquals('t', reader.peek());
+ reader.forward(1);
+ assertEquals('\u0000', reader.peek());
+ }
+
+ public void testNoBom() throws IOException {
+ byte[] data = "test".getBytes("UTF-8");
+ ByteArrayInputStream input = new ByteArrayInputStream(data);
+ java.io.Reader r = new UnicodeReader(input);
+ Reader reader = new Reader(r);
+ assertEquals('t', reader.peek());
+ assertEquals(Charset.forName("UTF-8"), reader.getEncoding());
+ reader.forward(1);
+ assertEquals('e', reader.peek());
+ reader.forward(1);
+ assertEquals('s', reader.peek());
+ reader.forward(1);
+ assertEquals('t', reader.peek());
+ reader.forward(1);
+ assertEquals('\u0000', reader.peek());
+ r.close();
+ }
+
+ public void testUtf8Bom() throws IOException {
+ File file = new File("src/test/resources/reader/utf-8.txt");
+ assertTrue("Test file not found: " + file.getAbsolutePath(), file.exists());
+ InputStream input = new FileInputStream(file);
+ Reader reader = new Reader(new UnicodeReader(input));
+ assertEquals('t', reader.peek());
+ reader.forward(1);
+ assertEquals('e', reader.peek());
+ reader.forward(1);
+ assertEquals('s', reader.peek());
+ reader.forward(1);
+ assertEquals('t', reader.peek());
+ reader.forward(1);
+ assertEquals('\u0000', reader.peek());
+ assertEquals(Charset.forName("UTF-8"), reader.getEncoding());
+ }
+
+ public void testUnicodeLeBom() throws IOException {
+ File file = new File("src/test/resources/reader/unicode-16le.txt");
+ assertTrue("Test file not found: " + file.getAbsolutePath(), file.exists());
+ InputStream input = new FileInputStream(file);
+ Reader reader = new Reader(new UnicodeReader(input));
+ assertEquals('t', reader.peek());
+ reader.forward(1);
+ assertEquals('e', reader.peek());
+ reader.forward(1);
+ assertEquals('s', reader.peek());
+ reader.forward(1);
+ assertEquals('t', reader.peek());
+ reader.forward(1);
+ assertEquals('\u0000', reader.peek());
+ assertEquals(Charset.forName("UTF-16LE"), reader.getEncoding());
+ }
+
+ public void testUnicodeBeBom() throws IOException {
+ File file = new File("src/test/resources/reader/unicode-16be.txt");
+ assertTrue("Test file not found: " + file.getAbsolutePath(), file.exists());
+ InputStream input = new FileInputStream(file);
+ Reader reader = new Reader(new UnicodeReader(input));
+ assertEquals('t', reader.peek());
+ reader.forward(1);
+ assertEquals('e', reader.peek());
+ reader.forward(1);
+ assertEquals('s', reader.peek());
+ reader.forward(1);
+ assertEquals('t', reader.peek());
+ reader.forward(1);
+ assertEquals('\u0000', reader.peek());
+ assertEquals(Charset.forName("UTF-16BE"), reader.getEncoding());
+ }
+
+}
diff --git a/src/test/java/org/yaml/snakeyaml/reader/ReaderStringTest.java b/src/test/java/org/yaml/snakeyaml/reader/ReaderStringTest.java
new file mode 100644
index 00000000..d4a98f8a
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/reader/ReaderStringTest.java
@@ -0,0 +1,61 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.reader;
+
+import java.util.regex.Matcher;
+
+import junit.framework.TestCase;
+
+public class ReaderStringTest extends TestCase {
+
+ public void testCheckPrintable() {
+ Reader reader = new Reader("test");
+ reader.checkPrintable("test");
+ Matcher matcher = Reader.NON_PRINTABLE.matcher("test");
+ assertFalse(matcher.find());
+ }
+
+ public void testCheckNonPrintable() {
+ Matcher matcher = Reader.NON_PRINTABLE.matcher("test\u0005 fail");
+ assertTrue(matcher.find());
+ try {
+ new Reader("test\u0005 fail");
+ fail("Non printable Unicode characters must not be accepted.");
+ } catch (ReaderException e) {
+ assertEquals(
+ "unacceptable character #5 special characters are not allowed\nin \"<string>\", position 4",
+ e.toString());
+ }
+ }
+
+ public void testForward() {
+ Reader reader = new Reader("test");
+ while (reader.peek() != '\u0000') {
+ reader.forward(1);
+ }
+ reader = new Reader("test");
+ assertEquals('t', reader.peek());
+ reader.forward(1);
+ assertEquals('e', reader.peek());
+ reader.forward(1);
+ assertEquals('s', reader.peek());
+ reader.forward(1);
+ assertEquals('t', reader.peek());
+ reader.forward(1);
+ assertEquals('\u0000', reader.peek());
+ }
+
+ public void testPeekInt() {
+ Reader reader = new Reader("test");
+ assertEquals('t', reader.peek(0));
+ assertEquals('e', reader.peek(1));
+ assertEquals('s', reader.peek(2));
+ assertEquals('t', reader.peek(3));
+ reader.forward(1);
+ assertEquals('e', reader.peek(0));
+ assertEquals('s', reader.peek(1));
+ assertEquals('t', reader.peek(2));
+ }
+
+}
diff --git a/src/test/java/org/yaml/snakeyaml/representer/RepresentTest.java b/src/test/java/org/yaml/snakeyaml/representer/RepresentTest.java
new file mode 100644
index 00000000..89f1c386
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/representer/RepresentTest.java
@@ -0,0 +1,83 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.representer;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.Dumper;
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.Loader;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.Construct;
+import org.yaml.snakeyaml.constructor.Constructor;
+import org.yaml.snakeyaml.nodes.Node;
+import org.yaml.snakeyaml.nodes.ScalarNode;
+
+public class RepresentTest extends TestCase {
+
+ public void testCustomRepresenter() {
+ Dumper dumper = new Dumper(new MyRepresenter(), new DumperOptions());
+ Loader loader = new Loader(new MyConstructor());
+ Yaml yaml = new Yaml(loader, dumper);
+ CustomBean etalon = new CustomBean("A", 1);
+ String output = yaml.dump(etalon);
+ assertEquals("!!Dice 'Ad1'\n", output);
+ CustomBean bean = (CustomBean) yaml.load(output);
+ assertEquals("A", bean.getPrefix());
+ assertEquals(1, bean.getSuffix());
+ assertEquals(etalon, bean);
+ }
+
+ class CustomBean {
+ private String prefix;
+ private int suffix;
+
+ public CustomBean(String prefix, int suffix) {
+ this.prefix = prefix;
+ this.suffix = suffix;
+ }
+
+ public String getPrefix() {
+ return prefix;
+ }
+
+ public int getSuffix() {
+ return suffix;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ CustomBean bean = (CustomBean) obj;
+ return prefix.equals(bean.getPrefix()) && suffix == bean.getSuffix();
+ }
+ }
+
+ class MyRepresenter extends Representer {
+ public MyRepresenter() {
+ this.representers.put(CustomBean.class, new RepresentDice());
+ }
+
+ private class RepresentDice implements Represent {
+ public Node representData(Object data) {
+ CustomBean coin = (CustomBean) data;
+ String value = coin.getPrefix() + "d" + coin.getSuffix();
+ return representScalar("!!Dice", value);
+ }
+ }
+ }
+
+ class MyConstructor extends Constructor {
+
+ public MyConstructor() {
+ this.yamlConstructors.put("tag:yaml.org,2002:Dice", new ConstuctDice());
+ }
+
+ private class ConstuctDice implements Construct {
+ public Object construct(Node node) {
+ String val = (String) constructScalar((ScalarNode) node);
+ return new CustomBean(val.substring(0, 1), Integer.parseInt(val.substring(2)));
+ }
+ }
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/representer/RepresenterTest.java b/src/test/java/org/yaml/snakeyaml/representer/RepresenterTest.java
new file mode 100644
index 00000000..af050360
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/representer/RepresenterTest.java
@@ -0,0 +1,131 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.representer;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.Yaml;
+
+public class RepresenterTest extends TestCase {
+
+ public void testRepresenter() {
+ MyBean bean = new MyBean();
+ bean.setName("Gnome");
+ bean.setValid(true);
+ bean.setPrimitive(true);
+ Yaml yaml = new Yaml();
+ assertEquals(
+ "!!org.yaml.snakeyaml.representer.RepresenterTest$MyBean {name: Gnome, primitive: true}\n",
+ yaml.dump(bean));
+ }
+
+ public static class MyBean {
+ private String name;
+ private Boolean valid;
+ private boolean primitive;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Boolean isValid() {
+ return valid;
+ }
+
+ public void setValid(Boolean valid) {
+ this.valid = valid;
+ }
+
+ public boolean isPrimitive() {
+ return primitive;
+ }
+
+ public void setPrimitive(boolean primitive) {
+ this.primitive = primitive;
+ }
+ }
+
+ public void testRepresenterNoConstructorAvailable() {
+ MyBean2 bean = new MyBean2("Gnome", true);
+ Yaml yaml = new Yaml();
+ assertEquals("!!org.yaml.snakeyaml.representer.RepresenterTest$MyBean2 {valid: true}\n",
+ yaml.dump(bean));
+ }
+
+ public static class MyBean2 {
+ private String name;
+ private Boolean valid;
+
+ public MyBean2(String name, Boolean valid) {
+ this();
+ this.name = name;
+ this.valid = valid;
+ }
+
+ private MyBean2() {
+ super();
+ }
+
+ private String getName() {
+ return name;
+ }
+
+ public Boolean getValid() {
+ return valid;
+ }
+
+ @Override
+ public String toString() {
+ return getName() + " " + getValid();
+ }
+ }
+
+ public void testRepresenterGetterWithException() {
+ MyBean3 bean = new MyBean3("Gnome", true);
+ Yaml yaml = new Yaml();
+ try {
+ yaml.dump(bean);
+ fail("Exception must be reported");
+ } catch (Exception e) {
+ assertTrue(true);
+ }
+ }
+
+ public static class MyBean3 {
+ private String name;
+ private Boolean valid;
+
+ public MyBean3(String name, Boolean valid) {
+ this.name = name;
+ this.valid = valid;
+ }
+
+ public String getName() {
+ throw new UnsupportedOperationException("Test.");
+ }
+
+ public Boolean isValid() {
+ return valid;
+ }
+
+ @Override
+ public String toString() {
+ return name + " " + isValid();
+ }
+ }
+
+ public void testRepresenterAddNull() {
+ Representer representer = new Representer();
+ try {
+ representer.addTypeDescription(null);
+ fail("Representer must be provided.");
+ } catch (Exception e) {
+ assertTrue(true);
+ }
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/representer/SafeRepresenterTest.java b/src/test/java/org/yaml/snakeyaml/representer/SafeRepresenterTest.java
new file mode 100644
index 00000000..262161a7
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/representer/SafeRepresenterTest.java
@@ -0,0 +1,105 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.representer;
+
+import java.math.BigInteger;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.Yaml;
+
+public class SafeRepresenterTest extends TestCase {
+
+ public void testBinaryPattern() {
+ Pattern pattern = SafeRepresenter.BINARY_PATTERN;
+ assertFalse(pattern.matcher("\tAndrey\r\n").find());
+ assertTrue(pattern.matcher("\u0005Andrey").find());
+ }
+
+ public void testFloat() {
+ assertEquals("1.0E12", new Double("1e12").toString());
+ }
+
+ public void testNumber() {
+ List<Number> list = new LinkedList<Number>();
+ list.add(new Byte((byte) 3));
+ list.add(new Short((short) 4));
+ list.add(new Integer(5));
+ list.add(new BigInteger("6"));
+ list.add(new Long(7L));
+ list.add(Double.POSITIVE_INFINITY);
+ list.add(Double.NEGATIVE_INFINITY);
+ list.add(Double.NaN);
+ Yaml yaml = new Yaml();
+ String output = yaml.dump(list);
+ assertEquals("[3, 4, 5, 6, 7, .inf, -.inf, .NaN]\n", output);
+ }
+
+ public void testDate() {
+ List<Date> list = new LinkedList<Date>();
+ list.add(new Date(1229684761159L));
+ list.add(new Date(1229684761059L));
+ list.add(new Date(1229684761009L));
+ list.add(new Date(1229684761150L));
+ list.add(new Date(1229684761100L));
+ list.add(new Date(1229684761000L));
+ list.add(new Date(1229684760000L));
+ DumperOptions options = new DumperOptions();
+ options.setDefaultFlowStyle(DumperOptions.DefaultFlowStyle.BLOCK);
+ Yaml yaml = new Yaml(options);
+ String output = yaml.dump(list);
+ assertEquals(
+ "- 2008-12-19T11:06:01.159Z\n- 2008-12-19T11:06:01.059Z\n- 2008-12-19T11:06:01.009Z\n- 2008-12-19T11:06:01.150Z\n- 2008-12-19T11:06:01.100Z\n- 2008-12-19T11:06:01Z\n- 2008-12-19T11:06:00Z\n",
+ output);
+ }
+
+ public void testEmptyArray() {
+ Yaml yaml = new Yaml();
+ String output = yaml.dump(new String[0]);
+ assertEquals("[]\n", output);
+ }
+
+ public void testStyle() {
+ List<Integer> list = new LinkedList<Integer>();
+ list.add(new Integer(1));
+ list.add(new Integer(1));
+ Map<String, Object> map = new HashMap<String, Object>();
+ map.put("list", list);
+ map.put("name", "Ubuntu");
+ map.put("age", 5);
+ DumperOptions options = new DumperOptions();
+ options.setDefaultStyle(DumperOptions.DefaultScalarStyle.DOUBLE_QUOTED);
+ options.setDefaultFlowStyle(DumperOptions.DefaultFlowStyle.BLOCK);
+ Yaml yaml = new Yaml(options);
+ String output = yaml.dump(map);
+ assertTrue(output.contains("\"age\": !!int \"5\""));
+ assertTrue(output.contains("\"name\": \"Ubuntu\""));
+ assertTrue(output.contains("- !!int \"1\""));
+ }
+
+ public void testStyle2() {
+ List<Integer> list = new LinkedList<Integer>();
+ list.add(new Integer(1));
+ list.add(new Integer(1));
+ Map<String, Object> map = new LinkedHashMap<String, Object>();
+ map.put("age", 5);
+ map.put("name", "Ubuntu");
+ map.put("list", list);
+ DumperOptions options = new DumperOptions();
+ options.setDefaultStyle(DumperOptions.DefaultScalarStyle.SINGLE_QUOTED);
+ options.setDefaultFlowStyle(DumperOptions.DefaultFlowStyle.FLOW);
+ Yaml yaml = new Yaml(options);
+ String output = yaml.dump(map);
+ assertEquals("{'age': !!int '5', 'name': 'Ubuntu', 'list': [!!int '1', !!int '1']}\n",
+ output);
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/resolver/RagelMachine.java b/src/test/java/org/yaml/snakeyaml/resolver/RagelMachine.java
new file mode 100644
index 00000000..324d869b
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/resolver/RagelMachine.java
@@ -0,0 +1,317 @@
+// line 1 "RagelMachine.rl"
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.resolver;
+
+//Source for Ragel 6.3
+
+/**
+ * Generated by Ragel 6.3 (http://www.complang.org/ragel/)
+ *
+ * @see http://www.complang.org/ragel/
+ */
+public class RagelMachine {
+
+ // line 15 "RagelMachine.java"
+ private static byte[] init__snakeyaml_actions_0() {
+ return new byte[] { 0, 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, 1, 5, 1, 6 };
+ }
+
+ private static final byte _snakeyaml_actions[] = init__snakeyaml_actions_0();
+
+ private static short[] init__snakeyaml_key_offsets_0() {
+ return new short[] { 0, 0, 20, 24, 28, 30, 32, 34, 35, 36, 37, 42, 46, 50, 52, 56, 59, 66,
+ 70, 74, 80, 82, 83, 84, 85, 87, 90, 92, 98, 102, 105, 106, 108, 110, 111, 113, 115,
+ 120, 122, 124, 126, 130, 132, 133, 135, 141, 147, 152, 157, 158, 160, 161, 162,
+ 163, 164, 165, 166, 170, 171, 172, 173, 174, 178, 179, 180, 182, 183, 184, 186,
+ 187, 188, 189, 191, 193, 194, 195, 195, 200, 202, 202, 211, 218, 224, 227, 234,
+ 239, 243, 245, 250, 253, 254, 263, 270, 277, 285, 291, 294, 295, 295, 302, 306,
+ 311, 316, 321, 327, 327, 327 };
+ }
+
+ private static final short _snakeyaml_key_offsets[] = init__snakeyaml_key_offsets_0();
+
+ private static char[] init__snakeyaml_trans_keys_0() {
+ return new char[] { 32, 43, 45, 46, 48, 60, 61, 70, 78, 79, 84, 89, 102, 110, 111, 116,
+ 121, 126, 49, 57, 46, 48, 49, 57, 73, 105, 48, 57, 43, 45, 48, 57, 78, 110, 70,
+ 102, 110, 46, 58, 95, 48, 57, 48, 53, 54, 57, 46, 58, 48, 57, 46, 58, 46, 95, 48,
+ 57, 95, 48, 49, 95, 48, 57, 65, 70, 97, 102, 48, 53, 54, 57, 48, 53, 54, 57, 73,
+ 78, 105, 110, 48, 57, 65, 97, 78, 97, 110, 48, 57, 45, 48, 57, 48, 57, 9, 32, 84,
+ 116, 48, 57, 9, 32, 48, 57, 58, 48, 57, 58, 48, 57, 48, 57, 58, 48, 57, 48, 57, 9,
+ 32, 43, 45, 90, 48, 57, 48, 57, 48, 57, 9, 32, 84, 116, 48, 57, 45, 48, 57, 9, 32,
+ 84, 116, 48, 57, 45, 46, 58, 95, 48, 57, 46, 58, 95, 48, 57, 46, 58, 95, 48, 57,
+ 60, 65, 97, 76, 83, 69, 108, 115, 101, 79, 85, 111, 117, 76, 76, 108, 108, 70, 78,
+ 102, 110, 70, 102, 82, 114, 85, 117, 69, 101, 83, 115, 97, 111, 117, 102, 110, 114,
+ 101, 69, 95, 101, 48, 57, 48, 57, 46, 58, 95, 98, 120, 48, 55, 56, 57, 46, 58, 95,
+ 48, 55, 56, 57, 46, 95, 48, 55, 56, 57, 95, 48, 49, 95, 48, 57, 65, 70, 97, 102,
+ 46, 58, 95, 48, 57, 46, 58, 48, 57, 46, 58, 46, 58, 95, 48, 57, 58, 48, 57, 58, 46,
+ 58, 95, 98, 120, 48, 55, 56, 57, 46, 58, 95, 48, 55, 56, 57, 46, 58, 95, 48, 55,
+ 56, 57, 45, 46, 58, 95, 48, 55, 56, 57, 9, 32, 43, 45, 46, 90, 58, 48, 57, 58, 9,
+ 32, 43, 45, 90, 48, 57, 9, 32, 84, 116, 46, 58, 95, 48, 57, 46, 58, 95, 48, 57, 46,
+ 58, 95, 48, 57, 45, 46, 58, 95, 48, 57, 0 };
+ }
+
+ private static final char _snakeyaml_trans_keys[] = init__snakeyaml_trans_keys_0();
+
+ private static byte[] init__snakeyaml_single_lengths_0() {
+ return new byte[] { 0, 18, 2, 2, 2, 0, 2, 1, 1, 1, 3, 0, 2, 2, 2, 1, 1, 0, 0, 4, 2, 1, 1,
+ 1, 0, 1, 0, 4, 2, 1, 1, 0, 0, 1, 0, 0, 5, 0, 0, 0, 4, 0, 1, 0, 4, 4, 3, 3, 1, 2, 1,
+ 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 4, 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, 0, 3, 0, 0,
+ 5, 3, 2, 1, 1, 3, 2, 2, 3, 1, 1, 5, 3, 3, 4, 6, 1, 1, 0, 5, 4, 3, 3, 3, 4, 0, 0, 0 };
+ }
+
+ private static final byte _snakeyaml_single_lengths[] = init__snakeyaml_single_lengths_0();
+
+ private static byte[] init__snakeyaml_range_lengths_0() {
+ return new byte[] { 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 2, 1, 0, 1, 1, 3, 2, 2, 1, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 2,
+ 2, 2, 1, 3, 1, 1, 0, 1, 1, 0, 2, 2, 2, 2, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0 };
+ }
+
+ private static final byte _snakeyaml_range_lengths[] = init__snakeyaml_range_lengths_0();
+
+ private static short[] init__snakeyaml_index_offsets_0() {
+ return new short[] { 0, 0, 20, 24, 28, 31, 33, 36, 38, 40, 42, 47, 50, 54, 57, 61, 64, 69,
+ 72, 75, 81, 84, 86, 88, 90, 92, 95, 97, 103, 107, 110, 112, 114, 116, 118, 120,
+ 122, 128, 130, 132, 134, 139, 141, 143, 145, 151, 157, 162, 167, 169, 172, 174,
+ 176, 178, 180, 182, 184, 189, 191, 193, 195, 197, 202, 204, 206, 209, 211, 213,
+ 216, 218, 220, 222, 225, 228, 230, 232, 233, 238, 240, 241, 249, 255, 260, 263,
+ 268, 273, 277, 280, 285, 288, 290, 298, 304, 310, 317, 324, 327, 329, 330, 337,
+ 342, 347, 352, 357, 363, 364, 365 };
+ }
+
+ private static final short _snakeyaml_index_offsets[] = init__snakeyaml_index_offsets_0();
+
+ private static byte[] init__snakeyaml_indicies_0() {
+ return new byte[] { 0, 2, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 0, 5, 1, 18,
+ 19, 20, 1, 22, 23, 21, 1, 24, 24, 1, 25, 1, 26, 27, 1, 28, 1, 28, 1, 27, 1, 21, 30,
+ 31, 29, 1, 32, 33, 1, 25, 30, 33, 1, 25, 30, 1, 21, 31, 31, 1, 34, 34, 1, 35, 35,
+ 35, 35, 1, 36, 37, 1, 38, 39, 1, 22, 40, 23, 41, 21, 1, 42, 42, 1, 28, 1, 43, 1,
+ 28, 1, 44, 1, 45, 46, 1, 47, 1, 48, 48, 50, 50, 49, 1, 48, 48, 51, 1, 53, 52, 1,
+ 53, 1, 54, 1, 55, 1, 56, 1, 57, 1, 58, 1, 59, 59, 60, 60, 61, 1, 62, 1, 63, 1, 61,
+ 1, 48, 48, 50, 50, 1, 51, 1, 64, 1, 65, 1, 48, 48, 50, 50, 66, 1, 67, 21, 30, 31,
+ 29, 1, 21, 30, 31, 68, 1, 21, 30, 31, 69, 1, 70, 1, 71, 72, 1, 73, 1, 74, 1, 75, 1,
+ 76, 1, 77, 1, 75, 1, 75, 78, 75, 79, 1, 80, 1, 0, 1, 81, 1, 0, 1, 82, 75, 83, 75,
+ 1, 75, 1, 75, 1, 84, 85, 1, 74, 1, 77, 1, 86, 87, 1, 75, 1, 75, 1, 72, 1, 75, 79,
+ 1, 83, 75, 1, 85, 1, 87, 1, 1, 88, 21, 88, 21, 1, 25, 1, 1, 21, 30, 90, 91, 92, 89,
+ 29, 1, 21, 30, 90, 89, 29, 1, 21, 90, 90, 31, 1, 34, 34, 1, 35, 35, 35, 35, 1, 21,
+ 93, 94, 20, 1, 25, 93, 37, 1, 25, 93, 1, 21, 95, 94, 94, 1, 95, 39, 1, 95, 1, 21,
+ 30, 90, 91, 92, 96, 97, 1, 21, 30, 90, 98, 69, 1, 21, 30, 90, 99, 68, 1, 67, 21,
+ 30, 90, 89, 29, 1, 59, 59, 60, 60, 100, 61, 1, 102, 101, 1, 102, 1, 1, 59, 59, 60,
+ 60, 61, 100, 1, 48, 48, 50, 50, 1, 21, 93, 94, 103, 1, 21, 93, 94, 104, 1, 21, 93,
+ 94, 105, 1, 67, 21, 93, 94, 20, 1, 1, 1, 1, 0 };
+ }
+
+ private static final byte _snakeyaml_indicies[] = init__snakeyaml_indicies_0();
+
+ private static byte[] init__snakeyaml_trans_targs_0() {
+ return new byte[] { 75, 0, 2, 19, 90, 100, 48, 105, 49, 56, 61, 64, 67, 70, 71, 72, 73, 74,
+ 3, 79, 84, 76, 6, 9, 5, 77, 7, 8, 78, 10, 11, 14, 12, 13, 82, 83, 85, 86, 88, 89,
+ 20, 22, 21, 23, 25, 26, 42, 27, 28, 40, 41, 29, 30, 31, 32, 33, 34, 35, 94, 36, 37,
+ 97, 95, 39, 43, 44, 99, 24, 45, 46, 104, 50, 53, 51, 52, 106, 54, 55, 57, 59, 58,
+ 60, 62, 63, 65, 66, 68, 69, 4, 80, 81, 15, 16, 17, 87, 18, 91, 47, 92, 93, 98, 96,
+ 38, 101, 102, 103 };
+ }
+
+ private static final byte _snakeyaml_trans_targs[] = init__snakeyaml_trans_targs_0();
+
+ // private static byte[] init__snakeyaml_trans_actions_0() {
+ // return new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ // 0, 0, 0, 0, 0, 0,
+ // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ // 0, 0, 0, 0,
+ // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ // 0, 0, 0, 0,
+ // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ // 0, 0 };
+ // }
+
+ // private static final byte _snakeyaml_trans_actions[] =
+ // init__snakeyaml_trans_actions_0();
+
+ private static byte[] init__snakeyaml_eof_actions_0() {
+ return new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 11, 11, 11,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 13, 13, 13, 13, 13, 13, 9, 9, 9, 9, 3,
+ 7, 1 };
+ }
+
+ private static final byte _snakeyaml_eof_actions[] = init__snakeyaml_eof_actions_0();
+
+ static final int snakeyaml_start = 1;
+ static final int snakeyaml_error = 0;
+
+ static final int snakeyaml_en_main = 1;
+
+ // line 53 "RagelMachine.rl"
+
+ public String scan(String scalar) {
+ if (scalar == null) {
+ throw new NullPointerException("Scalar must be provided.");
+ }
+ String tag = null;
+ int cs = 0;
+ int p = 0;
+ int pe = scalar.length();
+ int eof = pe;
+ char[] data;
+ if (pe == 0) {
+ // NULL value
+ data = new char[] { '~' };
+ pe = 1;
+ eof = 1;
+ } else {
+ data = scalar.toCharArray();
+ }
+
+ // line 257 "RagelMachine.java"
+ {
+ cs = snakeyaml_start;
+ }
+
+ // line 262 "RagelMachine.java"
+ {
+ int _klen;
+ int _trans = 0;
+ int _keys;
+ int _goto_targ = 0;
+
+ _goto: while (true) {
+ switch (_goto_targ) {
+ case 0:
+ if (p == pe) {
+ _goto_targ = 4;
+ continue _goto;
+ }
+ if (cs == 0) {
+ _goto_targ = 5;
+ continue _goto;
+ }
+ case 1:
+ _match: do {
+ _keys = _snakeyaml_key_offsets[cs];
+ _trans = _snakeyaml_index_offsets[cs];
+ _klen = _snakeyaml_single_lengths[cs];
+ if (_klen > 0) {
+ int _lower = _keys;
+ int _mid;
+ int _upper = _keys + _klen - 1;
+ while (true) {
+ if (_upper < _lower)
+ break;
+
+ _mid = _lower + ((_upper - _lower) >> 1);
+ if (data[p] < _snakeyaml_trans_keys[_mid])
+ _upper = _mid - 1;
+ else if (data[p] > _snakeyaml_trans_keys[_mid])
+ _lower = _mid + 1;
+ else {
+ _trans += (_mid - _keys);
+ break _match;
+ }
+ }
+ _keys += _klen;
+ _trans += _klen;
+ }
+
+ _klen = _snakeyaml_range_lengths[cs];
+ if (_klen > 0) {
+ int _lower = _keys;
+ int _mid;
+ int _upper = _keys + (_klen << 1) - 2;
+ while (true) {
+ if (_upper < _lower)
+ break;
+
+ _mid = _lower + (((_upper - _lower) >> 1) & ~1);
+ if (data[p] < _snakeyaml_trans_keys[_mid])
+ _upper = _mid - 2;
+ else if (data[p] > _snakeyaml_trans_keys[_mid + 1])
+ _lower = _mid + 2;
+ else {
+ _trans += ((_mid - _keys) >> 1);
+ break _match;
+ }
+ }
+ _trans += _klen;
+ }
+ } while (false);
+
+ _trans = _snakeyaml_indicies[_trans];
+ cs = _snakeyaml_trans_targs[_trans];
+
+ case 2:
+ if (cs == 0) {
+ _goto_targ = 5;
+ continue _goto;
+ }
+ if (++p != pe) {
+ _goto_targ = 1;
+ continue _goto;
+ }
+ case 4:
+ if (p == eof) {
+ int __acts = _snakeyaml_eof_actions[cs];
+ int __nacts = (int) _snakeyaml_actions[__acts++];
+ while (__nacts-- > 0) {
+ switch (_snakeyaml_actions[__acts++]) {
+ case 0:
+ // line 14 "RagelMachine.rl"
+ {
+ tag = "tag:yaml.org,2002:bool";
+ }
+ break;
+ case 1:
+ // line 15 "RagelMachine.rl"
+ {
+ tag = "tag:yaml.org,2002:merge";
+ }
+ break;
+ case 2:
+ // line 16 "RagelMachine.rl"
+ {
+ tag = "tag:yaml.org,2002:null";
+ }
+ break;
+ case 3:
+ // line 17 "RagelMachine.rl"
+ {
+ tag = "tag:yaml.org,2002:value";
+ }
+ break;
+ case 4:
+ // line 18 "RagelMachine.rl"
+ {
+ tag = "tag:yaml.org,2002:int";
+ }
+ break;
+ case 5:
+ // line 19 "RagelMachine.rl"
+ {
+ tag = "tag:yaml.org,2002:float";
+ }
+ break;
+ case 6:
+ // line 20 "RagelMachine.rl"
+ {
+ tag = "tag:yaml.org,2002:timestamp";
+ }
+ break;
+ // line 377 "RagelMachine.java"
+ }
+ }
+ }
+
+ case 5:
+ }
+ break;
+ }
+ }
+ // line 77 "RagelMachine.rl"
+
+ return tag;
+ }
+} \ No newline at end of file
diff --git a/src/test/java/org/yaml/snakeyaml/resolver/RagelMachineTest.java b/src/test/java/org/yaml/snakeyaml/resolver/RagelMachineTest.java
new file mode 100644
index 00000000..1ad62ccc
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/resolver/RagelMachineTest.java
@@ -0,0 +1,104 @@
+package org.yaml.snakeyaml.resolver;
+
+import junit.framework.TestCase;
+
+public class RagelMachineTest extends TestCase {
+ private RagelMachine machine = new RagelMachine();
+
+ public void testScan() {
+ assertNull(machine.scan("abc"));
+ }
+
+ public void testNullPointerException() {
+ try {
+ machine.scan(null);
+ fail("null must not be accepted.");
+ } catch (NullPointerException e) {
+ assertEquals("Scalar must be provided.", e.getMessage());
+ }
+ }
+
+ public void testScanBoolean() {
+ assertEquals("tag:yaml.org,2002:bool", machine.scan("true"));
+ assertEquals("tag:yaml.org,2002:bool", machine.scan("True"));
+ assertEquals("tag:yaml.org,2002:bool", machine.scan("TRUE"));
+ assertEquals("tag:yaml.org,2002:bool", machine.scan("false"));
+ assertEquals("tag:yaml.org,2002:bool", machine.scan("False"));
+ assertEquals("tag:yaml.org,2002:bool", machine.scan("FALSE"));
+ assertEquals("tag:yaml.org,2002:bool", machine.scan("on"));
+ assertEquals("tag:yaml.org,2002:bool", machine.scan("ON"));
+ assertEquals("tag:yaml.org,2002:bool", machine.scan("On"));
+ assertEquals("tag:yaml.org,2002:bool", machine.scan("off"));
+ assertEquals("tag:yaml.org,2002:bool", machine.scan("Off"));
+ assertEquals("tag:yaml.org,2002:bool", machine.scan("OFF"));
+ assertEquals("tag:yaml.org,2002:bool", machine.scan("on"));
+ assertEquals("tag:yaml.org,2002:bool", machine.scan("ON"));
+ assertEquals("tag:yaml.org,2002:bool", machine.scan("On"));
+ assertEquals("tag:yaml.org,2002:bool", machine.scan("off"));
+ assertEquals("tag:yaml.org,2002:bool", machine.scan("Off"));
+ assertEquals("tag:yaml.org,2002:bool", machine.scan("OFF"));
+ }
+
+ public void testScanNull() {
+ assertEquals("tag:yaml.org,2002:null", machine.scan("null"));
+ assertEquals("tag:yaml.org,2002:null", machine.scan("Null"));
+ assertEquals("tag:yaml.org,2002:null", machine.scan("NULL"));
+ assertEquals("tag:yaml.org,2002:null", machine.scan("~"));
+ assertEquals("tag:yaml.org,2002:null", machine.scan(" "));
+ assertEquals("tag:yaml.org,2002:null", machine.scan(""));
+ }
+
+ public void testScanMerge() {
+ assertEquals("tag:yaml.org,2002:merge", machine.scan("<<"));
+ }
+
+ public void testScanValue() {
+ assertEquals("tag:yaml.org,2002:value", machine.scan("="));
+ }
+
+ public void testScanInt() {
+ assertEquals("tag:yaml.org,2002:int", machine.scan("0"));
+ assertEquals("tag:yaml.org,2002:int", machine.scan("1"));
+ assertEquals("tag:yaml.org,2002:int", machine.scan("-0"));
+ assertEquals("tag:yaml.org,2002:int", machine.scan("-9"));
+ assertEquals("tag:yaml.org,2002:int", machine.scan("0b0011"));
+ assertEquals("tag:yaml.org,2002:int", machine.scan("0x12ef"));
+ assertEquals("tag:yaml.org,2002:int", machine.scan("0123"));
+ assertEquals("tag:yaml.org,2002:int", machine.scan("1_000"));
+ assertEquals("tag:yaml.org,2002:int", machine.scan("1_000_000"));
+ assertEquals("tag:yaml.org,2002:int", machine.scan("+0"));
+ assertEquals("tag:yaml.org,2002:int", machine.scan("+10"));
+ assertEquals("tag:yaml.org,2002:int", machine.scan("1__000"));
+ assertEquals("tag:yaml.org,2002:int", machine.scan("24:12:34"));
+ assertEquals("tag:yaml.org,2002:int", machine.scan("240:12:34"));
+ }
+
+ public void testScanFloat() {
+ assertEquals("tag:yaml.org,2002:float", machine.scan("1.0"));
+ assertEquals("tag:yaml.org,2002:float", machine.scan("-0.0"));
+ assertEquals("tag:yaml.org,2002:float", machine.scan("+2.2310"));
+ assertEquals("tag:yaml.org,2002:float", machine.scan("1.0e+12"));
+ assertEquals("tag:yaml.org,2002:float", machine.scan("1.345e-3"));
+ assertEquals("tag:yaml.org,2002:float", machine.scan("190:20:30.15"));
+ assertEquals("tag:yaml.org,2002:float", machine.scan("-.inf"));
+ assertEquals("tag:yaml.org,2002:float", machine.scan("+.INF"));
+ assertEquals("tag:yaml.org,2002:float", machine.scan(".Inf"));
+ assertEquals("tag:yaml.org,2002:float", machine.scan(".nan"));
+ assertEquals("tag:yaml.org,2002:float", machine.scan(".NaN"));
+ assertEquals("tag:yaml.org,2002:float", machine.scan(".NAN"));
+ assertEquals("tag:yaml.org,2002:float", machine.scan("1_000.5"));
+ assertEquals("tag:yaml.org,2002:float", machine.scan("1.023_456"));
+ assertEquals("tag:yaml.org,2002:float", machine.scan("-1_123.45"));
+ assertEquals("tag:yaml.org,2002:float", machine.scan(".5"));
+ assertEquals("tag:yaml.org,2002:float", machine.scan("1.E+1"));
+ assertNull(machine.scan("0x1,1"), machine.scan("0x1,1"));
+ }
+
+ public void testScanTimestamp() {
+ assertEquals("tag:yaml.org,2002:timestamp", machine.scan("2009-02-28"));
+ assertEquals("tag:yaml.org,2002:timestamp", machine.scan("2001-12-15T02:59:43.1Z"));
+ assertEquals("tag:yaml.org,2002:timestamp", machine.scan("2001-12-14t21:59:43.10-05:00"));
+ assertEquals("tag:yaml.org,2002:timestamp", machine.scan("2001-12-14 21:59:43.10 -5"));
+ assertEquals("tag:yaml.org,2002:timestamp", machine.scan("2001-12-15 2:59:43.10"));
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/resolver/ResolverTest.java b/src/test/java/org/yaml/snakeyaml/resolver/ResolverTest.java
new file mode 100644
index 00000000..94bd291f
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/resolver/ResolverTest.java
@@ -0,0 +1,141 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.resolver;
+
+import java.awt.Point;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.Dumper;
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.Loader;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.Construct;
+import org.yaml.snakeyaml.constructor.Constructor;
+import org.yaml.snakeyaml.nodes.Node;
+import org.yaml.snakeyaml.nodes.ScalarNode;
+import org.yaml.snakeyaml.representer.Represent;
+import org.yaml.snakeyaml.representer.Representer;
+
+public class ResolverTest extends TestCase {
+
+ @SuppressWarnings("unchecked")
+ public void testAddImplicitResolver() {
+ Dumper dumper = new Dumper(new MyRepresenter(), new DumperOptions());
+ Loader loader = new Loader(new MyConstructor());
+ Yaml yaml = new Yaml(loader, dumper);
+ Pattern regexp = Pattern.compile("\\d\\d-\\d\\d-\\d\\d\\d");
+ yaml.addImplicitResolver("tag:yaml.org,2002:Phone", regexp, "0123456789");
+ Phone phone1 = new Phone("12-34-567");
+ Phone phone2 = new Phone("11-22-333");
+ Phone phone3 = new Phone("44-55-777");
+ List<Phone> etalonList = new LinkedList<Phone>();
+ etalonList.add(phone1);
+ etalonList.add(phone2);
+ etalonList.add(phone3);
+ String output = yaml.dump(etalonList);
+ assertEquals("[12-34-567, 11-22-333, 44-55-777]\n", output);
+ List<Phone> parsedList = (List<Phone>) yaml.load(output);
+ assertEquals(3, parsedList.size());
+ assertEquals(phone1, parsedList.get(0));
+ assertEquals(phone2, parsedList.get(1));
+ assertEquals(phone3, parsedList.get(2));
+ assertEquals(etalonList, parsedList);
+ }
+
+ public void testAddImplicitResolver2() {
+ Dumper dumper = new Dumper(new PointRepresenter(), new DumperOptions());
+ Yaml yaml = new Yaml(dumper);
+ Pattern regexp = Pattern.compile("\\d\\d-\\d\\d-\\d\\d\\d");
+ yaml.addImplicitResolver("tag:yaml.org,2002:Phone", regexp, "\0");
+ Pattern regexp2 = Pattern.compile("x\\d_y\\d");
+ // try any scalar, and not only those which start with 'x'
+ yaml.addImplicitResolver("tag:yaml.org,2002:Point", regexp2, null);
+ Map<String, Object> map = new LinkedHashMap<String, Object>();
+ map.put("a", new Phone("12-34-567"));
+ map.put("b", new Point(1, 5));
+ String output = yaml.dump(map);
+ assertEquals("{a: 12-34-567, b: x1_y5}\n", output);
+ }
+
+ class Phone {
+ private String number;
+
+ public Phone(String n) {
+ this.number = n;
+ }
+
+ public String getNumber() {
+ return number;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof Phone)) {
+ return false;
+ }
+ return toString().equals(obj.toString());
+ }
+
+ @Override
+ public String toString() {
+ return "Phone: " + number;
+ }
+ }
+
+ class MyRepresenter extends Representer {
+ public MyRepresenter() {
+ this.representers.put(Phone.class, new RepresentPhone());
+ }
+
+ private class RepresentPhone implements Represent {
+ public Node representData(Object data) {
+ Phone phone = (Phone) data;
+ String value = phone.getNumber();
+ return representScalar("tag:yaml.org,2002:Phone", value);
+ }
+ }
+ }
+
+ class MyConstructor extends Constructor {
+ public MyConstructor() {
+ this.yamlConstructors.put("tag:yaml.org,2002:Phone", new ConstuctPhone());
+ }
+
+ private class ConstuctPhone implements Construct {
+ public Object construct(Node node) {
+ String val = (String) constructScalar((ScalarNode) node);
+ return new Phone(val);
+ }
+ }
+ }
+
+ class PointRepresenter extends Representer {
+ public PointRepresenter() {
+ this.representers.put(Point.class, new RepresentPoint());
+ this.representers.put(Phone.class, new RepresentPhone());
+ }
+
+ private class RepresentPoint implements Represent {
+ public Node representData(Object data) {
+ Point phone = (Point) data;
+ String value = "x" + (int) phone.getX() + "_y" + (int) phone.getY();
+ return representScalar("tag:yaml.org,2002:Point", value);
+ }
+ }
+
+ private class RepresentPhone implements Represent {
+ public Node representData(Object data) {
+ Phone phone = (Phone) data;
+ String value = phone.getNumber();
+ return representScalar("tag:yaml.org,2002:Phone", value);
+ }
+ }
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/resolver/ResolverTupleTest.java b/src/test/java/org/yaml/snakeyaml/resolver/ResolverTupleTest.java
new file mode 100644
index 00000000..763291af
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/resolver/ResolverTupleTest.java
@@ -0,0 +1,16 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.resolver;
+
+import java.util.regex.Pattern;
+
+import junit.framework.TestCase;
+
+public class ResolverTupleTest extends TestCase {
+
+ public void testToString() {
+ ResolverTuple tuple = new ResolverTuple("dice", Pattern.compile("\\d+"));
+ assertEquals("Tuple tag=dice regexp=\\d+", tuple.toString());
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/scanner/ScannerImplTest.java b/src/test/java/org/yaml/snakeyaml/scanner/ScannerImplTest.java
new file mode 100644
index 00000000..4486522d
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/scanner/ScannerImplTest.java
@@ -0,0 +1,47 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.scanner;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.error.Mark;
+import org.yaml.snakeyaml.reader.Reader;
+import org.yaml.snakeyaml.tokens.BlockEndToken;
+import org.yaml.snakeyaml.tokens.BlockMappingStartToken;
+import org.yaml.snakeyaml.tokens.KeyToken;
+import org.yaml.snakeyaml.tokens.ScalarToken;
+import org.yaml.snakeyaml.tokens.StreamEndToken;
+import org.yaml.snakeyaml.tokens.StreamStartToken;
+import org.yaml.snakeyaml.tokens.Token;
+import org.yaml.snakeyaml.tokens.ValueToken;
+
+public class ScannerImplTest extends TestCase {
+
+ @SuppressWarnings("unchecked")
+ public void testGetToken() {
+ String data = "string: abcd";
+ Reader reader = new Reader(data);
+ Scanner scanner = new ScannerImpl(reader);
+
+ Mark dummy = new Mark("dummy", 0, 0, 0, "", 0);
+ LinkedList<Token> etalonTokens = new LinkedList<Token>();
+ etalonTokens.add(new StreamStartToken(dummy, dummy));
+ etalonTokens.add(new BlockMappingStartToken(dummy, dummy));
+ etalonTokens.add(new KeyToken(dummy, dummy));
+ etalonTokens.add(new ScalarToken("string", true, dummy, dummy, (char) 0));
+ etalonTokens.add(new ValueToken(dummy, dummy));
+ etalonTokens.add(new ScalarToken("abcd", true, dummy, dummy, (char) 0));
+ etalonTokens.add(new BlockEndToken(dummy, dummy));
+ etalonTokens.add(new StreamEndToken(dummy, dummy));
+ while (scanner.checkToken(new ArrayList())) {
+ assertEquals(etalonTokens.removeFirst(), scanner.getToken());
+ // System.out.println(scanner.getToken());
+ }
+ assertFalse("Must contain no more tokens: " + scanner.getToken(), scanner
+ .checkToken(new ArrayList()));
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/scanner/SimpleKeyTest.java b/src/test/java/org/yaml/snakeyaml/scanner/SimpleKeyTest.java
new file mode 100644
index 00000000..ca4a4075
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/scanner/SimpleKeyTest.java
@@ -0,0 +1,14 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.scanner;
+
+import junit.framework.TestCase;
+
+public class SimpleKeyTest extends TestCase {
+
+ public void testToString() {
+ SimpleKey key = new SimpleKey(1, false, 5, 3, 2, null);
+ assertTrue(key.toString().contains("SimpleKey"));
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/serializer/SerializerTest.java b/src/test/java/org/yaml/snakeyaml/serializer/SerializerTest.java
new file mode 100644
index 00000000..898ff034
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/serializer/SerializerTest.java
@@ -0,0 +1,89 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.serializer;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.text.NumberFormat;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.emitter.Emitter;
+import org.yaml.snakeyaml.nodes.ScalarNode;
+import org.yaml.snakeyaml.resolver.Resolver;
+
+public class SerializerTest extends TestCase {
+ private Serializer serializer;
+
+ @Override
+ protected void setUp() throws Exception {
+ DumperOptions config = new DumperOptions();
+ StringWriter writer = new StringWriter();
+ serializer = new Serializer(new Emitter(writer, config), new Resolver(), config);
+ }
+
+ public void testSerializerIsAlreadyOpened() throws IOException {
+ serializer.open();
+ try {
+ serializer.open();
+ fail();
+ } catch (RuntimeException e) {
+ assertEquals("serializer is already opened", e.getMessage());
+ }
+ }
+
+ public void testSerializerIsClosed1() throws IOException {
+ serializer.open();
+ serializer.close();
+ try {
+ serializer.open();
+ fail();
+ } catch (RuntimeException e) {
+ assertEquals("serializer is closed", e.getMessage());
+ }
+ }
+
+ public void testSerializerIsClosed2() throws IOException {
+ serializer.open();
+ serializer.close();
+ try {
+ serializer.serialize(new ScalarNode("!foo", "bar", null, null, (char) 0));
+ fail();
+ } catch (RuntimeException e) {
+ assertEquals("serializer is closed", e.getMessage());
+ }
+ }
+
+ public void testSerializerIsClosed3() throws IOException {
+ serializer.open();
+ serializer.close();
+ serializer.close();// no problem to close twice
+ }
+
+ public void testSerializerIsNotOpened1() throws IOException {
+ try {
+ serializer.close();
+ fail();
+ } catch (RuntimeException e) {
+ assertEquals("serializer is not opened", e.getMessage());
+ }
+ }
+
+ public void testSerializerIsNotOpened2() throws IOException {
+ try {
+ serializer.serialize(new ScalarNode("!foo", "bar", null, null, (char) 0));
+ fail();
+ } catch (RuntimeException e) {
+ assertEquals("serializer is not opened", e.getMessage());
+ }
+ }
+
+ public void testGenerateAnchor() {
+ NumberFormat format = NumberFormat.getNumberInstance();
+ format.setMinimumIntegerDigits(3);
+ String anchor = format.format(3L);
+ assertEquals("003", anchor);
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/tokens/AliasTokenTest.java b/src/test/java/org/yaml/snakeyaml/tokens/AliasTokenTest.java
new file mode 100644
index 00000000..c8aed69e
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/tokens/AliasTokenTest.java
@@ -0,0 +1,29 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.tokens;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.error.Mark;
+
+public class AliasTokenTest extends TestCase {
+
+ public void testEquals() {
+ Mark mark = new Mark("test1", 0, 0, 0, "*The first line.\nThe last line.", 0);
+ AliasToken token = new AliasToken("*id123", mark, mark);
+ assertFalse(token.equals(mark));
+ }
+
+ public void testGetArguments() {
+ Mark mark = new Mark("test1", 0, 0, 0, "*The first line.\nThe last line.", 0);
+ AliasToken token = new AliasToken("*id123", mark, mark);
+ assertEquals("value=*id123", token.getArguments());
+ }
+
+ public void testGetTokenId() {
+ Mark mark = new Mark("test1", 0, 0, 0, "*The first line.\nThe last line.", 0);
+ AliasToken token = new AliasToken("&id123", mark, mark);
+ assertEquals("<alias>", token.getTokenId());
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/tokens/AnchorTokenTest.java b/src/test/java/org/yaml/snakeyaml/tokens/AnchorTokenTest.java
new file mode 100644
index 00000000..2352a459
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/tokens/AnchorTokenTest.java
@@ -0,0 +1,23 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.tokens;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.error.Mark;
+
+public class AnchorTokenTest extends TestCase {
+
+ public void testGetArguments() {
+ Mark mark = new Mark("test1", 0, 0, 0, "*The first line.\nThe last line.", 0);
+ AnchorToken token = new AnchorToken("&id123", mark, mark);
+ assertEquals("value=&id123", token.getArguments());
+ }
+
+ public void testGetTokenId() {
+ Mark mark = new Mark("test1", 0, 0, 0, "*The first line.\nThe last line.", 0);
+ AnchorToken token = new AnchorToken("&id123", mark, mark);
+ assertEquals("<anchor>", token.getTokenId());
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/tokens/BlockEndTokenTest.java b/src/test/java/org/yaml/snakeyaml/tokens/BlockEndTokenTest.java
new file mode 100644
index 00000000..38cb49b1
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/tokens/BlockEndTokenTest.java
@@ -0,0 +1,23 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.tokens;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.error.Mark;
+
+public class BlockEndTokenTest extends TestCase {
+
+ public void testGetArguments() {
+ Mark mark = new Mark("test1", 0, 0, 0, "*The first line.\nThe last line.", 0);
+ BlockEndToken token = new BlockEndToken(mark, mark);
+ assertEquals("", token.getArguments());
+ }
+
+ public void testGetTokenId() {
+ Mark mark = new Mark("test1", 0, 0, 0, "*The first line.\nThe last line.", 0);
+ BlockEndToken token = new BlockEndToken(mark, mark);
+ assertEquals("<block end>", token.getTokenId());
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/tokens/BlockEntryTokenTest.java b/src/test/java/org/yaml/snakeyaml/tokens/BlockEntryTokenTest.java
new file mode 100644
index 00000000..869c2871
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/tokens/BlockEntryTokenTest.java
@@ -0,0 +1,18 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.tokens;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.error.Mark;
+
+public class BlockEntryTokenTest extends TestCase {
+
+ public void testGetTokenId() {
+ Mark mark = new Mark("test1", 0, 0, 0, "*The first line.\nThe last line.", 0);
+ BlockEntryToken token = new BlockEntryToken(mark, mark);
+ assertEquals("-", token.getTokenId());
+ }
+
+}
diff --git a/src/test/java/org/yaml/snakeyaml/tokens/BlockSequenceStartTokenTest.java b/src/test/java/org/yaml/snakeyaml/tokens/BlockSequenceStartTokenTest.java
new file mode 100644
index 00000000..38e4096e
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/tokens/BlockSequenceStartTokenTest.java
@@ -0,0 +1,17 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.tokens;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.error.Mark;
+
+public class BlockSequenceStartTokenTest extends TestCase {
+
+ public void testGetTokenId() {
+ Mark mark = new Mark("test1", 0, 0, 0, "*The first line.\nThe last line.", 0);
+ BlockSequenceStartToken token = new BlockSequenceStartToken(mark, mark);
+ assertEquals("<block sequence start>", token.getTokenId());
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/tokens/DirectiveTokenTest.java b/src/test/java/org/yaml/snakeyaml/tokens/DirectiveTokenTest.java
new file mode 100644
index 00000000..fd765403
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/tokens/DirectiveTokenTest.java
@@ -0,0 +1,56 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.tokens;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.error.Mark;
+
+public class DirectiveTokenTest extends TestCase {
+
+ public void testGetArguments() {
+ Mark mark = new Mark("test1", 0, 0, 0, "*The first line.\nThe last line.", 0);
+ DirectiveToken token = new DirectiveToken("YAML", null, mark, mark);
+ assertEquals("name=YAML", token.getArguments());
+ }
+
+ public void testInvalidList() {
+ Mark mark = new Mark("test1", 0, 0, 0, "*The first line.\nThe last line.", 0);
+ List<Integer> list = new LinkedList<Integer>();
+ list.add(new Integer(1));
+ try {
+ new DirectiveToken("YAML", list, mark, mark);
+ fail("List must have 2 values.");
+ } catch (Exception e) {
+ assertEquals("Two strings must be provided instead of 1", e.getMessage());
+ }
+ }
+
+ public void testTag() {
+ Mark mark = new Mark("test1", 0, 0, 0, "*The first line.\nThe last line.", 0);
+ List<String> list = new LinkedList<String>();
+ list.add("!foo");
+ list.add("!bar");
+ DirectiveToken token = new DirectiveToken("TAG", list, mark, mark);
+ assertEquals("name=TAG, value=[!foo, !bar]", token.getArguments());
+ }
+
+ public void testList() {
+ Mark mark = new Mark("test1", 0, 0, 0, "*The first line.\nThe last line.", 0);
+ List<Integer> list = new LinkedList<Integer>();
+ list.add(new Integer(1));
+ list.add(new Integer(1));
+ DirectiveToken token = new DirectiveToken("YAML", list, mark, mark);
+ assertEquals("name=YAML, value=[1, 1]", token.getArguments());
+ }
+
+ public void testGetTokenId() {
+ Mark mark = new Mark("test1", 0, 0, 0, "*The first line.\nThe last line.", 0);
+ DirectiveToken token = new DirectiveToken("YAML", null, mark, mark);
+ assertEquals("<directive>", token.getTokenId());
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/tokens/DocumentEndTokenTest.java b/src/test/java/org/yaml/snakeyaml/tokens/DocumentEndTokenTest.java
new file mode 100644
index 00000000..ed418356
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/tokens/DocumentEndTokenTest.java
@@ -0,0 +1,17 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.tokens;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.error.Mark;
+
+public class DocumentEndTokenTest extends TestCase {
+
+ public void testGetTokenId() {
+ Mark mark = new Mark("test1", 0, 0, 0, "*The first line.\nThe last line.", 0);
+ DocumentEndToken token = new DocumentEndToken(mark, mark);
+ assertEquals("<document end>", token.getTokenId());
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/tokens/DocumentStartTokenTest.java b/src/test/java/org/yaml/snakeyaml/tokens/DocumentStartTokenTest.java
new file mode 100644
index 00000000..253857f0
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/tokens/DocumentStartTokenTest.java
@@ -0,0 +1,17 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.tokens;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.error.Mark;
+
+public class DocumentStartTokenTest extends TestCase {
+
+ public void testGetTokenId() {
+ Mark mark = new Mark("test1", 0, 0, 0, "*The first line.\nThe last line.", 0);
+ DocumentStartToken token = new DocumentStartToken(mark, mark);
+ assertEquals("<document start>", token.getTokenId());
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/tokens/FlowEntryTokenTest.java b/src/test/java/org/yaml/snakeyaml/tokens/FlowEntryTokenTest.java
new file mode 100644
index 00000000..c9d3f0b7
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/tokens/FlowEntryTokenTest.java
@@ -0,0 +1,17 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.tokens;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.error.Mark;
+
+public class FlowEntryTokenTest extends TestCase {
+
+ public void testGetTokenId() {
+ Mark mark = new Mark("test1", 0, 0, 0, "*The first line.\nThe last line.", 0);
+ FlowEntryToken token = new FlowEntryToken(mark, mark);
+ assertEquals(",", token.getTokenId());
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/tokens/FlowMappingStartTokenTest.java b/src/test/java/org/yaml/snakeyaml/tokens/FlowMappingStartTokenTest.java
new file mode 100644
index 00000000..5c5cf4ef
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/tokens/FlowMappingStartTokenTest.java
@@ -0,0 +1,17 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.tokens;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.error.Mark;
+
+public class FlowMappingStartTokenTest extends TestCase {
+
+ public void testGetTokenId() {
+ Mark mark = new Mark("test1", 0, 0, 0, "*The first line.\nThe last line.", 0);
+ FlowMappingStartToken token = new FlowMappingStartToken(mark, mark);
+ assertEquals("{", token.getTokenId());
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/tokens/FlowSequenceStartTokenTest.java b/src/test/java/org/yaml/snakeyaml/tokens/FlowSequenceStartTokenTest.java
new file mode 100644
index 00000000..b79cbb97
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/tokens/FlowSequenceStartTokenTest.java
@@ -0,0 +1,17 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.tokens;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.error.Mark;
+
+public class FlowSequenceStartTokenTest extends TestCase {
+
+ public void testGetTokenId() {
+ Mark mark = new Mark("test1", 0, 0, 0, "*The first line.\nThe last line.", 0);
+ FlowSequenceStartToken token = new FlowSequenceStartToken(mark, mark);
+ assertEquals("[", token.getTokenId());
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/tokens/StreamStartTokenTest.java b/src/test/java/org/yaml/snakeyaml/tokens/StreamStartTokenTest.java
new file mode 100644
index 00000000..8475e4ed
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/tokens/StreamStartTokenTest.java
@@ -0,0 +1,17 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.tokens;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.error.Mark;
+
+public class StreamStartTokenTest extends TestCase {
+
+ public void testGetTokenId() {
+ Mark mark = new Mark("test1", 0, 0, 0, "*The first line.\nThe last line.", 0);
+ StreamStartToken token = new StreamStartToken(mark, mark);
+ assertEquals("<stream start>", token.getTokenId());
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/tokens/TagTokenTest.java b/src/test/java/org/yaml/snakeyaml/tokens/TagTokenTest.java
new file mode 100644
index 00000000..7ab3bb11
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/tokens/TagTokenTest.java
@@ -0,0 +1,33 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.tokens;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.error.Mark;
+
+public class TagTokenTest extends TestCase {
+
+ public void testGetArguments() {
+ Mark mark = new Mark("test1", 0, 0, 0, "*The first line.\nThe last line.", 0);
+ TagToken token = new TagToken(new String[] { "!foo", "!bar" }, mark, mark);
+ assertEquals("value=[!foo, !bar]", token.getArguments());
+ }
+
+ public void testNoTag() {
+ try {
+ Mark mark = new Mark("test1", 0, 0, 0, "*The first line.\nThe last line.", 0);
+ new TagToken(new String[] { "!foo" }, mark, mark);
+ fail("Marks must be provided.");
+ } catch (Exception e) {
+ assertEquals("Two strings must be provided instead of 1", e.getMessage());
+ }
+ }
+
+ public void testGetTokenId() {
+ Mark mark = new Mark("test1", 0, 0, 0, "*The first line.\nThe last line.", 0);
+ TagToken token = new TagToken(new String[] { "!foo", "!bar" }, mark, mark);
+ assertEquals("<tag>", token.getTokenId());
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/types/AbstractTest.java b/src/test/java/org/yaml/snakeyaml/types/AbstractTest.java
new file mode 100644
index 00000000..0b464fb3
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/types/AbstractTest.java
@@ -0,0 +1,36 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.types;
+
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.Yaml;
+
+public abstract class AbstractTest extends TestCase {
+ @SuppressWarnings("unchecked")
+ protected Map<String, Object> getMap(String data) {
+ Yaml yaml = new Yaml();
+ Map<String, Object> nativeData = (Map<String, Object>) yaml.load(data);
+ return nativeData;
+ }
+
+ protected Object load(String data) {
+ Yaml yaml = new Yaml();
+ Object obj = yaml.load(data);
+ return obj;
+ }
+
+ protected String dump(Object data) {
+ Yaml yaml = new Yaml();
+ return yaml.dump(data);
+ }
+
+ @SuppressWarnings("unchecked")
+ protected Object getMapValue(String data, String key) {
+ Map nativeData = getMap(data);
+ return nativeData.get(key);
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/types/BinaryTagTest.java b/src/test/java/org/yaml/snakeyaml/types/BinaryTagTest.java
new file mode 100644
index 00000000..8dcbecc3
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/types/BinaryTagTest.java
@@ -0,0 +1,64 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.types;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @see http://yaml.org/type/binary.html
+ */
+public class BinaryTagTest extends AbstractTest {
+ String line1 = "R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5";
+ String line2 = "OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+";
+ String line3 = "+f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC";
+ String line4 = "AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs=";
+ String content = line1 + line2 + line3 + line4;
+
+ public void testBinary() throws IOException {
+ byte[] binary = (byte[]) getMapValue("canonical: !!binary " + content, "canonical");
+ assertEquals((byte) 'G', binary[0]);
+ assertEquals((byte) 'I', binary[1]);
+ assertEquals((byte) 'F', binary[2]);
+ assertEquals((byte) '8', binary[3]);
+ assertEquals((byte) '9', binary[4]);
+ }
+
+ public void testBinary2() throws IOException {
+ byte[] binary = (byte[]) load("!!binary \"MQ==\"");
+ assertEquals(1, binary.length);
+ assertEquals((byte) '1', binary[0]);
+ }
+
+ public void testBinaryTag() throws IOException {
+ byte[] binary = (byte[]) getMapValue("canonical: !<tag:yaml.org,2002:binary> " + content,
+ "canonical");
+ assertEquals((byte) 'G', binary[0]);
+ assertEquals((byte) 'I', binary[1]);
+ assertEquals((byte) 'F', binary[2]);
+ assertEquals((byte) '8', binary[3]);
+ assertEquals((byte) '9', binary[4]);
+ }
+
+ public void testBinaryOut() throws IOException {
+ byte[] data = "GIF89\tbi\u0003\u0000nary\n\u001Fimage\n".getBytes("ISO-8859-1");
+ Map<String, String> map = new HashMap<String, String>();
+ String value = new String(data, "ISO-8859-1");
+ map.put("canonical", value);
+ String output = dump(map);
+ assertEquals("canonical: !!binary |-\n R0lGODkJYmkDAG5hcnkKH2ltYWdlCg==\n", output);
+ }
+
+ public void testByteArray() throws IOException {
+ byte[] data = { 8, 14, 15, 10, 126, 32, 65, 65, 65 };
+ String output = dump(data);
+ assertEquals("!!binary |-\n CA4PCn4gQUFB\n", output);
+ byte[] parsed = (byte[]) load(output);
+ assertEquals(data.length, parsed.length);
+ for (int i = 0; i < data.length; i++) {
+ assertEquals(data[i], parsed[i]);
+ }
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/types/BoolTagTest.java b/src/test/java/org/yaml/snakeyaml/types/BoolTagTest.java
new file mode 100644
index 00000000..68a1cd08
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/types/BoolTagTest.java
@@ -0,0 +1,59 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.types;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @see http://yaml.org/type/int.html
+ */
+public class BoolTagTest extends AbstractTest {
+ public void testBool() throws IOException {
+ assertEquals(Boolean.TRUE, getMapValue("canonical: true", "canonical"));
+ assertEquals(Boolean.FALSE, getMapValue("answer: NO", "answer"));
+ assertEquals(Boolean.TRUE, getMapValue("logical: True", "logical"));
+ assertEquals(Boolean.TRUE, getMapValue("option: on", "option"));
+ }
+
+ public void testBoolCanonical() throws IOException {
+ assertEquals(Boolean.TRUE, getMapValue("canonical: Yes", "canonical"));
+ assertEquals(Boolean.TRUE, getMapValue("canonical: yes", "canonical"));
+ assertEquals(Boolean.TRUE, getMapValue("canonical: YES", "canonical"));
+ assertEquals("yES", getMapValue("canonical: yES", "canonical"));
+ assertEquals(Boolean.FALSE, getMapValue("canonical: No", "canonical"));
+ assertEquals(Boolean.FALSE, getMapValue("canonical: NO", "canonical"));
+ assertEquals(Boolean.FALSE, getMapValue("canonical: no", "canonical"));
+ assertEquals(Boolean.FALSE, getMapValue("canonical: off", "canonical"));
+ assertEquals(Boolean.FALSE, getMapValue("canonical: Off", "canonical"));
+ assertEquals(Boolean.FALSE, getMapValue("canonical: OFF", "canonical"));
+ assertEquals(Boolean.TRUE, getMapValue("canonical: ON", "canonical"));
+ assertEquals(Boolean.TRUE, getMapValue("canonical: On", "canonical"));
+ assertEquals(Boolean.TRUE, getMapValue("canonical: on", "canonical"));
+ // it looks like it is against the specification but it is like in
+ // PyYAML
+ assertEquals("n", getMapValue("canonical: n", "canonical"));
+ assertEquals("N", getMapValue("canonical: N", "canonical"));
+ assertEquals("y", getMapValue("canonical: y", "canonical"));
+ assertEquals("Y", getMapValue("canonical: Y", "canonical"));
+ }
+
+ public void testBoolShorthand() throws IOException {
+ assertEquals(Boolean.TRUE, getMapValue("boolean: !!bool true", "boolean"));
+ }
+
+ public void testBoolTag() throws IOException {
+ assertEquals(Boolean.TRUE,
+ getMapValue("boolean: !<tag:yaml.org,2002:bool> true", "boolean"));
+ }
+
+ public void testBoolOut() throws IOException {
+ Map<String, Boolean> map = new HashMap<String, Boolean>();
+ map.put("boolean", Boolean.TRUE);
+ String output = dump(map);
+ assertTrue(output, output.contains("boolean: true"));
+ }
+
+}
diff --git a/src/test/java/org/yaml/snakeyaml/types/FloatTagTest.java b/src/test/java/org/yaml/snakeyaml/types/FloatTagTest.java
new file mode 100644
index 00000000..aa3ede81
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/types/FloatTagTest.java
@@ -0,0 +1,55 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.types;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @see http://yaml.org/type/float.html
+ */
+public class FloatTagTest extends AbstractTest {
+
+ public void testFloat() throws IOException {
+ assertEquals(new Double(6.8523015e+5), getMapValue("canonical: 6.8523015e+5", "canonical"));
+ assertEquals(new Double(6.8523015e+5), getMapValue("exponentioal: 685.230_15e+03",
+ "exponentioal"));
+ assertEquals(new Double(6.8523015e+5), getMapValue("fixed: 685_230.15", "fixed"));
+ assertEquals(new Double(6.8523015e+5), getMapValue("sexagesimal: 190:20:30.15",
+ "sexagesimal"));
+ assertEquals(Double.NEGATIVE_INFINITY, getMapValue("negative infinity: -.inf",
+ "negative infinity"));
+ assertEquals(Double.NaN, getMapValue("not a number: .NaN", "not a number"));
+ }
+
+ public void testFloatShorthand() throws IOException {
+ assertEquals(new Double(1), getMapValue("number: !!float 1", "number"));
+ }
+
+ public void testFloatTag() throws IOException {
+ assertEquals(new Double(1), getMapValue("number: !<tag:yaml.org,2002:float> 1", "number"));
+ }
+
+ public void testFloatOut() throws IOException {
+ Map<String, Object> map = new HashMap<String, Object>();
+ map.put("number", new Double(1));
+ String output = dump(map);
+ assertEquals("{number: 1.0}\n", output);
+ }
+
+ public void testBasicDoubleScalarLoad() {
+ assertEquals(new Double(47.0), load("47.0"));
+ assertEquals(new Double(0.0), load("0.0"));
+ assertEquals(new Double(-1.0), load("-1.0"));
+ }
+
+ public void testDumpStr() {
+ assertEquals("'1.0'\n", dump("1.0"));
+ }
+
+ public void testDump() {
+ assertEquals("1.0\n", dump(1.0));
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/types/IntTagTest.java b/src/test/java/org/yaml/snakeyaml/types/IntTagTest.java
new file mode 100644
index 00000000..d75dad32
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/types/IntTagTest.java
@@ -0,0 +1,55 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.types;
+
+import java.io.IOException;
+import java.math.BigInteger;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @see http://yaml.org/type/int.html
+ */
+public class IntTagTest extends AbstractTest {
+
+ public void testInt() throws IOException {
+ assertEquals(new Integer(685230), getMapValue("canonical: 685230", "canonical"));
+ assertEquals(new Integer(685230), getMapValue("number: 685_230", "number"));
+ assertEquals(new Integer(685230), getMapValue("decimal: +685230", "decimal"));
+ assertEquals(new Integer(-685230), getMapValue("number: -685230", "number"));
+ assertEquals(new Integer(685230), getMapValue("octal: 02472256", "octal"));
+ assertEquals(new Integer(685230), getMapValue("hexadecimal: 0x_0A_74_AE", "hexadecimal"));
+ assertEquals(new Integer(685230), getMapValue("binary: 0b1010_0111_0100_1010_1110",
+ "binary"));
+ assertEquals(new Integer(685230), getMapValue("sexagesimal: 190:20:30", "sexagesimal"));
+ assertEquals(new Integer(0), load("0"));
+ assertEquals(new Integer(0), load("-0"));
+ assertEquals(new Integer(0), load("+0"));
+ assertEquals(Integer.MIN_VALUE, load(dump(Integer.MIN_VALUE)));
+ assertEquals(Integer.MAX_VALUE, load(dump(Integer.MAX_VALUE)));
+ }
+
+ public void testBigInt() throws IOException {
+ assertEquals(new Long(922337203685477580L), load("922337203685477580"));
+ assertEquals(new BigInteger("9223372036854775809999999999"),
+ load("9223372036854775809999999999"));
+ assertEquals(Long.MIN_VALUE, load("-9223372036854775808"));
+ }
+
+ public void testIntShorthand() throws IOException {
+ assertEquals(new Integer(1), getMapValue("number: !!int 1", "number"));
+ }
+
+ public void testIntTag() throws IOException {
+ assertEquals(new Integer(1), getMapValue("number: !<tag:yaml.org,2002:int> 1", "number"));
+ }
+
+ public void testIntOut() throws IOException {
+ Map<String, Integer> map = new HashMap<String, Integer>();
+ map.put("number", new Integer(1));
+ String output = dump(map);
+ assertTrue(output.contains("number: 1"));
+ }
+
+}
diff --git a/src/test/java/org/yaml/snakeyaml/types/MapTagTest.java b/src/test/java/org/yaml/snakeyaml/types/MapTagTest.java
new file mode 100644
index 00000000..5977c7e0
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/types/MapTagTest.java
@@ -0,0 +1,59 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.types;
+
+import java.io.IOException;
+import java.util.Map;
+
+import org.yaml.snakeyaml.YamlDocument;
+
+/**
+ * @see http://yaml.org/type/map.html
+ */
+public class MapTagTest extends AbstractTest {
+
+ @SuppressWarnings("unchecked")
+ public void testMap() throws IOException {
+ YamlDocument document = new YamlDocument("types/map.yaml");
+ Map<String, Map<String, String>> map = (Map<String, Map<String, String>>) document
+ .getNativeData();
+ assertEquals(2, map.size());
+ Map<String, String> map1 = (Map<String, String>) map.get("Block style");
+ assertEquals(3, map1.size());
+ assertEquals("Evans", map1.get("Clark"));
+ assertEquals("Ingerson", map1.get("Brian"));
+ assertEquals("Ben-Kiki", map1.get("Oren"));
+ //
+ Map<String, String> map2 = (Map<String, String>) map.get("Flow style");
+ assertEquals(3, map2.size());
+ assertEquals("Evans", map2.get("Clark"));
+ assertEquals("Ingerson", map2.get("Brian"));
+ assertEquals("Ben-Kiki", map2.get("Oren"));
+ //
+ assertEquals(map1, map2);
+ assertNotSame(map1, map2);
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testMapYaml11() throws IOException {
+ YamlDocument document = new YamlDocument("types/map_mixed_tags.yaml");
+ Map<String, Map<String, String>> map = (Map<String, Map<String, String>>) document
+ .getNativeData();
+ assertEquals(2, map.size());
+ Map<String, String> map1 = (Map<String, String>) map.get("Block style");
+ assertEquals(3, map1.size());
+ assertEquals("Evans", map1.get("Clark"));
+ assertEquals("Ingerson", map1.get("Brian"));
+ assertEquals("Ben-Kiki", map1.get("Oren"));
+ //
+ Map<String, String> map2 = (Map<String, String>) map.get("Flow style");
+ assertEquals(3, map2.size());
+ assertEquals("Evans", map2.get("Clark"));
+ assertEquals("Ingerson", map2.get("Brian"));
+ assertEquals("Ben-Kiki", map2.get("Oren"));
+ //
+ assertEquals(map1, map2);
+ }
+
+}
diff --git a/src/test/java/org/yaml/snakeyaml/types/MergeTagTest.java b/src/test/java/org/yaml/snakeyaml/types/MergeTagTest.java
new file mode 100644
index 00000000..1805d201
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/types/MergeTagTest.java
@@ -0,0 +1,59 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.types;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+import org.yaml.snakeyaml.YamlDocument;
+
+/**
+ * @see http://yaml.org/type/merge.html
+ */
+public class MergeTagTest extends AbstractTest {
+
+ @SuppressWarnings("unchecked")
+ public void testMerge() throws IOException {
+ YamlDocument document = new YamlDocument("types/merge.yaml");
+ List list = (List) document.getNativeData();
+ assertEquals(8, list.size());
+ Map<Object, Object> center = (Map<Object, Object>) list.get(0);
+ assertEquals(2, center.size());
+ assertEquals(new Integer(1), center.get("x"));
+ assertEquals(new Integer(2), center.get("y"));
+ //
+ Map<Object, Object> left = (Map<Object, Object>) list.get(1);
+ assertEquals(2, left.size());
+ assertEquals(left.get("x").getClass().toString(), new Integer(0), left.get("x"));
+ assertEquals(new Integer(2), left.get("y"));
+ //
+ Map<Object, Object> big = (Map<Object, Object>) list.get(2);
+ assertEquals(1, big.size());
+ assertEquals(new Integer(10), big.get("r"));
+ //
+ Map<Object, Object> small = (Map<Object, Object>) list.get(3);
+ assertEquals(1, small.size());
+ assertEquals(new Integer(1), small.get("r"));
+ // Explicit keys
+ Map<Object, Object> explicit = (Map<Object, Object>) list.get(4);
+ assertEquals(4, explicit.size());
+ assertEquals(new Integer(1), explicit.get("x"));
+ assertEquals(new Integer(2), explicit.get("y"));
+ assertEquals(new Integer(10), explicit.get("r"));
+ assertEquals("center/big", explicit.get("label"));
+ // Merge one map
+ Map<Object, Object> merged1 = (Map<Object, Object>) list.get(5);
+ assertEquals(explicit, merged1);
+ assertNotSame(explicit, merged1);
+ // Merge multiple maps
+ Map<Object, Object> merged2 = (Map<Object, Object>) list.get(6);
+ assertEquals(explicit, merged2);
+ assertNotSame(explicit, merged2);
+ // Override
+ Map<Object, Object> merged3 = (Map<Object, Object>) list.get(7);
+ assertEquals(explicit, merged3);
+ assertNotSame(explicit, merged3);
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/types/NullTagTest.java b/src/test/java/org/yaml/snakeyaml/types/NullTagTest.java
new file mode 100644
index 00000000..d874691e
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/types/NullTagTest.java
@@ -0,0 +1,73 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.types;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @see http://yaml.org/type/null.html
+ */
+public class NullTagTest extends AbstractTest {
+
+ public void testNull() throws IOException {
+ assertNull("Got: '" + load("---\n") + "'", load("---\n"));
+ assertNull(load("---\n..."));
+ assertNull(load("---\n...\n"));
+ assertNull(load("\n"));
+ assertNull(load(""));
+ assertNull(load(" "));
+ assertNull(load("~"));
+ assertNull(load("---\n~"));
+ assertNull(load("null"));
+ assertNull(load("Null"));
+ assertNull(load("NULL"));
+ assertNull(getMapValue("empty:\n", "empty"));
+ assertNull(getMapValue("canonical: ~", "canonical"));
+ assertNull(getMapValue("english: null", "english"));
+ assertNull(getMapValue("english: Null", "english"));
+ assertNull(getMapValue("english: NULL", "english"));
+ assertEquals("null key", getMapValue("~: null key\n", null));
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testSequenceNull() throws IOException {
+ String input = "---\n# This sequence has five\n# entries, two have values.\nsparse:\n - ~\n - 2nd entry\n -\n - 4th entry\n - Null\n";
+ List<String> parsed = (List<String>) getMapValue(input, "sparse");
+ assertEquals(5, parsed.size());
+ assertNull(parsed.get(0));
+ assertEquals("2nd entry", parsed.get(1));
+ assertNull("Got: '" + parsed.get(2) + "'", parsed.get(2));
+ assertEquals("4th entry", parsed.get(3));
+ assertNull(parsed.get(4));
+ }
+
+ public void testNullInMap() throws IOException {
+ String input = "key1: null\n~: value1";
+ Map<String, Object> parsed = getMap(input);
+ assertEquals(2, parsed.size());
+ assertTrue(parsed.containsKey(null));
+ Object value1 = parsed.get(null);
+ assertEquals("value1", value1);
+ //
+ assertNull(parsed.get("key1"));
+ //
+ assertFalse(getMap("key2: value2").containsKey(null));
+ }
+
+ public void testBoolShorthand() throws IOException {
+ assertNull(getMapValue("nothing: !!null null", "nothing"));
+ }
+
+ public void testBoolTag() throws IOException {
+ assertNull(getMapValue("nothing: !<tag:yaml.org,2002:null> null", "nothing"));
+ }
+
+ public void testBoolOut() throws IOException {
+ String output = dump(null);
+ assertEquals("null\n", output);
+ }
+
+}
diff --git a/src/test/java/org/yaml/snakeyaml/types/OmapTagTest.java b/src/test/java/org/yaml/snakeyaml/types/OmapTagTest.java
new file mode 100644
index 00000000..4af21425
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/types/OmapTagTest.java
@@ -0,0 +1,35 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.types;
+
+import java.io.IOException;
+import java.util.Map;
+
+import org.yaml.snakeyaml.YamlDocument;
+
+/**
+ * @see http://yaml.org/type/omap.html
+ */
+public class OmapTagTest extends AbstractTest {
+
+ @SuppressWarnings("unchecked")
+ public void testOmap() throws IOException {
+ YamlDocument document = new YamlDocument("types/omap.yaml");
+ Map<String, Map<String, String>> map = (Map<String, Map<String, String>>) document
+ .getNativeData();
+ assertEquals(2, map.size());
+ Map<String, String> map1 = (Map<String, String>) map.get("Bestiary");
+ assertEquals(3, map1.size());
+ assertEquals("African pig-like ant eater. Ugly.", map1.get("aardvark"));
+ assertEquals("South-American ant eater. Two species.", map1.get("anteater"));
+ assertEquals("South-American constrictor snake. Scaly.", map1.get("anaconda"));
+ //
+ Map<String, String> map2 = (Map<String, String>) map.get("Numbers");
+ assertEquals(3, map2.size());
+ assertEquals(new Integer(1), map2.get("one"));
+ assertEquals(new Integer(2), map2.get("two"));
+ assertEquals(new Integer(3), map2.get("three"));
+ }
+
+}
diff --git a/src/test/java/org/yaml/snakeyaml/types/PairsTagTest.java b/src/test/java/org/yaml/snakeyaml/types/PairsTagTest.java
new file mode 100644
index 00000000..e03b3a6a
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/types/PairsTagTest.java
@@ -0,0 +1,59 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.types;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+import org.yaml.snakeyaml.YamlDocument;
+
+/**
+ * @see http://yaml.org/type/pairs.html
+ */
+public class PairsTagTest extends AbstractTest {
+
+ @SuppressWarnings("unchecked")
+ public void testPairs() throws IOException {
+ YamlDocument document = new YamlDocument("types/pairs.yaml", false);
+ Map<String, List<String[]>> map = (Map<String, List<String[]>>) document.getNativeData();
+ assertEquals(2, map.size());
+ List<String[]> list1 = (List<String[]>) map.get("Block tasks");
+ assertEquals(4, list1.size());
+ Object[] tuple1 = list1.get(0);
+ assertEquals(2, tuple1.length);
+ assertEquals("meeting", tuple1[0]);
+ assertEquals("with team.", tuple1[1]);
+ //
+
+ Object[] tuple2 = list1.get(1);
+ assertEquals(2, tuple2.length);
+ assertEquals("meeting", tuple2[0]);
+ assertEquals("with boss.", tuple2[1]);
+ //
+
+ Object[] tuple3 = list1.get(2);
+ assertEquals(2, tuple3.length);
+ assertEquals("break", tuple3[0]);
+ assertEquals("lunch.", tuple3[1]);
+ //
+
+ Object[] tuple4 = list1.get(3);
+ assertEquals(2, tuple4.length);
+ assertEquals("meeting", tuple4[0]);
+ assertEquals("with client.", tuple4[1]);
+ //
+ List<String[]> list2 = (List<String[]>) map.get("Flow tasks");
+ assertEquals(2, list2.size());
+ Object[] tuple2_1 = list2.get(0);
+ assertEquals(2, tuple2_1.length);
+ assertEquals("meeting", tuple2_1[0]);
+ assertEquals("with team", tuple2_1[1]);
+ //
+ Object[] tuple2_2 = list2.get(1);
+ assertEquals(2, tuple2_2.length);
+ assertEquals("meeting", tuple2_2[0]);
+ assertEquals("with boss", tuple2_2[1]);
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/types/SeqTagTest.java b/src/test/java/org/yaml/snakeyaml/types/SeqTagTest.java
new file mode 100644
index 00000000..0b142eed
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/types/SeqTagTest.java
@@ -0,0 +1,70 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.types;
+
+import java.util.List;
+import java.util.Map;
+
+import org.yaml.snakeyaml.YamlDocument;
+
+/**
+ * @see http://yaml.org/type/seq.html
+ */
+public class SeqTagTest extends AbstractTest {
+
+ @SuppressWarnings("unchecked")
+ public void testSeq() {
+ YamlDocument document = new YamlDocument("types/seq.yaml");
+ Map<String, List<String>> map = (Map<String, List<String>>) document.getNativeData();
+ assertEquals(2, map.size());
+ List<String> list1 = (List<String>) map.get("Block style");
+ assertEquals(9, list1.size());
+ assertEquals("Mercury", list1.get(0));
+ assertEquals("Venus", list1.get(1));
+ assertEquals("Earth", list1.get(2));
+ assertEquals("Mars", list1.get(3));
+ assertEquals("Jupiter", list1.get(4));
+ assertEquals("Saturn", list1.get(5));
+ assertEquals("Uranus", list1.get(6));
+ assertEquals("Neptune", list1.get(7));
+ assertEquals("Pluto", list1.get(8));
+ //
+ List<String> list2 = (List<String>) map.get("Flow style");
+ assertEquals(9, list2.size());
+ assertEquals("Mercury", list2.get(0));
+ assertEquals("Venus", list2.get(1));
+ assertEquals("Earth", list2.get(2));
+ assertEquals("Mars", list2.get(3));
+ assertEquals("Jupiter", list2.get(4));
+ assertEquals("Saturn", list2.get(5));
+ assertEquals("Uranus", list2.get(6));
+ assertEquals("Neptune", list2.get(7));
+ assertEquals("Pluto", list2.get(8));
+ //
+ assertEquals(list1, list2);
+ assertNotSame(list1, list2);
+ }
+
+ public void testArray() {
+ Integer[] array = new Integer[3];
+ array[0] = new Integer(1);
+ array[1] = new Integer(1);
+ array[2] = new Integer(2);
+ String output = dump(array);
+ assertEquals("[1, 1, 2]\n", output);
+ }
+
+ public void testArrayPrimitives() {
+ int[] array = new int[3];
+ array[0] = 1;
+ array[1] = 1;
+ array[2] = 2;
+ try {
+ dump(array);
+ fail("Arrays of primitives are not supported.");
+ } catch (RuntimeException e) {
+ assertEquals("Arrays of primitives are not fully supported.", e.getMessage());
+ }
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/types/SetTagTest.java b/src/test/java/org/yaml/snakeyaml/types/SetTagTest.java
new file mode 100644
index 00000000..ea0acbdc
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/types/SetTagTest.java
@@ -0,0 +1,33 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.types;
+
+import java.util.Map;
+import java.util.Set;
+
+import org.yaml.snakeyaml.YamlDocument;
+
+/**
+ * @see http://yaml.org/type/set.html
+ */
+public class SetTagTest extends AbstractTest {
+
+ @SuppressWarnings("unchecked")
+ public void testSet() {
+ YamlDocument document = new YamlDocument("types/set.yaml");
+ Map<String, Set<String>> map = (Map<String, Set<String>>) document.getNativeData();
+ assertEquals(2, map.size());
+ Set<String> set1 = (Set<String>) map.get("baseball players");
+ assertEquals(3, set1.size());
+ assertTrue(set1.contains("Mark McGwire"));
+ assertTrue(set1.contains("Sammy Sosa"));
+ assertTrue(set1.contains("Ken Griffey"));
+ //
+ Set<String> set2 = (Set<String>) map.get("baseball teams");
+ assertEquals(3, set2.size());
+ assertTrue(set2.contains("Boston Red Sox"));
+ assertTrue(set2.contains("Detroit Tigers"));
+ assertTrue(set2.contains("New York Yankees"));
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/types/StrTagTest.java b/src/test/java/org/yaml/snakeyaml/types/StrTagTest.java
new file mode 100644
index 00000000..c2ebcd60
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/types/StrTagTest.java
@@ -0,0 +1,130 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.types;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.nio.charset.Charset;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.yaml.snakeyaml.Yaml;
+
+/**
+ * @see http://yaml.org/type/str.html
+ */
+public class StrTagTest extends AbstractTest {
+ private String getData(String data, String key) {
+ return (String) getMapValue(data, key);
+ }
+
+ public void testString() throws IOException {
+ assertEquals("abcd", getData("string: abcd", "string"));
+ }
+
+ public void testStringShorthand() throws IOException {
+ assertEquals("abcd", getData("string: !!str abcd", "string"));
+ }
+
+ public void testStringTag() throws IOException {
+ assertEquals("abcd", getData("string: !<tag:yaml.org,2002:str> abcd", "string"));
+ }
+
+ public void testUnicode() throws IOException {
+ // escaped 8-bit unicode character (u-umlaut):
+ assertEquals("\u00fc", load("\"\\xfc\""));
+ assertEquals("\\xfc", load("\\xfc"));
+
+ // 2 escaped 8-bit unicode characters (u-umlaut following by e-grave):
+ assertEquals("\u00fc\u00e8", load("\"\\xfc\\xe8\""));
+
+ // escaped 16-bit unicode character (em dash):
+ assertEquals("\u2014", load("\"\\u2014\""));
+
+ // UTF-32 encoding is explicitly not supported
+ assertEquals("\\U2014AAAA", load("'\\U2014AAAA'"));
+
+ // (and I don't have a surrogate pair handy at the moment)
+ // raw unicode characters in the stream (em dash)
+ assertEquals("\u2014", load("\u2014"));
+ }
+
+ /**
+ * @see http://code.google.com/p/jvyamlb/issues/detail?id=6
+ */
+ @SuppressWarnings("unchecked")
+ public void testIssueId6() {
+ Map<String, String> map = (Map<String, String>) load("---\ntest: |-\n \"Test\r\r (* error here)\"");
+ assertEquals("\"Test\n\n(* error here)\"", map.get("test"));
+ }
+
+ public void testStrDump() {
+ assertEquals("abc\n", dump("abc"));
+ }
+
+ public void testUnicodeDump() {
+ assertEquals("\\u263a\n", dump("\\u263a"));
+ assertEquals("The leading zero must be preserved.", "\\u063a\n", dump("\\u063a"));
+ }
+
+ public void testStringIntOut() {
+ Map<String, String> map = new HashMap<String, String>();
+ map.put("number", "1");
+ String output = dump(map);
+ assertTrue(output, output.contains("number: '1'"));
+ }
+
+ public void testStringFloatOut() {
+ Map<String, String> map = new HashMap<String, String>();
+ map.put("number", "1.1");
+ String output = dump(map);
+ assertTrue(output, output.contains("number: '1.1'"));
+ }
+
+ public void testStringBoolOut() {
+ Map<String, String> map = new HashMap<String, String>();
+ map.put("number", "True");
+ String output = dump(map);
+ assertTrue(output, output.contains("number: 'True'"));
+ }
+
+ public void testEmitLongString() throws IOException {
+ String str = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
+ String output = dump(str);
+ assertEquals(str + "\n", output);
+ }
+
+ public void testEmitLongStringWithCR() throws IOException {
+ String str = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n\n";
+ String output = dump(str);
+ assertEquals("'" + str + "\n '\n", output);
+ }
+
+ public void testEmitDoubleQuoted() throws IOException {
+ String str = "\"xx\"";
+ String output = dump(str);
+ assertEquals("'" + str + "'\n", output);
+ }
+
+ public void testEmitEndOfLine() throws IOException {
+ String str = "xxxxxxx\n";
+ String output = dump(str);
+ assertEquals("'" + str + "\n '\n", output);
+ }
+
+ public void testDumpUtf16() throws IOException {
+ String str = "xxx";
+ assertEquals(3, str.toString().length());
+ Yaml yaml = new Yaml();
+ Charset charset = Charset.forName("UTF-16");
+ ByteArrayOutputStream stream = new ByteArrayOutputStream();
+ Writer writer = new OutputStreamWriter(stream, charset);
+ yaml.dump(str, writer);
+ assertEquals(str + "\n", stream.toString("UTF-16"));
+ assertEquals("Must include BOM: " + stream.toString(), (1 + 3 + 1) * 2, stream.toString()
+ .length());
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/types/TimestampTagTest.java b/src/test/java/org/yaml/snakeyaml/types/TimestampTagTest.java
new file mode 100644
index 00000000..9135c046
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/types/TimestampTagTest.java
@@ -0,0 +1,93 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.types;
+
+import java.io.IOException;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TimeZone;
+
+/**
+ * @see http://yaml.org/type/timestamp.html
+ */
+public class TimestampTagTest extends AbstractTest {
+
+ public void testTimestamp() throws IOException {
+ assertEquals("2001-12-15 at 2:59:43 (100)", getText("canonical: 2001-12-15T02:59:43.1Z",
+ "canonical"));
+ assertEquals("2001-12-15 at 2:59:43 (100)", getText(
+ "valid iso8601: 2001-12-14t21:59:43.10-05:00", "valid iso8601"));
+ assertEquals("2001-12-15 at 2:59:43 (100)", getText(
+ "space separated: 2001-12-14 21:59:43.10 -5", "space separated"));
+ assertEquals("2001-12-15 at 2:59:43 (100)", getText(
+ "no time zone (Z): 2001-12-15 2:59:43.10", "no time zone (Z)"));
+ assertEquals("2002-12-14 at 0:0:0 (0)", getText("date (00:00:00Z): 2002-12-14",
+ "date (00:00:00Z)"));
+ }
+
+ public void testTimestampShorthand() throws IOException {
+ assertTrue(getMapValue("canonical: !!timestamp 2001-12-15T02:59:43.1Z", "canonical") instanceof Date);
+ }
+
+ public void testTimestampTag() throws IOException {
+ assertTrue(getMapValue("canonical: !<tag:yaml.org,2002:timestamp> 2001-12-15T02:59:43.1Z",
+ "canonical") instanceof Date);
+ }
+
+ public void testTimestampOut() throws IOException {
+ Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Europe/Moscow"));
+ cal.clear();
+ cal.set(2008, 8, 23, 14, 35, 4);
+ Date date = cal.getTime();
+ String output = dump(date);
+ assertEquals("2008-09-23T10:35:04Z\n", output);
+ }
+
+ public void testTimestampOutMap() throws IOException {
+ Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Europe/Moscow"));
+ cal.clear();
+ cal.set(2008, 8, 23, 14, 35, 4);
+ Date date = cal.getTime();
+ Map<String, Date> map = new HashMap<String, Date>();
+ map.put("canonical", date);
+ String output = dump(map);
+ assertEquals("{canonical: !!timestamp '2008-09-23T10:35:04Z'}\n", output);
+ }
+
+ private String getText(String yaml, String key) {
+ Date date = (Date) getMapValue(yaml, key);
+ Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+ cal.setTime(date);
+ int years = cal.get(Calendar.YEAR);
+ int months = cal.get(Calendar.MONTH) + 1; // 0..12
+ int days = cal.get(Calendar.DAY_OF_MONTH); // 1..31
+ int hour24 = cal.get(Calendar.HOUR_OF_DAY); // 0..24
+ int minutes = cal.get(Calendar.MINUTE); // 0..59
+ int seconds = cal.get(Calendar.SECOND); // 0..59
+ int millis = cal.get(Calendar.MILLISECOND);
+ String result = String.valueOf(years) + "-" + String.valueOf(months) + "-"
+ + String.valueOf(days) + " at " + String.valueOf(hour24) + ":"
+ + String.valueOf(minutes) + ":" + String.valueOf(seconds) + " ("
+ + String.valueOf(millis) + ")";
+ return result;
+ }
+
+ public void testTimestampReadWrite() throws IOException {
+ Date date = (Date) getMapValue("Time: 2001-11-23 15:01:42 -5", "Time");
+ Map<String, Date> map = new HashMap<String, Date>();
+ map.put("canonical", date);
+ String output = dump(map);
+ assertEquals("{canonical: !!timestamp '2001-11-23T20:01:42Z'}\n", output);
+ }
+
+ public void testSqlDate() throws IOException {
+ java.sql.Date date = new java.sql.Date(1000000000000L);
+ Map<String, java.sql.Date> map = new HashMap<String, java.sql.Date>();
+ map.put("canonical", date);
+ String output = dump(map);
+ assertEquals("{canonical: !!timestamp '2001-09-09T01:46:40Z'}\n", output);
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/types/ValueTagTest.java b/src/test/java/org/yaml/snakeyaml/types/ValueTagTest.java
new file mode 100644
index 00000000..a18a2e02
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/types/ValueTagTest.java
@@ -0,0 +1,49 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml.types;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.YamlDocument;
+
+/**
+ * @see http://yaml.org/type/value.html
+ */
+public class ValueTagTest extends AbstractTest {
+
+ /**
+ * The 'value' tag does not work as defined in the specification but exactly
+ * as in PyYAML
+ */
+ @SuppressWarnings("unchecked")
+ public void testValue() throws IOException {
+ InputStream input = YamlDocument.class.getClassLoader().getResourceAsStream(
+ YamlDocument.ROOT + "types/value.yaml");
+ Yaml yaml = new Yaml();
+ Iterator iter = (Iterator) yaml.loadAll(input).iterator();
+ Map<String, List<String>> oldSchema = (Map<String, List<String>>) iter.next();
+ assertEquals(1, oldSchema.size());
+ List<String> list = oldSchema.get("link with");
+ assertEquals(2, list.size());
+ assertEquals("library1.dll", list.get(0));
+ assertEquals("library2.dll", list.get(1));
+ //
+ Map<String, List<Map<String, String>>> newSchema = (Map<String, List<Map<String, String>>>) iter
+ .next();
+ assertEquals(1, newSchema.size());
+ //
+ List<Map<String, String>> list2 = newSchema.get("link with");
+ assertEquals(2, list2.size());
+ Map<String, String> map1 = list2.get(0);
+ assertEquals(2, map1.size());
+ assertEquals("library1.dll", map1.get("="));
+ assertEquals(new Double(1.2), map1.get("version"));
+ assertFalse(iter.hasNext());
+ }
+}