Promote SchemaSourceRepresentation
[yangtools.git] / parser / yang-parser-impl / src / test / java / org / opendaylight / yangtools / yang / parser / impl / YT1193Test.java
1 /*
2  * Copyright (c) 2021 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.yang.parser.impl;
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.assertInstanceOf;
13
14 import org.junit.jupiter.api.Test;
15 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
16 import org.opendaylight.yangtools.yang.model.api.meta.DeclarationInText;
17 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
18 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
19 import org.opendaylight.yangtools.yang.model.spi.source.YangTextSource;
20 import org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration;
21
22 public class YT1193Test {
23     @Test
24     void testDeclarationReference() throws Exception {
25         final var declaredRoots = new DefaultYangParserFactory()
26             .createParser(YangParserConfiguration.builder().retainDeclarationReferences(true).build())
27             .addSource(YangTextSource.forResource(getClass(), "/yt1193/foo.yang"))
28             .addSource(YangTextSource.forResource(getClass(), "/yt1193/bar.yang"))
29             .addSource(YangTextSource.forResource(getClass(), "/yt1193/baz.yang"))
30             .buildDeclaredModel();
31         assertEquals(3, declaredRoots.size());
32
33         for (var stmt : declaredRoots) {
34             switch (stmt.rawArgument()) {
35                 case "foo" -> assertFooReferences(stmt);
36                 case "bar" -> assertBarReferences(stmt);
37                 case "baz" -> assertBazReferences(stmt);
38                 default -> throw new IllegalStateException("Unexpected statement " + stmt);
39             }
40         }
41     }
42
43     private static void assertFooReferences(final DeclaredStatement<?> foo) {
44         assertReference(foo, YangStmtMapping.MODULE, 1, 1);
45
46         final var it = foo.declaredSubstatements().iterator();
47         assertReference(it.next(), YangStmtMapping.NAMESPACE, 2, 3);
48         assertReference(it.next(), YangStmtMapping.PREFIX, 3, 3);
49         assertReference(it.next(), YangStmtMapping.YANG_VERSION, 4, 3);
50         assertReference(it.next(), YangStmtMapping.REVISION, 6, 3);
51         assertReference(it.next(), YangStmtMapping.ORGANIZATION, 8, 3);
52         assertReference(it.next(), YangStmtMapping.DESCRIPTION, 9, 3);
53         assertReference(it.next(), YangStmtMapping.REFERENCE, 10, 3);
54         assertReference(it.next(), YangStmtMapping.CONTACT, 11, 3);
55         assertFooContainerReferences(it.next());
56         assertReference(it.next(), YangStmtMapping.RPC, 25, 3);
57         assertReference(it.next(), YangStmtMapping.NOTIFICATION, 26, 3);
58         assertDeprLeafListReferences(it.next());
59         assertObsoTypedefReferences(it.next());
60         assertFalse(it.hasNext());
61     }
62
63     private static void assertFooContainerReferences(final DeclaredStatement<?> foo) {
64         assertReference(foo, YangStmtMapping.CONTAINER, 13, 3);
65
66         final var it = foo.declaredSubstatements().iterator();
67         assertReference(it.next(), YangStmtMapping.ACTION, 14, 5);
68         assertReference(it.next(), YangStmtMapping.PRESENCE, 22, 5);
69         assertFalse(it.hasNext());
70     }
71
72     private static void assertDeprLeafListReferences(final DeclaredStatement<?> depr) {
73         assertReference(depr, YangStmtMapping.LEAF_LIST, 28, 3);
74
75         final var it = depr.declaredSubstatements().iterator();
76         assertReference(it.next(), YangStmtMapping.TYPE, 29, 5);
77         assertReference(it.next(), YangStmtMapping.UNITS, 36, 5);
78         assertReference(it.next(), YangStmtMapping.STATUS, 37, 5);
79         assertFalse(it.hasNext());
80     }
81
82     private static void assertObsoTypedefReferences(final DeclaredStatement<?> obso) {
83         assertReference(obso, YangStmtMapping.TYPEDEF, 40, 3);
84
85         final var it = obso.declaredSubstatements().iterator();
86         assertReference(it.next(), YangStmtMapping.TYPE, 41, 5);
87         assertReference(it.next(), YangStmtMapping.STATUS, 44, 5);
88         assertFalse(it.hasNext());
89     }
90
91     private static void assertBarReferences(final DeclaredStatement<?> bar) {
92         assertReference(bar, YangStmtMapping.MODULE, 1, 1);
93
94         final var it = bar.declaredSubstatements().iterator();
95         assertReference(it.next(), YangStmtMapping.NAMESPACE, 2, 3);
96         assertReference(it.next(), YangStmtMapping.PREFIX, 3, 3);
97         assertReference(it.next(), YangStmtMapping.YANG_VERSION, 4, 3);
98         assertReference(it.next(), YangStmtMapping.IMPORT, 6, 3);
99         assertReference(it.next(), YangStmtMapping.IDENTITY, 11, 3);
100         assertReference(it.next(), YangStmtMapping.IDENTITY, 13, 3);
101         assertReference(it.next(), YangStmtMapping.ANYDATA, 17, 3);
102         assertReference(it.next(), YangStmtMapping.ANYXML, 18, 3);
103         assertReference(it.next(), YangStmtMapping.INCLUDE, 20, 3);
104         assertFalse(it.hasNext());
105     }
106
107     private static void assertBazReferences(final DeclaredStatement<?> baz) {
108         assertReference(baz, YangStmtMapping.SUBMODULE, 1, 1);
109
110         final var it = baz.declaredSubstatements().iterator();
111         assertReference(it.next(), YangStmtMapping.YANG_VERSION, 2, 3);
112         assertReference(it.next(), YangStmtMapping.BELONGS_TO, 4, 3);
113         assertReference(it.next(), YangStmtMapping.EXTENSION, 8, 3);
114         assertFalse(it.hasNext());
115     }
116
117     private static void assertReference(final DeclaredStatement<?> foo, final StatementDefinition def, final int line,
118             final int column) {
119         assertEquals(def, foo.statementDefinition());
120
121         final var inText = assertInstanceOf(DeclarationInText.class, foo.declarationReference().orElseThrow());
122         assertEquals(line, inText.startLine());
123         assertEquals(column, inText.startColumn());
124     }
125 }