Adjust to yangtools-2.0.0 changes
[mdsal.git] / binding / mdsal-binding-java-api-generator / src / test / java / org / opendaylight / mdsal / binding / java / api / generator / test / Bug532Test.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 package org.opendaylight.mdsal.binding.java.api.generator.test;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotNull;
12 import static org.junit.Assert.assertTrue;
13 import static org.opendaylight.mdsal.binding.java.api.generator.test.CompilationTestUtils.BASE_PKG;
14 import static org.opendaylight.mdsal.binding.java.api.generator.test.CompilationTestUtils.COMPILER_OUTPUT_PATH;
15 import static org.opendaylight.mdsal.binding.java.api.generator.test.CompilationTestUtils.FS;
16 import static org.opendaylight.mdsal.binding.java.api.generator.test.CompilationTestUtils.GENERATOR_OUTPUT_PATH;
17 import static org.opendaylight.mdsal.binding.java.api.generator.test.CompilationTestUtils.cleanUp;
18 import static org.opendaylight.mdsal.binding.java.api.generator.test.CompilationTestUtils.getSourceFiles;
19 import static org.opendaylight.mdsal.binding.java.api.generator.test.CompilationTestUtils.testCompilation;
20
21 import com.google.common.collect.ImmutableSet;
22 import com.google.common.collect.Lists;
23 import java.io.File;
24 import java.io.IOException;
25 import java.lang.reflect.Constructor;
26 import java.net.URISyntaxException;
27 import java.net.URL;
28 import java.net.URLClassLoader;
29 import java.util.List;
30 import org.junit.Test;
31 import org.mockito.Mockito;
32 import org.opendaylight.mdsal.binding.java.api.generator.GeneratorJavaFile;
33 import org.opendaylight.mdsal.binding.model.api.Type;
34 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
35 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
36
37 /**
38  * Test correct functionality of copy constructor of generated builder classes.
39  */
40 public class Bug532Test extends BaseCompilationTest {
41
42     @Test
43     public void test() throws Exception {
44         final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "bug532");
45         assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
46         final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "bug532");
47         assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir());
48
49         generateTestSources("/compilation/list-gen-test", sourcesOutputDir);
50
51         // Test if sources are compilable
52         testCompilation(sourcesOutputDir, compiledOutputDir);
53
54         ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
55         Class<?> linksKeyClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.LinksKey", true, loader);
56         Class<?> linksClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.Links", true, loader);
57         Class<?> linksBuilderClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.LinksBuilder", true,
58                 loader);
59         Class<?> levelClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.links.Level", true, loader);
60         Class<?> nodeClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.links.Node", true, loader);
61         Class<?> nodeListClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.links.NodeList", true,
62                 loader);
63
64         // init default values
65         Byte expectedId = Byte.valueOf("5");
66         String expectedName = "test-link";
67         Integer expectedSize = 10;
68
69
70         Object expectedLevel = Mockito.mock(levelClass);
71         Integer expectedLinksId = 11;
72         Object expectedNode = Mockito.mock(nodeClass);
73         List<?> expectedNodeList = Lists.newArrayList(Mockito.mock(nodeListClass), Mockito.mock(nodeListClass));
74         Constructor<?> keyConstructor = linksKeyClass.getDeclaredConstructor(Byte.class, String.class, Integer.class);
75         Object expectedKey = keyConstructor.newInstance(expectedId, expectedName, expectedSize);
76
77         // create Links object
78         Object linksBuilder = linksBuilderClass.newInstance();
79         linksBuilderClass.getDeclaredMethod("setKey", linksKeyClass).invoke(linksBuilder, expectedKey);
80         linksBuilderClass.getDeclaredMethod("setLevel", levelClass).invoke(linksBuilder, expectedLevel);
81         linksBuilderClass.getDeclaredMethod("setLinksId", Integer.class).invoke(linksBuilder, expectedLinksId);
82         linksBuilderClass.getDeclaredMethod("setNode", nodeClass).invoke(linksBuilder, expectedNode);
83         linksBuilderClass.getDeclaredMethod("setNodeList", List.class).invoke(linksBuilder, expectedNodeList);
84         Object links = linksBuilderClass.getDeclaredMethod("build").invoke(linksBuilder);
85
86         // create LinksBuilder object with constructor with Links object
87         // argument
88         Constructor<?> linksBuilderConstructor = linksBuilderClass.getDeclaredConstructor(linksClass);
89         assertNotNull(linksBuilderConstructor);
90         Object linksBuilderTested = linksBuilderConstructor.newInstance(links);
91
92         // get values from LinksBuilder
93         Object actualKey = linksBuilderClass.getDeclaredMethod("getKey").invoke(linksBuilderTested);
94         Object actualId = linksBuilderClass.getDeclaredMethod("getId").invoke(linksBuilderTested);
95         Object actualName = linksBuilderClass.getDeclaredMethod("getName").invoke(linksBuilderTested);
96         Object actualSize = linksBuilderClass.getDeclaredMethod("getSize").invoke(linksBuilderTested);
97         Object actualLevel = linksBuilderClass.getDeclaredMethod("getLevel").invoke(linksBuilderTested);
98         Object actualLinksId = linksBuilderClass.getDeclaredMethod("getLinksId").invoke(linksBuilderTested);
99         Object actualNode = linksBuilderClass.getDeclaredMethod("getNode").invoke(linksBuilderTested);
100         Object actualNodeList = linksBuilderClass.getDeclaredMethod("getNodeList").invoke(linksBuilderTested);
101
102         // test
103         assertEquals(expectedKey, actualKey);
104         assertEquals(expectedId, actualId);
105         assertEquals(expectedName, actualName);
106         assertEquals(expectedSize, actualSize);
107         assertEquals(expectedLevel, actualLevel);
108         assertEquals(expectedLinksId, actualLinksId);
109         assertEquals(expectedNode, actualNode);
110         assertEquals(expectedNodeList, actualNodeList);
111
112         cleanUp(sourcesOutputDir, compiledOutputDir);
113     }
114
115     private void generateTestSources(final String resourceDirPath, final File sourcesOutputDir)
116             throws IOException, URISyntaxException {
117         final List<File> sourceFiles = getSourceFiles(resourceDirPath);
118         final SchemaContext context = YangParserTestUtils.parseYangFiles(sourceFiles);
119         final List<Type> types = bindingGenerator.generateTypes(context);
120         final GeneratorJavaFile generator = new GeneratorJavaFile(ImmutableSet.copyOf(types));
121         generator.generateToFile(sourcesOutputDir);
122     }
123
124 }