Add CopyPolicy.EXACT_REPLICA
[yangtools.git] / yang / yang-parser-rfc7950 / src / test / java / org / opendaylight / yangtools / yang / stmt / YT1208Test.java
1 /*
2  * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yangtools.yang.stmt;
9
10 import static org.junit.Assert.assertNotNull;
11 import static org.junit.Assert.assertSame;
12
13 import java.net.URI;
14 import org.junit.Test;
15 import org.opendaylight.yangtools.yang.common.QNameModule;
16 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentEffectiveStatement;
17 import org.opendaylight.yangtools.yang.model.api.stmt.CaseEffectiveStatement;
18 import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceEffectiveStatement;
19 import org.opendaylight.yangtools.yang.model.api.stmt.ContainerEffectiveStatement;
20 import org.opendaylight.yangtools.yang.model.api.stmt.GroupingEffectiveStatement;
21 import org.opendaylight.yangtools.yang.model.api.stmt.LeafEffectiveStatement;
22 import org.opendaylight.yangtools.yang.model.api.stmt.LeafListEffectiveStatement;
23 import org.opendaylight.yangtools.yang.model.api.stmt.ListEffectiveStatement;
24 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement;
25 import org.opendaylight.yangtools.yang.model.api.stmt.NotificationEffectiveStatement;
26 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement;
27
28 public class YT1208Test {
29     @Test
30     public void testAugmentStatementReuse() throws Exception {
31         final ModuleEffectiveStatement module = StmtTestUtils.parseYangSource("/bugs/YT1208/augment.yang")
32             .getModuleStatements()
33             .get(QNameModule.create(URI.create("foo")));
34         assertNotNull(module);
35
36         final NotificationEffectiveStatement notif = module
37             .findFirstEffectiveSubstatement(NotificationEffectiveStatement.class).orElseThrow();
38
39         final AugmentEffectiveStatement grpAug = notif
40             .findFirstEffectiveSubstatement(GroupingEffectiveStatement.class).orElseThrow()
41             .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow()
42             .findFirstEffectiveSubstatement(AugmentEffectiveStatement.class).orElseThrow();
43         final AugmentEffectiveStatement contAug = notif
44             .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow()
45             .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow()
46             .findFirstEffectiveSubstatement(AugmentEffectiveStatement.class).orElseThrow();
47
48         assertSame(contAug, grpAug);
49     }
50
51     @Test
52     public void testCaseStatementReuse() throws Exception {
53         final ModuleEffectiveStatement module = StmtTestUtils.parseYangSource("/bugs/YT1208/case.yang")
54             .getModuleStatements()
55             .get(QNameModule.create(URI.create("foo")));
56         assertNotNull(module);
57
58         final NotificationEffectiveStatement notif = module
59             .findFirstEffectiveSubstatement(NotificationEffectiveStatement.class).orElseThrow();
60
61         final CaseEffectiveStatement grpBar = notif
62             .findFirstEffectiveSubstatement(GroupingEffectiveStatement.class).orElseThrow()
63             .findFirstEffectiveSubstatement(ChoiceEffectiveStatement.class).orElseThrow()
64             .findFirstEffectiveSubstatement(CaseEffectiveStatement.class).orElseThrow();
65         final CaseEffectiveStatement contBar = notif
66             .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow()
67             .findFirstEffectiveSubstatement(ChoiceEffectiveStatement.class).orElseThrow()
68             .findFirstEffectiveSubstatement(CaseEffectiveStatement.class).orElseThrow();
69
70         assertSame(contBar, grpBar);
71     }
72
73     @Test
74     public void testChoiceStatementReuse() throws Exception {
75         final ModuleEffectiveStatement module = StmtTestUtils.parseYangSource("/bugs/YT1208/choice.yang")
76             .getModuleStatements()
77             .get(QNameModule.create(URI.create("foo")));
78         assertNotNull(module);
79
80         final NotificationEffectiveStatement notif = module
81             .findFirstEffectiveSubstatement(NotificationEffectiveStatement.class).orElseThrow();
82
83         final ChoiceEffectiveStatement grpBar = notif
84             .findFirstEffectiveSubstatement(GroupingEffectiveStatement.class).orElseThrow()
85             .findFirstEffectiveSubstatement(ChoiceEffectiveStatement.class).orElseThrow();
86         final ChoiceEffectiveStatement contBar = notif
87             .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow()
88             .findFirstEffectiveSubstatement(ChoiceEffectiveStatement.class).orElseThrow();
89
90         assertSame(contBar, grpBar);
91     }
92
93     @Test
94     public void testGroupingStatementReuse() throws Exception {
95         final ModuleEffectiveStatement module = StmtTestUtils.parseYangSource("/bugs/YT1208/grouping.yang")
96             .getModuleStatements()
97             .get(QNameModule.create(URI.create("foo")));
98         assertNotNull(module);
99
100         final NotificationEffectiveStatement notif = module
101             .findFirstEffectiveSubstatement(NotificationEffectiveStatement.class).orElseThrow();
102
103         final GroupingEffectiveStatement grpBar = notif
104             .findFirstEffectiveSubstatement(GroupingEffectiveStatement.class).orElseThrow()
105             .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow()
106             .findFirstEffectiveSubstatement(GroupingEffectiveStatement.class).orElseThrow();
107         final GroupingEffectiveStatement contBar = notif
108             .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow()
109             .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow()
110             .findFirstEffectiveSubstatement(GroupingEffectiveStatement.class).orElseThrow();
111
112         assertSame(contBar, grpBar);
113     }
114
115     @Test
116     public void testLeafStatementReuse() throws Exception {
117         final ModuleEffectiveStatement module = StmtTestUtils.parseYangSource("/bugs/YT1208/leaf.yang")
118             .getModuleStatements()
119             .get(QNameModule.create(URI.create("foo")));
120         assertNotNull(module);
121
122         final NotificationEffectiveStatement notif = module
123             .findFirstEffectiveSubstatement(NotificationEffectiveStatement.class).orElseThrow();
124
125         final LeafEffectiveStatement grpBar = notif
126             .findFirstEffectiveSubstatement(GroupingEffectiveStatement.class).orElseThrow()
127             .findFirstEffectiveSubstatement(LeafEffectiveStatement.class).orElseThrow();
128         final LeafEffectiveStatement contBar = notif
129             .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow()
130             .findFirstEffectiveSubstatement(LeafEffectiveStatement.class).orElseThrow();
131
132         assertSame(contBar, grpBar);
133     }
134
135     @Test
136     public void testLeafListStatementReuse() throws Exception {
137         final ModuleEffectiveStatement module = StmtTestUtils.parseYangSource("/bugs/YT1208/leaflist.yang")
138             .getModuleStatements()
139             .get(QNameModule.create(URI.create("foo")));
140         assertNotNull(module);
141
142         final NotificationEffectiveStatement notif = module
143             .findFirstEffectiveSubstatement(NotificationEffectiveStatement.class).orElseThrow();
144
145         final LeafListEffectiveStatement grpBar = notif
146             .findFirstEffectiveSubstatement(GroupingEffectiveStatement.class).orElseThrow()
147             .findFirstEffectiveSubstatement(LeafListEffectiveStatement.class).orElseThrow();
148         final LeafListEffectiveStatement contBar = notif
149             .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow()
150             .findFirstEffectiveSubstatement(LeafListEffectiveStatement.class).orElseThrow();
151
152         assertSame(contBar, grpBar);
153     }
154
155     @Test
156     public void testListStatementReuse() throws Exception {
157         final ModuleEffectiveStatement module = StmtTestUtils.parseYangSource("/bugs/YT1208/list.yang")
158             .getModuleStatements()
159             .get(QNameModule.create(URI.create("foo")));
160         assertNotNull(module);
161
162         final NotificationEffectiveStatement notif = module
163             .findFirstEffectiveSubstatement(NotificationEffectiveStatement.class).orElseThrow();
164
165         final ListEffectiveStatement grpBar = notif
166             .findFirstEffectiveSubstatement(GroupingEffectiveStatement.class).orElseThrow()
167             .findFirstEffectiveSubstatement(ListEffectiveStatement.class).orElseThrow();
168         final ListEffectiveStatement contBar = notif
169             .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow()
170             .findFirstEffectiveSubstatement(ListEffectiveStatement.class).orElseThrow();
171
172         assertSame(contBar, grpBar);
173     }
174
175     @Test
176     public void testTypedefStatementReuse() throws Exception {
177         final ModuleEffectiveStatement module = StmtTestUtils.parseYangSource("/bugs/YT1208/typedef.yang")
178             .getModuleStatements()
179             .get(QNameModule.create(URI.create("foo")));
180         assertNotNull(module);
181
182         final TypedefEffectiveStatement grpBar = module
183             .findFirstEffectiveSubstatement(GroupingEffectiveStatement.class).orElseThrow()
184             .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow()
185             .findFirstEffectiveSubstatement(TypedefEffectiveStatement.class).orElseThrow();
186         final TypedefEffectiveStatement contBar = module
187             .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow()
188             .findFirstEffectiveSubstatement(TypedefEffectiveStatement.class).orElseThrow();
189
190         assertSame(contBar, grpBar);
191     }
192 }