1 /** 2 * Copyright (c) 2008, http://www.snakeyaml.org 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package org.pyyaml; 17 18 import java.util.ArrayList; 19 import java.util.HashMap; 20 import java.util.HashSet; 21 import java.util.List; 22 import java.util.Map; 23 import java.util.Set; 24 import java.util.TreeMap; 25 26 import junit.framework.TestCase; 27 28 import org.yaml.snakeyaml.Yaml; 29 import org.yaml.snakeyaml.constructor.SafeConstructor; 30 31 public class PyRecursiveTest extends TestCase { 32 33 @SuppressWarnings("unchecked") testDict()34 public void testDict() { 35 Map<AnInstance, AnInstance> value = new HashMap<AnInstance, AnInstance>(); 36 AnInstance instance = new AnInstance(value, value); 37 value.put(instance, instance); 38 Yaml yaml = new Yaml(); 39 String output1 = yaml.dump(value); 40 assertTrue(output1.contains("!!org.pyyaml.AnInstance")); 41 assertTrue(output1.contains("&id001")); 42 assertTrue(output1.contains("&id002")); 43 assertTrue(output1.contains("*id001")); 44 assertTrue(output1.contains("*id002")); 45 assertTrue(output1.contains("foo")); 46 assertTrue(output1.contains("bar")); 47 Map<AnInstance, AnInstance> value2 = (Map<AnInstance, AnInstance>) yaml.load(output1); 48 assertEquals(value.size(), value2.size()); 49 for (AnInstance tmpInstance : value2.values()) { 50 assertSame(tmpInstance.getBar(), tmpInstance.getFoo()); 51 assertSame(tmpInstance.getBar(), value2); 52 assertSame(tmpInstance, value2.get(tmpInstance)); 53 } 54 } 55 56 @SuppressWarnings({ "unchecked", "rawtypes" }) testDictSafeConstructor()57 public void testDictSafeConstructor() { 58 Map value = new TreeMap(); 59 value.put("abc", "www"); 60 value.put("qwerty", value); 61 Yaml yaml = new Yaml(new SafeConstructor()); 62 String output1 = yaml.dump(value); 63 assertEquals("&id001\nabc: www\nqwerty: *id001\n", output1); 64 Map value2 = (Map) yaml.load(output1); 65 assertEquals(2, value2.size()); 66 assertEquals("www", value2.get("abc")); 67 assertTrue(value2.get("qwerty") instanceof Map); 68 Map value3 = (Map) value2.get("qwerty"); 69 assertTrue(value3.get("qwerty") instanceof Map); 70 } 71 72 @SuppressWarnings({ "unchecked", "rawtypes" }) testList()73 public void testList() { 74 List value = new ArrayList(); 75 value.add(value); 76 value.add("test"); 77 value.add(new Integer(1)); 78 79 Yaml yaml = new Yaml(); 80 String output1 = yaml.dump(value); 81 assertEquals("&id001\n- *id001\n- test\n- 1\n", output1); 82 List value2 = (List) yaml.load(output1); 83 assertEquals(3, value2.size()); 84 assertEquals(value.size(), value2.size()); 85 assertSame(value2, value2.get(0)); 86 // we expect self-reference as 1st element of the list 87 // let's remove self-reference and check other "simple" members of the 88 // list. otherwise assertEquals will lead us to StackOverflow 89 value.remove(0); 90 value2.remove(0); 91 assertEquals(value, value2); 92 } 93 94 @SuppressWarnings({ "unchecked", "rawtypes" }) testListSafeConstructor()95 public void testListSafeConstructor() { 96 List value = new ArrayList(); 97 value.add(value); 98 value.add("test"); 99 value.add(new Integer(1)); 100 101 Yaml yaml = new Yaml(new SafeConstructor()); 102 String output1 = yaml.dump(value); 103 assertEquals("&id001\n- *id001\n- test\n- 1\n", output1); 104 List value2 = (List) yaml.load(output1); 105 assertEquals(3, value2.size()); 106 assertEquals(value.size(), value2.size()); 107 assertSame(value2, value2.get(0)); 108 // we expect self-reference as 1st element of the list 109 // let's remove self-reference and check other "simple" members of the 110 // list. otherwise assertEquals will lead us to StackOverflow 111 value.remove(0); 112 value2.remove(0); 113 assertEquals(value, value2); 114 } 115 116 @SuppressWarnings({ "unchecked", "rawtypes" }) testSet()117 public void testSet() { 118 Set value = new HashSet(); 119 value.add(new AnInstance(value, value)); 120 Yaml yaml = new Yaml(); 121 String output1 = yaml.dump(value); 122 Set<AnInstance> value2 = (Set<AnInstance>) yaml.load(output1); 123 124 assertEquals(value.size(), value2.size()); 125 for (AnInstance tmpInstance : value2) { 126 assertSame(tmpInstance.getBar(), tmpInstance.getFoo()); 127 assertSame(tmpInstance.getBar(), value2); 128 } 129 } 130 testSet2()131 public void testSet2() { 132 Set<Object> set = new HashSet<Object>(3); 133 set.add("aaa"); 134 set.add(111); 135 set.add(set); 136 Yaml yaml = new Yaml(); 137 try { 138 yaml.dump(set); 139 fail("Java does not allow a recursive set to be a key for a map."); 140 } catch (StackOverflowError e) { 141 // ignore 142 } 143 } 144 } 145