xref: /aosp_15_r20/external/snakeyaml/src/test/java/examples/CustomBeanResolverTest.java (revision ac2a7c1bf4e14d82f3bd566dcc2d76d5b42faf34)
1*ac2a7c1bSSadaf Ebrahimi /**
2*ac2a7c1bSSadaf Ebrahimi  * Copyright (c) 2008, SnakeYAML
3*ac2a7c1bSSadaf Ebrahimi  *
4*ac2a7c1bSSadaf Ebrahimi  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5*ac2a7c1bSSadaf Ebrahimi  * in compliance with the License. You may obtain a copy of the License at
6*ac2a7c1bSSadaf Ebrahimi  *
7*ac2a7c1bSSadaf Ebrahimi  * http://www.apache.org/licenses/LICENSE-2.0
8*ac2a7c1bSSadaf Ebrahimi  *
9*ac2a7c1bSSadaf Ebrahimi  * Unless required by applicable law or agreed to in writing, software distributed under the License
10*ac2a7c1bSSadaf Ebrahimi  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11*ac2a7c1bSSadaf Ebrahimi  * or implied. See the License for the specific language governing permissions and limitations under
12*ac2a7c1bSSadaf Ebrahimi  * the License.
13*ac2a7c1bSSadaf Ebrahimi  */
14*ac2a7c1bSSadaf Ebrahimi package examples;
15*ac2a7c1bSSadaf Ebrahimi 
16*ac2a7c1bSSadaf Ebrahimi import java.math.BigDecimal;
17*ac2a7c1bSSadaf Ebrahimi import java.util.regex.Pattern;
18*ac2a7c1bSSadaf Ebrahimi import junit.framework.TestCase;
19*ac2a7c1bSSadaf Ebrahimi import org.yaml.snakeyaml.Yaml;
20*ac2a7c1bSSadaf Ebrahimi import org.yaml.snakeyaml.constructor.Constructor;
21*ac2a7c1bSSadaf Ebrahimi import org.yaml.snakeyaml.nodes.Node;
22*ac2a7c1bSSadaf Ebrahimi import org.yaml.snakeyaml.nodes.NodeId;
23*ac2a7c1bSSadaf Ebrahimi import org.yaml.snakeyaml.nodes.ScalarNode;
24*ac2a7c1bSSadaf Ebrahimi 
25*ac2a7c1bSSadaf Ebrahimi /**
26*ac2a7c1bSSadaf Ebrahimi  * http://code.google.com/p/snakeyaml/issues/detail?id=75
27*ac2a7c1bSSadaf Ebrahimi  */
28*ac2a7c1bSSadaf Ebrahimi public class CustomBeanResolverTest extends TestCase {
29*ac2a7c1bSSadaf Ebrahimi 
30*ac2a7c1bSSadaf Ebrahimi   private final Pattern CUSTOM_PATTERN = Pattern.compile("\\d+%");
31*ac2a7c1bSSadaf Ebrahimi 
testOnlyBigDecimal()32*ac2a7c1bSSadaf Ebrahimi   public void testOnlyBigDecimal() {
33*ac2a7c1bSSadaf Ebrahimi     Yaml yaml = new Yaml(new BigBeanConstructor());
34*ac2a7c1bSSadaf Ebrahimi     Foo foo = yaml.load("bar: 50\nbaz: 35%\nbas: 1250");
35*ac2a7c1bSSadaf Ebrahimi     assertEquals(50.0, foo.bar);
36*ac2a7c1bSSadaf Ebrahimi     assertEquals("0.35", foo.baz.toString());
37*ac2a7c1bSSadaf Ebrahimi     assertEquals("1250", foo.bas);
38*ac2a7c1bSSadaf Ebrahimi   }
39*ac2a7c1bSSadaf Ebrahimi 
testPrimitive()40*ac2a7c1bSSadaf Ebrahimi   public void testPrimitive() {
41*ac2a7c1bSSadaf Ebrahimi     Yaml yaml = new Yaml(new BigBeanConstructor());
42*ac2a7c1bSSadaf Ebrahimi     Foo foo = yaml.load("bar: 50%\nbaz: 35%\nbas: 1250%\nbaw: 35");
43*ac2a7c1bSSadaf Ebrahimi     assertEquals(0.5, foo.bar);
44*ac2a7c1bSSadaf Ebrahimi     assertEquals("0.35", foo.baz.toString());
45*ac2a7c1bSSadaf Ebrahimi     assertEquals("1250%", foo.bas);
46*ac2a7c1bSSadaf Ebrahimi     assertEquals("35", foo.baw.toString());
47*ac2a7c1bSSadaf Ebrahimi   }
48*ac2a7c1bSSadaf Ebrahimi 
49*ac2a7c1bSSadaf Ebrahimi   class BigBeanConstructor extends Constructor {
50*ac2a7c1bSSadaf Ebrahimi 
BigBeanConstructor()51*ac2a7c1bSSadaf Ebrahimi     public BigBeanConstructor() {
52*ac2a7c1bSSadaf Ebrahimi       super(Foo.class);
53*ac2a7c1bSSadaf Ebrahimi       yamlClassConstructors.put(NodeId.scalar, new ConstructBig());
54*ac2a7c1bSSadaf Ebrahimi     }
55*ac2a7c1bSSadaf Ebrahimi 
56*ac2a7c1bSSadaf Ebrahimi     private class ConstructBig extends ConstructScalar {
57*ac2a7c1bSSadaf Ebrahimi 
construct(Node node)58*ac2a7c1bSSadaf Ebrahimi       public Object construct(Node node) {
59*ac2a7c1bSSadaf Ebrahimi         if (node.getType().equals(BigDecimal.class)) {
60*ac2a7c1bSSadaf Ebrahimi           String val = constructScalar((ScalarNode) node);
61*ac2a7c1bSSadaf Ebrahimi           if (CUSTOM_PATTERN.matcher(val).matches()) {
62*ac2a7c1bSSadaf Ebrahimi             return new BigDecimal(val.substring(0, val.length() - 1)).divide(new BigDecimal(100));
63*ac2a7c1bSSadaf Ebrahimi           }
64*ac2a7c1bSSadaf Ebrahimi         } else if (node.getType().isAssignableFrom(double.class)) {
65*ac2a7c1bSSadaf Ebrahimi           String val = constructScalar((ScalarNode) node);
66*ac2a7c1bSSadaf Ebrahimi           if (CUSTOM_PATTERN.matcher(val).matches()) {
67*ac2a7c1bSSadaf Ebrahimi             return Double.valueOf(val.substring(0, val.length() - 1)) / 100;
68*ac2a7c1bSSadaf Ebrahimi           }
69*ac2a7c1bSSadaf Ebrahimi         }
70*ac2a7c1bSSadaf Ebrahimi         return super.construct(node);
71*ac2a7c1bSSadaf Ebrahimi       }
72*ac2a7c1bSSadaf Ebrahimi     }
73*ac2a7c1bSSadaf Ebrahimi   }
74*ac2a7c1bSSadaf Ebrahimi 
75*ac2a7c1bSSadaf Ebrahimi   public static class Foo {
76*ac2a7c1bSSadaf Ebrahimi 
77*ac2a7c1bSSadaf Ebrahimi     public double bar = 0;
78*ac2a7c1bSSadaf Ebrahimi     public BigDecimal baz;
79*ac2a7c1bSSadaf Ebrahimi     public BigDecimal baw;
80*ac2a7c1bSSadaf Ebrahimi     public String bas;
81*ac2a7c1bSSadaf Ebrahimi   }
82*ac2a7c1bSSadaf Ebrahimi }
83