2 * Copyright (c) 2021 PANTHEON.tech, s.r.o. 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.parser.impl;
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;
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;
22 public class YT1193Test {
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());
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);
43 private static void assertFooReferences(final DeclaredStatement<?> foo) {
44 assertReference(foo, YangStmtMapping.MODULE, 1, 1);
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());
63 private static void assertFooContainerReferences(final DeclaredStatement<?> foo) {
64 assertReference(foo, YangStmtMapping.CONTAINER, 13, 3);
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());
72 private static void assertDeprLeafListReferences(final DeclaredStatement<?> depr) {
73 assertReference(depr, YangStmtMapping.LEAF_LIST, 28, 3);
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());
82 private static void assertObsoTypedefReferences(final DeclaredStatement<?> obso) {
83 assertReference(obso, YangStmtMapping.TYPEDEF, 40, 3);
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());
91 private static void assertBarReferences(final DeclaredStatement<?> bar) {
92 assertReference(bar, YangStmtMapping.MODULE, 1, 1);
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());
107 private static void assertBazReferences(final DeclaredStatement<?> baz) {
108 assertReference(baz, YangStmtMapping.SUBMODULE, 1, 1);
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());
117 private static void assertReference(final DeclaredStatement<?> foo, final StatementDefinition def, final int line,
119 assertEquals(def, foo.statementDefinition());
121 final var inText = assertInstanceOf(DeclarationInText.class, foo.declarationReference().orElseThrow());
122 assertEquals(line, inText.startLine());
123 assertEquals(column, inText.startColumn());