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