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.recursive; 17 18 import java.util.Date; 19 20 import junit.framework.TestCase; 21 22 import org.yaml.snakeyaml.TypeDescription; 23 import org.yaml.snakeyaml.Util; 24 import org.yaml.snakeyaml.Yaml; 25 import org.yaml.snakeyaml.constructor.Constructor; 26 27 public class Human_WithArrayOfChildrenTest extends TestCase { 28 29 public static class Human_WithArrayOfChildren extends AbstractHuman { 30 31 private Human_WithArrayOfChildren father; 32 private Human_WithArrayOfChildren mother; 33 private Human_WithArrayOfChildren partner; 34 private Human_WithArrayOfChildren bankAccountOwner; 35 protected Human_WithArrayOfChildren[] children; 36 Human_WithArrayOfChildren()37 public Human_WithArrayOfChildren() { 38 children = new Human_WithArrayOfChildren[0]; 39 } 40 getFather()41 public Human_WithArrayOfChildren getFather() { 42 return father; 43 } 44 setFather(Human_WithArrayOfChildren father)45 public void setFather(Human_WithArrayOfChildren father) { 46 this.father = father; 47 } 48 getMother()49 public Human_WithArrayOfChildren getMother() { 50 return mother; 51 } 52 setMother(Human_WithArrayOfChildren mother)53 public void setMother(Human_WithArrayOfChildren mother) { 54 this.mother = mother; 55 } 56 getPartner()57 public Human_WithArrayOfChildren getPartner() { 58 return partner; 59 } 60 setPartner(Human_WithArrayOfChildren partner)61 public void setPartner(Human_WithArrayOfChildren partner) { 62 this.partner = partner; 63 } 64 getBankAccountOwner()65 public Human_WithArrayOfChildren getBankAccountOwner() { 66 return bankAccountOwner; 67 } 68 setBankAccountOwner(Human_WithArrayOfChildren bankAccountOwner)69 public void setBankAccountOwner(Human_WithArrayOfChildren bankAccountOwner) { 70 this.bankAccountOwner = bankAccountOwner; 71 } 72 getChildren()73 public Human_WithArrayOfChildren[] getChildren() { 74 return children; 75 } 76 setChildren(Human_WithArrayOfChildren[] children)77 public void setChildren(Human_WithArrayOfChildren[] children) { 78 this.children = children; 79 } 80 81 } 82 createSon()83 private Human_WithArrayOfChildren createSon() { 84 Human_WithArrayOfChildren father = new Human_WithArrayOfChildren(); 85 father.setName("Father"); 86 father.setBirthday(new Date(1000000000)); 87 father.setBirthPlace("Leningrad"); 88 father.setBankAccountOwner(father); 89 // 90 Human_WithArrayOfChildren mother = new Human_WithArrayOfChildren(); 91 mother.setName("Mother"); 92 mother.setBirthday(new Date(100000000000L)); 93 mother.setBirthPlace("Saint-Petersburg"); 94 father.setPartner(mother); 95 mother.setPartner(father); 96 mother.setBankAccountOwner(father); 97 // 98 Human_WithArrayOfChildren son = new Human_WithArrayOfChildren(); 99 son.setName("Son"); 100 son.setBirthday(new Date(310000000000L)); 101 son.setBirthPlace("Munich"); 102 son.setBankAccountOwner(father); 103 son.setFather(father); 104 son.setMother(mother); 105 // 106 Human_WithArrayOfChildren daughter = new Human_WithArrayOfChildren(); 107 daughter.setName("Daughter"); 108 daughter.setBirthday(new Date(420000000000L)); 109 daughter.setBirthPlace("New York"); 110 daughter.setBankAccountOwner(father); 111 daughter.setFather(father); 112 daughter.setMother(mother); 113 // 114 Human_WithArrayOfChildren[] children = new Human_WithArrayOfChildren[] { son, daughter }; 115 father.setChildren(children); 116 mother.setChildren(children); 117 // 118 return son; 119 } 120 checkSon(Human_WithArrayOfChildren son)121 private void checkSon(Human_WithArrayOfChildren son) { 122 assertNotNull(son); 123 assertEquals("Son", son.getName()); 124 125 Human_WithArrayOfChildren father2 = son.getFather(); 126 assertEquals("Father", father2.getName()); 127 assertEquals("Mother", son.getMother().getName()); 128 assertSame(father2, father2.getBankAccountOwner()); 129 assertSame(father2.getPartner(), son.getMother()); 130 assertSame(father2, son.getMother().getPartner()); 131 132 Human_WithArrayOfChildren[] fathersChildren = father2.getChildren(); 133 assertEquals(2, fathersChildren.length); 134 Human_WithArrayOfChildren[] mothersChildren = father2.getPartner().getChildren(); 135 assertEquals(2, mothersChildren.length); 136 assertSame(mothersChildren, fathersChildren); 137 138 for (Object child : fathersChildren) { 139 // check if type descriptor was correct 140 assertSame(Human_WithArrayOfChildren.class, child.getClass()); 141 } 142 } 143 testChildrenArray()144 public void testChildrenArray() { 145 Constructor constructor = new Constructor(Human_WithArrayOfChildren.class); 146 TypeDescription HumanWithChildrenArrayDescription = new TypeDescription( 147 Human_WithArrayOfChildren.class); 148 HumanWithChildrenArrayDescription.putListPropertyType("children", 149 Human_WithArrayOfChildren.class); 150 constructor.addTypeDescription(HumanWithChildrenArrayDescription); 151 Human_WithArrayOfChildren son = createSon(); 152 Yaml yaml = new Yaml(constructor); 153 String output = yaml.dump(son); 154 // System.out.println(output); 155 String etalon = Util.getLocalResource("recursive/with-childrenArray.yaml"); 156 assertEquals(etalon, output); 157 // 158 Human_WithArrayOfChildren son2 = (Human_WithArrayOfChildren) yaml.load(output); 159 checkSon(son2); 160 } 161 testDumpChildrenArrayWithoutRootTag()162 public void testDumpChildrenArrayWithoutRootTag() { 163 Yaml yaml = new Yaml(); 164 Human_WithArrayOfChildren son = createSon(); 165 String output = yaml.dumpAsMap(son); 166 // System.out.println(output); 167 String etalon = Util.getLocalResource("recursive/with-childrenArray-no-root-tag.yaml"); 168 assertEquals(etalon, output); 169 } 170 testParseChildrenArrayWithoutRootTag()171 public void testParseChildrenArrayWithoutRootTag() { 172 Constructor constructor = new Constructor(Human_WithArrayOfChildren.class); 173 TypeDescription HumanWithChildrenArrayDescription = new TypeDescription( 174 Human_WithArrayOfChildren.class); 175 HumanWithChildrenArrayDescription.putListPropertyType("children", 176 Human_WithArrayOfChildren.class); 177 constructor.addTypeDescription(HumanWithChildrenArrayDescription); 178 Yaml yaml = new Yaml(constructor); 179 String doc = Util.getLocalResource("recursive/with-childrenArray-no-root-tag.yaml"); 180 Human_WithArrayOfChildren son2 = (Human_WithArrayOfChildren) yaml.load(doc); 181 checkSon(son2); 182 } 183 } 184