13488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov/**
211a89b445f3bde56bf07e6a0d04f0b0256dcb215Andrey Somov * Copyright (c) 2008, http://www.snakeyaml.org
33488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov *
43488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov * Licensed under the Apache License, Version 2.0 (the "License");
53488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov * you may not use this file except in compliance with the License.
63488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov * You may obtain a copy of the License at
73488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov *
83488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov *     http://www.apache.org/licenses/LICENSE-2.0
93488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov *
103488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov * Unless required by applicable law or agreed to in writing, software
113488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov * distributed under the License is distributed on an "AS IS" BASIS,
123488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov * See the License for the specific language governing permissions and
143488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov * limitations under the License.
153488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov */
163488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somovpackage org.yaml.snakeyaml.issues.issue64;
173488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov
183488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somovimport java.util.LinkedList;
193488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somovimport java.util.List;
203488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov
213488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somovimport junit.framework.TestCase;
223488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov
23def9635e03df5f547cda12693af495d24d1b0a5bAndrey Somovimport org.yaml.snakeyaml.Yaml;
243488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somovimport org.yaml.snakeyaml.constructor.AbstractConstruct;
253488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somovimport org.yaml.snakeyaml.constructor.Constructor;
263488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somovimport org.yaml.snakeyaml.nodes.Node;
273488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somovimport org.yaml.snakeyaml.nodes.ScalarNode;
283488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somovimport org.yaml.snakeyaml.nodes.Tag;
293488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somovimport org.yaml.snakeyaml.representer.Represent;
303488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somovimport org.yaml.snakeyaml.representer.Representer;
313488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov
323488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somovpublic class ParameterizedTypeTest extends TestCase {
333488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov
343488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov    public void testRepresenter() {
3543bd82cf730ff2001bb710e9bc9842be917aefc1Andrey Somov        Yaml yaml = new Yaml(new ClassConstructor(), new ClassRepresenter());
363488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov
373488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov        String methodName = "testMethod";
383488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov        List<Class<?>> argTypes = new LinkedList<Class<?>>();
393488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov        argTypes.add(String.class);
403488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov        argTypes.add(Integer.class);
413488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov        argTypes.add(Boolean.class);
423488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov        MethodDesc methodDesc = new MethodDesc(methodName, argTypes);
433488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov
443488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov        String out = yaml.dump(methodDesc);
453488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov        // System.out.println(out);
463488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov        assertEquals(
473488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov                "!!org.yaml.snakeyaml.issues.issue64.MethodDesc\nargTypes: [!clazz 'String', !clazz 'Integer', !clazz 'Boolean']\nname: testMethod\n",
483488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov                out);
493488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov        MethodDesc parsed = (MethodDesc) yaml.load(out);
503488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov        assertEquals(methodName, parsed.getName());
513488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov        List<Class<?>> argTypes2 = parsed.getArgTypes();
523488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov        assertEquals(3, argTypes2.size());
533488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov        assertEquals(argTypes, argTypes2);
543488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov    }
553488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov
563488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov    static class ClassRepresenter extends Representer {
573488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov        public ClassRepresenter() {
583488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov            this.representers.put(Class.class, new RepresentClass());
593488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov        }
603488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov
613488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov        private class RepresentClass implements Represent {
623488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov            public Node representData(Object data) {
633488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov                Class<?> clazz = (Class<?>) data;
643488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov                return representScalar(new Tag("!clazz"), clazz.getSimpleName());
653488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov            }
663488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov        }
673488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov    }
683488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov
693488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov    static class ClassConstructor extends Constructor {
703488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov        public ClassConstructor() {
713488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov            this.yamlConstructors.put(new Tag("!clazz"), new ConstructClass());
723488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov        }
733488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov
743488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov        private class ConstructClass extends AbstractConstruct {
753488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov
763488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov            public Object construct(Node node) {
773488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov                String clazz = (String) constructScalar((ScalarNode) node);
783488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov                try {
793488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov                    return Class.forName("java.lang." + clazz);
803488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov                } catch (ClassNotFoundException e) {
813488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov                    throw new RuntimeException(e);
823488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov                }
833488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov            }
843488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov        }
853488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov    }
863488f4215a90e6e0fabf9919ede31a7a09ecbd45Andrey Somov}
87