2 * Copyright (c) 2016 Cisco Systems, Inc. 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.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;
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;
61 class DeclaredStatementsTest extends AbstractYangTest {
63 void testDeclaredAnyXml() {
64 final var schemaContext = assertEffectiveModel("/declared-statements-test/anyxml-declared-test.yang");
66 final Module testModule = schemaContext.findModules("anyxml-declared-test").iterator().next();
67 assertNotNull(testModule);
69 final AnyxmlSchemaNode anyxmlSchemaNode = (AnyxmlSchemaNode) testModule.getDataChildByName(
70 QName.create(testModule.getQNameModule(), "foobar"));
71 assertNotNull(anyxmlSchemaNode);
72 final AnyxmlStatement anyxmlStatement = ((AnyxmlEffectiveStatement) anyxmlSchemaNode).getDeclared();
74 final QName name = anyxmlStatement.argument();
77 final WhenStatement whenStatement = anyxmlStatement.getWhenStatement().orElseThrow();
78 assertNotNull(whenStatement.argument());
79 final DescriptionStatement whenStatementDescription = whenStatement.getDescription().orElseThrow();
80 assertTrue(whenStatement.getReference().isPresent());
82 final var ifFeatureStatements = anyxmlStatement.getIfFeatures();
83 assertNotNull(ifFeatureStatements);
84 assertEquals(1, ifFeatureStatements.size());
85 final var ifFeaturePredicate = ifFeatureStatements.iterator().next().argument();
86 assertNotNull(ifFeaturePredicate);
88 final var mustStatements = anyxmlStatement.getMustStatements();
89 assertNotNull(mustStatements);
90 assertEquals(1, mustStatements.size());
91 final MustStatement mustStatement = mustStatements.iterator().next();
92 assertNotNull(mustStatement.argument());
93 assertTrue(mustStatement.getErrorAppTagStatement().isPresent());
94 assertTrue(mustStatement.getErrorMessageStatement().isPresent());
95 assertTrue(mustStatement.getDescription().isPresent());
96 assertTrue(mustStatement.getReference().isPresent());
98 final ConfigStatement configStatement = anyxmlStatement.getConfig().orElseThrow();
99 assertFalse(configStatement.argument());
101 final StatusStatement statusStatement = anyxmlStatement.getStatus().orElseThrow();
102 final Status status = statusStatement.argument();
103 assertNotNull(status);
105 final DescriptionStatement descriptionStatement = anyxmlStatement.getDescription().orElseThrow();
106 assertEquals("anyxml description", descriptionStatement.argument());
108 final ReferenceStatement referenceStatement = anyxmlStatement.getReference().orElseThrow();
109 assertEquals("anyxml reference", referenceStatement.argument());
111 assertTrue(anyxmlStatement.getMandatory().isPresent());
115 void testDeclaredChoice() {
116 final var schemaContext = assertEffectiveModel("/declared-statements-test/choice-declared-test.yang");
118 final Module testModule = schemaContext.findModules("choice-declared-test").iterator().next();
119 assertNotNull(testModule);
121 final ChoiceSchemaNode choiceSchemaNode = (ChoiceSchemaNode) testModule.getDataChildByName(
122 QName.create(testModule.getQNameModule(), "test-choice"));
123 assertNotNull(choiceSchemaNode);
124 final ChoiceStatement choiceStatement = ((ChoiceEffectiveStatement) choiceSchemaNode).getDeclared();
126 final QName name = choiceStatement.argument();
129 final DefaultStatement defaultStatement = choiceStatement.getDefault().orElseThrow();
130 assertEquals("case-two", defaultStatement.argument());
132 assertTrue(choiceStatement.getConfig().isPresent());
133 assertTrue(choiceStatement.getMandatory().isPresent());
135 final var caseStatements = choiceStatement.getCases();
136 assertNotNull(caseStatements);
137 assertEquals(3, caseStatements.size());
138 final CaseStatement caseStatement = caseStatements.iterator().next();
139 final QName caseStatementName = caseStatement.argument();
140 assertNotNull(caseStatementName);
141 assertNotNull(caseStatement.getWhenStatement().orElseThrow());
142 final var caseStatementIfFeatures = caseStatement.getIfFeatures();
143 assertNotNull(caseStatementIfFeatures);
144 assertEquals(1, caseStatementIfFeatures.size());
145 final var caseStatementDataDefinitions = caseStatement.getDataDefinitions();
146 assertNotNull(caseStatementDataDefinitions);
147 assertEquals(1, caseStatementDataDefinitions.size());
148 assertTrue(caseStatement.getStatus().isPresent());
149 assertTrue(caseStatement.getDescription().isPresent());
150 assertTrue(caseStatement.getReference().isPresent());
152 assertNotNull(choiceStatement.getWhenStatement().orElseThrow());
154 final var ifFeatureStatements = choiceStatement.getIfFeatures();
155 assertNotNull(ifFeatureStatements);
156 assertEquals(1, ifFeatureStatements.size());
158 assertTrue(choiceStatement.getStatus().isPresent());
159 assertTrue(choiceStatement.getDescription().isPresent());
160 assertTrue(choiceStatement.getReference().isPresent());
164 void testDeclaredAugment() {
165 final var schemaContext = assertEffectiveModel("/declared-statements-test/augment-declared-test.yang");
167 final var testModule = schemaContext.findModules("augment-declared-test").iterator().next();
168 assertNotNull(testModule);
170 final var augmentationSchemas = testModule.getAugmentations();
171 assertNotNull(augmentationSchemas);
172 assertEquals(1, augmentationSchemas.size());
174 final AugmentationSchemaNode augmentationSchema = augmentationSchemas.iterator().next();
175 final AugmentStatement augmentStatement = ((AugmentEffectiveStatement) augmentationSchema).getDeclared();
177 final SchemaNodeIdentifier targetNode = augmentStatement.argument();
178 assertNotNull(targetNode);
180 final var augmentStatementDataDefinitions = augmentStatement.getDataDefinitions();
181 assertNotNull(augmentStatementDataDefinitions);
182 assertEquals(1, augmentStatementDataDefinitions.size());
186 void testDeclaredModuleAndSubmodule() {
187 final var schemaContext = assertEffectiveModel("/declared-statements-test/parent-module-declared-test.yang",
188 "/declared-statements-test/child-module-declared-test.yang");
190 final Module testModule = schemaContext.findModules("parent-module-declared-test").iterator().next();
191 assertNotNull(testModule);
193 final ModuleStatement moduleStatement = ((ModuleEffectiveStatement) testModule).getDeclared();
194 assertNotNull(moduleStatement.argument());
196 final YangVersionStatement moduleStatementYangVersion = moduleStatement.getYangVersion();
197 assertNotNull(moduleStatementYangVersion);
198 assertNotNull(moduleStatementYangVersion.argument());
200 final NamespaceStatement moduleStatementNamspace = moduleStatement.getNamespace();
201 assertNotNull(moduleStatementNamspace);
202 assertNotNull(moduleStatementNamspace.argument());
204 final PrefixStatement moduleStatementPrefix = moduleStatement.getPrefix();
205 assertNotNull(moduleStatementPrefix);
206 assertNotNull(moduleStatementPrefix.argument());
208 assertEquals(1, moduleStatement.getIncludes().size());
209 final IncludeStatement includeStatement = moduleStatement.getIncludes().iterator().next();
210 assertEquals(Unqualified.of("child-module-declared-test"), includeStatement.argument());
212 final var submodules = testModule.getSubmodules();
213 assertNotNull(submodules);
214 assertEquals(1, submodules.size());
216 final Submodule submodule = submodules.iterator().next();
217 final SubmoduleStatement submoduleStatement = ((SubmoduleEffectiveStatement) submodule).getDeclared();
219 assertNotNull(submoduleStatement.argument());
221 final YangVersionStatement submoduleStatementYangVersion = submoduleStatement.getYangVersion();
222 assertNotNull(submoduleStatementYangVersion);
224 final BelongsToStatement belongsToStatement = submoduleStatement.getBelongsTo();
225 assertNotNull(belongsToStatement);
226 assertNotNull(belongsToStatement.argument());
227 assertNotNull(belongsToStatement.getPrefix());
231 void testDeclaredModule() {
232 final var schemaContext = assertEffectiveModel("/declared-statements-test/root-module-declared-test.yang",
233 "/declared-statements-test/imported-module-declared-test.yang");
235 final Revision revision = Revision.of("2016-09-28");
236 final Module testModule = schemaContext.findModule("root-module-declared-test", revision).orElseThrow();
237 assertNotNull(testModule);
239 final ModuleStatement moduleStatement = ((ModuleEffectiveStatement) testModule).getDeclared();
241 assertEquals(1, moduleStatement.getImports().size());
242 final ImportStatement importStatement = moduleStatement.getImports().iterator().next();
243 assertEquals(Unqualified.of("imported-module-declared-test"), importStatement.argument());
244 assertEquals("imdt", importStatement.getPrefix().argument());
245 assertEquals(revision, importStatement.getRevisionDate().argument());
247 assertEquals("test description", moduleStatement.getDescription().orElseThrow().argument());
248 assertEquals("test reference", moduleStatement.getReference().orElseThrow().argument());
249 assertEquals("test organization", moduleStatement.getOrganization().orElseThrow().argument());
250 assertEquals("test contact", moduleStatement.getContact().orElseThrow().argument());
252 assertEquals(1, moduleStatement.getRevisions().size());
253 final RevisionStatement revisionStatement = moduleStatement.getRevisions().iterator().next();
254 assertEquals(revision, revisionStatement.argument());
255 assertEquals("test description", revisionStatement.getDescription().orElseThrow().argument());
256 assertEquals("test reference", revisionStatement.getReference().orElseThrow().argument());
258 assertEquals(1, moduleStatement.getExtensions().size());
259 final ExtensionStatement extensionStatement = moduleStatement.getExtensions().iterator().next();
260 assertEquals(Status.CURRENT, extensionStatement.getStatus().orElseThrow().argument());
261 assertEquals("test description", extensionStatement.getDescription().orElseThrow().argument());
262 assertEquals("test reference", extensionStatement.getReference().orElseThrow().argument());
263 final ArgumentStatement argumentStatement = extensionStatement.getArgument();
264 assertEquals("ext-argument", argumentStatement.argument().getLocalName());
265 assertTrue(argumentStatement.getYinElement().argument());
267 assertEquals(2, moduleStatement.getFeatures().size());
268 final FeatureStatement featureStatement = moduleStatement.getFeatures().iterator().next();
269 assertEquals(Status.CURRENT, featureStatement.getStatus().orElseThrow().argument());
270 assertEquals("test description", featureStatement.getDescription().orElseThrow().argument());
271 assertEquals("test reference", featureStatement.getReference().orElseThrow().argument());
272 assertEquals("test-feature", featureStatement.argument().getLocalName());
273 assertEquals(1, featureStatement.getIfFeatures().size());
275 assertEquals(2, moduleStatement.getIdentities().size());
276 IdentityStatement identityStatement = moduleStatement.getIdentities().stream()
277 .filter(identity -> identity.argument().getLocalName().equals("test-id"))
281 assertEquals("test-base-id", identityStatement.getBases().iterator().next().argument().getLocalName());
282 assertEquals(Status.CURRENT, identityStatement.getStatus().orElseThrow().argument());
283 assertEquals("test description", identityStatement.getDescription().orElseThrow().argument());
284 assertEquals("test reference", identityStatement.getReference().orElseThrow().argument());
285 assertEquals("test-id", identityStatement.argument().getLocalName());
287 assertEquals(1, moduleStatement.getTypedefs().size());
288 final TypedefStatement typedefStatement = moduleStatement.getTypedefs().iterator().next();
289 assertEquals(Status.CURRENT, typedefStatement.getStatus().orElseThrow().argument());
290 assertEquals("test description", typedefStatement.getDescription().orElseThrow().argument());
291 assertEquals("test reference", typedefStatement.getReference().orElseThrow().argument());
292 assertEquals("test-typedef", typedefStatement.argument().getLocalName());
293 assertEquals("int32", typedefStatement.getType().rawArgument());
294 assertEquals("meter", typedefStatement.getUnits().orElseThrow().argument());
298 void testDeclaredContainer() {
299 final var schemaContext = assertEffectiveModel("/declared-statements-test/container-declared-test.yang");
301 final Module testModule = schemaContext.findModules("container-declared-test").iterator().next();
302 assertNotNull(testModule);
304 final ContainerSchemaNode containerSchemaNode = (ContainerSchemaNode) testModule.getDataChildByName(
305 QName.create(testModule.getQNameModule(), "test-container"));
306 assertNotNull(containerSchemaNode);
307 final ContainerStatement containerStatement =
308 ((ContainerEffectiveStatement) containerSchemaNode).getDeclared();
310 final QName name = containerStatement.argument();
313 final WhenStatement containerStatementWhen = containerStatement.getWhenStatement().orElseThrow();
315 final var containerStatementIfFeatures = containerStatement.getIfFeatures();
316 assertNotNull(containerStatementIfFeatures);
317 assertEquals(1, containerStatementIfFeatures.size());
319 final var containerStatementMusts = containerStatement.getMustStatements();
320 assertNotNull(containerStatementMusts);
321 assertEquals(1, containerStatementMusts.size());
323 final PresenceStatement containerStatementPresence = containerStatement.getPresence();
324 assertNotNull(containerStatementPresence);
325 assertNotNull(containerStatementPresence.argument());
327 assertTrue(containerStatement.getConfig().isPresent());
328 assertTrue(containerStatement.getStatus().isPresent());
329 assertTrue(containerStatement.getDescription().isPresent());
330 assertTrue(containerStatement.getReference().isPresent());
332 final var containerStatementTypedefs = containerStatement.getTypedefs();
333 assertNotNull(containerStatementTypedefs);
334 assertEquals(1, containerStatementTypedefs.size());
336 final var containerStatementGroupings = containerStatement.getGroupings();
337 assertNotNull(containerStatementGroupings);
338 assertEquals(1, containerStatementGroupings.size());
340 final var containerStatementDataDefinitions = containerStatement.getDataDefinitions();
342 assertNotNull(containerStatementDataDefinitions);
343 assertEquals(1, containerStatementDataDefinitions.size());