Promote SchemaSourceRepresentation
[yangtools.git] / parser / rfc6643-parser-support / src / test / java / org / opendaylight / yangtools / rfc6643 / parser / IetfYangSmiv2ExtensionPluginTest.java
1 /*
2  * Copyright (c) 2017, 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.rfc6643.parser;
9
10 import static org.junit.jupiter.api.Assertions.assertEquals;
11 import static org.junit.jupiter.api.Assertions.assertInstanceOf;
12
13 import org.junit.jupiter.api.Test;
14 import org.opendaylight.yangtools.rfc6643.model.api.AliasSchemaNode;
15 import org.opendaylight.yangtools.rfc6643.model.api.DefValSchemaNode;
16 import org.opendaylight.yangtools.rfc6643.model.api.ImpliedSchemaNode;
17 import org.opendaylight.yangtools.rfc6643.model.api.MaxAccess;
18 import org.opendaylight.yangtools.rfc6643.model.api.MaxAccessSchemaNode;
19 import org.opendaylight.yangtools.rfc6643.model.api.ObjectIdentifier;
20 import org.opendaylight.yangtools.rfc6643.model.api.OidSchemaNode;
21 import org.opendaylight.yangtools.rfc6643.model.api.SubIdSchemaNode;
22 import org.opendaylight.yangtools.yang.common.QName;
23 import org.opendaylight.yangtools.yang.common.Uint32;
24 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
25 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
26 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
27 import org.opendaylight.yangtools.yang.model.spi.source.YangTextSource;
28 import org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration;
29 import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.RFC7950Reactors;
30 import org.opendaylight.yangtools.yang.parser.rfc7950.repo.YangStatementStreamSource;
31 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase;
32
33 class IetfYangSmiv2ExtensionPluginTest {
34     private static final String NS = "urn:opendaylight:yang:extension:third-party";
35     private static final String REV = "2016-06-09";
36
37     @Test
38     void testExtensions() throws Exception {
39         final var reactor = RFC7950Reactors.defaultReactorBuilder()
40             .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION,
41                 new DisplayHintStatementSupport(YangParserConfiguration.DEFAULT))
42             .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION,
43                 new MaxAccessStatementSupport(YangParserConfiguration.DEFAULT))
44             .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION,
45                 new DefValStatementSupport(YangParserConfiguration.DEFAULT))
46             .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION,
47                 new ImpliedStatementSupport(YangParserConfiguration.DEFAULT))
48             .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION,
49                 new AliasStatementSupport(YangParserConfiguration.DEFAULT))
50             .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION,
51                 new OidStatementSupport(YangParserConfiguration.DEFAULT))
52             .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION,
53                 new SubIdStatementSupport(YangParserConfiguration.DEFAULT))
54             .build();
55         final var schema = reactor.newBuild()
56             .addSources(
57                 YangStatementStreamSource.create(YangTextSource.forResource(
58                     IetfYangSmiv2ExtensionPluginTest.class, "/foo.yang")),
59                 YangStatementStreamSource.create(YangTextSource.forResource(
60                     IetfYangSmiv2ExtensionPluginTest.class, "/ietf-yang-smiv2.yang")))
61             .buildEffective();
62
63         assertEquals(1, schema.getUnknownSchemaNodes().size());
64         final var aliasExtEffectStmt = assertInstanceOf(AliasSchemaNode.class,
65             schema.getUnknownSchemaNodes().iterator().next());
66         assertEquals("ifXTable", aliasExtEffectStmt.getArgument());
67         assertEquals(1, aliasExtEffectStmt.getUnknownSchemaNodes().size());
68         final var oidExtEffectStmt = assertInstanceOf(OidSchemaNode.class,
69             aliasExtEffectStmt.getUnknownSchemaNodes().iterator().next());
70         assertEquals("1.3.6.1.2.1.31.1.1", oidExtEffectStmt.getArgument().toString());
71
72         final var root = assertInstanceOf(ContainerSchemaNode.class,
73             schema.dataChildByName(QName.create(NS, REV, "root")));
74         assertEquals(1, root.getUnknownSchemaNodes().size());
75         final var oid = assertInstanceOf(OidSchemaNode.class, root.getUnknownSchemaNodes().iterator().next());
76         assertEquals("1", oid.getArgument().toString());
77
78         final var ifStackEntry = assertInstanceOf(ListSchemaNode.class,
79             root.dataChildByName(QName.create(NS, REV, "ifStackEntry")));
80         assertEquals(2, ifStackEntry.getUnknownSchemaNodes().size());
81         ifStackEntry.getUnknownSchemaNodes().forEach(unknownSchemaNode -> {
82             if (unknownSchemaNode instanceof OidSchemaNode oidSchema) {
83                 assertEquals(ObjectIdentifier.forString("1.1"), oidSchema.getArgument());
84             } else if (unknownSchemaNode instanceof ImpliedSchemaNode impliedSchema) {
85                 assertEquals("ifStackHigherLayer", impliedSchema.getArgument());
86             }
87         });
88
89         final var ifStackHigherLayer = assertInstanceOf(LeafSchemaNode.class,
90             ifStackEntry.dataChildByName(QName.create(NS, REV, "ifStackHigherLayer")));
91         ifStackHigherLayer.getUnknownSchemaNodes().forEach(unknownSchemaNode -> {
92             if (unknownSchemaNode instanceof MaxAccessSchemaNode maxAccess) {
93                 assertEquals(MaxAccess.NOT_ACCESSIBLE, maxAccess.getArgument());
94             }
95         });
96
97         final var testNumberLeaf = assertInstanceOf(LeafSchemaNode.class,
98             ifStackEntry.getDataChildByName(QName.create(NS, REV, "test-number")));
99         assertEquals(3, testNumberLeaf.getUnknownSchemaNodes().size());
100         testNumberLeaf.getUnknownSchemaNodes().forEach(unknownSchemaNode -> {
101             if (unknownSchemaNode instanceof SubIdSchemaNode subId) {
102                 assertEquals(Uint32.TWO, subId.getArgument());
103             } else if (unknownSchemaNode instanceof DefValSchemaNode defVal) {
104                 assertEquals("0", defVal.getArgument());
105             }
106         });
107     }
108 }