blob: f6cf3b4b3768de4ba82b6b95cacbf2bf1728759b [file] [log] [blame]
/**
* Copyright (c) 2008-2012, http://www.snakeyaml.org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.yaml.snakeyaml.constructor;
import java.math.BigInteger;
import junit.framework.TestCase;
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.Util;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.error.YAMLException;
public class BeanConstructorTest extends TestCase {
public void testPrimitivesConstructor() {
Yaml yaml = new Yaml(new Constructor(TestBean1.class));
String document = Util.getLocalResource("constructor/test-primitives1.yaml");
TestBean1 result = (TestBean1) yaml.load(document);
assertNotNull(result);
assertEquals(new Byte((byte) 1), result.getByteClass());
assertEquals((byte) -3, result.getBytePrimitive());
assertEquals(new Short((short) 0), result.getShortClass());
assertEquals((short) -13, result.getShortPrimitive());
assertEquals(new Integer(5), result.getInteger());
assertEquals(17, result.getIntPrimitive());
assertEquals("the text", result.getText());
assertEquals("13", result.getId());
assertEquals(new Long(11111111111L), result.getLongClass());
assertEquals(9999999999L, result.getLongPrimitive());
assertEquals(Boolean.TRUE, result.getBooleanClass());
assertTrue(result.isBooleanPrimitive());
assertEquals(Character.valueOf('2'), result.getCharClass());
assertEquals('#', result.getCharPrimitive());
assertEquals(new BigInteger("1234567890123456789012345678901234567890"),
result.getBigInteger());
assertEquals(new Float(2), result.getFloatClass());
assertEquals(new Float(3.1416), result.getFloatPrimitive());
assertEquals(new Double(4), result.getDoubleClass());
assertEquals(new Double(11200), result.getDoublePrimitive());
assertEquals(1199836800000L, result.getDate().getTime());
assertEquals("public", result.publicField);
//
DumperOptions options = new DumperOptions();
options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
Yaml yamlToDump = new Yaml(options);
String output = yamlToDump.dump(result);
TestBean1 result2 = (TestBean1) yaml.load(output);
assertNotNull(result2);
TestBean1 result3 = (TestBean1) new Yaml().load(output);
assertNotNull(result3);
}
public void testNoClassConstructor() {
try {
new Yaml(new Constructor((Class<? extends Object>) null));
fail("Class must be provided.");
} catch (NullPointerException e) {
assertEquals("Root class must be provided.", e.getMessage());
}
}
public void testNoClassConstructorString() throws ClassNotFoundException {
try {
new Yaml(new Constructor((String) null));
fail("Class must be provided.");
} catch (NullPointerException e) {
assertEquals("Root type must be provided.", e.getMessage());
}
}
public void testNoClassConstructorEmptyString() throws ClassNotFoundException {
try {
new Yaml(new Constructor(" "));
fail("Class must be provided.");
} catch (YAMLException e) {
assertEquals("Root type must be provided.", e.getMessage());
}
}
public void testCharacter() {
Yaml yaml = new Yaml(new Constructor(TestBean1.class));
String document = "charClass: id";
try {
yaml.load(document);
fail("Only one char must be allowed.");
} catch (Exception e) {
assertTrue(e.getMessage(),
e.getMessage().contains("Invalid node Character: 'id'; length: 2"));
}
document = "charClass: #";
TestBean1 bean = (TestBean1) yaml.load(document);
assertNull("Null must be accepted.", bean.getCharClass());
document = "charClass: ''";
bean = (TestBean1) yaml.load(document);
assertNull("Null must be accepted.", bean.getCharClass());
document = "charClass:\n";
bean = (TestBean1) yaml.load(document);
assertNull("Null must be accepted.", bean.getCharClass());
document = "charClass: 1\n";
bean = (TestBean1) yaml.load(document);
assertEquals(Character.valueOf('1'), bean.getCharClass());
}
public void testNoEmptyConstructor() {
Yaml yaml = new Yaml(new Constructor(TestBean2.class));
String document = "text: qwerty";
try {
yaml.load(document);
fail("No empty constructor available");
} catch (Exception e) {
assertTrue(e.getMessage(), e.getMessage().contains("NoSuchMethodException"));
}
TestBean2 bean = new TestBean2();
assertEquals("", bean.getText());
}
private class TestBean2 {
private String text;
public TestBean2() {
setText("");
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
public void testPrivateMethod() {
// TODO: Are we sure no private ????
Yaml yaml = new Yaml(new Constructor(TestBean2.class));
String document = "text: qwerty";
try {
yaml.load(document);
fail("Private method cannot be called.");
} catch (Exception e) {
assertTrue(e.getMessage(), e.getMessage().contains("NoSuchMethodException"));
}
}
public void testKeyNotScalar() {
Yaml yaml = new Yaml(new Constructor(TestBean1.class));
String document = "[1, 2]: qwerty";
try {
yaml.load(document);
fail("Keys must be scalars.");
} catch (Exception e) {
assertTrue(e.getMessage(), e.getMessage().contains("Keys must be scalars but found"));
}
}
public void testInvalidKey() {
Yaml yaml = new Yaml(new Constructor(TestBean1.class));
String document = "something: qwerty";
try {
yaml.load(document);
fail("Non-existing property must fail.");
} catch (Exception e) {
assertTrue(e.getMessage(),
e.getMessage().contains("Unable to find property 'something'"));
}
}
public void testStaticField() {
Yaml yaml = new Yaml(new Constructor(TestBean1.class));
String document = "staticInteger: 123";
try {
yaml.load(document);
fail("Staic variables must not be used.");
} catch (Exception e) {
assertTrue(e.getMessage(),
e.getMessage().contains("Unable to find property 'staticInteger'"));
}
}
public void testScalarContructor() {
Yaml yaml = new Yaml(new Constructor(Parent1.class));
String document = "id: 123\nchild: 25";
Parent1 parent = (Parent1) yaml.load(document);
assertEquals("123", parent.getId());
Child1 child = parent.getChild();
assertEquals(new Integer(25), child.getCode());
}
public void testScalarContructorException() {
Yaml yaml = new Yaml(new Constructor(ExceptionParent.class));
String document = "id: 123\nchild: 25";
try {
yaml.load(document);
fail("ExceptionParent should not be created.");
} catch (Exception e) {
assertTrue(
e.getMessage(),
e.getMessage().contains(
"Can't construct a java object for scalar tag:yaml.org,2002:int"));
}
}
static public class ExceptionParent {
private String id;
private ExceptionChild child;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public ExceptionChild getChild() {
return child;
}
public void setChild(ExceptionChild child) {
this.child = child;
}
}
public static class ExceptionChild {
private Integer code;
public ExceptionChild(Integer code) {
throw new RuntimeException("ExceptionChild cannot be created.");
}
public Integer getCode() {
return code;
}
}
}