/*
* 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.hamcrest.CoreMatchers.anyOf;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.opendaylight.yangtools.yang.stmt.StmtTestUtils.sourceForResource;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.Test;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode;
import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.model.api.SchemaNode;
import org.opendaylight.yangtools.yang.model.api.SchemaPath;
import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
import org.opendaylight.yangtools.yang.model.api.UsesNode;
import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
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 GroupingAndUsesStmtTest {
private static final StatementStreamSource MODULE = sourceForResource("/model/bar.yang");
private static final StatementStreamSource SUBMODULE = sourceForResource("/model/subfoo.yang");
private static final StatementStreamSource GROUPING_MODULE = sourceForResource("/model/baz.yang");
private static final StatementStreamSource USES_MODULE = sourceForResource("/model/foo.yang");
@Test
public void groupingTest() throws ReactorException {
final CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR.newBuild();
reactor.addSources(MODULE, GROUPING_MODULE);
final EffectiveSchemaContext result = reactor.buildEffective();
assertNotNull(result);
final Module testModule = result.findModuleByName("baz", null);
assertNotNull(testModule);
final Set<GroupingDefinition> groupings = testModule.getGroupings();
assertEquals(1, groupings.size());
final Iterator<GroupingDefinition> groupingsIterator = groupings.iterator();
final GroupingDefinition grouping = groupingsIterator.next();
assertEquals("target", grouping.getQName().getLocalName());
assertEquals(5, grouping.getChildNodes().size());
final AnyXmlSchemaNode anyXmlNode = (AnyXmlSchemaNode) grouping.getDataChildByName(QName.create(testModule.getQNameModule(), "data"));
assertNotNull(anyXmlNode);
final ChoiceSchemaNode choiceNode = (ChoiceSchemaNode) grouping.getDataChildByName(QName.create(testModule.getQNameModule(), "how"));
assertNotNull(choiceNode);
final LeafSchemaNode leafNode = (LeafSchemaNode) grouping.getDataChildByName(QName.create(testModule.getQNameModule(), "address"));
assertNotNull(leafNode);
final ContainerSchemaNode containerNode = (ContainerSchemaNode) grouping.getDataChildByName(QName.create(testModule.getQNameModule(), "port"));
assertNotNull(containerNode);
final ListSchemaNode listNode = (ListSchemaNode) grouping.getDataChildByName(QName.create(testModule.getQNameModule(), "addresses"));
assertNotNull(listNode);
assertEquals(1, grouping.getGroupings().size());
assertEquals("target-inner", grouping.getGroupings().iterator().next().getQName().getLocalName());
assertEquals(1, grouping.getTypeDefinitions().size());
assertEquals("group-type", grouping.getTypeDefinitions().iterator().next().getQName().getLocalName());
final List<UnknownSchemaNode> unknownSchemaNodes = grouping.getUnknownSchemaNodes();
assertEquals(1, unknownSchemaNodes.size());
final UnknownSchemaNode extensionUse = unknownSchemaNodes.get(0);
assertEquals("opendaylight", extensionUse.getExtensionDefinition().getQName().getLocalName());
}
@Test
public void usesAndRefinesTest() throws ReactorException {
final CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR.newBuild();
reactor.addSources(MODULE, SUBMODULE, GROUPING_MODULE, USES_MODULE);
final EffectiveSchemaContext result = reactor.buildEffective();
assertNotNull(result);
final Module testModule = result.findModuleByName("foo", null);
assertNotNull(testModule);
final Set<UsesNode> usesNodes = testModule.getUses();
assertEquals(1, usesNodes.size());
UsesNode usesNode = usesNodes.iterator().next();
assertEquals("target", usesNode.getGroupingPath().getLastComponent().getLocalName());
assertEquals(1, usesNode.getAugmentations().size());
ContainerSchemaNode container = (ContainerSchemaNode) testModule.getDataChildByName(QName.create(testModule.getQNameModule(), "peer"));
assertNotNull(container);
container = (ContainerSchemaNode) container.getDataChildByName(QName.create(testModule.getQNameModule(), "destination"));
assertEquals(1, container.getUses().size());
usesNode = container.getUses().iterator().next();
assertEquals("target", usesNode.getGroupingPath().getLastComponent().getLocalName());
final Map<SchemaPath, SchemaNode> refines = usesNode.getRefines();
assertEquals(4, refines.size());
final Iterator<SchemaPath> refinesKeysIterator = refines.keySet().iterator();
SchemaPath path = refinesKeysIterator.next();
assertThat(path.getLastComponent().getLocalName(), anyOf(is("port"), is("address"), is("addresses"), is("id")));
path = refinesKeysIterator.next();
assertThat(path.getLastComponent().getLocalName(), anyOf(is("port"), is("address"), is("addresses"), is("id")));
path = refinesKeysIterator.next();
assertThat(path.getLastComponent().getLocalName(), anyOf(is("port"), is("address"), is("addresses"), is("id")));
path = refinesKeysIterator.next();
assertThat(path.getLastComponent().getLocalName(), anyOf(is("port"), is("address"), is("addresses"), is("id")));
}
}