• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.yaml.snakeyaml.issues.issue73;
17 
18 import java.util.HashSet;
19 import java.util.LinkedHashSet;
20 import java.util.Set;
21 
22 import junit.framework.TestCase;
23 
24 import org.yaml.snakeyaml.Util;
25 import org.yaml.snakeyaml.Yaml;
26 
27 public class RecursiveSetTest extends TestCase {
testDumpException()28     public void testDumpException() {
29         Set<Object> set1 = new HashSet<Object>();
30         Set<Object> set2 = new HashSet<Object>();
31         set1.add(set2);
32         set2.add(set1);
33         Yaml yaml = new Yaml();
34         try {
35             yaml.dump(set1);
36             fail("Recursive sets are not supported.");
37         } catch (StackOverflowError e) {
38             assertEquals(null, e.getMessage());
39         }
40     }
41 
testLoadException()42     public void testLoadException() {
43         String doc = Util.getLocalResource("issues/issue73-recursive4.txt");
44         // System.out.println(doc);
45         Yaml yaml = new Yaml();
46         try {
47             yaml.load(doc);
48             fail("Recursive sets are not supported.");
49         } catch (Exception e) {
50             assertTrue(e.getMessage(), e.getMessage().contains("Set cannot be recursive."));
51         }
52     }
53 
54     /**
55      * XXX: sets can be recursive
56      */
57     @SuppressWarnings("unchecked")
testLoadRecursiveTest()58     public void testLoadRecursiveTest() {
59         String doc = Util.getLocalResource("issues/issue73-recursive5.txt");
60         // System.out.println(doc);
61         Yaml yaml = new Yaml();
62         Bean1 obj = (Bean1) yaml.load(doc);
63         Set<Object> set = obj.getSet();
64         // System.out.println(set);
65         assertEquals(LinkedHashSet.class, set.getClass());
66         assertEquals("ID123", obj.getId());
67         assertEquals(3, set.size());
68         assertTrue(set.remove("zzz"));
69         assertTrue(set.remove("ccc"));
70         assertFalse(set.contains("111"));
71         try {
72             set.contains(set);
73             fail("Recursive set fails to provide a hashcode.");
74         } catch (StackOverflowError e) {
75             // ignore
76         }
77         //
78         Set<Object> self = (Set<Object>) set.iterator().next();
79         assertEquals(LinkedHashSet.class, self.getClass());
80         assertEquals(set, self);
81         assertSame(set, self);
82         assertEquals(1, set.size());
83         assertEquals(1, self.size());
84         set.add("111");
85         assertEquals(2, set.size());
86         assertEquals(2, self.size());
87         //
88         self.clear();
89         assertTrue(self.isEmpty());
90         assertTrue(set.isEmpty());
91         assertFalse("Now it should not be recursive any longer (no StackOverflowError).",
92                 set.contains(set));
93         //
94         set.add("jjj");
95         assertEquals(1, set.size());
96         assertEquals(1, self.size());
97     }
98 
99     public static class Bean1 {
100         private Set<Object> set;
101         private String id;
102 
getSet()103         public Set<Object> getSet() {
104             return set;
105         }
106 
setSet(Set<Object> set)107         public void setSet(Set<Object> set) {
108             this.set = set;
109         }
110 
getId()111         public String getId() {
112             return id;
113         }
114 
setId(String id)115         public void setId(String id) {
116             this.id = id;
117         }
118     }
119 }
120