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
9 package org.opendaylight.yangtools.yang.stmt;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertFalse;
13 import static org.junit.Assert.assertNotNull;
14 import static org.junit.Assert.assertTrue;
15 import static org.opendaylight.yangtools.yang.stmt.StmtTestUtils.sourceForResource;
17 import java.text.ParseException;
18 import java.util.Collection;
20 import java.util.function.Predicate;
21 import org.junit.Test;
22 import org.opendaylight.yangtools.yang.common.QName;
23 import org.opendaylight.yangtools.yang.common.Revision;
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.RevisionAwareXPath;
30 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
31 import org.opendaylight.yangtools.yang.model.api.Status;
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.getName();
93 final WhenStatement whenStatement = anyxmlStatement.getWhenStatement().get();
94 final RevisionAwareXPath whenRevisionAwareXPath = whenStatement.getCondition();
95 assertNotNull(whenRevisionAwareXPath);
96 final DescriptionStatement whenStatementDescription = whenStatement.getDescription().get();
97 assertTrue(whenStatement.getReference().isPresent());
99 final Collection<? extends IfFeatureStatement> ifFeatureStatements = anyxmlStatement.getIfFeatures();
100 assertNotNull(ifFeatureStatements);
101 assertEquals(1, ifFeatureStatements.size());
102 final Predicate<Set<QName>> ifFeaturePredicate = ifFeatureStatements.iterator().next().getIfFeaturePredicate();
103 assertNotNull(ifFeaturePredicate);
105 final Collection<? extends MustStatement> mustStatements = anyxmlStatement.getMustStatements();
106 assertNotNull(mustStatements);
107 assertEquals(1, mustStatements.size());
108 final MustStatement mustStatement = mustStatements.iterator().next();
109 final RevisionAwareXPath mustRevisionAwareXPath = mustStatement.getCondition();
110 assertNotNull(mustRevisionAwareXPath);
111 assertTrue(mustStatement.getErrorAppTagStatement().isPresent());
112 assertTrue(mustStatement.getErrorMessageStatement().isPresent());
113 assertTrue(mustStatement.getDescription().isPresent());
114 assertTrue(mustStatement.getReference().isPresent());
116 final ConfigStatement configStatement = anyxmlStatement.getConfig().get();
117 assertFalse(configStatement.getValue());
119 final StatusStatement statusStatement = anyxmlStatement.getStatus().get();
120 final Status status = statusStatement.getValue();
121 assertNotNull(status);
123 final DescriptionStatement descriptionStatement = anyxmlStatement.getDescription().get();
124 assertEquals("anyxml description", descriptionStatement.getText());
126 final ReferenceStatement referenceStatement = anyxmlStatement.getReference().get();
127 assertEquals("anyxml reference", referenceStatement.getText());
129 assertTrue(anyxmlStatement.getMandatory().isPresent());
133 public void testDeclaredChoice() throws ReactorException {
134 final StatementStreamSource choiceStmtModule =
135 sourceForResource("/declared-statements-test/choice-declared-test.yang");
137 final SchemaContext schemaContext = StmtTestUtils.parseYangSources(choiceStmtModule);
138 assertNotNull(schemaContext);
140 final Module testModule = schemaContext.findModules("choice-declared-test").iterator().next();
141 assertNotNull(testModule);
143 final ChoiceSchemaNode choiceSchemaNode = (ChoiceSchemaNode) testModule.getDataChildByName(
144 QName.create(testModule.getQNameModule(), "test-choice"));
145 assertNotNull(choiceSchemaNode);
146 final ChoiceStatement choiceStatement = ((ChoiceEffectiveStatement) choiceSchemaNode).getDeclared();
148 final QName name = choiceStatement.getName();
151 final DefaultStatement defaultStatement = choiceStatement.getDefault().get();
152 assertEquals("case-two", defaultStatement.getValue());
154 assertTrue(choiceStatement.getConfig().isPresent());
155 assertTrue(choiceStatement.getMandatory().isPresent());
157 final Collection<? extends CaseStatement> caseStatements = choiceStatement.getCases();
158 assertNotNull(caseStatements);
159 assertEquals(3, caseStatements.size());
160 final CaseStatement caseStatement = caseStatements.iterator().next();
161 final QName caseStatementName = caseStatement.getName();
162 assertNotNull(caseStatementName);
163 final WhenStatement caseStatementWhen = caseStatement.getWhenStatement().get();
164 final Collection<? extends IfFeatureStatement> caseStatementIfFeatures = caseStatement.getIfFeatures();
165 assertNotNull(caseStatementIfFeatures);
166 assertEquals(1, caseStatementIfFeatures.size());
167 final Collection<? extends DataDefinitionStatement> caseStatementDataDefinitions =
168 caseStatement.getDataDefinitions();
169 assertNotNull(caseStatementDataDefinitions);
170 assertEquals(1, caseStatementDataDefinitions.size());
171 assertTrue(caseStatement.getStatus().isPresent());
172 assertTrue(caseStatement.getDescription().isPresent());
173 assertTrue(caseStatement.getReference().isPresent());
175 final WhenStatement whenStatement = choiceStatement.getWhenStatement().get();
177 final Collection<? extends IfFeatureStatement> ifFeatureStatements = choiceStatement.getIfFeatures();
178 assertNotNull(ifFeatureStatements);
179 assertEquals(1, ifFeatureStatements.size());
181 assertTrue(choiceStatement.getStatus().isPresent());
182 assertTrue(choiceStatement.getDescription().isPresent());
183 assertTrue(choiceStatement.getReference().isPresent());
187 public void testDeclaredAugment() throws ReactorException {
188 final StatementStreamSource augmentStmtModule =
189 sourceForResource("/declared-statements-test/augment-declared-test.yang");
191 final SchemaContext schemaContext = StmtTestUtils.parseYangSources(augmentStmtModule);
192 assertNotNull(schemaContext);
194 final Module testModule = schemaContext.findModules("augment-declared-test").iterator().next();
195 assertNotNull(testModule);
197 final Set<AugmentationSchemaNode> augmentationSchemas = testModule.getAugmentations();
198 assertNotNull(augmentationSchemas);
199 assertEquals(1, augmentationSchemas.size());
201 final AugmentationSchemaNode augmentationSchema = augmentationSchemas.iterator().next();
202 final AugmentStatement augmentStatement = ((AugmentEffectiveStatement) augmentationSchema).getDeclared();
204 final SchemaNodeIdentifier targetNode = augmentStatement.getTargetNode();
205 assertNotNull(targetNode);
207 final Collection<? extends DataDefinitionStatement> augmentStatementDataDefinitions =
208 augmentStatement.getDataDefinitions();
209 assertNotNull(augmentStatementDataDefinitions);
210 assertEquals(1, augmentStatementDataDefinitions.size());
214 public void testDeclaredModuleAndSubmodule() throws ReactorException {
215 final StatementStreamSource parentModule =
216 sourceForResource("/declared-statements-test/parent-module-declared-test.yang");
218 final StatementStreamSource childModule =
219 sourceForResource("/declared-statements-test/child-module-declared-test.yang");
221 final SchemaContext schemaContext = StmtTestUtils.parseYangSources(parentModule, childModule);
222 assertNotNull(schemaContext);
224 final Module testModule = schemaContext.findModules("parent-module-declared-test").iterator().next();
225 assertNotNull(testModule);
227 final ModuleStatement moduleStatement = ((ModuleEffectiveStatement) testModule).getDeclared();
229 final String moduleStatementName = moduleStatement.getName();
230 assertNotNull(moduleStatementName);
232 final YangVersionStatement moduleStatementYangVersion = moduleStatement.getYangVersion();
233 assertNotNull(moduleStatementYangVersion);
234 assertNotNull(moduleStatementYangVersion.getValue());
236 final NamespaceStatement moduleStatementNamspace = moduleStatement.getNamespace();
237 assertNotNull(moduleStatementNamspace);
238 assertNotNull(moduleStatementNamspace.getUri());
240 final PrefixStatement moduleStatementPrefix = moduleStatement.getPrefix();
241 assertNotNull(moduleStatementPrefix);
242 assertNotNull(moduleStatementPrefix.getValue());
244 assertEquals(1, moduleStatement.getIncludes().size());
245 final IncludeStatement includeStatement = moduleStatement.getIncludes().iterator().next();
246 assertEquals("child-module-declared-test", includeStatement.getModule());
248 final Set<Module> submodules = testModule.getSubmodules();
249 assertNotNull(submodules);
250 assertEquals(1, submodules.size());
252 final Module submodule = submodules.iterator().next();
253 final SubmoduleStatement submoduleStatement = ((SubmoduleEffectiveStatement) submodule).getDeclared();
255 final String submoduleStatementName = submoduleStatement.getName();
256 assertNotNull(submoduleStatementName);
258 final YangVersionStatement submoduleStatementYangVersion = submoduleStatement.getYangVersion();
259 assertNotNull(submoduleStatementYangVersion);
261 final BelongsToStatement belongsToStatement = submoduleStatement.getBelongsTo();
262 assertNotNull(belongsToStatement);
263 assertNotNull(belongsToStatement.getModule());
264 assertNotNull(belongsToStatement.getPrefix());
268 public void testDeclaredModule() throws ReactorException, ParseException {
269 final StatementStreamSource rootModule =
270 sourceForResource("/declared-statements-test/root-module-declared-test.yang");
272 final StatementStreamSource importedModule =
273 sourceForResource("/declared-statements-test/imported-module-declared-test.yang");
275 final SchemaContext schemaContext = StmtTestUtils.parseYangSources(rootModule, importedModule);
276 assertNotNull(schemaContext);
278 final Revision revision = Revision.of("2016-09-28");
279 final Module testModule = schemaContext.findModule("root-module-declared-test", revision).get();
280 assertNotNull(testModule);
282 final ModuleStatement moduleStatement = ((ModuleEffectiveStatement) testModule).getDeclared();
284 assertEquals(1, moduleStatement.getImports().size());
285 final ImportStatement importStatement = moduleStatement.getImports().iterator().next();
286 assertEquals("imported-module-declared-test", importStatement.getModule());
287 assertEquals("imdt", importStatement.getPrefix().getValue());
288 assertEquals(revision, importStatement.getRevisionDate().getDate());
290 assertEquals("test description", moduleStatement.getDescription().get().getText());
291 assertEquals("test reference", moduleStatement.getReference().get().getText());
292 assertEquals("test organization", moduleStatement.getOrganization().get().getText());
293 assertEquals("test contact", moduleStatement.getContact().get().getText());
295 assertEquals(1, moduleStatement.getRevisions().size());
296 final RevisionStatement revisionStatement = moduleStatement.getRevisions().iterator().next();
297 assertEquals(revision, revisionStatement.getDate());
298 assertEquals("test description", revisionStatement.getDescription().get().getText());
299 assertEquals("test reference", revisionStatement.getReference().get().getText());
301 assertEquals(1, moduleStatement.getExtensions().size());
302 final ExtensionStatement extensionStatement = moduleStatement.getExtensions().iterator().next();
303 assertEquals(Status.CURRENT, extensionStatement.getStatus().get().getValue());
304 assertEquals("test description", extensionStatement.getDescription().get().getText());
305 assertEquals("test reference", extensionStatement.getReference().get().getText());
306 final ArgumentStatement argumentStatement = extensionStatement.getArgument();
307 assertEquals("ext-argument", argumentStatement.getName().getLocalName());
308 assertTrue(argumentStatement.getYinElement().getValue());
310 assertEquals(2, moduleStatement.getFeatures().size());
311 final FeatureStatement featureStatement = moduleStatement.getFeatures().iterator().next();
312 assertEquals(Status.CURRENT, featureStatement.getStatus().get().getValue());
313 assertEquals("test description", featureStatement.getDescription().get().getText());
314 assertEquals("test reference", featureStatement.getReference().get().getText());
315 assertEquals("test-feature", featureStatement.getName().getLocalName());
316 assertEquals(1, featureStatement.getIfFeatures().size());
318 assertEquals(2, moduleStatement.getIdentities().size());
319 IdentityStatement identityStatement = null;
320 for (final IdentityStatement identity : moduleStatement.getIdentities()) {
321 if (identity.getName().getLocalName().equals("test-id")) {
322 identityStatement = identity;
326 assertEquals("test-base-id", identityStatement.getBases().iterator().next().getName().getLocalName());
327 assertEquals(Status.CURRENT, identityStatement.getStatus().get().getValue());
328 assertEquals("test description", identityStatement.getDescription().get().getText());
329 assertEquals("test reference", identityStatement.getReference().get().getText());
330 assertEquals("test-id", identityStatement.getName().getLocalName());
332 assertEquals(1, moduleStatement.getTypedefs().size());
333 final TypedefStatement typedefStatement = moduleStatement.getTypedefs().iterator().next();
334 assertEquals(Status.CURRENT, typedefStatement.getStatus().get().getValue());
335 assertEquals("test description", typedefStatement.getDescription().get().getText());
336 assertEquals("test reference", typedefStatement.getReference().get().getText());
337 assertEquals("test-typedef", typedefStatement.getName().getLocalName());
338 assertEquals("int32", typedefStatement.getType().getName());
339 assertEquals("meter", typedefStatement.getUnits().get().getName());
343 public void testDeclaredContainer() throws ReactorException {
344 final StatementStreamSource containerStmtModule =
345 sourceForResource("/declared-statements-test/container-declared-test.yang");
347 final SchemaContext schemaContext = StmtTestUtils.parseYangSources(containerStmtModule);
348 assertNotNull(schemaContext);
350 final Module testModule = schemaContext.findModules("container-declared-test").iterator().next();
351 assertNotNull(testModule);
353 final ContainerSchemaNode containerSchemaNode = (ContainerSchemaNode) testModule.getDataChildByName(
354 QName.create(testModule.getQNameModule(), "test-container"));
355 assertNotNull(containerSchemaNode);
356 final ContainerStatement containerStatement =
357 ((ContainerEffectiveStatement) containerSchemaNode).getDeclared();
359 final QName name = containerStatement.getName();
362 final WhenStatement containerStatementWhen = containerStatement.getWhenStatement().get();
364 final Collection<? extends IfFeatureStatement> containerStatementIfFeatures =
365 containerStatement.getIfFeatures();
366 assertNotNull(containerStatementIfFeatures);
367 assertEquals(1, containerStatementIfFeatures.size());
369 final Collection<? extends MustStatement> containerStatementMusts = containerStatement.getMustStatements();
370 assertNotNull(containerStatementMusts);
371 assertEquals(1, containerStatementMusts.size());
373 final PresenceStatement containerStatementPresence = containerStatement.getPresence();
374 assertNotNull(containerStatementPresence);
375 assertNotNull(containerStatementPresence.getValue());
377 assertTrue(containerStatement.getConfig().isPresent());
378 assertTrue(containerStatement.getStatus().isPresent());
379 assertTrue(containerStatement.getDescription().isPresent());
380 assertTrue(containerStatement.getReference().isPresent());
382 final Collection<? extends TypedefStatement> containerStatementTypedefs = containerStatement.getTypedefs();
383 assertNotNull(containerStatementTypedefs);
384 assertEquals(1, containerStatementTypedefs.size());
386 final Collection<? extends GroupingStatement> containerStatementGroupings = containerStatement.getGroupings();
387 assertNotNull(containerStatementGroupings);
388 assertEquals(1, containerStatementGroupings.size());
390 final Collection<? extends DataDefinitionStatement> containerStatementDataDefinitions =
391 containerStatement.getDataDefinitions();
393 assertNotNull(containerStatementDataDefinitions);
394 assertEquals(1, containerStatementDataDefinitions.size());