/** | |
* Copyright (c) 2008-2010 Andrey Somov | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
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 java.util.TreeMap; | |
import junit.framework.TestCase; | |
import org.yaml.snakeyaml.Loader; | |
import org.yaml.snakeyaml.Yaml; | |
import org.yaml.snakeyaml.constructor.SafeConstructor; | |
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(); | |
String output1 = yaml.dump(value); | |
assertTrue(output1.contains("!!org.pyyaml.AnInstance")); | |
assertTrue(output1.contains("&id001")); | |
assertTrue(output1.contains("&id002")); | |
assertTrue(output1.contains("*id001")); | |
assertTrue(output1.contains("*id002")); | |
assertTrue(output1.contains("foo")); | |
assertTrue(output1.contains("bar")); | |
Map<AnInstance, AnInstance> value2 = (Map<AnInstance, AnInstance>) yaml.load(output1); | |
assertEquals(value.size(), value2.size()); | |
for (AnInstance tmpInstance : value2.values()) { | |
assertSame(tmpInstance.getBar(), tmpInstance.getFoo()); | |
assertSame(tmpInstance.getBar(), value2); | |
assertSame(tmpInstance, value2.get(tmpInstance)); | |
} | |
} | |
@SuppressWarnings("unchecked") | |
public void testDictSafeConstructor() { | |
Map value = new TreeMap(); | |
value.put("abc", "www"); | |
value.put("qwerty", value); | |
Yaml yaml = new Yaml(new Loader(new SafeConstructor())); | |
String output1 = yaml.dump(value); | |
assertEquals("&id001\nabc: www\nqwerty: *id001\n", output1); | |
Map value2 = (Map) yaml.load(output1); | |
assertEquals(2, value2.size()); | |
assertEquals("www", value2.get("abc")); | |
assertTrue(value2.get("qwerty") instanceof Map); | |
Map value3 = (Map) value2.get("qwerty"); | |
assertTrue(value3.get("qwerty") instanceof Map); | |
} | |
@SuppressWarnings("unchecked") | |
public void testList() { | |
List value = new ArrayList(); | |
value.add(value); | |
value.add("test"); | |
value.add(new Integer(1)); | |
Yaml yaml = new Yaml(); | |
String output1 = yaml.dump(value); | |
assertEquals("&id001\n- *id001\n- test\n- 1\n", output1); | |
List value2 = (List) yaml.load(output1); | |
assertEquals(3, value2.size()); | |
assertEquals(value.size(), value2.size()); | |
assertSame(value2, value2.get(0)); | |
// we expect self-reference as 1st element of the list | |
// let's remove self-reference and check other "simple" members of the | |
// list. otherwise assertEquals will lead us to StackOverflow | |
value.remove(0); | |
value2.remove(0); | |
assertEquals(value, value2); | |
} | |
@SuppressWarnings("unchecked") | |
public void testListSafeConstructor() { | |
List value = new ArrayList(); | |
value.add(value); | |
value.add("test"); | |
value.add(new Integer(1)); | |
Yaml yaml = new Yaml(new Loader(new SafeConstructor())); | |
String output1 = yaml.dump(value); | |
assertEquals("&id001\n- *id001\n- test\n- 1\n", output1); | |
List value2 = (List) yaml.load(output1); | |
assertEquals(3, value2.size()); | |
assertEquals(value.size(), value2.size()); | |
assertSame(value2, value2.get(0)); | |
// we expect self-reference as 1st element of the list | |
// let's remove self-reference and check other "simple" members of the | |
// list. otherwise assertEquals will lead us to StackOverflow | |
value.remove(0); | |
value2.remove(0); | |
assertEquals(value, value2); | |
} | |
@SuppressWarnings("unchecked") | |
public void testSet() { | |
Set value = new HashSet(); | |
value.add(new AnInstance(value, value)); | |
Yaml yaml = new Yaml(); | |
String output1 = yaml.dump(value); | |
Set<AnInstance> value2 = (Set<AnInstance>) yaml.load(output1); | |
assertEquals(value.size(), value2.size()); | |
for (AnInstance tmpInstance : value2) { | |
assertSame(tmpInstance.getBar(), tmpInstance.getFoo()); | |
assertSame(tmpInstance.getBar(), value2); | |
} | |
} | |
public void testSet2() { | |
Set<Object> set = new HashSet<Object>(3); | |
set.add("aaa"); | |
set.add(111); | |
set.add(set); | |
Yaml yaml = new Yaml(); | |
try { | |
yaml.dump(set); | |
fail("Java does not allow a recursive set to be a key for a map."); | |
} catch (StackOverflowError e) { | |
// ignore | |
} | |
} | |
} |