2 * Copyright (c) 2016 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.yang.stmt;
10 import static org.junit.jupiter.api.Assertions.assertEquals;
11 import static org.junit.jupiter.api.Assertions.assertNotEquals;
12 import static org.junit.jupiter.api.Assertions.assertNotNull;
13 import static org.opendaylight.yangtools.yang.stmt.StmtTestUtils.sourceForResource;
15 import java.util.Collection;
16 import java.util.Optional;
17 import org.junit.jupiter.api.Test;
18 import org.opendaylight.yangtools.yang.common.QName;
19 import org.opendaylight.yangtools.yang.common.QNameModule;
20 import org.opendaylight.yangtools.yang.common.XMLNamespace;
21 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
22 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
23 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
24 import org.opendaylight.yangtools.yang.model.api.Module;
25 import org.opendaylight.yangtools.yang.model.api.ModuleLike;
26 import org.opendaylight.yangtools.yang.model.api.Submodule;
27 import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.RFC7950Reactors;
28 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
29 import org.opendaylight.yangtools.yang.parser.spi.source.StatementStreamSource;
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
33 class EffectiveModulesAndSubmodulesTest {
34 private static final Logger LOG = LoggerFactory.getLogger(EffectiveModulesAndSubmodulesTest.class);
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");
46 private static final QNameModule ROOT = QNameModule.of("root-module");
49 void modulesAndSubmodulesSimpleReferencesTest() throws ReactorException {
50 final var result = RFC7950Reactors.defaultReactor().newBuild()
51 .addSources(ROOT_MODULE, IMPORTED_MODULE, SUBMODULE_1, SUBMODULE_2, SUBMODULE_TO_SUBMODULE_1)
54 assertNotNull(result);
56 final var modules = result.getModules();
57 assertNotNull(modules);
58 assertEquals(2, modules.size());
61 Module imported = null;
62 for (final Module module : modules) {
63 switch (module.getName()) {
67 case "imported-module":
72 printReferences(module, false, "");
73 printChilds(module.getChildNodes(), " ");
77 assertNotNull(imported);
79 final var rootChildNodes = root.getChildNodes();
80 final var importedChildNodes = imported.getChildNodes();
82 assertNotNull(rootChildNodes);
83 assertNotNull(importedChildNodes);
85 assertEquals(3, rootChildNodes.size());
86 assertEquals(1, importedChildNodes.size());
88 final var rootSubmodules = root.getSubmodules();
89 final var importedSubmodules = imported.getSubmodules();
91 assertNotNull(rootSubmodules);
92 assertNotNull(importedSubmodules);
94 assertEquals(2, rootSubmodules.size());
95 assertEquals(0, importedSubmodules.size());
97 Submodule sub1 = null;
98 Submodule sub2 = null;
99 for (var rootSubmodule : rootSubmodules) {
100 switch (rootSubmodule.getName()) {
102 sub1 = rootSubmodule;
105 sub2 = rootSubmodule;
114 assertEquals(ROOT, sub1.getQNameModule());
115 assertEquals(ROOT, sub2.getQNameModule());
117 final var sub1ChildNodes = sub1.getChildNodes();
118 final var sub2ChildNodes = sub2.getChildNodes();
120 assertNotNull(sub1ChildNodes);
121 assertNotNull(sub2ChildNodes);
123 assertEquals(1, sub1ChildNodes.size());
124 assertEquals(1, sub2ChildNodes.size());
126 final var sub1Submodules = sub1.getSubmodules();
127 final var sub2Submodules = sub2.getSubmodules();
129 assertNotNull(sub1Submodules);
130 assertNotNull(sub2Submodules);
132 assertEquals(1, sub1Submodules.size());
133 assertEquals(0, sub2Submodules.size());
135 Submodule sub1Submodule = null;
136 for (var submodule : sub1Submodules) {
137 switch (submodule.getName()) {
138 case "submodule-to-submodule-1":
139 sub1Submodule = submodule;
145 assertNotNull(sub1Submodule);
147 assertEquals(ROOT, sub1Submodule.getQNameModule());
149 final var sub1SubmoduleChildNodes = sub1Submodule.getChildNodes();
150 assertNotNull(sub1SubmoduleChildNodes);
151 assertEquals(1, sub1SubmoduleChildNodes.size());
153 final var sub1SubmoduleSubmodules = sub1Submodule.getSubmodules();
154 assertNotNull(sub1SubmoduleSubmodules);
155 assertEquals(0, sub1SubmoduleSubmodules.size());
157 findModulesSubTest(result, root, imported);
159 getDataChildByNameSubTest(result, root);
162 private static void getDataChildByNameSubTest(final EffectiveModelContext result, final Module root) {
163 final var containerInRoot = result.getDataChildByName(
164 QName.create(root.getQNameModule(), "container-in-root-module"));
165 assertEquals(Optional.of("desc"), containerInRoot.getDescription());
168 private static void findModulesSubTest(final EffectiveModelContext result, final Module root,
169 final Module imported) {
170 final var foundRoot = result.findModule("root-module").orElseThrow();
171 final var foundRoots = result.findModules(XMLNamespace.of("root-module"));
172 final var foundRoot3 = result.findModule(XMLNamespace.of("root-module")).orElseThrow();
174 assertNotNull(foundRoot);
175 assertNotNull(foundRoots);
176 assertEquals(1, foundRoots.size());
177 final var foundRoot2 = foundRoots.iterator().next();
179 assertNotNull(foundRoot2);
180 assertNotNull(foundRoot3);
182 assertEquals(root, foundRoot);
183 assertEquals(root, foundRoot2);
184 assertEquals(root, foundRoot3);
186 final var foundImported = result.findModule("imported-module").orElseThrow();
187 final var foundImporteds = result.findModules(XMLNamespace.of("imported-module"));
188 final var foundImported3 = result.findModule(XMLNamespace.of("imported-module")).orElseThrow();
190 assertNotNull(foundImported);
191 assertNotNull(foundImporteds);
192 assertEquals(1, foundImporteds.size());
193 final var foundImported2 = foundImporteds.iterator().next();
195 assertNotNull(foundImported2);
196 assertNotNull(foundImported3);
198 assertEquals(imported, foundImported);
199 assertEquals(imported, foundImported2);
200 assertEquals(imported, foundImported3);
202 assertNotEquals(root, imported);
205 private static void printReferences(final ModuleLike module, final boolean isSubmodule, final String indent) {
206 LOG.debug("{}{} {}", indent, isSubmodule ? "Submodule" : "Module", module.getName());
207 for (var submodule : module.getSubmodules()) {
208 printReferences(submodule, true, indent + " ");
209 printChilds(submodule.getChildNodes(), indent + " ");
213 private static void printChilds(final Collection<? extends DataSchemaNode> childNodes, final String indent) {
214 for (var child : childNodes) {
215 LOG.debug("{}{} {}", indent, "Child", child.getQName().getLocalName());
216 if (child instanceof DataNodeContainer container) {
217 printChilds(container.getChildNodes(), indent + " ");