Bug 2366 - Effective statments impl merge, retest & bugfix
[yangtools.git] / yang / yang-parser-impl / src / test / java / org / opendaylight / yangtools / yang / stmt / effective / build / test / EffectiveModulesAndSubmodulesTest.java
1 package org.opendaylight.yangtools.yang.stmt.effective.build.test;
2
3 import static org.junit.Assert.assertEquals;
4 import static org.junit.Assert.assertFalse;
5 import static org.junit.Assert.assertNotNull;
6
7 import org.opendaylight.yangtools.yang.common.QName;
8
9 import org.opendaylight.yangtools.yang.common.QNameModule;
10 import java.net.URISyntaxException;
11 import java.net.URI;
12 import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
13 import java.util.Collection;
14 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
15 import java.util.Set;
16 import org.opendaylight.yangtools.yang.model.api.Module;
17 import org.opendaylight.yangtools.yang.stmt.test.StmtTestUtils;
18 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
19 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
20 import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor;
21 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangInferencePipeline;
22 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.EffectiveSchemaContext;
23 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangStatementSourceImpl;
24 import org.junit.Test;
25
26 public class EffectiveModulesAndSubmodulesTest {
27
28     private static final YangStatementSourceImpl ROOT_MODULE = new YangStatementSourceImpl(
29             "/stmt-test/submodules/root-module.yang",false);
30     private static final YangStatementSourceImpl IMPORTED_MODULE = new YangStatementSourceImpl(
31             "/stmt-test/submodules/imported-module.yang",false);
32     private static final YangStatementSourceImpl SUBMODULE_1 = new YangStatementSourceImpl(
33             "/stmt-test/submodules/submodule-1.yang",false);
34     private static final YangStatementSourceImpl SUBMODULE_2 = new YangStatementSourceImpl(
35             "/stmt-test/submodules/submodule-2.yang",false);
36     private static final YangStatementSourceImpl SUBMODULE_TO_SUBMODULE_1 = new YangStatementSourceImpl(
37             "/stmt-test/submodules/submodule-to-submodule-1.yang",false);
38
39     @Test
40     public void modulesAndSubmodulesSimpleReferencesTest()
41             throws SourceException, ReactorException, URISyntaxException {
42         CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
43                 .newBuild();
44         StmtTestUtils.addSources(reactor, ROOT_MODULE, IMPORTED_MODULE,
45                 SUBMODULE_1, SUBMODULE_2, SUBMODULE_TO_SUBMODULE_1);
46         EffectiveSchemaContext result = reactor.buildEffective();
47
48         assertNotNull(result);
49
50         Set<Module> modules = result.getModules();
51         assertNotNull(modules);
52         assertEquals(2, modules.size());
53
54         Module root = null;
55         Module imported = null;
56         for (Module module : modules) {
57             switch (module.getName()) {
58             case "root-module":
59                 root = module;
60                 break;
61             case "imported-module":
62                 imported = module;
63                 break;
64             default:
65             }
66             StmtTestUtils.printReferences(module, false, "");
67             StmtTestUtils.printChilds(module.getChildNodes(), "      ");
68         }
69
70         assertNotNull(root);
71         assertNotNull(imported);
72
73         Collection<DataSchemaNode> rootChildNodes = root.getChildNodes();
74         Collection<DataSchemaNode> importedChildNodes = imported
75                 .getChildNodes();
76
77         assertNotNull(rootChildNodes);
78         assertNotNull(importedChildNodes);
79
80         assertEquals(3, rootChildNodes.size());
81         assertEquals(1, importedChildNodes.size());
82
83         Set<Module> rootSubmodules = root.getSubmodules();
84         Set<Module> importedSubmodules = imported.getSubmodules();
85
86         assertNotNull(rootSubmodules);
87         assertNotNull(importedSubmodules);
88
89         assertEquals(2, rootSubmodules.size());
90         assertEquals(0, importedSubmodules.size());
91
92         Module sub1 = null;
93         Module sub2 = null;
94         for (Module rootSubmodule : rootSubmodules) {
95             switch (rootSubmodule.getName()) {
96             case "submodule-1":
97                 sub1 = rootSubmodule;
98                 break;
99             case "submodule-2":
100                 sub2 = rootSubmodule;
101                 break;
102             default:
103             }
104         }
105
106         assertNotNull(sub1);
107         assertNotNull(sub2);
108
109         assertEquals(QNameModule.create(new URI("root-module"),
110                 SimpleDateFormatUtil.DEFAULT_DATE_REV), sub1.getQNameModule());
111         assertEquals(QNameModule.create(new URI("root-module"),
112                 SimpleDateFormatUtil.DEFAULT_DATE_REV), sub2.getQNameModule());
113
114         Collection<DataSchemaNode> sub1ChildNodes = sub1.getChildNodes();
115         Collection<DataSchemaNode> sub2ChildNodes = sub2.getChildNodes();
116
117         assertNotNull(sub1ChildNodes);
118         assertNotNull(sub2ChildNodes);
119
120         assertEquals(2, sub1ChildNodes.size());
121         assertEquals(1, sub2ChildNodes.size());
122
123         Set<Module> sub1Submodules = sub1.getSubmodules();
124         Set<Module> sub2Submodules = sub2.getSubmodules();
125
126         assertNotNull(sub1Submodules);
127         assertNotNull(sub2Submodules);
128
129         assertEquals(1, sub1Submodules.size());
130         assertEquals(0, sub2Submodules.size());
131
132         Module sub1Submodule = null;
133         for (Module submodule : sub1Submodules) {
134             switch (submodule.getName()) {
135             case "submodule-to-submodule-1":
136                 sub1Submodule = submodule;
137                 break;
138             default:
139             }
140         }
141
142         assertNotNull(sub1Submodule);
143
144         assertEquals(QNameModule.create(new URI("root-module"),
145                 SimpleDateFormatUtil.DEFAULT_DATE_REV),
146                 sub1Submodule.getQNameModule());
147
148         Collection<DataSchemaNode> sub1SubmoduleChildNodes = sub1Submodule
149                 .getChildNodes();
150         assertNotNull(sub1SubmoduleChildNodes);
151         assertEquals(1, sub1SubmoduleChildNodes.size());
152
153         Set<Module> sub1SubmoduleSubmodules = sub1Submodule.getSubmodules();
154         assertNotNull(sub1SubmoduleSubmodules);
155         assertEquals(0, sub1SubmoduleSubmodules.size());
156
157         findModulesSubTest(result, root, imported);
158
159         getDataChildByNameSubTest(result, root);
160
161     }
162
163     private void getDataChildByNameSubTest(EffectiveSchemaContext result,
164             Module root) {
165         DataSchemaNode containerInRoot = result.getDataChildByName(QName
166                 .create(root.getQNameModule(), "container-in-root-module"));
167         assertNotNull(containerInRoot);
168         assertEquals("desc", containerInRoot.getDescription());
169     }
170
171     private void findModulesSubTest(EffectiveSchemaContext result, Module root,
172             Module imported) throws URISyntaxException {
173         Module foundRoot = result.findModuleByName("root-module",
174                 SimpleDateFormatUtil.DEFAULT_DATE_REV);
175         Set<Module> foundRoots = result.findModuleByNamespace(new URI(
176                 "root-module"));
177         Module foundRoot3 = result.findModuleByNamespaceAndRevision(new URI(
178                 "root-module"), SimpleDateFormatUtil.DEFAULT_DATE_REV);
179
180         assertNotNull(foundRoot);
181         assertNotNull(foundRoots);
182         assertEquals(1, foundRoots.size());
183         Module foundRoot2 = foundRoots.iterator().next();
184
185         assertNotNull(foundRoot2);
186         assertNotNull(foundRoot3);
187
188         assertEquals(root, foundRoot);
189         assertEquals(root, foundRoot2);
190         assertEquals(root, foundRoot3);
191
192         Module foundImported = result.findModuleByName("imported-module",
193                 SimpleDateFormatUtil.DEFAULT_DATE_REV);
194         Set<Module> foundImporteds = result.findModuleByNamespace(new URI(
195                 "imported-module"));
196         Module foundImported3 = result.findModuleByNamespaceAndRevision(
197                 new URI("imported-module"),
198                 SimpleDateFormatUtil.DEFAULT_DATE_REV);
199
200         assertNotNull(foundImported);
201         assertNotNull(foundImporteds);
202         assertEquals(1, foundImporteds.size());
203         Module foundImported2 = foundImporteds.iterator().next();
204
205         assertNotNull(foundImported2);
206         assertNotNull(foundImported3);
207
208         assertEquals(imported, foundImported);
209         assertEquals(imported, foundImported2);
210         assertEquals(imported, foundImported3);
211
212         assertFalse(root.equals(imported));
213     }
214
215 }