Rename binding-runtime-dynamic to binding-loader
[yangtools.git] / parser / yang-parser-rfc7950 / src / test / java / org / opendaylight / yangtools / yang / stmt / DeclaredStatementsTest.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. 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.jupiter.api.Assertions.assertEquals;
11 import static org.junit.jupiter.api.Assertions.assertFalse;
12 import static org.junit.jupiter.api.Assertions.assertNotNull;
13 import static org.junit.jupiter.api.Assertions.assertTrue;
14
15 import org.junit.jupiter.api.Test;
16 import org.opendaylight.yangtools.yang.common.QName;
17 import org.opendaylight.yangtools.yang.common.Revision;
18 import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
19 import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
20 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
21 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
22 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
23 import org.opendaylight.yangtools.yang.model.api.Module;
24 import org.opendaylight.yangtools.yang.model.api.Status;
25 import org.opendaylight.yangtools.yang.model.api.Submodule;
26 import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlEffectiveStatement;
27 import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement;
28 import org.opendaylight.yangtools.yang.model.api.stmt.ArgumentStatement;
29 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentEffectiveStatement;
30 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
31 import org.opendaylight.yangtools.yang.model.api.stmt.BelongsToStatement;
32 import org.opendaylight.yangtools.yang.model.api.stmt.CaseStatement;
33 import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceEffectiveStatement;
34 import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceStatement;
35 import org.opendaylight.yangtools.yang.model.api.stmt.ConfigStatement;
36 import org.opendaylight.yangtools.yang.model.api.stmt.ContainerEffectiveStatement;
37 import org.opendaylight.yangtools.yang.model.api.stmt.ContainerStatement;
38 import org.opendaylight.yangtools.yang.model.api.stmt.DefaultStatement;
39 import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement;
40 import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionStatement;
41 import org.opendaylight.yangtools.yang.model.api.stmt.FeatureStatement;
42 import org.opendaylight.yangtools.yang.model.api.stmt.IdentityStatement;
43 import org.opendaylight.yangtools.yang.model.api.stmt.ImportStatement;
44 import org.opendaylight.yangtools.yang.model.api.stmt.IncludeStatement;
45 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement;
46 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement;
47 import org.opendaylight.yangtools.yang.model.api.stmt.MustStatement;
48 import org.opendaylight.yangtools.yang.model.api.stmt.NamespaceStatement;
49 import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement;
50 import org.opendaylight.yangtools.yang.model.api.stmt.PresenceStatement;
51 import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement;
52 import org.opendaylight.yangtools.yang.model.api.stmt.RevisionStatement;
53 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
54 import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement;
55 import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleEffectiveStatement;
56 import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleStatement;
57 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement;
58 import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement;
59 import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionStatement;
60 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
61
62 class DeclaredStatementsTest extends AbstractYangTest {
63     @Test
64     void testDeclaredAnyXml() {
65         final var schemaContext = assertEffectiveModel("/declared-statements-test/anyxml-declared-test.yang");
66
67         final Module testModule = schemaContext.findModules("anyxml-declared-test").iterator().next();
68         assertNotNull(testModule);
69
70         final AnyxmlSchemaNode anyxmlSchemaNode = (AnyxmlSchemaNode) testModule.getDataChildByName(
71             QName.create(testModule.getQNameModule(), "foobar"));
72         assertNotNull(anyxmlSchemaNode);
73         final AnyxmlStatement anyxmlStatement = ((AnyxmlEffectiveStatement) anyxmlSchemaNode).getDeclared();
74
75         final QName name = anyxmlStatement.argument();
76         assertNotNull(name);
77
78         final WhenStatement whenStatement = anyxmlStatement.getWhenStatement().orElseThrow();
79         assertNotNull(whenStatement.argument());
80         final DescriptionStatement whenStatementDescription = whenStatement.getDescription().orElseThrow();
81         assertTrue(whenStatement.getReference().isPresent());
82
83         final var ifFeatureStatements = anyxmlStatement.getIfFeatures();
84         assertNotNull(ifFeatureStatements);
85         assertEquals(1, ifFeatureStatements.size());
86         final var ifFeaturePredicate = ifFeatureStatements.iterator().next().argument();
87         assertNotNull(ifFeaturePredicate);
88
89         final var mustStatements = anyxmlStatement.getMustStatements();
90         assertNotNull(mustStatements);
91         assertEquals(1, mustStatements.size());
92         final MustStatement mustStatement = mustStatements.iterator().next();
93         assertNotNull(mustStatement.argument());
94         assertTrue(mustStatement.getErrorAppTagStatement().isPresent());
95         assertTrue(mustStatement.getErrorMessageStatement().isPresent());
96         assertTrue(mustStatement.getDescription().isPresent());
97         assertTrue(mustStatement.getReference().isPresent());
98
99         final ConfigStatement configStatement = anyxmlStatement.getConfig().orElseThrow();
100         assertFalse(configStatement.argument());
101
102         final StatusStatement statusStatement = anyxmlStatement.getStatus().orElseThrow();
103         final Status status = statusStatement.argument();
104         assertNotNull(status);
105
106         final DescriptionStatement descriptionStatement = anyxmlStatement.getDescription().orElseThrow();
107         assertEquals("anyxml description", descriptionStatement.argument());
108
109         final ReferenceStatement referenceStatement = anyxmlStatement.getReference().orElseThrow();
110         assertEquals("anyxml reference", referenceStatement.argument());
111
112         assertTrue(anyxmlStatement.getMandatory().isPresent());
113     }
114
115     @Test
116     void testDeclaredChoice() {
117         final var schemaContext = assertEffectiveModel("/declared-statements-test/choice-declared-test.yang");
118
119         final Module testModule = schemaContext.findModules("choice-declared-test").iterator().next();
120         assertNotNull(testModule);
121
122         final ChoiceSchemaNode choiceSchemaNode = (ChoiceSchemaNode) testModule.getDataChildByName(
123             QName.create(testModule.getQNameModule(), "test-choice"));
124         assertNotNull(choiceSchemaNode);
125         final ChoiceStatement choiceStatement = ((ChoiceEffectiveStatement) choiceSchemaNode).getDeclared();
126
127         final QName name = choiceStatement.argument();
128         assertNotNull(name);
129
130         final DefaultStatement defaultStatement = choiceStatement.getDefault().orElseThrow();
131         assertEquals("case-two", defaultStatement.argument());
132
133         assertTrue(choiceStatement.getConfig().isPresent());
134         assertTrue(choiceStatement.getMandatory().isPresent());
135
136         final var caseStatements = choiceStatement.getCases();
137         assertNotNull(caseStatements);
138         assertEquals(3, caseStatements.size());
139         final CaseStatement caseStatement = caseStatements.iterator().next();
140         final QName caseStatementName = caseStatement.argument();
141         assertNotNull(caseStatementName);
142         final WhenStatement caseStatementWhen = caseStatement.getWhenStatement().orElseThrow();
143         final var caseStatementIfFeatures = caseStatement.getIfFeatures();
144         assertNotNull(caseStatementIfFeatures);
145         assertEquals(1, caseStatementIfFeatures.size());
146         final var caseStatementDataDefinitions = caseStatement.getDataDefinitions();
147         assertNotNull(caseStatementDataDefinitions);
148         assertEquals(1, caseStatementDataDefinitions.size());
149         assertTrue(caseStatement.getStatus().isPresent());
150         assertTrue(caseStatement.getDescription().isPresent());
151         assertTrue(caseStatement.getReference().isPresent());
152
153         final WhenStatement whenStatement = choiceStatement.getWhenStatement().orElseThrow();
154
155         final var ifFeatureStatements = choiceStatement.getIfFeatures();
156         assertNotNull(ifFeatureStatements);
157         assertEquals(1, ifFeatureStatements.size());
158
159         assertTrue(choiceStatement.getStatus().isPresent());
160         assertTrue(choiceStatement.getDescription().isPresent());
161         assertTrue(choiceStatement.getReference().isPresent());
162     }
163
164     @Test
165     void testDeclaredAugment() throws ReactorException {
166         final var schemaContext = assertEffectiveModel("/declared-statements-test/augment-declared-test.yang");
167
168         final var testModule = schemaContext.findModules("augment-declared-test").iterator().next();
169         assertNotNull(testModule);
170
171         final var augmentationSchemas = testModule.getAugmentations();
172         assertNotNull(augmentationSchemas);
173         assertEquals(1, augmentationSchemas.size());
174
175         final AugmentationSchemaNode augmentationSchema = augmentationSchemas.iterator().next();
176         final AugmentStatement augmentStatement = ((AugmentEffectiveStatement) augmentationSchema).getDeclared();
177
178         final SchemaNodeIdentifier targetNode = augmentStatement.argument();
179         assertNotNull(targetNode);
180
181         final var augmentStatementDataDefinitions = augmentStatement.getDataDefinitions();
182         assertNotNull(augmentStatementDataDefinitions);
183         assertEquals(1, augmentStatementDataDefinitions.size());
184     }
185
186     @Test
187     void testDeclaredModuleAndSubmodule() throws ReactorException {
188         final var schemaContext = assertEffectiveModel("/declared-statements-test/parent-module-declared-test.yang",
189             "/declared-statements-test/child-module-declared-test.yang");
190
191         final Module testModule = schemaContext.findModules("parent-module-declared-test").iterator().next();
192         assertNotNull(testModule);
193
194         final ModuleStatement moduleStatement = ((ModuleEffectiveStatement) testModule).getDeclared();
195         assertNotNull(moduleStatement.argument());
196
197         final YangVersionStatement moduleStatementYangVersion = moduleStatement.getYangVersion();
198         assertNotNull(moduleStatementYangVersion);
199         assertNotNull(moduleStatementYangVersion.argument());
200
201         final NamespaceStatement moduleStatementNamspace = moduleStatement.getNamespace();
202         assertNotNull(moduleStatementNamspace);
203         assertNotNull(moduleStatementNamspace.argument());
204
205         final PrefixStatement moduleStatementPrefix = moduleStatement.getPrefix();
206         assertNotNull(moduleStatementPrefix);
207         assertNotNull(moduleStatementPrefix.argument());
208
209         assertEquals(1, moduleStatement.getIncludes().size());
210         final IncludeStatement includeStatement = moduleStatement.getIncludes().iterator().next();
211         assertEquals(Unqualified.of("child-module-declared-test"), includeStatement.argument());
212
213         final var submodules = testModule.getSubmodules();
214         assertNotNull(submodules);
215         assertEquals(1, submodules.size());
216
217         final Submodule submodule = submodules.iterator().next();
218         final SubmoduleStatement submoduleStatement = ((SubmoduleEffectiveStatement) submodule).getDeclared();
219
220         assertNotNull(submoduleStatement.argument());
221
222         final YangVersionStatement submoduleStatementYangVersion = submoduleStatement.getYangVersion();
223         assertNotNull(submoduleStatementYangVersion);
224
225         final BelongsToStatement belongsToStatement = submoduleStatement.getBelongsTo();
226         assertNotNull(belongsToStatement);
227         assertNotNull(belongsToStatement.argument());
228         assertNotNull(belongsToStatement.getPrefix());
229     }
230
231     @Test
232     void testDeclaredModule() {
233         final var schemaContext = assertEffectiveModel("/declared-statements-test/root-module-declared-test.yang",
234             "/declared-statements-test/imported-module-declared-test.yang");
235
236         final Revision revision = Revision.of("2016-09-28");
237         final Module testModule = schemaContext.findModule("root-module-declared-test", revision).orElseThrow();
238         assertNotNull(testModule);
239
240         final ModuleStatement moduleStatement = ((ModuleEffectiveStatement) testModule).getDeclared();
241
242         assertEquals(1, moduleStatement.getImports().size());
243         final ImportStatement importStatement = moduleStatement.getImports().iterator().next();
244         assertEquals(Unqualified.of("imported-module-declared-test"), importStatement.argument());
245         assertEquals("imdt", importStatement.getPrefix().argument());
246         assertEquals(revision, importStatement.getRevisionDate().argument());
247
248         assertEquals("test description", moduleStatement.getDescription().orElseThrow().argument());
249         assertEquals("test reference", moduleStatement.getReference().orElseThrow().argument());
250         assertEquals("test organization", moduleStatement.getOrganization().orElseThrow().argument());
251         assertEquals("test contact", moduleStatement.getContact().orElseThrow().argument());
252
253         assertEquals(1, moduleStatement.getRevisions().size());
254         final RevisionStatement revisionStatement = moduleStatement.getRevisions().iterator().next();
255         assertEquals(revision, revisionStatement.argument());
256         assertEquals("test description", revisionStatement.getDescription().orElseThrow().argument());
257         assertEquals("test reference", revisionStatement.getReference().orElseThrow().argument());
258
259         assertEquals(1, moduleStatement.getExtensions().size());
260         final ExtensionStatement extensionStatement = moduleStatement.getExtensions().iterator().next();
261         assertEquals(Status.CURRENT, extensionStatement.getStatus().orElseThrow().argument());
262         assertEquals("test description", extensionStatement.getDescription().orElseThrow().argument());
263         assertEquals("test reference", extensionStatement.getReference().orElseThrow().argument());
264         final ArgumentStatement argumentStatement = extensionStatement.getArgument();
265         assertEquals("ext-argument", argumentStatement.argument().getLocalName());
266         assertTrue(argumentStatement.getYinElement().argument());
267
268         assertEquals(2, moduleStatement.getFeatures().size());
269         final FeatureStatement featureStatement = moduleStatement.getFeatures().iterator().next();
270         assertEquals(Status.CURRENT, featureStatement.getStatus().orElseThrow().argument());
271         assertEquals("test description", featureStatement.getDescription().orElseThrow().argument());
272         assertEquals("test reference", featureStatement.getReference().orElseThrow().argument());
273         assertEquals("test-feature", featureStatement.argument().getLocalName());
274         assertEquals(1, featureStatement.getIfFeatures().size());
275
276         assertEquals(2, moduleStatement.getIdentities().size());
277         IdentityStatement identityStatement = moduleStatement.getIdentities().stream()
278             .filter(identity -> identity.argument().getLocalName().equals("test-id"))
279             .findFirst()
280             .orElseThrow();
281
282         assertEquals("test-base-id", identityStatement.getBases().iterator().next().argument().getLocalName());
283         assertEquals(Status.CURRENT, identityStatement.getStatus().orElseThrow().argument());
284         assertEquals("test description", identityStatement.getDescription().orElseThrow().argument());
285         assertEquals("test reference", identityStatement.getReference().orElseThrow().argument());
286         assertEquals("test-id", identityStatement.argument().getLocalName());
287
288         assertEquals(1, moduleStatement.getTypedefs().size());
289         final TypedefStatement typedefStatement = moduleStatement.getTypedefs().iterator().next();
290         assertEquals(Status.CURRENT, typedefStatement.getStatus().orElseThrow().argument());
291         assertEquals("test description", typedefStatement.getDescription().orElseThrow().argument());
292         assertEquals("test reference", typedefStatement.getReference().orElseThrow().argument());
293         assertEquals("test-typedef", typedefStatement.argument().getLocalName());
294         assertEquals("int32", typedefStatement.getType().rawArgument());
295         assertEquals("meter", typedefStatement.getUnits().orElseThrow().argument());
296     }
297
298     @Test
299     void testDeclaredContainer() throws ReactorException {
300         final var schemaContext = assertEffectiveModel("/declared-statements-test/container-declared-test.yang");
301
302         final Module testModule = schemaContext.findModules("container-declared-test").iterator().next();
303         assertNotNull(testModule);
304
305         final ContainerSchemaNode containerSchemaNode = (ContainerSchemaNode) testModule.getDataChildByName(
306             QName.create(testModule.getQNameModule(), "test-container"));
307         assertNotNull(containerSchemaNode);
308         final ContainerStatement containerStatement =
309             ((ContainerEffectiveStatement) containerSchemaNode).getDeclared();
310
311         final QName name = containerStatement.argument();
312         assertNotNull(name);
313
314         final WhenStatement containerStatementWhen = containerStatement.getWhenStatement().orElseThrow();
315
316         final var containerStatementIfFeatures = containerStatement.getIfFeatures();
317         assertNotNull(containerStatementIfFeatures);
318         assertEquals(1, containerStatementIfFeatures.size());
319
320         final var containerStatementMusts = containerStatement.getMustStatements();
321         assertNotNull(containerStatementMusts);
322         assertEquals(1, containerStatementMusts.size());
323
324         final PresenceStatement containerStatementPresence = containerStatement.getPresence();
325         assertNotNull(containerStatementPresence);
326         assertNotNull(containerStatementPresence.argument());
327
328         assertTrue(containerStatement.getConfig().isPresent());
329         assertTrue(containerStatement.getStatus().isPresent());
330         assertTrue(containerStatement.getDescription().isPresent());
331         assertTrue(containerStatement.getReference().isPresent());
332
333         final var containerStatementTypedefs = containerStatement.getTypedefs();
334         assertNotNull(containerStatementTypedefs);
335         assertEquals(1, containerStatementTypedefs.size());
336
337         final var containerStatementGroupings = containerStatement.getGroupings();
338         assertNotNull(containerStatementGroupings);
339         assertEquals(1, containerStatementGroupings.size());
340
341         final var containerStatementDataDefinitions = containerStatement.getDataDefinitions();
342
343         assertNotNull(containerStatementDataDefinitions);
344         assertEquals(1, containerStatementDataDefinitions.size());
345     }
346 }