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.Map; 18*ac2a7c1bSSadaf Ebrahimi import java.util.regex.Pattern; 19*ac2a7c1bSSadaf Ebrahimi import junit.framework.TestCase; 20*ac2a7c1bSSadaf Ebrahimi import org.yaml.snakeyaml.Yaml; 21*ac2a7c1bSSadaf Ebrahimi import org.yaml.snakeyaml.constructor.AbstractConstruct; 22*ac2a7c1bSSadaf Ebrahimi import org.yaml.snakeyaml.constructor.SafeConstructor; 23*ac2a7c1bSSadaf Ebrahimi import org.yaml.snakeyaml.nodes.Node; 24*ac2a7c1bSSadaf Ebrahimi import org.yaml.snakeyaml.nodes.ScalarNode; 25*ac2a7c1bSSadaf Ebrahimi import org.yaml.snakeyaml.nodes.Tag; 26*ac2a7c1bSSadaf Ebrahimi 27*ac2a7c1bSSadaf Ebrahimi /** 28*ac2a7c1bSSadaf Ebrahimi * Use custom implicit resolver when the runtime class is not defined. 29*ac2a7c1bSSadaf Ebrahimi * http://code.google.com/p/snakeyaml/issues/detail?id=75 30*ac2a7c1bSSadaf Ebrahimi */ 31*ac2a7c1bSSadaf Ebrahimi public class CustomImplicitResolverTest extends TestCase { 32*ac2a7c1bSSadaf Ebrahimi 33*ac2a7c1bSSadaf Ebrahimi private final Tag CUSTOM_TAG = new Tag("!BigDecimalDividedBy100"); 34*ac2a7c1bSSadaf Ebrahimi private final Pattern CUSTOM_PATTERN = Pattern.compile("\\d+%"); 35*ac2a7c1bSSadaf Ebrahimi 36*ac2a7c1bSSadaf Ebrahimi @SuppressWarnings("unchecked") testImplicit()37*ac2a7c1bSSadaf Ebrahimi public void testImplicit() { 38*ac2a7c1bSSadaf Ebrahimi Yaml yaml = new Yaml(new BigConstructor()); 39*ac2a7c1bSSadaf Ebrahimi yaml.addImplicitResolver(CUSTOM_TAG, CUSTOM_PATTERN, "-0123456789"); 40*ac2a7c1bSSadaf Ebrahimi Map<String, Object> obj = yaml.load("bar: 50%"); 41*ac2a7c1bSSadaf Ebrahimi assertEquals("0.5", obj.get("bar").toString()); 42*ac2a7c1bSSadaf Ebrahimi assertEquals(BigDecimal.class, obj.get("bar").getClass()); 43*ac2a7c1bSSadaf Ebrahimi } 44*ac2a7c1bSSadaf Ebrahimi testImplicitFailure()45*ac2a7c1bSSadaf Ebrahimi public void testImplicitFailure() { 46*ac2a7c1bSSadaf Ebrahimi Yaml yaml = new Yaml(new BigConstructor()); 47*ac2a7c1bSSadaf Ebrahimi yaml.addImplicitResolver(CUSTOM_TAG, Pattern.compile("\\d+%"), "-0123456789"); 48*ac2a7c1bSSadaf Ebrahimi try { 49*ac2a7c1bSSadaf Ebrahimi yaml.load("bar: !!float 50%"); 50*ac2a7c1bSSadaf Ebrahimi fail("Both implicit and explicit are present."); 51*ac2a7c1bSSadaf Ebrahimi } catch (NumberFormatException e) { 52*ac2a7c1bSSadaf Ebrahimi assertEquals("For input string: \"50%\"", e.getMessage()); 53*ac2a7c1bSSadaf Ebrahimi } 54*ac2a7c1bSSadaf Ebrahimi } 55*ac2a7c1bSSadaf Ebrahimi 56*ac2a7c1bSSadaf Ebrahimi class BigConstructor extends SafeConstructor { 57*ac2a7c1bSSadaf Ebrahimi BigConstructor()58*ac2a7c1bSSadaf Ebrahimi public BigConstructor() { 59*ac2a7c1bSSadaf Ebrahimi this.yamlConstructors.put(CUSTOM_TAG, new ConstructBig()); 60*ac2a7c1bSSadaf Ebrahimi } 61*ac2a7c1bSSadaf Ebrahimi 62*ac2a7c1bSSadaf Ebrahimi private class ConstructBig extends AbstractConstruct { 63*ac2a7c1bSSadaf Ebrahimi construct(Node node)64*ac2a7c1bSSadaf Ebrahimi public Object construct(Node node) { 65*ac2a7c1bSSadaf Ebrahimi String val = constructScalar((ScalarNode) node); 66*ac2a7c1bSSadaf Ebrahimi return new BigDecimal(val.substring(0, val.length() - 1)).divide(new BigDecimal(100)); 67*ac2a7c1bSSadaf Ebrahimi } 68*ac2a7c1bSSadaf Ebrahimi } 69*ac2a7c1bSSadaf Ebrahimi } 70*ac2a7c1bSSadaf Ebrahimi } 71