2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.yangtools.sal.java.api.generator.test;
10 import static org.junit.Assert.*;
11 import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.*;
14 import java.math.BigDecimal;
16 import java.net.URLClassLoader;
17 import java.util.HashSet;
18 import java.util.List;
21 import org.junit.Test;
22 import org.opendaylight.yangtools.sal.binding.model.api.Type;
23 import org.opendaylight.yangtools.sal.java.api.generator.GeneratorJavaFile;
24 import org.opendaylight.yangtools.yang.model.api.Module;
25 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
28 * Test correct code generation.
31 public class TypedefCompilationTest extends BaseCompilationTest {
32 private static final String VAL = "_value";
33 private static final String UNITS = "_UNITS";
36 public void test() throws Exception {
37 final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "typedef");
38 assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
39 final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "typedef");
40 assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir());
42 final List<File> sourceFiles = getSourceFiles("/compilation/typedef");
43 final Set<Module> modulesToBuild = parser.parseYangModels(sourceFiles);
44 final SchemaContext context = parser.resolveSchemaContext(modulesToBuild);
45 final List<Type> types = bindingGenerator.generateTypes(context);
46 final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types));
47 generator.generateToFile(sourcesOutputDir);
49 File parent = new File(sourcesOutputDir, NS_FOO);
50 File int32Ext1 = new File(parent, "Int32Ext1.java");
51 File int32Ext2 = new File(parent, "Int32Ext2.java");
52 File myDecimalType = new File(parent, "MyDecimalType.java");
53 File stringExt1 = new File(parent, "StringExt1.java");
54 File stringExt2 = new File(parent, "StringExt2.java");
55 File stringExt3 = new File(parent, "StringExt3.java");
56 File unionExt1 = new File(parent, "UnionExt1.java");
57 File unionExt2 = new File(parent, "UnionExt2.java");
58 File unionExt3 = new File(parent, "UnionExt3.java");
59 File unionExt4 = new File(parent, "UnionExt4.java");
60 assertTrue(int32Ext1.exists());
61 assertTrue(int32Ext2.exists());
62 assertTrue(myDecimalType.exists());
63 assertTrue(stringExt1.exists());
64 assertTrue(stringExt2.exists());
65 assertTrue(stringExt3.exists());
66 assertTrue(unionExt1.exists());
67 assertTrue(unionExt2.exists());
68 assertTrue(unionExt3.exists());
69 assertTrue(unionExt4.exists());
70 assertFilesCount(parent, 16);
72 // Test if sources are compilable
73 testCompilation(sourcesOutputDir, compiledOutputDir);
75 String pkg = BASE_PKG + ".urn.opendaylight.foo.rev131008";
76 ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
77 Class<?> int32Ext1Class = Class.forName(pkg + ".Int32Ext1", true, loader);
78 Class<?> int32Ext2Class = Class.forName(pkg + ".Int32Ext2", true, loader);
79 Class<?> myDecimalTypeClass = Class.forName(pkg + ".MyDecimalType", true, loader);
80 Class<?> stringExt1Class = Class.forName(pkg + ".StringExt1", true, loader);
81 Class<?> stringExt2Class = Class.forName(pkg + ".StringExt2", true, loader);
82 Class<?> stringExt3Class = Class.forName(pkg + ".StringExt3", true, loader);
83 Class<?> unionExt1Class = Class.forName(pkg + ".UnionExt1", true, loader);
84 Class<?> unionExt2Class = Class.forName(pkg + ".UnionExt2", true, loader);
85 Class<?> unionExt3Class = Class.forName(pkg + ".UnionExt3", true, loader);
86 Class<?> unionExt4Class = Class.forName(pkg + ".UnionExt4", true, loader);
89 assertFalse(int32Ext1Class.isInterface());
90 assertContainsField(int32Ext1Class, VAL, Integer.class);
91 assertEquals(1, int32Ext1Class.getDeclaredFields().length);
92 assertContainsConstructor(int32Ext1Class, Integer.class);
93 assertContainsConstructor(int32Ext1Class, int32Ext1Class);
94 assertEquals(2, int32Ext1Class.getConstructors().length);
95 assertContainsDefaultMethods(int32Ext1Class);
98 assertFalse(int32Ext2Class.isInterface());
99 assertContainsFieldWithValue(int32Ext2Class, UNITS, String.class, "mile", Integer.class);
100 assertEquals(1, int32Ext2Class.getDeclaredFields().length);
101 assertContainsConstructor(int32Ext2Class, Integer.class);
102 assertContainsConstructor(int32Ext2Class, int32Ext2Class);
103 assertContainsConstructor(int32Ext2Class, int32Ext1Class);
104 assertEquals(3, int32Ext2Class.getDeclaredConstructors().length);
105 assertContainsMethod(int32Ext2Class, String.class, "toString");
106 assertEquals(1, int32Ext2Class.getDeclaredMethods().length);
108 // typedef string-ext1
109 assertFalse(stringExt1Class.isInterface());
110 assertContainsField(stringExt1Class, VAL, String.class);
111 assertContainsField(stringExt1Class, "patterns", List.class);
112 assertContainsField(stringExt1Class, "PATTERN_CONSTANTS", List.class);
113 assertContainsMethod(stringExt1Class, String.class, "getValue");
114 assertEquals(3, stringExt1Class.getDeclaredFields().length);
115 assertContainsConstructor(stringExt1Class, String.class);
116 assertContainsConstructor(stringExt1Class, stringExt1Class);
117 assertEquals(2, stringExt1Class.getDeclaredConstructors().length);
118 assertContainsGetLength(stringExt1Class);
119 assertContainsDefaultMethods(stringExt1Class);
121 // typedef string-ext2
122 assertFalse(stringExt2Class.isInterface());
123 assertEquals(0, stringExt2Class.getDeclaredFields().length);
124 assertContainsConstructor(stringExt2Class, String.class);
125 assertContainsConstructor(stringExt2Class, stringExt2Class);
126 assertContainsConstructor(stringExt2Class, stringExt1Class);
127 assertEquals(3, stringExt2Class.getDeclaredConstructors().length);
128 assertContainsGetLength(stringExt2Class);
129 assertEquals(1, stringExt2Class.getDeclaredMethods().length);
131 // typedef string-ext3
132 assertFalse(stringExt3Class.isInterface());
133 assertEquals(0, stringExt3Class.getDeclaredFields().length);
134 assertContainsConstructor(stringExt3Class, String.class);
135 assertContainsConstructor(stringExt3Class, stringExt3Class);
136 assertContainsConstructor(stringExt3Class, stringExt2Class);
137 assertEquals(3, stringExt3Class.getDeclaredConstructors().length);
138 assertEquals(0, stringExt3Class.getDeclaredMethods().length);
140 // typedef my-decimal-type
141 assertFalse(myDecimalTypeClass.isInterface());
142 assertContainsField(myDecimalTypeClass, VAL, BigDecimal.class);
143 assertEquals(1, myDecimalTypeClass.getDeclaredFields().length);
144 assertContainsMethod(myDecimalTypeClass, BigDecimal.class, "getValue");
145 assertContainsConstructor(myDecimalTypeClass, BigDecimal.class);
146 assertContainsConstructor(myDecimalTypeClass, myDecimalTypeClass);
147 assertEquals(2, myDecimalTypeClass.getDeclaredConstructors().length);
148 assertContainsDefaultMethods(myDecimalTypeClass);
150 // typedef union-ext1
151 assertFalse(unionExt1Class.isInterface());
152 assertContainsField(unionExt1Class, "_int16", Short.class);
153 assertContainsField(unionExt1Class, "_int32", Integer.class);
154 assertEquals(2, unionExt1Class.getDeclaredFields().length);
155 assertContainsMethod(unionExt1Class, Short.class, "getInt16");
156 assertContainsMethod(unionExt1Class, Integer.class, "getInt32");
157 assertContainsConstructor(unionExt1Class, Short.class);
158 assertContainsConstructor(unionExt1Class, Integer.class);
159 assertContainsConstructor(unionExt1Class, unionExt1Class);
160 assertEquals(3, unionExt1Class.getDeclaredConstructors().length);
161 assertContainsDefaultMethods(unionExt1Class);
163 // typedef union-ext2
164 assertFalse(unionExt2Class.isInterface());
165 assertEquals(0, unionExt2Class.getDeclaredFields().length);
166 assertEquals(0, unionExt2Class.getDeclaredMethods().length);
167 assertContainsConstructor(unionExt2Class, Short.class);
168 assertContainsConstructor(unionExt2Class, Integer.class);
169 assertContainsConstructor(unionExt2Class, unionExt2Class);
170 assertContainsConstructor(unionExt2Class, unionExt1Class);
171 assertEquals(4, unionExt2Class.getDeclaredConstructors().length);
173 // typedef union-ext3
174 assertFalse(unionExt3Class.isInterface());
175 assertContainsField(unionExt3Class, "_string", String.class);
176 assertContainsField(unionExt3Class, "_unionExt2", unionExt2Class);
177 assertContainsFieldWithValue(unionExt3Class, UNITS, String.class, "object id", String.class);
178 assertEquals(3, unionExt3Class.getDeclaredFields().length);
179 assertContainsMethod(unionExt3Class, String.class, "getString");
180 assertContainsMethod(unionExt3Class, unionExt2Class, "getUnionExt2");
181 assertContainsConstructor(unionExt3Class, String.class);
182 assertContainsConstructor(unionExt3Class, unionExt2Class);
183 assertContainsConstructor(unionExt3Class, unionExt3Class);
184 assertEquals(3, unionExt3Class.getDeclaredConstructors().length);
185 assertContainsDefaultMethods(unionExt3Class);
187 // typedef union-ext4
188 assertFalse(unionExt4Class.isInterface());
189 assertContainsField(unionExt4Class, "_unionExt3", unionExt3Class);
190 assertContainsField(unionExt4Class, "_int32Ext2", int32Ext2Class);
191 assertContainsField(unionExt4Class, "_empty", Boolean.class);
192 assertContainsField(unionExt4Class, "_myDecimalType", myDecimalTypeClass);
193 assertEquals(4, unionExt4Class.getDeclaredFields().length);
194 assertContainsMethod(unionExt4Class, unionExt3Class, "getUnionExt3");
195 assertContainsMethod(unionExt4Class, int32Ext2Class, "getInt32Ext2");
196 assertContainsMethod(unionExt4Class, Boolean.class, "isEmpty");
197 assertContainsMethod(unionExt4Class, myDecimalTypeClass, "getMyDecimalType");
198 assertContainsConstructor(unionExt4Class, unionExt3Class);
199 assertContainsConstructor(unionExt4Class, int32Ext2Class);
200 assertContainsConstructor(unionExt4Class, Boolean.class);
201 assertContainsConstructor(unionExt4Class, myDecimalTypeClass);
202 assertContainsConstructor(unionExt4Class, unionExt4Class);
203 assertEquals(5, unionExt4Class.getDeclaredConstructors().length);
204 assertContainsDefaultMethods(unionExt4Class);
206 cleanUp(sourcesOutputDir, compiledOutputDir);