Fix detection of reused substatements
[yangtools.git] / yang / yang-parser-rfc7950 / src / test / java / org / opendaylight / yangtools / yang / stmt / YT1212Test.java
index ba93e183c88a8466803b484dc280f454ebc7c01a..a27de9aec3f825923a96b6f564a95c45df4fa2b6 100644 (file)
@@ -7,17 +7,22 @@
  */
 package org.opendaylight.yangtools.yang.stmt;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNotSame;
 import static org.junit.Assert.assertSame;
 
 import java.net.URI;
+import java.util.List;
+import java.util.stream.Collectors;
 import org.junit.Test;
 import org.opendaylight.yangtools.yang.common.QNameModule;
 import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ContainerEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.GroupingEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.LeafEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.NotificationEffectiveStatement;
 
 public class YT1212Test {
     @Test
@@ -61,4 +66,29 @@ public class YT1212Test {
         // The 'type' is not context-independent, but it being copy-insensitive and statements get reused
         assertSame(foo.effectiveSubstatements(), grpFoo.effectiveSubstatements());
     }
+
+    @Test
+    public void testContainerStatementReuse() throws Exception {
+        final ModuleEffectiveStatement module = StmtTestUtils.parseYangSource("/bugs/YT1212/container.yang")
+            .getModuleStatements()
+            .get(QNameModule.create(URI.create("foo")));
+        assertNotNull(module);
+
+        final NotificationEffectiveStatement notif =
+            module.findFirstEffectiveSubstatement(NotificationEffectiveStatement.class).orElseThrow();
+        final List<GroupingEffectiveStatement> groupings = notif.effectiveSubstatements().stream()
+            .filter(GroupingEffectiveStatement.class::isInstance).map(GroupingEffectiveStatement.class::cast)
+            .collect(Collectors.toList());
+        assertEquals(2, groupings.size());
+        final GroupingEffectiveStatement grp = groupings.get(0);
+        assertEquals("grp", grp.argument().getLocalName());
+        final GroupingEffectiveStatement barGrp = groupings.get(1);
+        assertEquals("bar", barGrp.argument().getLocalName());
+        final ContainerEffectiveStatement bar = notif.findFirstEffectiveSubstatement(ContainerEffectiveStatement.class)
+            .orElseThrow();
+
+        // Container needs to be reused
+        assertSame(bar.findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow(),
+            barGrp.findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow());
+    }
 }