2 * Copyright (c) 2020 PANTHEON.tech, s.r.o. 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.Assert.assertEquals;
11 import static org.junit.Assert.assertNotNull;
12 import static org.junit.Assert.assertNotSame;
13 import static org.junit.Assert.assertSame;
15 import java.util.List;
16 import java.util.stream.Collectors;
17 import org.junit.Test;
18 import org.opendaylight.yangtools.yang.common.QNameModule;
19 import org.opendaylight.yangtools.yang.common.XMLNamespace;
20 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentEffectiveStatement;
21 import org.opendaylight.yangtools.yang.model.api.stmt.CaseEffectiveStatement;
22 import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceEffectiveStatement;
23 import org.opendaylight.yangtools.yang.model.api.stmt.ContainerEffectiveStatement;
24 import org.opendaylight.yangtools.yang.model.api.stmt.GroupingEffectiveStatement;
25 import org.opendaylight.yangtools.yang.model.api.stmt.LeafEffectiveStatement;
26 import org.opendaylight.yangtools.yang.model.api.stmt.LeafListEffectiveStatement;
27 import org.opendaylight.yangtools.yang.model.api.stmt.ListEffectiveStatement;
28 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement;
29 import org.opendaylight.yangtools.yang.model.api.stmt.NotificationEffectiveStatement;
30 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement;
31 import org.opendaylight.yangtools.yang.model.api.stmt.UsesEffectiveStatement;
33 public class YT1208Test {
35 public void testAugmentStatementReuse() throws Exception {
36 final ModuleEffectiveStatement module = StmtTestUtils.parseYangSource("/bugs/YT1208/augment.yang")
37 .getModuleStatement(QNameModule.create(XMLNamespace.of("foo")));
39 final NotificationEffectiveStatement notif = module
40 .findFirstEffectiveSubstatement(NotificationEffectiveStatement.class).orElseThrow();
42 final AugmentEffectiveStatement grpAug = notif
43 .findFirstEffectiveSubstatement(GroupingEffectiveStatement.class).orElseThrow()
44 .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow()
45 .findFirstEffectiveSubstatement(AugmentEffectiveStatement.class).orElseThrow();
46 final AugmentEffectiveStatement contAug = notif
47 .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow()
48 .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow()
49 .findFirstEffectiveSubstatement(AugmentEffectiveStatement.class).orElseThrow();
51 assertSame(contAug, grpAug);
55 public void testCaseStatementReuse() throws Exception {
56 final ModuleEffectiveStatement module = StmtTestUtils.parseYangSource("/bugs/YT1208/case.yang")
57 .getModuleStatement(QNameModule.create(XMLNamespace.of("foo")));
59 final NotificationEffectiveStatement notif = module
60 .findFirstEffectiveSubstatement(NotificationEffectiveStatement.class).orElseThrow();
62 final CaseEffectiveStatement grpBar = notif
63 .findFirstEffectiveSubstatement(GroupingEffectiveStatement.class).orElseThrow()
64 .findFirstEffectiveSubstatement(ChoiceEffectiveStatement.class).orElseThrow()
65 .findFirstEffectiveSubstatement(CaseEffectiveStatement.class).orElseThrow();
66 final CaseEffectiveStatement contBar = notif
67 .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow()
68 .findFirstEffectiveSubstatement(ChoiceEffectiveStatement.class).orElseThrow()
69 .findFirstEffectiveSubstatement(CaseEffectiveStatement.class).orElseThrow();
71 assertSame(contBar, grpBar);
75 public void testChoiceStatementReuse() throws Exception {
76 final ModuleEffectiveStatement module = StmtTestUtils.parseYangSource("/bugs/YT1208/choice.yang")
77 .getModuleStatement(QNameModule.create(XMLNamespace.of("foo")));
79 final NotificationEffectiveStatement notif = module
80 .findFirstEffectiveSubstatement(NotificationEffectiveStatement.class).orElseThrow();
82 final ChoiceEffectiveStatement grpBar = notif
83 .findFirstEffectiveSubstatement(GroupingEffectiveStatement.class).orElseThrow()
84 .findFirstEffectiveSubstatement(ChoiceEffectiveStatement.class).orElseThrow();
85 final ChoiceEffectiveStatement contBar = notif
86 .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow()
87 .findFirstEffectiveSubstatement(ChoiceEffectiveStatement.class).orElseThrow();
89 assertSame(contBar, grpBar);
93 public void testGroupingStatementReuse() throws Exception {
94 final ModuleEffectiveStatement module = StmtTestUtils.parseYangSource("/bugs/YT1208/grouping.yang")
95 .getModuleStatement(QNameModule.create(XMLNamespace.of("foo")));
97 final NotificationEffectiveStatement notif = module
98 .findFirstEffectiveSubstatement(NotificationEffectiveStatement.class).orElseThrow();
100 final GroupingEffectiveStatement grpBar = notif
101 .findFirstEffectiveSubstatement(GroupingEffectiveStatement.class).orElseThrow()
102 .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow()
103 .findFirstEffectiveSubstatement(GroupingEffectiveStatement.class).orElseThrow();
104 final GroupingEffectiveStatement contBar = notif
105 .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow()
106 .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow()
107 .findFirstEffectiveSubstatement(GroupingEffectiveStatement.class).orElseThrow();
109 assertSame(contBar, grpBar);
113 public void testLeafStatementReuse() throws Exception {
114 final ModuleEffectiveStatement module = StmtTestUtils.parseYangSource("/bugs/YT1208/leaf.yang")
115 .getModuleStatement(QNameModule.create(XMLNamespace.of("foo")));
116 assertNotNull(module);
118 final NotificationEffectiveStatement notif = module
119 .findFirstEffectiveSubstatement(NotificationEffectiveStatement.class).orElseThrow();
121 final LeafEffectiveStatement grpBar = notif
122 .findFirstEffectiveSubstatement(GroupingEffectiveStatement.class).orElseThrow()
123 .findFirstEffectiveSubstatement(LeafEffectiveStatement.class).orElseThrow();
124 final LeafEffectiveStatement contBar = notif
125 .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow()
126 .findFirstEffectiveSubstatement(LeafEffectiveStatement.class).orElseThrow();
128 assertSame(contBar, grpBar);
132 public void testLeafListStatementReuse() throws Exception {
133 final ModuleEffectiveStatement module = StmtTestUtils.parseYangSource("/bugs/YT1208/leaflist.yang")
134 .getModuleStatement(QNameModule.create(XMLNamespace.of("foo")));
136 final NotificationEffectiveStatement notif = module
137 .findFirstEffectiveSubstatement(NotificationEffectiveStatement.class).orElseThrow();
139 final LeafListEffectiveStatement grpBar = notif
140 .findFirstEffectiveSubstatement(GroupingEffectiveStatement.class).orElseThrow()
141 .findFirstEffectiveSubstatement(LeafListEffectiveStatement.class).orElseThrow();
142 final LeafListEffectiveStatement contBar = notif
143 .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow()
144 .findFirstEffectiveSubstatement(LeafListEffectiveStatement.class).orElseThrow();
146 assertSame(contBar, grpBar);
150 public void testListStatementReuse() throws Exception {
151 final ModuleEffectiveStatement module = StmtTestUtils.parseYangSource("/bugs/YT1208/list.yang")
152 .getModuleStatement(QNameModule.create(XMLNamespace.of("foo")));
154 final NotificationEffectiveStatement notif = module
155 .findFirstEffectiveSubstatement(NotificationEffectiveStatement.class).orElseThrow();
157 final ListEffectiveStatement grpBar = notif
158 .findFirstEffectiveSubstatement(GroupingEffectiveStatement.class).orElseThrow()
159 .findFirstEffectiveSubstatement(ListEffectiveStatement.class).orElseThrow();
160 final ListEffectiveStatement contBar = notif
161 .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow()
162 .findFirstEffectiveSubstatement(ListEffectiveStatement.class).orElseThrow();
164 assertSame(contBar, grpBar);
168 public void testTypedefStatementReuse() throws Exception {
169 final ModuleEffectiveStatement module = StmtTestUtils.parseYangSource("/bugs/YT1208/typedef.yang")
170 .getModuleStatement(QNameModule.create(XMLNamespace.of("foo")));
172 final TypedefEffectiveStatement grpBar = module
173 .findFirstEffectiveSubstatement(GroupingEffectiveStatement.class).orElseThrow()
174 .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow()
175 .findFirstEffectiveSubstatement(TypedefEffectiveStatement.class).orElseThrow();
176 final TypedefEffectiveStatement contBar = module
177 .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow()
178 .findFirstEffectiveSubstatement(TypedefEffectiveStatement.class).orElseThrow();
180 assertSame(contBar, grpBar);
184 public void testUsesStatementReuse() throws Exception {
185 final ModuleEffectiveStatement module = StmtTestUtils.parseYangSource("/bugs/YT1208/uses.yang")
186 .getModuleStatement(QNameModule.create(XMLNamespace.of("foo")));
187 assertNotNull(module);
188 final List<GroupingEffectiveStatement> groupings = module
189 .streamEffectiveSubstatements(GroupingEffectiveStatement.class).collect(Collectors.toList());
190 assertEquals(2, groupings.size());
191 final ContainerEffectiveStatement grpFoo = groupings.get(1)
192 .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow();
193 final ContainerEffectiveStatement foo = module
194 .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow();
195 assertNotSame(foo, grpFoo);
196 assertSame(foo.findFirstEffectiveSubstatement(UsesEffectiveStatement.class).orElseThrow(),
197 grpFoo.findFirstEffectiveSubstatement(UsesEffectiveStatement.class).orElseThrow());