BUG-865: do not use ModuleBuilder
[mdsal.git] / binding / mdsal-binding-generator-impl / src / test / java / org / opendaylight / yangtools / sal / binding / yang / types / TypeProviderImplTest.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.yangtools.sal.binding.yang.types;
10
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertFalse;
13 import static org.junit.Assert.assertNotNull;
14 import static org.junit.Assert.assertTrue;
15 import static org.junit.Assert.fail;
16 import static org.mockito.Mockito.mock;
17
18 import java.io.File;
19 import java.net.URI;
20 import java.util.NoSuchElementException;
21 import org.junit.Test;
22 import org.opendaylight.yangtools.binding.generator.util.generated.type.builder.GeneratedTypeBuilderImpl;
23 import org.opendaylight.yangtools.sal.binding.model.api.Type;
24 import org.opendaylight.yangtools.yang.common.QName;
25 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
26 import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode;
27 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
28 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
29 import org.opendaylight.yangtools.yang.model.api.Module;
30 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
31 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
32 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
33 import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition;
34 import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition;
35 import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition;
36 import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
37 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
38 import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition;
39 import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition;
40 import org.opendaylight.yangtools.yang.model.util.type.BaseTypes;
41 import org.opendaylight.yangtools.yang.model.util.type.IdentityrefTypeBuilder;
42 import org.opendaylight.yangtools.yang.parser.builder.impl.LeafSchemaNodeBuilder;
43 import org.opendaylight.yangtools.yang.parser.util.YangValidationException;
44
45 public class TypeProviderImplTest {
46
47     @Test (expected = YangValidationException.class)
48     public void testLeafRefRelativeSelfReference() throws Exception {
49         File relative = new File(getClass().getResource("/leafref/leafref-relative-invalid.yang").toURI());
50
51         final SchemaContext schemaContext = RetestUtils.parseYangSources(relative);
52         final Module moduleRelative = schemaContext.findModuleByNamespace(new URI("urn:xml:ns:yang:lrr")).iterator().next();
53         final TypeProviderImpl typeProvider = new TypeProviderImpl(schemaContext);
54
55         DataSchemaNode leafref = ((ListSchemaNode) moduleRelative.getDataChildByName("neighbor")).getDataChildByName("neighbor-id");
56         LeafSchemaNode leaf = (LeafSchemaNode) leafref;
57         TypeDefinition<?> leafType = leaf.getType();
58         Type leafrefResolvedType = typeProvider.javaTypeForSchemaDefinitionType(leafType, leaf);
59     }
60
61     @Test (expected = YangValidationException.class)
62     public void testLeafRefAbsoluteSelfReference() throws Exception {
63         File relative = new File(getClass().getResource("/leafref/leafref-absolute-invalid.yang").toURI());
64
65         final SchemaContext schemaContext = RetestUtils.parseYangSources(relative);
66         final Module moduleRelative = schemaContext.findModuleByNamespace(new URI("urn:xml:ns:yang:lra")).iterator().next();
67         final TypeProviderImpl typeProvider = new TypeProviderImpl(schemaContext);
68
69         DataSchemaNode leafref = ((ListSchemaNode) moduleRelative.getDataChildByName("neighbor")).getDataChildByName("neighbor-id");
70         LeafSchemaNode leaf = (LeafSchemaNode) leafref;
71         TypeDefinition<?> leafType = leaf.getType();
72         Type leafrefResolvedType = typeProvider.javaTypeForSchemaDefinitionType(leafType, leaf);
73     }
74
75     @Test
76     public void testLeafRefRelativeAndAbsoluteValidReference() throws Exception {
77         File valid = new File(getClass().getResource("/leafref/leafref-valid.yang").toURI());
78
79         final SchemaContext schemaContext = RetestUtils.parseYangSources(valid);
80         final Module moduleValid = schemaContext.findModuleByNamespace(new URI("urn:xml:ns:yang:lrv")).iterator().next();
81         final TypeProviderImpl typeProvider = new TypeProviderImpl(schemaContext);
82
83         DataSchemaNode leafrefRel = ((ListSchemaNode) moduleValid.getDataChildByName("neighbor")).getDataChildByName
84                 ("neighbor-id");
85         LeafSchemaNode leafRel = (LeafSchemaNode) leafrefRel;
86         TypeDefinition<?> leafTypeRel = leafRel.getType();
87         Type leafrefRelResolvedType = typeProvider.javaTypeForSchemaDefinitionType(leafTypeRel, leafRel);
88         assertNotNull(leafrefRelResolvedType);
89
90         DataSchemaNode leafrefAbs = ((ListSchemaNode) moduleValid.getDataChildByName("neighbor")).getDataChildByName
91                 ("neighbor2-id");
92         LeafSchemaNode leafAbs = (LeafSchemaNode) leafrefAbs;
93         TypeDefinition<?> leafTypeAbs = leafAbs.getType();
94         Type leafrefAbsResolvedType = typeProvider.javaTypeForSchemaDefinitionType(leafTypeAbs, leafAbs);
95         assertNotNull(leafrefAbsResolvedType);
96     }
97
98     @Test
99     public void testMethodsOfTypeProviderImpl() throws Exception {
100         final File abstractTopology = new File(getClass().getResource("/base-yang-types.yang")
101                 .toURI());
102
103         final SchemaContext schemaContext = RetestUtils.parseYangSources(abstractTopology);
104
105         final TypeProviderImpl typeProvider = new TypeProviderImpl(schemaContext);
106
107         final SchemaPath refTypePath = SchemaPath.create(true, QName.create("cont1"), QName.create("list1"));
108         final GeneratedTypeBuilderImpl refType = new GeneratedTypeBuilderImpl("org.opendaylight.yangtools.test", "TestType");
109         typeProvider.putReferencedType(refTypePath, refType);
110         final StringTypeDefinition stringType = BaseTypes.stringType();
111         LeafSchemaNodeBuilder leafSchemaNodeBuilder = new LeafSchemaNodeBuilder("test-module", 111, QName.create("Cont1"), SchemaPath.ROOT);
112         leafSchemaNodeBuilder.setType(stringType);
113         LeafSchemaNode leafSchemaNode = leafSchemaNodeBuilder.build();
114
115         // test constructor
116         assertNotNull(typeProvider);
117
118         // test getAdditionalTypes() method
119         assertFalse(typeProvider.getAdditionalTypes().isEmpty());
120
121         // test getConstructorPropertyName() method
122         assertTrue(typeProvider.getConstructorPropertyName(null).isEmpty());
123         assertEquals("value", typeProvider.getConstructorPropertyName(stringType));
124
125         // test getParamNameFromType() method
126         assertEquals("string", typeProvider.getParamNameFromType(stringType));
127
128         // test getTypeDefaultConstruction() method for string type
129         assertEquals("\"default value\"", typeProvider.getTypeDefaultConstruction(leafSchemaNode, "default value"));
130
131         // binary type
132         final BinaryTypeDefinition binaryType = BaseTypes.binaryType();
133         leafSchemaNodeBuilder = new LeafSchemaNodeBuilder("test-module", 111, QName.create("Cont1"), SchemaPath.ROOT);
134         leafSchemaNodeBuilder.setType(binaryType);
135         leafSchemaNode = leafSchemaNodeBuilder.build();
136         assertEquals("new byte[] {-45}", typeProvider.getTypeDefaultConstruction(leafSchemaNode, "01"));
137
138         // boolean type
139         final BooleanTypeDefinition booleanType = BaseTypes.booleanType();
140         leafSchemaNodeBuilder = new LeafSchemaNodeBuilder("test-module", 111, QName.create("Cont1"), SchemaPath.ROOT);
141         leafSchemaNodeBuilder.setType(booleanType);
142         leafSchemaNode = leafSchemaNodeBuilder.build();
143         assertEquals("new java.lang.Boolean(\"false\")", typeProvider.getTypeDefaultConstruction(leafSchemaNode, "false"));
144
145         // decimal type
146         final DecimalTypeDefinition decimalType = BaseTypes.decimalTypeBuilder(refTypePath).setFractionDigits(4).build();
147         leafSchemaNodeBuilder = new LeafSchemaNodeBuilder("test-module", 111, QName.create("Cont1"), SchemaPath.ROOT);
148         leafSchemaNodeBuilder.setType(decimalType);
149         leafSchemaNode = leafSchemaNodeBuilder.build();
150         assertEquals("new java.math.BigDecimal(\"111\")", typeProvider.getTypeDefaultConstruction(leafSchemaNode, "111"));
151
152         // empty type
153         final EmptyTypeDefinition emptyType = BaseTypes.emptyType();
154         leafSchemaNodeBuilder = new LeafSchemaNodeBuilder("test-module", 111, QName.create("Cont1"), SchemaPath.ROOT);
155         leafSchemaNodeBuilder.setType(emptyType);
156         leafSchemaNode = leafSchemaNodeBuilder.build();
157         assertEquals("new java.lang.Boolean(\"default value\")", typeProvider.getTypeDefaultConstruction(leafSchemaNode, "default value"));
158
159         // enum type
160         final EnumTypeDefinition enumType =  BaseTypes.enumerationTypeBuilder(refTypePath).build();
161         leafSchemaNodeBuilder = new LeafSchemaNodeBuilder("test-module", 111, QName.create("Cont1"), SchemaPath.ROOT);
162         leafSchemaNodeBuilder.setType(enumType);
163         leafSchemaNode = leafSchemaNodeBuilder.build();
164         try {
165             assertEquals("\"default value\"", typeProvider.getTypeDefaultConstruction(leafSchemaNode, "default value"));
166             fail("Expected NoSuchElementException");
167         } catch (Exception e) {
168             assertTrue( e instanceof NoSuchElementException);
169         }
170
171         // identityref type
172         final IdentitySchemaNode identitySchemaNode = mock(IdentitySchemaNode.class);
173
174         final IdentityrefTypeBuilder identityRefBuilder = BaseTypes.identityrefTypeBuilder(refTypePath);
175         identityRefBuilder.setIdentity(identitySchemaNode);
176         final IdentityrefTypeDefinition identityRef =  identityRefBuilder.build();
177         leafSchemaNodeBuilder = new LeafSchemaNodeBuilder("test-module", 111, QName.create("Cont1"), SchemaPath.ROOT);
178         leafSchemaNodeBuilder.setType(identityRef);
179
180         leafSchemaNode = leafSchemaNodeBuilder.build();
181         try {
182             assertEquals("\"default value\"", typeProvider.getTypeDefaultConstruction(leafSchemaNode, "default value"));
183             fail("Expected UnsupportedOperationException");
184         } catch (Exception e) {
185             assertTrue(e instanceof UnsupportedOperationException);
186             assertEquals("Cannot get default construction for identityref type", e.getMessage());
187         }
188     }
189 }