+/*
+ * Copyright (c) 2017 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.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
+import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+
+public class Bug6183Test {
+ private static final String FOO_NS = "foo";
+ private static final String FOO_REV = "1970-01-01";
+
+ @Test
+ public void testYang10() throws Exception {
+ assertSchemaContext(StmtTestUtils.parseYangSources("/bugs/bug6183/yang10"));
+ }
+
+ @Test
+ public void testYang11() throws Exception {
+ assertSchemaContext(StmtTestUtils.parseYangSources("/bugs/bug6183/yang11"));
+ }
+
+ public void assertSchemaContext(final SchemaContext context) throws Exception {
+ assertNotNull(context);
+ assertEquals(3, context.getChildNodes().size());
+ assertEquals(1, context.getModules().size());
+ assertEquals(4, context.getModules().iterator().next().getAugmentations().size());
+
+ assertTrue(context.getDataChildByName(foo("before")) instanceof ContainerSchemaNode);
+ assertTrue(context.getDataChildByName(foo("after")) instanceof ContainerSchemaNode);
+
+ final DataSchemaNode dataChildByName = context.getDataChildByName(foo("my-choice"));
+ assertTrue(dataChildByName instanceof ChoiceSchemaNode);
+ final ChoiceSchemaNode myChoice = (ChoiceSchemaNode) dataChildByName;
+
+ assertEquals(4, myChoice.getCases().size());
+
+ final ChoiceCaseNode implCase = myChoice.getCaseNodeByName(foo("implicit-case-container"));
+ assertNotNull(implCase);
+ final ChoiceCaseNode declCaseOne = myChoice.getCaseNodeByName(foo("declared-case-one"));
+ assertNotNull(declCaseOne);
+ final ChoiceCaseNode secondImplCase = myChoice.getCaseNodeByName(foo("second-implicit-case-container"));
+ assertNotNull(secondImplCase);
+ final ChoiceCaseNode declCaseTwo = myChoice.getCaseNodeByName(foo("declared-case-two"));
+ assertNotNull(declCaseTwo);
+
+ assertEquals(1, declCaseOne.getChildNodes().size());
+ assertFalse(getLeafSchemaNode(declCaseOne, "leaf-in-declare-case-one").isAugmenting());
+ assertEquals(1, declCaseTwo.getChildNodes().size());
+ assertFalse(getLeafSchemaNode(declCaseTwo, "leaf-in-declare-case-two").isAugmenting());
+
+ assertEquals(2, implCase.getChildNodes().size());
+ assertTrue(getLeafSchemaNode(implCase, "leaf-after-container").isAugmenting());
+ final ContainerSchemaNode implCaseContainer = getContainerSchemaNode(implCase, "implicit-case-container");
+
+ assertEquals(3, implCaseContainer.getChildNodes().size());
+ assertTrue(getLeafSchemaNode(implCaseContainer, "leaf-inside-container").isAugmenting());
+ assertFalse(getLeafSchemaNode(implCaseContainer, "declared-leaf-in-case-container").isAugmenting());
+ final ContainerSchemaNode declContInCaseCont = getContainerSchemaNode(implCaseContainer,
+ "declared-container-in-case-container");
+
+ assertEquals(1, declContInCaseCont.getChildNodes().size());
+ assertFalse(getLeafSchemaNode(declContInCaseCont, "declared-leaf").isAugmenting());
+
+ assertEquals(2, secondImplCase.getChildNodes().size());
+ assertTrue(getLeafSchemaNode(secondImplCase, "leaf-after-second-container").isAugmenting());
+ final ContainerSchemaNode secondImplCaseContainer = getContainerSchemaNode(secondImplCase,
+ "second-implicit-case-container");
+
+ assertEquals(2, secondImplCaseContainer.getChildNodes().size());
+ assertTrue(getLeafSchemaNode(secondImplCaseContainer, "leaf-inside-second-container").isAugmenting());
+ assertFalse(getLeafSchemaNode(secondImplCaseContainer, "declared-leaf-in-second-case-container").isAugmenting());
+ }
+
+ private static ContainerSchemaNode getContainerSchemaNode(final DataNodeContainer parent, final String containerName) {
+ final DataSchemaNode dataChildByName = parent.getDataChildByName(foo(containerName));
+ assertTrue(dataChildByName instanceof ContainerSchemaNode);
+ return (ContainerSchemaNode) dataChildByName;
+ }
+
+ private static LeafSchemaNode getLeafSchemaNode(final DataNodeContainer parent, final String leafName) {
+ final DataSchemaNode dataChildByName = parent.getDataChildByName(foo(leafName));
+ assertTrue(dataChildByName instanceof LeafSchemaNode);
+ return (LeafSchemaNode) dataChildByName;
+ }
+
+ private static QName foo(final String localName) {
+ return QName.create(FOO_NS, FOO_REV, localName);
+ }
+}