1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package examples;
17
18 import java.math.BigDecimal;
19 import java.util.regex.Pattern;
20
21 import junit.framework.TestCase;
22
23 import org.yaml.snakeyaml.Yaml;
24 import org.yaml.snakeyaml.constructor.Constructor;
25 import org.yaml.snakeyaml.nodes.Node;
26 import org.yaml.snakeyaml.nodes.NodeId;
27 import org.yaml.snakeyaml.nodes.ScalarNode;
28
29
30
31
32 public class CustomBeanResolverTest extends TestCase {
33 private final Pattern CUSTOM_PATTERN = Pattern.compile("\\d+%");
34
35 public void testOnlyBigDecimal() {
36 Yaml yaml = new Yaml(new BigBeanConstructor());
37 Foo foo = (Foo) yaml.load("bar: 50\nbaz: 35%\nbas: 1250");
38 assertEquals(50.0, foo.bar);
39 assertEquals("0.35", foo.baz.toString());
40 assertEquals("1250", foo.bas);
41 }
42
43 public void testPrimitive() {
44 Yaml yaml = new Yaml(new BigBeanConstructor());
45 Foo foo = (Foo) yaml.load("bar: 50%\nbaz: 35%\nbas: 1250%\nbaw: 35");
46 assertEquals(0.5, foo.bar);
47 assertEquals("0.35", foo.baz.toString());
48 assertEquals("1250%", foo.bas);
49 assertEquals("35", foo.baw.toString());
50 }
51
52 class BigBeanConstructor extends Constructor {
53 public BigBeanConstructor() {
54 super(Foo.class);
55 yamlClassConstructors.put(NodeId.scalar, new ConstructBig());
56 }
57
58 private class ConstructBig extends ConstructScalar {
59 public Object construct(Node node) {
60 if (node.getType().equals(BigDecimal.class)) {
61 String val = (String) constructScalar((ScalarNode) node);
62 if (CUSTOM_PATTERN.matcher(val).matches()) {
63 return new BigDecimal(val.substring(0, val.length() - 1))
64 .divide(new BigDecimal(100));
65 }
66 } else if (node.getType().isAssignableFrom(double.class)) {
67 String val = (String) constructScalar((ScalarNode) node);
68 if (CUSTOM_PATTERN.matcher(val).matches()) {
69 return new Double(val.substring(0, val.length() - 1)) / 100;
70 }
71 }
72 return super.construct(node);
73 }
74 }
75 }
76
77 public static class Foo {
78 public double bar = 0;
79 public BigDecimal baz;
80 public BigDecimal baw;
81 public String bas;
82 }
83 }