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