Fail to parse with duplicate mapping keys
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 791627c..2045a70 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -7,6 +7,9 @@
</properties>
<body>
<release version="1.15-SNAPSHOT" date="in Mercurial" description="Maintenance">
+ <action dev="py4fun" type="fix" issue="199">
+ Fail to parse with duplicate mapping keys (2015-02-04)
+ </action>
<action dev="py4fun" type="update" issue="205">
Add test to clarify iOS emoji character in the surrogate range (2015-02-03)
</action>
diff --git a/src/main/java/org/yaml/snakeyaml/constructor/BaseConstructor.java b/src/main/java/org/yaml/snakeyaml/constructor/BaseConstructor.java
index 227b95d..755a5a7 100644
--- a/src/main/java/org/yaml/snakeyaml/constructor/BaseConstructor.java
+++ b/src/main/java/org/yaml/snakeyaml/constructor/BaseConstructor.java
@@ -382,7 +382,10 @@
new RecursiveTuple<Map<Object, Object>, RecursiveTuple<Object, Object>>(
mapping, new RecursiveTuple<Object, Object>(key, value)));
} else {
- mapping.put(key, value);
+ Object previous = mapping.put(key, value);
+ if (previous != null) throw new ConstructorException("while constructing a mapping",
+ node.getStartMark(), "found duplicate key '" + key + "' with values '" + previous + "' and '" + value + "'", tuple
+ .getKeyNode().getStartMark());
}
}
}
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue139/MergeValueTest.java b/src/test/java/org/yaml/snakeyaml/issues/issue139/MergeValueTest.java
index 55bf50f..399de94 100644
--- a/src/test/java/org/yaml/snakeyaml/issues/issue139/MergeValueTest.java
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue139/MergeValueTest.java
@@ -21,21 +21,33 @@
import org.yaml.snakeyaml.Util;
import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.ConstructorException;
public class MergeValueTest extends TestCase {
public void testNotUniqueSimple() {
- String simple = "{key: 1, key: 2}";
+ String simple = "{k: 1, k: 2}";
Yaml yaml = new Yaml();
- @SuppressWarnings("unchecked")
- Map<String, Integer> map = (Map<String, Integer>) yaml.load(simple);
- assertEquals(1, map.size());
- assertEquals(new Integer(2), map.get("key"));
+ try {
+ yaml.load(simple);
+ fail("Duplicate key must not be accepted.");
+ } catch (ConstructorException e) {
+ System.out.print(e);
+ assertTrue(simple, e.getMessage().contains("duplicate key"));
+ }
}
public void testMerge() {
check("issues/issue139-1.yaml");// merge with unique keys
- check("issues/issue139-2.yaml");// merge with same key
+ }
+
+ public void testMergeWithSameKey() {
+ try {
+ check("issues/issue139-2.yaml");// merge with same key
+ fail("Duplicate key must not be accepted.");
+ } catch (ConstructorException e) {
+ assertTrue(e.getMessage().contains("duplicate key"));
+ }
}
private void check(String name) {
@@ -64,7 +76,7 @@
assertEquals(2, map.size());
Map<String, Integer> common = (Map<String, Integer>) map.get("common");
Map<String, Integer> production = (Map<String, Integer>) map.get("production");
- assertEquals(new Integer(2), common.get("key"));
- assertEquals(new Integer(3), production.get("key"));
+ assertEquals(new Integer(1), common.get("key"));
+ assertEquals(new Integer(2), production.get("key"));
}
}
diff --git a/src/test/resources/issues/issue139-2.yaml b/src/test/resources/issues/issue139-2.yaml
index ca2967c..b52d1d5 100644
--- a/src/test/resources/issues/issue139-2.yaml
+++ b/src/test/resources/issues/issue139-2.yaml
@@ -1,6 +1,6 @@
common: &id_common
key: 1
- key: 2 # this value must overwrite the previous. Is it specified ?
+ key: 2 # this is the same key
production:
<<: *id_common
\ No newline at end of file
diff --git a/src/test/resources/issues/issue139-3.yaml b/src/test/resources/issues/issue139-3.yaml
index 3b5d0d9..8ed5a48 100644
--- a/src/test/resources/issues/issue139-3.yaml
+++ b/src/test/resources/issues/issue139-3.yaml
@@ -1,7 +1,6 @@
common: &id_common
key: 1
- key: 2
production:
<<: *id_common
- key: 3 # this value must stay
\ No newline at end of file
+ key: 2 # this value must stay
\ No newline at end of file