• 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.issue82;
17 
18 import java.util.ArrayList;
19 import java.util.Collection;
20 import java.util.HashMap;
21 import java.util.HashSet;
22 import java.util.Map;
23 import java.util.Set;
24 
25 import junit.framework.TestCase;
26 
27 import org.yaml.snakeyaml.TypeDescription;
28 import org.yaml.snakeyaml.Yaml;
29 import org.yaml.snakeyaml.constructor.Constructor;
30 import org.yaml.snakeyaml.nodes.Tag;
31 import org.yaml.snakeyaml.representer.Representer;
32 
33 /**
34  * issue 82: property order influence when aliased in generic collection
35  */
36 public class PropOrderInfluenceWhenAliasedInGenericCollectionTest extends TestCase {
37 
38     public static interface Account {
39     }
40 
41     public static class GeneralAccount implements Account {
42         public String name = "General";
43     }
44 
45     public static class SuperSaverAccount extends GeneralAccount {
46 
SuperSaverAccount()47         public SuperSaverAccount() {
48             name = "SuperSaver";
49         }
50     }
51 
52     public static class CustomerAB {
53         public Collection<Account> aAll;
54         public Collection<GeneralAccount> bGeneral;
55 
56         @Override
toString()57         public String toString() {
58             return "CustomerAB";
59         }
60     }
61 
62     public static class CustomerBA {
63         public Collection<GeneralAccount> aGeneral;
64         public Collection<Account> bAll;
65     }
66 
67     public static class CustomerAB_MapValue {
68         public Collection<Account> aAll;
69         public Map<String, GeneralAccount> bGeneralMap;
70 
71         @Override
toString()72         public String toString() {
73             return "CustomerAB_MapValue";
74         }
75     }
76 
77     public static class CustomerAB_MapKey {
78         public Collection<Account> aAll;
79         public Map<GeneralAccount, String> bGeneralMap;
80 
81         @Override
toString()82         public String toString() {
83             return "CustomerAB_MapKey";
84         }
85     }
86 
87     public static class CustomerAB_Property {
88         public Account acc;
89         public Collection<GeneralAccount> bGeneral;
90 
91         @Override
toString()92         public String toString() {
93             return "CustomerAB_Property";
94         }
95     }
96 
testAB()97     public void testAB() {
98         SuperSaverAccount supersaver = new SuperSaverAccount();
99         GeneralAccount generalAccount = new GeneralAccount();
100 
101         CustomerAB customerAB = new CustomerAB();
102         ArrayList<Account> all = new ArrayList<Account>();
103         all.add(supersaver);
104         all.add(generalAccount);
105         ArrayList<GeneralAccount> general = new ArrayList<GeneralAccount>();
106         general.add(generalAccount);
107         general.add(supersaver);
108 
109         customerAB.aAll = all;
110         customerAB.bGeneral = general;
111 
112         Yaml yaml = new Yaml();
113         String dump = yaml.dump(customerAB);
114         // System.out.println(dump);
115         CustomerAB parsed = (CustomerAB) yaml.load(dump);
116         assertNotNull(parsed);
117     }
118 
testAB_Set()119     public void testAB_Set() {
120         SuperSaverAccount supersaver = new SuperSaverAccount();
121         GeneralAccount generalAccount = new GeneralAccount();
122 
123         CustomerAB customerAB = new CustomerAB();
124         ArrayList<Account> all = new ArrayList<Account>();
125         all.add(supersaver);
126         all.add(generalAccount);
127         Set<GeneralAccount> general = new HashSet<GeneralAccount>();
128         general.add(generalAccount);
129         general.add(supersaver);
130 
131         customerAB.aAll = all;
132         customerAB.bGeneral = general;
133 
134         Yaml yaml = new Yaml();
135         String dump = yaml.dump(customerAB);
136         // System.out.println(dump);
137         CustomerAB parsed = (CustomerAB) yaml.load(dump);
138         assertNotNull(parsed);
139     }
140 
testABWithCustomTag()141     public void testABWithCustomTag() {
142         SuperSaverAccount supersaver = new SuperSaverAccount();
143         GeneralAccount generalAccount = new GeneralAccount();
144 
145         CustomerAB customerAB = new CustomerAB();
146         ArrayList<Account> all = new ArrayList<Account>();
147         all.add(supersaver);
148         all.add(generalAccount);
149         ArrayList<GeneralAccount> general = new ArrayList<GeneralAccount>();
150         general.add(generalAccount);
151         general.add(supersaver);
152 
153         customerAB.aAll = all;
154         customerAB.bGeneral = general;
155 
156         Constructor constructor = new Constructor();
157         Representer representer = new Representer();
158         Tag generalAccountTag = new Tag("!GA");
159         constructor
160                 .addTypeDescription(new TypeDescription(GeneralAccount.class, generalAccountTag));
161         representer.addClassTag(GeneralAccount.class, generalAccountTag);
162 
163         Yaml yaml = new Yaml(constructor, representer);
164         String dump = yaml.dump(customerAB);
165         // System.out.println(dump);
166         CustomerAB parsed = (CustomerAB) yaml.load(dump);
167         assertNotNull(parsed);
168     }
169 
testABProperty()170     public void testABProperty() {
171         SuperSaverAccount supersaver = new SuperSaverAccount();
172         GeneralAccount generalAccount = new GeneralAccount();
173 
174         CustomerAB_Property customerAB_property = new CustomerAB_Property();
175         ArrayList<Account> all = new ArrayList<Account>();
176         all.add(supersaver);
177         all.add(generalAccount);
178         ArrayList<GeneralAccount> general = new ArrayList<GeneralAccount>();
179         general.add(generalAccount);
180         general.add(supersaver);
181 
182         customerAB_property.acc = generalAccount;
183         customerAB_property.bGeneral = general;
184 
185         Constructor constructor = new Constructor();
186         Representer representer = new Representer();
187 
188         Yaml yaml = new Yaml(constructor, representer);
189         String dump = yaml.dump(customerAB_property);
190         // System.out.println(dump);
191         CustomerAB_Property parsed = (CustomerAB_Property) yaml.load(dump);
192         assertNotNull(parsed);
193     }
194 
testABPropertyWithCustomTag()195     public void testABPropertyWithCustomTag() {
196         SuperSaverAccount supersaver = new SuperSaverAccount();
197         GeneralAccount generalAccount = new GeneralAccount();
198 
199         CustomerAB_Property customerAB_property = new CustomerAB_Property();
200         ArrayList<Account> all = new ArrayList<Account>();
201         all.add(supersaver);
202         all.add(generalAccount);
203         ArrayList<GeneralAccount> general = new ArrayList<GeneralAccount>();
204         general.add(generalAccount);
205         general.add(supersaver);
206 
207         customerAB_property.acc = generalAccount;
208         customerAB_property.bGeneral = general;
209 
210         Constructor constructor = new Constructor();
211         Representer representer = new Representer();
212 
213         Tag generalAccountTag = new Tag("!GA");
214         constructor
215                 .addTypeDescription(new TypeDescription(GeneralAccount.class, generalAccountTag));
216         representer.addClassTag(GeneralAccount.class, generalAccountTag);
217 
218         Yaml yaml = new Yaml(constructor, representer);
219         String dump = yaml.dump(customerAB_property);
220         // System.out.println(dump);
221         CustomerAB_Property parsed = (CustomerAB_Property) yaml.load(dump);
222         assertNotNull(parsed);
223     }
224 
testABwithJavaBeanHelpers()225     public void testABwithJavaBeanHelpers() {
226         SuperSaverAccount supersaver = new SuperSaverAccount();
227         GeneralAccount generalAccount = new GeneralAccount();
228 
229         CustomerAB customerAB = new CustomerAB();
230         ArrayList<Account> all = new ArrayList<Account>();
231         all.add(supersaver);
232         all.add(generalAccount);
233         ArrayList<GeneralAccount> general = new ArrayList<GeneralAccount>();
234         general.add(generalAccount);
235         general.add(supersaver);
236 
237         customerAB.aAll = all;
238         customerAB.bGeneral = general;
239 
240         Yaml yaml = new Yaml();
241         String dump2 = yaml.dumpAsMap(customerAB);
242         // System.out.println(dump2);
243         Yaml loader = new Yaml();
244         CustomerAB parsed = loader.loadAs(dump2, CustomerAB.class);
245         assertNotNull(parsed);
246     }
247 
testAB_asMapValue()248     public void testAB_asMapValue() {
249         SuperSaverAccount supersaver = new SuperSaverAccount();
250         GeneralAccount generalAccount = new GeneralAccount();
251 
252         CustomerAB_MapValue customerAB_mapValue = new CustomerAB_MapValue();
253         ArrayList<Account> all = new ArrayList<Account>();
254         all.add(supersaver);
255         all.add(generalAccount);
256         Map<String, GeneralAccount> generalMap = new HashMap<String, GeneralAccount>();
257         generalMap.put(generalAccount.name, generalAccount);
258         generalMap.put(supersaver.name, supersaver);
259 
260         customerAB_mapValue.aAll = all;
261         customerAB_mapValue.bGeneralMap = generalMap;
262 
263         Yaml yaml = new Yaml();
264         String dump = yaml.dump(customerAB_mapValue);
265         // System.out.println(dump);
266         CustomerAB_MapValue parsed = (CustomerAB_MapValue) yaml.load(dump);
267         assertNotNull(parsed);
268     }
269 
testAB_asMapKey()270     public void testAB_asMapKey() {
271         SuperSaverAccount supersaver = new SuperSaverAccount();
272         GeneralAccount generalAccount = new GeneralAccount();
273 
274         CustomerAB_MapKey customerAB_mapKey = new CustomerAB_MapKey();
275         ArrayList<Account> all = new ArrayList<Account>();
276         all.add(supersaver);
277         all.add(generalAccount);
278         Map<GeneralAccount, String> generalMap = new HashMap<GeneralAccount, String>();
279         generalMap.put(generalAccount, generalAccount.name);
280         generalMap.put(supersaver, supersaver.name);
281 
282         customerAB_mapKey.aAll = all;
283         customerAB_mapKey.bGeneralMap = generalMap;
284 
285         Yaml yaml = new Yaml();
286         String dump = yaml.dump(customerAB_mapKey);
287         // System.out.println(dump);
288         CustomerAB_MapKey parsed = (CustomerAB_MapKey) yaml.load(dump);
289         assertNotNull(parsed);
290     }
291 
testBA()292     public void testBA() {
293         SuperSaverAccount supersaver = new SuperSaverAccount();
294         GeneralAccount generalAccount = new GeneralAccount();
295 
296         CustomerBA customerBA = new CustomerBA();
297         ArrayList<Account> all = new ArrayList<Account>();
298         all.add(supersaver);
299         all.add(generalAccount);
300         ArrayList<GeneralAccount> general = new ArrayList<GeneralAccount>();
301         general.add(generalAccount);
302         general.add(supersaver);
303 
304         customerBA.aGeneral = general;
305         customerBA.bAll = all;
306 
307         Yaml yaml = new Yaml();
308         String dump = yaml.dump(customerBA);
309         // System.out.println(dump);
310         //
311         CustomerBA parsed = (CustomerBA) yaml.load(dump);
312         assertEquals(2, parsed.bAll.size());
313         assertEquals(2, parsed.aGeneral.size());
314         assertFalse(parsed.bAll.equals(parsed.aGeneral));
315         GeneralAccount[] array = parsed.aGeneral.toArray(new GeneralAccount[2]);
316         assertEquals(GeneralAccount.class, array[0].getClass());
317         assertEquals(SuperSaverAccount.class, array[1].getClass());
318         assertEquals("SuperSaver", array[1].name);
319     }
320 }
321