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 */ 16package org.yaml.snakeyaml.issues.issue100; 17 18import java.util.HashSet; 19import java.util.List; 20import java.util.Map; 21import java.util.Set; 22 23import junit.framework.TestCase; 24 25import org.yaml.snakeyaml.Util; 26import org.yaml.snakeyaml.Yaml; 27import org.yaml.snakeyaml.constructor.Constructor; 28 29public class MergeJavaBeanTest extends TestCase { 30 31 @SuppressWarnings("unchecked") 32 public void testNoMerge() { 33 String input = "- &id001 !!org.yaml.snakeyaml.issues.issue100.Data {age: 11, id: id123}\n- *id001"; 34 // System.out.println(input); 35 Yaml yaml = new Yaml(); 36 List<Data> list = (List<Data>) yaml.load(input); 37 for (Data data : list) { 38 // System.out.println(data); 39 assertEquals("id123", data.getId()); 40 assertEquals(11, data.getAge()); 41 } 42 } 43 44 public void testMergeWithTags() { 45 String input = Util.getLocalResource("issues/issue100-1.yaml"); 46 // System.out.println(input); 47 Yaml yaml = new Yaml(); 48 49 List<?> list = (List<?>) yaml.load(input); 50 // First object: Data ( 11, "id123" ) 51 assertEquals(list.get(0).getClass(), Data.class); 52 assertEquals(11, ((Data) list.get(0)).getAge()); 53 assertEquals("id123", ((Data) list.get(0)).getId()); 54 55 // Second object: Data ( 13, "id456" ) 56 assertEquals(list.get(1).getClass(), Data.class); 57 assertEquals(13, ((Data) list.get(1)).getAge()); 58 assertEquals("id456", ((Data) list.get(1)).getId()); 59 60 // Third object: Data ( 11, "id789" ) 61 assertEquals(list.get(2).getClass(), Data.class); 62 assertEquals(11, ((Data) list.get(2)).getAge()); 63 assertEquals("id789", ((Data) list.get(2)).getId()); 64 65 // 4th object: DataMore ( 30, "id123" ) 66 assertEquals(list.get(3).getClass(), DataMore.class); 67 assertEquals(30, ((DataMore) list.get(3)).getAge()); 68 assertEquals("id123", ((DataMore) list.get(3)).getId()); 69 assertTrue(((DataMore) list.get(3)).isComplete()); 70 71 // 5th object: Map ( age: 100 ) 72 assertTrue(list.get(4) instanceof Map); 73 assertEquals(1, ((Map<?, ?>) list.get(4)).size()); 74 assertTrue(((Map<?, ?>) list.get(4)).containsKey("age")); 75 assertEquals(100, ((Map<?, ?>) list.get(4)).get("age")); 76 77 // 6th object: DataMore ( 100, "id789" ) 78 assertEquals(list.get(5).getClass(), DataMore.class); 79 assertEquals(100, ((DataMore) list.get(5)).getAge()); 80 assertEquals("id789", ((DataMore) list.get(5)).getId()); 81 assertFalse(((DataMore) list.get(5)).isComplete()); 82 // All instances except the last Map must be different Data instances 83 Set<Data> dataSet = new HashSet<Data>(); 84 for (Object data : list) { 85 if (data instanceof Data) { 86 dataSet.add((Data) data); 87 } 88 } 89 assertEquals("Must be all but one Data instances.", list.size() - 1, dataSet.size()); 90 } 91 92 /** 93 * Since to explicit tag is provided JavaBean properties are used to create 94 * a map 95 */ 96 @SuppressWarnings("unchecked") 97 public void testMergeBeanToMap() { 98 String input = "- &id001 !!org.yaml.snakeyaml.issues.issue100.Data {age: 11, id: id123}\n- << : *id001"; 99 // System.out.println(input); 100 Yaml yaml = new Yaml(); 101 List<Object> list = (List<Object>) yaml.load(input); 102 // First object: Data ( 11, "id123" ) 103 Data first = (Data) list.get(0); 104 assertEquals(11, first.getAge()); 105 assertEquals("id123", first.getId()); 106 // Second object is map 107 Map<?, ?> second = (Map<?, ?>) list.get(1); 108 assertEquals(11, second.get("age")); 109 assertEquals("id123", second.get("id")); 110 } 111 112 @SuppressWarnings("unchecked") 113 public void testMergeAndDeviate() { 114 String input = "- &id001 !!org.yaml.snakeyaml.issues.issue100.Data {age: 11, id: id123}\n- <<: *id001\n id: id456"; 115 // System.out.println(input); 116 Yaml yaml = new Yaml(); 117 List<Object> list = (List<Object>) yaml.load(input); 118 // First object: Data ( 11, "id123" ) 119 Data first = (Data) list.get(0); 120 assertEquals(11, first.getAge()); 121 assertEquals("id123", first.getId()); 122 // Second object is map with a diffrent id 123 Map<?, ?> second = (Map<?, ?>) list.get(1); 124 assertEquals(11, second.get("age")); 125 assertEquals("id456", second.get("id")); 126 } 127 128 /** 129 * <pre> 130 * Test that the merge-override works correctly in the case of custom classes / data types. 131 * Two base objects are specified: 132 * id001 refers to Data ( 11, "id123" ) 133 * id002 refers to Data ( 37, null ) with a literal null value 134 * The third object is specified as having the properties of id001, with the properties of 135 * id002 overriding where they conflict. 136 * Data ( 37, "id123" ) 137 * </pre> 138 */ 139 @SuppressWarnings("unchecked") 140 public void testMergeAndDeviateOverride() { 141 String input = "- &id001 !!org.yaml.snakeyaml.issues.issue100.Data {age: 11, id: id123}\n- &id002 !!org.yaml.snakeyaml.issues.issue100.Data {age: 37}\n- <<: [ *id002, *id001 ]"; 142 // System.out.println(input); 143 Yaml yaml = new Yaml(); 144 List<Data> list = (List<Data>) yaml.load(input); 145 146 // First object: Data ( 11, "id123" ) 147 assertEquals(11, list.get(0).getAge()); 148 assertEquals("id123", list.get(0).getId()); 149 150 // Second object: Data ( 37, null ) 151 assertEquals(37, list.get(1).getAge()); 152 assertEquals(null, list.get(1).getId()); 153 154 // Third object: map 155 Map<?, ?> third = (Map<?, ?>) list.get(2); 156 assertEquals(37, third.get("age")); 157 assertEquals("id123", third.get("id")); 158 } 159 160 /** 161 * When the merged JavaBean is itself a JavaBean property then explicit tag 162 * is not required 163 */ 164 public void testMergeBeanProperty() { 165 String input = Util.getLocalResource("issues/issue100-3.yaml"); 166 // System.out.println(input); 167 Yaml yaml = new Yaml(new Constructor(DataBean.class)); 168 DataBean bean = (DataBean) yaml.load(input); 169 assertEquals("id001", bean.getId()); 170 assertEquals("id002", bean.getData().getId()); 171 assertEquals(17, bean.getData().getAge()); 172 assertEquals(17, bean.getMore().getAge()); 173 assertEquals("more003", bean.getMore().getId()); 174 assertTrue(bean.getMore().isComplete()); 175 } 176 177 /** 178 * Merge map to JavaBean 179 */ 180 @SuppressWarnings("unchecked") 181 public void testMergeMapToJavaBean() { 182 String input = "- &id001 { age: 11, id: id123 }\n- !!org.yaml.snakeyaml.issues.issue100.Data\n <<: *id001\n id: id456"; 183 // System.out.println(input); 184 Yaml yaml = new Yaml(new Constructor()); 185 List<Object> objects = (List<Object>) yaml.load(input); 186 assertEquals(2, objects.size()); 187 // Check first type 188 Object first = objects.get(0); 189 Map<Object, Object> firstMap = (Map<Object, Object>) first; 190 // Check first contents 191 assertEquals(11, firstMap.get("age")); 192 assertEquals("id123", firstMap.get("id")); 193 // Check second contents 194 Data secondData = (Data) objects.get(1); 195 assertEquals(11, secondData.getAge()); 196 assertEquals("id456", secondData.getId()); 197 } 198} 199