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.Assert.assertEquals;
11 import static org.junit.Assert.assertFalse;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertTrue;
14 import static org.opendaylight.yangtools.yang.stmt.StmtTestUtils.sourceForResource;
16 import java.text.ParseException;
17 import java.util.Collection;
19 import java.util.function.Predicate;
20 import org.junit.Test;
21 import org.opendaylight.yangtools.yang.common.QName;
22 import org.opendaylight.yangtools.yang.common.Revision;
23 import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
24 import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
25 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
26 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
27 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
28 import org.opendaylight.yangtools.yang.model.api.Module;
29 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
30 import org.opendaylight.yangtools.yang.model.api.Status;
31 import org.opendaylight.yangtools.yang.model.api.Submodule;
32 import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlEffectiveStatement;
33 import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement;
34 import org.opendaylight.yangtools.yang.model.api.stmt.ArgumentStatement;
35 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentEffectiveStatement;
36 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
37 import org.opendaylight.yangtools.yang.model.api.stmt.BelongsToStatement;
38 import org.opendaylight.yangtools.yang.model.api.stmt.CaseStatement;
39 import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceEffectiveStatement;
40 import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceStatement;
41 import org.opendaylight.yangtools.yang.model.api.stmt.ConfigStatement;
42 import org.opendaylight.yangtools.yang.model.api.stmt.ContainerEffectiveStatement;
43 import org.opendaylight.yangtools.yang.model.api.stmt.ContainerStatement;
44 import org.opendaylight.yangtools.yang.model.api.stmt.DataDefinitionStatement;
45 import org.opendaylight.yangtools.yang.model.api.stmt.DefaultStatement;
46 import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement;
47 import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionStatement;
48 import org.opendaylight.yangtools.yang.model.api.stmt.FeatureStatement;
49 import org.opendaylight.yangtools.yang.model.api.stmt.GroupingStatement;
50 import org.opendaylight.yangtools.yang.model.api.stmt.IdentityStatement;
51 import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement;
52 import org.opendaylight.yangtools.yang.model.api.stmt.ImportStatement;
53 import org.opendaylight.yangtools.yang.model.api.stmt.IncludeStatement;
54 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement;
55 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement;
56 import org.opendaylight.yangtools.yang.model.api.stmt.MustStatement;
57 import org.opendaylight.yangtools.yang.model.api.stmt.NamespaceStatement;
58 import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement;
59 import org.opendaylight.yangtools.yang.model.api.stmt.PresenceStatement;
60 import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement;
61 import org.opendaylight.yangtools.yang.model.api.stmt.RevisionStatement;
62 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
63 import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement;
64 import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleEffectiveStatement;
65 import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleStatement;
66 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement;
67 import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement;
68 import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionStatement;
69 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
70 import org.opendaylight.yangtools.yang.parser.spi.source.StatementStreamSource;
72 public class DeclaredStatementsTest {
75 public void testDeclaredAnyXml() throws ReactorException {
76 final StatementStreamSource anyxmlStmtModule =
77 sourceForResource("/declared-statements-test/anyxml-declared-test.yang");
79 final SchemaContext schemaContext = StmtTestUtils.parseYangSources(anyxmlStmtModule);
80 assertNotNull(schemaContext);
82 final Module testModule = schemaContext.findModules("anyxml-declared-test").iterator().next();
83 assertNotNull(testModule);
85 final AnyxmlSchemaNode anyxmlSchemaNode = (AnyxmlSchemaNode) testModule.getDataChildByName(
86 QName.create(testModule.getQNameModule(), "foobar"));
87 assertNotNull(anyxmlSchemaNode);
88 final AnyxmlStatement anyxmlStatement = ((AnyxmlEffectiveStatement) anyxmlSchemaNode).getDeclared();
90 final QName name = anyxmlStatement.argument();
93 final WhenStatement whenStatement = anyxmlStatement.getWhenStatement().orElseThrow();
94 assertNotNull(whenStatement.argument());
95 final DescriptionStatement whenStatementDescription = whenStatement.getDescription().orElseThrow();
96 assertTrue(whenStatement.getReference().isPresent());
98 final var ifFeatureStatements = anyxmlStatement.getIfFeatures();
99 assertNotNull(ifFeatureStatements);
100 assertEquals(1, ifFeatureStatements.size());
101 final Predicate<Set<QName>> ifFeaturePredicate = ifFeatureStatements.iterator().next().getIfFeaturePredicate();
102 assertNotNull(ifFeaturePredicate);
104 final var mustStatements = anyxmlStatement.getMustStatements();
105 assertNotNull(mustStatements);
106 assertEquals(1, mustStatements.size());
107 final MustStatement mustStatement = mustStatements.iterator().next();
108 assertNotNull(mustStatement.argument());
109 assertTrue(mustStatement.getErrorAppTagStatement().isPresent());
110 assertTrue(mustStatement.getErrorMessageStatement().isPresent());
111 assertTrue(mustStatement.getDescription().isPresent());
112 assertTrue(mustStatement.getReference().isPresent());
114 final ConfigStatement configStatement = anyxmlStatement.getConfig().orElseThrow();
115 assertFalse(configStatement.getValue());
117 final StatusStatement statusStatement = anyxmlStatement.getStatus().orElseThrow();
118 final Status status = statusStatement.argument();
119 assertNotNull(status);
121 final DescriptionStatement descriptionStatement = anyxmlStatement.getDescription().orElseThrow();
122 assertEquals("anyxml description", descriptionStatement.argument());
124 final ReferenceStatement referenceStatement = anyxmlStatement.getReference().orElseThrow();
125 assertEquals("anyxml reference", referenceStatement.argument());
127 assertTrue(anyxmlStatement.getMandatory().isPresent());
131 public void testDeclaredChoice() throws ReactorException {
132 final StatementStreamSource choiceStmtModule =
133 sourceForResource("/declared-statements-test/choice-declared-test.yang");
135 final SchemaContext schemaContext = StmtTestUtils.parseYangSources(choiceStmtModule);
136 assertNotNull(schemaContext);
138 final Module testModule = schemaContext.findModules("choice-declared-test").iterator().next();
139 assertNotNull(testModule);
141 final ChoiceSchemaNode choiceSchemaNode = (ChoiceSchemaNode) testModule.getDataChildByName(
142 QName.create(testModule.getQNameModule(), "test-choice"));
143 assertNotNull(choiceSchemaNode);
144 final ChoiceStatement choiceStatement = ((ChoiceEffectiveStatement) choiceSchemaNode).getDeclared();
146 final QName name = choiceStatement.argument();
149 final DefaultStatement defaultStatement = choiceStatement.getDefault().orElseThrow();
150 assertEquals("case-two", defaultStatement.argument());
152 assertTrue(choiceStatement.getConfig().isPresent());
153 assertTrue(choiceStatement.getMandatory().isPresent());
155 final var caseStatements = choiceStatement.getCases();
156 assertNotNull(caseStatements);
157 assertEquals(3, caseStatements.size());
158 final CaseStatement caseStatement = caseStatements.iterator().next();
159 final QName caseStatementName = caseStatement.argument();
160 assertNotNull(caseStatementName);
161 final WhenStatement caseStatementWhen = caseStatement.getWhenStatement().orElseThrow();
162 final var caseStatementIfFeatures = caseStatement.getIfFeatures();
163 assertNotNull(caseStatementIfFeatures);
164 assertEquals(1, caseStatementIfFeatures.size());
165 final var caseStatementDataDefinitions = caseStatement.getDataDefinitions();
166 assertNotNull(caseStatementDataDefinitions);
167 assertEquals(1, caseStatementDataDefinitions.size());
168 assertTrue(caseStatement.getStatus().isPresent());
169 assertTrue(caseStatement.getDescription().isPresent());
170 assertTrue(caseStatement.getReference().isPresent());
172 final WhenStatement whenStatement = choiceStatement.getWhenStatement().orElseThrow();
174 final var ifFeatureStatements = choiceStatement.getIfFeatures();
175 assertNotNull(ifFeatureStatements);
176 assertEquals(1, ifFeatureStatements.size());
178 assertTrue(choiceStatement.getStatus().isPresent());
179 assertTrue(choiceStatement.getDescription().isPresent());
180 assertTrue(choiceStatement.getReference().isPresent());
184 public void testDeclaredAugment() throws ReactorException {
185 final StatementStreamSource augmentStmtModule =
186 sourceForResource("/declared-statements-test/augment-declared-test.yang");
188 final SchemaContext schemaContext = StmtTestUtils.parseYangSources(augmentStmtModule);
189 assertNotNull(schemaContext);
191 final Module testModule = schemaContext.findModules("augment-declared-test").iterator().next();
192 assertNotNull(testModule);
194 final Collection<? extends AugmentationSchemaNode> augmentationSchemas = testModule.getAugmentations();
195 assertNotNull(augmentationSchemas);
196 assertEquals(1, augmentationSchemas.size());
198 final AugmentationSchemaNode augmentationSchema = augmentationSchemas.iterator().next();
199 final AugmentStatement augmentStatement = ((AugmentEffectiveStatement) augmentationSchema).getDeclared();
201 final SchemaNodeIdentifier targetNode = augmentStatement.argument();
202 assertNotNull(targetNode);
204 final Collection<? extends DataDefinitionStatement> augmentStatementDataDefinitions =
205 augmentStatement.getDataDefinitions();
206 assertNotNull(augmentStatementDataDefinitions);
207 assertEquals(1, augmentStatementDataDefinitions.size());
211 public void testDeclaredModuleAndSubmodule() throws ReactorException {
212 final StatementStreamSource parentModule =
213 sourceForResource("/declared-statements-test/parent-module-declared-test.yang");
215 final StatementStreamSource childModule =
216 sourceForResource("/declared-statements-test/child-module-declared-test.yang");
218 final SchemaContext schemaContext = StmtTestUtils.parseYangSources(parentModule, childModule);
219 assertNotNull(schemaContext);
221 final Module testModule = schemaContext.findModules("parent-module-declared-test").iterator().next();
222 assertNotNull(testModule);
224 final ModuleStatement moduleStatement = ((ModuleEffectiveStatement) testModule).getDeclared();
225 assertNotNull(moduleStatement.argument());
227 final YangVersionStatement moduleStatementYangVersion = moduleStatement.getYangVersion();
228 assertNotNull(moduleStatementYangVersion);
229 assertNotNull(moduleStatementYangVersion.argument());
231 final NamespaceStatement moduleStatementNamspace = moduleStatement.getNamespace();
232 assertNotNull(moduleStatementNamspace);
233 assertNotNull(moduleStatementNamspace.argument());
235 final PrefixStatement moduleStatementPrefix = moduleStatement.getPrefix();
236 assertNotNull(moduleStatementPrefix);
237 assertNotNull(moduleStatementPrefix.argument());
239 assertEquals(1, moduleStatement.getIncludes().size());
240 final IncludeStatement includeStatement = moduleStatement.getIncludes().iterator().next();
241 assertEquals(Unqualified.of("child-module-declared-test"), includeStatement.argument());
243 final Collection<? extends Submodule> submodules = testModule.getSubmodules();
244 assertNotNull(submodules);
245 assertEquals(1, submodules.size());
247 final Submodule submodule = submodules.iterator().next();
248 final SubmoduleStatement submoduleStatement = ((SubmoduleEffectiveStatement) submodule).getDeclared();
250 assertNotNull(submoduleStatement.argument());
252 final YangVersionStatement submoduleStatementYangVersion = submoduleStatement.getYangVersion();
253 assertNotNull(submoduleStatementYangVersion);
255 final BelongsToStatement belongsToStatement = submoduleStatement.getBelongsTo();
256 assertNotNull(belongsToStatement);
257 assertNotNull(belongsToStatement.argument());
258 assertNotNull(belongsToStatement.getPrefix());
262 public void testDeclaredModule() throws ReactorException, ParseException {
263 final StatementStreamSource rootModule =
264 sourceForResource("/declared-statements-test/root-module-declared-test.yang");
266 final StatementStreamSource importedModule =
267 sourceForResource("/declared-statements-test/imported-module-declared-test.yang");
269 final SchemaContext schemaContext = StmtTestUtils.parseYangSources(rootModule, importedModule);
270 assertNotNull(schemaContext);
272 final Revision revision = Revision.of("2016-09-28");
273 final Module testModule = schemaContext.findModule("root-module-declared-test", revision).orElseThrow();
274 assertNotNull(testModule);
276 final ModuleStatement moduleStatement = ((ModuleEffectiveStatement) testModule).getDeclared();
278 assertEquals(1, moduleStatement.getImports().size());
279 final ImportStatement importStatement = moduleStatement.getImports().iterator().next();
280 assertEquals(Unqualified.of("imported-module-declared-test"), importStatement.argument());
281 assertEquals("imdt", importStatement.getPrefix().argument());
282 assertEquals(revision, importStatement.getRevisionDate().argument());
284 assertEquals("test description", moduleStatement.getDescription().orElseThrow().argument());
285 assertEquals("test reference", moduleStatement.getReference().orElseThrow().argument());
286 assertEquals("test organization", moduleStatement.getOrganization().orElseThrow().argument());
287 assertEquals("test contact", moduleStatement.getContact().orElseThrow().argument());
289 assertEquals(1, moduleStatement.getRevisions().size());
290 final RevisionStatement revisionStatement = moduleStatement.getRevisions().iterator().next();
291 assertEquals(revision, revisionStatement.argument());
292 assertEquals("test description", revisionStatement.getDescription().orElseThrow().argument());
293 assertEquals("test reference", revisionStatement.getReference().orElseThrow().argument());
295 assertEquals(1, moduleStatement.getExtensions().size());
296 final ExtensionStatement extensionStatement = moduleStatement.getExtensions().iterator().next();
297 assertEquals(Status.CURRENT, extensionStatement.getStatus().orElseThrow().argument());
298 assertEquals("test description", extensionStatement.getDescription().orElseThrow().argument());
299 assertEquals("test reference", extensionStatement.getReference().orElseThrow().argument());
300 final ArgumentStatement argumentStatement = extensionStatement.getArgument();
301 assertEquals("ext-argument", argumentStatement.argument().getLocalName());
302 assertTrue(argumentStatement.getYinElement().argument());
304 assertEquals(2, moduleStatement.getFeatures().size());
305 final FeatureStatement featureStatement = moduleStatement.getFeatures().iterator().next();
306 assertEquals(Status.CURRENT, featureStatement.getStatus().orElseThrow().argument());
307 assertEquals("test description", featureStatement.getDescription().orElseThrow().argument());
308 assertEquals("test reference", featureStatement.getReference().orElseThrow().argument());
309 assertEquals("test-feature", featureStatement.argument().getLocalName());
310 assertEquals(1, featureStatement.getIfFeatures().size());
312 assertEquals(2, moduleStatement.getIdentities().size());
313 IdentityStatement identityStatement = null;
314 for (final IdentityStatement identity : moduleStatement.getIdentities()) {
315 if (identity.argument().getLocalName().equals("test-id")) {
316 identityStatement = identity;
320 assertEquals("test-base-id", identityStatement.getBases().iterator().next().argument().getLocalName());
321 assertEquals(Status.CURRENT, identityStatement.getStatus().orElseThrow().argument());
322 assertEquals("test description", identityStatement.getDescription().orElseThrow().argument());
323 assertEquals("test reference", identityStatement.getReference().orElseThrow().argument());
324 assertEquals("test-id", identityStatement.argument().getLocalName());
326 assertEquals(1, moduleStatement.getTypedefs().size());
327 final TypedefStatement typedefStatement = moduleStatement.getTypedefs().iterator().next();
328 assertEquals(Status.CURRENT, typedefStatement.getStatus().orElseThrow().argument());
329 assertEquals("test description", typedefStatement.getDescription().orElseThrow().argument());
330 assertEquals("test reference", typedefStatement.getReference().orElseThrow().argument());
331 assertEquals("test-typedef", typedefStatement.argument().getLocalName());
332 assertEquals("int32", typedefStatement.getType().rawArgument());
333 assertEquals("meter", typedefStatement.getUnits().orElseThrow().argument());
337 public void testDeclaredContainer() throws ReactorException {
338 final StatementStreamSource containerStmtModule =
339 sourceForResource("/declared-statements-test/container-declared-test.yang");
341 final SchemaContext schemaContext = StmtTestUtils.parseYangSources(containerStmtModule);
342 assertNotNull(schemaContext);
344 final Module testModule = schemaContext.findModules("container-declared-test").iterator().next();
345 assertNotNull(testModule);
347 final ContainerSchemaNode containerSchemaNode = (ContainerSchemaNode) testModule.getDataChildByName(
348 QName.create(testModule.getQNameModule(), "test-container"));
349 assertNotNull(containerSchemaNode);
350 final ContainerStatement containerStatement =
351 ((ContainerEffectiveStatement) containerSchemaNode).getDeclared();
353 final QName name = containerStatement.argument();
356 final WhenStatement containerStatementWhen = containerStatement.getWhenStatement().orElseThrow();
358 final Collection<? extends IfFeatureStatement> containerStatementIfFeatures =
359 containerStatement.getIfFeatures();
360 assertNotNull(containerStatementIfFeatures);
361 assertEquals(1, containerStatementIfFeatures.size());
363 final Collection<? extends MustStatement> containerStatementMusts = containerStatement.getMustStatements();
364 assertNotNull(containerStatementMusts);
365 assertEquals(1, containerStatementMusts.size());
367 final PresenceStatement containerStatementPresence = containerStatement.getPresence();
368 assertNotNull(containerStatementPresence);
369 assertNotNull(containerStatementPresence.argument());
371 assertTrue(containerStatement.getConfig().isPresent());
372 assertTrue(containerStatement.getStatus().isPresent());
373 assertTrue(containerStatement.getDescription().isPresent());
374 assertTrue(containerStatement.getReference().isPresent());
376 final Collection<? extends TypedefStatement> containerStatementTypedefs = containerStatement.getTypedefs();
377 assertNotNull(containerStatementTypedefs);
378 assertEquals(1, containerStatementTypedefs.size());
380 final Collection<? extends GroupingStatement> containerStatementGroupings = containerStatement.getGroupings();
381 assertNotNull(containerStatementGroupings);
382 assertEquals(1, containerStatementGroupings.size());
384 final Collection<? extends DataDefinitionStatement> containerStatementDataDefinitions =
385 containerStatement.getDataDefinitions();
387 assertNotNull(containerStatementDataDefinitions);
388 assertEquals(1, containerStatementDataDefinitions.size());