/*
* Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.yangtools.yang.stmt;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.opendaylight.yangtools.yang.stmt.StmtTestUtils.sourceForResource;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Collection;
import java.util.Set;
import org.junit.Test;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.common.QNameModule;
import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
import org.opendaylight.yangtools.yang.parser.spi.source.StatementStreamSource;
import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor;
import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangInferencePipeline;
import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.EffectiveSchemaContext;
public class EffectiveModulesAndSubmodulesTest {
private static final StatementStreamSource ROOT_MODULE = sourceForResource(
"/stmt-test/submodules/root-module.yang");
private static final StatementStreamSource IMPORTED_MODULE = sourceForResource(
"/stmt-test/submodules/imported-module.yang");
private static final StatementStreamSource SUBMODULE_1 = sourceForResource(
"/stmt-test/submodules/submodule-1.yang");
private static final StatementStreamSource SUBMODULE_2 = sourceForResource(
"/stmt-test/submodules/submodule-2.yang");
private static final StatementStreamSource SUBMODULE_TO_SUBMODULE_1 = sourceForResource(
"/stmt-test/submodules/submodule-to-submodule-1.yang");
@Test
public void modulesAndSubmodulesSimpleReferencesTest()
throws SourceException, ReactorException, URISyntaxException {
final CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
.newBuild();
reactor.addSources(ROOT_MODULE, IMPORTED_MODULE,
SUBMODULE_1, SUBMODULE_2, SUBMODULE_TO_SUBMODULE_1);
final EffectiveSchemaContext result = reactor.buildEffective();
assertNotNull(result);
final Set<Module> modules = result.getModules();
assertNotNull(modules);
assertEquals(2, modules.size());
Module root = null;
Module imported = null;
for (final Module module : modules) {
switch (module.getName()) {
case "root-module":
root = module;
break;
case "imported-module":
imported = module;
break;
default:
}
StmtTestUtils.printReferences(module, false, "");
StmtTestUtils.printChilds(module.getChildNodes(), " ");
}
assertNotNull(root);
assertNotNull(imported);
final Collection<DataSchemaNode> rootChildNodes = root.getChildNodes();
final Collection<DataSchemaNode> importedChildNodes = imported
.getChildNodes();
assertNotNull(rootChildNodes);
assertNotNull(importedChildNodes);
assertEquals(3, rootChildNodes.size());
assertEquals(1, importedChildNodes.size());
final Set<Module> rootSubmodules = root.getSubmodules();
final Set<Module> importedSubmodules = imported.getSubmodules();
assertNotNull(rootSubmodules);
assertNotNull(importedSubmodules);
assertEquals(2, rootSubmodules.size());
assertEquals(0, importedSubmodules.size());
Module sub1 = null;
Module sub2 = null;
for (final Module rootSubmodule : rootSubmodules) {
switch (rootSubmodule.getName()) {
case "submodule-1":
sub1 = rootSubmodule;
break;
case "submodule-2":
sub2 = rootSubmodule;
break;
default:
}
}
assertNotNull(sub1);
assertNotNull(sub2);
assertEquals(QNameModule.create(new URI("root-module"),
SimpleDateFormatUtil.DEFAULT_DATE_REV), sub1.getQNameModule());
assertEquals(QNameModule.create(new URI("root-module"),
SimpleDateFormatUtil.DEFAULT_DATE_REV), sub2.getQNameModule());
final Collection<DataSchemaNode> sub1ChildNodes = sub1.getChildNodes();
final Collection<DataSchemaNode> sub2ChildNodes = sub2.getChildNodes();
assertNotNull(sub1ChildNodes);
assertNotNull(sub2ChildNodes);
assertEquals(1, sub1ChildNodes.size());
assertEquals(1, sub2ChildNodes.size());
final Set<Module> sub1Submodules = sub1.getSubmodules();
final Set<Module> sub2Submodules = sub2.getSubmodules();
assertNotNull(sub1Submodules);
assertNotNull(sub2Submodules);
assertEquals(1, sub1Submodules.size());
assertEquals(0, sub2Submodules.size());
Module sub1Submodule = null;
for (final Module submodule : sub1Submodules) {
switch (submodule.getName()) {
case "submodule-to-submodule-1":
sub1Submodule = submodule;
break;
default:
}
}
assertNotNull(sub1Submodule);
assertEquals(QNameModule.create(new URI("root-module"),
SimpleDateFormatUtil.DEFAULT_DATE_REV),
sub1Submodule.getQNameModule());
final Collection<DataSchemaNode> sub1SubmoduleChildNodes = sub1Submodule
.getChildNodes();
assertNotNull(sub1SubmoduleChildNodes);
assertEquals(1, sub1SubmoduleChildNodes.size());
final Set<Module> sub1SubmoduleSubmodules = sub1Submodule.getSubmodules();
assertNotNull(sub1SubmoduleSubmodules);
assertEquals(0, sub1SubmoduleSubmodules.size());
findModulesSubTest(result, root, imported);
getDataChildByNameSubTest(result, root);
}
private static void getDataChildByNameSubTest(final EffectiveSchemaContext result,
final Module root) {
final DataSchemaNode containerInRoot = result.getDataChildByName(QName
.create(root.getQNameModule(), "container-in-root-module"));
assertNotNull(containerInRoot);
assertEquals("desc", containerInRoot.getDescription());
}
private static void findModulesSubTest(final EffectiveSchemaContext result, final Module root,
final Module imported) throws URISyntaxException {
final Module foundRoot = result.findModuleByName("root-module",
SimpleDateFormatUtil.DEFAULT_DATE_REV);
final Set<Module> foundRoots = result.findModuleByNamespace(new URI(
"root-module"));
final Module foundRoot3 = result.findModuleByNamespaceAndRevision(new URI(
"root-module"), SimpleDateFormatUtil.DEFAULT_DATE_REV);
assertNotNull(foundRoot);
assertNotNull(foundRoots);
assertEquals(1, foundRoots.size());
final Module foundRoot2 = foundRoots.iterator().next();
assertNotNull(foundRoot2);
assertNotNull(foundRoot3);
assertEquals(root, foundRoot);
assertEquals(root, foundRoot2);
assertEquals(root, foundRoot3);
final Module foundImported = result.findModuleByName("imported-module",
SimpleDateFormatUtil.DEFAULT_DATE_REV);
final Set<Module> foundImporteds = result.findModuleByNamespace(new URI(
"imported-module"));
final Module foundImported3 = result.findModuleByNamespaceAndRevision(
new URI("imported-module"),
SimpleDateFormatUtil.DEFAULT_DATE_REV);
assertNotNull(foundImported);
assertNotNull(foundImporteds);
assertEquals(1, foundImporteds.size());
final Module foundImported2 = foundImporteds.iterator().next();
assertNotNull(foundImported2);
assertNotNull(foundImported3);
assertEquals(imported, foundImported);
assertEquals(imported, foundImported2);
assertEquals(imported, foundImported3);
assertFalse(root.equals(imported));
}
}