2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2024 Ericsson
4 * Modifications Copyright (C) 2024 OpenInfra Foundation Europe
5 * ================================================================================
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
18 * SPDX-License-Identifier: Apache-2.0
19 * ============LICENSE_END=========================================================
21 package org.oran.smo.yangtools.parser.model.yangdom.test;
23 import static org.junit.Assert.assertTrue;
25 import java.util.Arrays;
27 import org.junit.Test;
29 import org.oran.smo.yangtools.parser.findings.ParserFindingType;
30 import org.oran.smo.yangtools.parser.model.statements.yang.YContainer;
31 import org.oran.smo.yangtools.parser.model.statements.yang.YInput;
32 import org.oran.smo.yangtools.parser.model.statements.yang.YLeaf;
33 import org.oran.smo.yangtools.parser.model.statements.yang.YModule;
34 import org.oran.smo.yangtools.parser.model.statements.yang.YRpc;
35 import org.oran.smo.yangtools.parser.model.statements.yang.YSubmodule;
36 import org.oran.smo.yangtools.parser.model.yangdom.YangDomElement;
37 import org.oran.smo.yangtools.parser.testutils.YangTestCommon;
39 public class BasicParsingTest extends YangTestCommon {
42 public void test_empty_file() {
43 parseAbsoluteImplementsYangModels(Arrays.asList(
44 "src/test/resources/model-yangdom/basic-parsing-test/empty-file.yang"));
45 assertHasFindingOfType(ParserFindingType.P013_INVALID_SYNTAX_AT_DOCUMENT_ROOT.toString());
47 assertTrue(yangDeviceModel.getModuleRegistry().getAllYangModels().size() == 0);
51 public void test_semicolon_only() {
52 parseAbsoluteImplementsYangModels(Arrays.asList(
53 "src/test/resources/model-yangdom/basic-parsing-test/semicolon-only.yang"));
54 assertHasFindingOfType(ParserFindingType.P013_INVALID_SYNTAX_AT_DOCUMENT_ROOT.toString());
56 assertTrue(yangDeviceModel.getModuleRegistry().getAllYangModels().size() == 0);
60 public void test_hello_world() {
61 parseAbsoluteImplementsYangModels(Arrays.asList(
62 "src/test/resources/model-yangdom/basic-parsing-test/hello-world.yang"));
63 assertHasFindingOfType(ParserFindingType.P013_INVALID_SYNTAX_AT_DOCUMENT_ROOT.toString());
65 assertTrue(yangDeviceModel.getModuleRegistry().getAllYangModels().size() == 0);
69 public void test_no_left_brace() {
70 parseAbsoluteImplementsYangModels(Arrays.asList(
71 "src/test/resources/model-yangdom/basic-parsing-test/no-left-brace.yang"));
72 assertHasFindingOfType(ParserFindingType.P013_INVALID_SYNTAX_AT_DOCUMENT_ROOT.toString());
74 assertTrue(yangDeviceModel.getModuleRegistry().getAllYangModels().size() == 0);
78 public void test_junk_at_end() {
79 parseAbsoluteImplementsYangModels(Arrays.asList(
80 "src/test/resources/model-yangdom/basic-parsing-test/junk-at-end.yang"));
81 assertHasFindingOfType(ParserFindingType.P014_INVALID_SYNTAX_AT_DOCUMENT_END.toString());
83 assertTrue(yangDeviceModel.getModuleRegistry().getAllYangModels().size() == 1);
84 assertTrue(yangDeviceModel.getModuleRegistry().byModuleName("junk-at-end-module").size() == 1);
88 public void test_block_comments() {
89 parseAbsoluteImplementsYangModels(Arrays.asList(
90 "src/test/resources/model-yangdom/basic-parsing-test/block-comments.yang"));
93 assertTrue(yangDeviceModel.getModuleRegistry().getAllYangModels().size() == 1);
94 assertTrue(yangDeviceModel.getModuleRegistry().byModuleName("block-comments-module").size() == 1);
98 public void test_line_comments() {
99 parseAbsoluteImplementsYangModels(Arrays.asList(
100 "src/test/resources/model-yangdom/basic-parsing-test/line-comments.yang"));
103 assertTrue(yangDeviceModel.getModuleRegistry().getAllYangModels().size() == 1);
104 assertTrue(yangDeviceModel.getModuleRegistry().byModuleName("line-comment-module").size() == 1);
108 public void test_simple_module() {
109 parseAbsoluteImplementsYangModels(Arrays.asList(
110 "src/test/resources/model-yangdom/basic-parsing-test/simple-module.yang"));
112 final YModule simpleModule = getModule("simple-module");
113 assertTrue(simpleModule != null);
115 final YangDomElement moduleDomElement = simpleModule.getDomElement();
116 assertTrue(moduleDomElement.toString().equals("module simple-module"));
117 assertTrue(moduleDomElement.hashCode() == "'module simple-module'".hashCode());
118 assertTrue(moduleDomElement.getTrimmedValueOrNull().equals("simple-module"));
120 final YRpc rpc1 = getRpc(simpleModule, "rpc1");
121 assertTrue(rpc1.getDomElement().getNameValue().equals("'rpc rpc1'"));
122 assertTrue(rpc1.getDomElement().getNameValue().equals("'rpc rpc1'"));
124 final YInput input1 = rpc1.getInput();
125 assertTrue(input1.getDomElement().getNameValue().equals("'input'"));
126 assertTrue(input1.getDomElement().getNameValue().equals("'input'"));
127 assertTrue(input1.getDomElement().getTrimmedValueOrNull() == null);
128 assertTrue(input1.getDomElement().getParentElement() == rpc1.getDomElement());
130 assertTrue(input1.getDomElement().getChildren().size() == 2);
131 input1.getDomElement().getChildren().get(1).remove();
132 assertTrue(input1.getDomElement().getChildren().size() == 1);
133 assertTrue(input1.getDomElement().getChildren().get(0).getValue().equals("leaf1"));
135 assertTrue(input1.getDomElement().getSimplifiedPath().equals("/module=simple-module/rpc=rpc1/input"));
137 final YLeaf leaf4 = getLeaf(simpleModule, "leaf4");
138 assertTrue(leaf4.getDomElement().getSimplifiedPath().equals("/module=simple-module/leaf=leaf4"));
140 assertTrue(leaf4.getWhens().get(0).getDomElement().getSimplifiedPath().equals(
141 "/module=simple-module/leaf=leaf4/when=(../leaf3)"));
143 assertTrue(getLeaf(simpleModule, "leaf5").getDescription().getValue().equals("Hello World"));
144 assertTrue(getLeaf(simpleModule, "leaf6").getDescription().getValue().equals("Hello World"));
145 assertTrue(getLeaf(simpleModule, "leaf7").getDescription().getValue().equals("Hello World!"));
149 public void test_multiple_semicolons() {
150 parseAbsoluteImplementsYangModels(Arrays.asList(
151 "src/test/resources/model-yangdom/basic-parsing-test/multiple-semicolons.yang"));
152 assertHasFindingOfType(ParserFindingType.P055_SUPERFLUOUS_STATEMENT.toString());
154 assertTrue(yangDeviceModel.getModuleRegistry().getAllYangModels().size() == 1);
155 assertTrue(yangDeviceModel.getModuleRegistry().byModuleName("multiple-semicolons").size() == 1);
159 public void test_multiple_plus() {
160 parseAbsoluteImplementsYangModels(Arrays.asList(
161 "src/test/resources/model-yangdom/basic-parsing-test/multiple-plus.yang"));
162 assertHasFindingOfType(ParserFindingType.P015_INVALID_SYNTAX_IN_DOCUMENT.toString());
164 assertTrue(yangDeviceModel.getModuleRegistry().getAllYangModels().size() == 1);
168 public void test_quoted_plus_unquoted() {
169 parseAbsoluteImplementsYangModels(Arrays.asList(
170 "src/test/resources/model-yangdom/basic-parsing-test/quoted-plus-unquoted.yang"));
171 assertHasFindingOfType(ParserFindingType.P015_INVALID_SYNTAX_IN_DOCUMENT.toString());
173 assertTrue(yangDeviceModel.getModuleRegistry().getAllYangModels().size() == 1);
177 public void test_unquoted_plus_unquoted() {
178 parseAbsoluteImplementsYangModels(Arrays.asList(
179 "src/test/resources/model-yangdom/basic-parsing-test/unquoted-plus-unquoted.yang"));
180 assertHasFindingOfType(ParserFindingType.P015_INVALID_SYNTAX_IN_DOCUMENT.toString());
182 assertTrue(yangDeviceModel.getModuleRegistry().getAllYangModels().size() == 0);
186 public void test_document_end_missing() {
187 parseAbsoluteImplementsYangModels(Arrays.asList(
188 "src/test/resources/model-yangdom/basic-parsing-test/document-end-missing.yang"));
189 assertHasFindingOfType(ParserFindingType.P014_INVALID_SYNTAX_AT_DOCUMENT_END.toString());
191 assertTrue(yangDeviceModel.getModuleRegistry().getAllYangModels().size() == 1);
195 public void test_double_left_brace() {
196 parseAbsoluteImplementsYangModels(Arrays.asList(
197 "src/test/resources/model-yangdom/basic-parsing-test/double-left-brace.yang"));
198 assertHasFindingOfType(ParserFindingType.P015_INVALID_SYNTAX_IN_DOCUMENT.toString());
202 public void test_three_statements() {
203 parseAbsoluteImplementsYangModels(Arrays.asList(
204 "src/test/resources/model-yangdom/basic-parsing-test/three-statements.yang"));
205 assertHasFindingOfType(ParserFindingType.P015_INVALID_SYNTAX_IN_DOCUMENT.toString());
209 public void test_mult_statements_at_root() {
210 parseAbsoluteImplementsYangModels(Arrays.asList(
211 "src/test/resources/model-yangdom/basic-parsing-test/multiple-statements-at-root.yang"));
212 assertHasFindingOfType(ParserFindingType.P013_INVALID_SYNTAX_AT_DOCUMENT_ROOT.toString());
214 assertTrue(yangDeviceModel.getModuleRegistry().getAllYangModels().size() == 0);
218 public void test_weird_root() {
219 parseAbsoluteImplementsYangModels(Arrays.asList(
220 "src/test/resources/model-yangdom/basic-parsing-test/weird-root.yang"));
221 assertHasFindingOfType(ParserFindingType.P013_INVALID_SYNTAX_AT_DOCUMENT_ROOT.toString());
223 assertTrue(yangDeviceModel.getModuleRegistry().getAllYangModels().size() == 0);
227 public void test_missing_and_ducplicate_statements() {
228 parseAbsoluteImplementsYangModels(Arrays.asList(
229 "src/test/resources/model-yangdom/basic-parsing-test/missing-and-duplicate-statements.yang"));
231 final YModule module = getModule("missing-and-duplicate-statements");
232 assertTrue(module != null);
234 final YContainer cont1 = getContainer(module, "cont1");
235 assertDomElementHasFindingOfType(cont1.getDomElement(), ParserFindingType.P018_ILLEGAL_CHILD_STATEMENT.toString());
237 final YLeaf leaf1 = getLeaf(cont1, "leaf1");
238 assertDomElementHasFindingOfType(leaf1.getDomElement(), ParserFindingType.P018_ILLEGAL_CHILD_STATEMENT.toString());
239 assertStatementHasFindingOfType(leaf1.getMandatory(), ParserFindingType.P015_INVALID_SYNTAX_IN_DOCUMENT.toString());
241 final YLeaf leaf2 = getLeaf(cont1, "leaf2");
242 assertStatementHasFindingOfType(leaf2.getType().getBases().get(0), ParserFindingType.P052_INVALID_YANG_IDENTIFIER
245 final YLeaf leaf3 = getLeaf(cont1, "leaf3");
246 assertStatementHasFindingOfType(leaf3.getMandatory(), ParserFindingType.P015_INVALID_SYNTAX_IN_DOCUMENT.toString());
248 final YContainer contWithWeirdCharacters = getContainer(module, "cont2_with_weird_%%_characters");
249 assertStatementHasFindingOfType(contWithWeirdCharacters, ParserFindingType.P052_INVALID_YANG_IDENTIFIER.toString());
251 final YContainer cont3 = getContainer(module, "cont3");
252 assertDomElementHasFindingOfType(cont3.getDomElement().getChildren().get(0),
253 ParserFindingType.P015_INVALID_SYNTAX_IN_DOCUMENT.toString());
254 assertDomElementHasFindingOfType(cont3.getDomElement().getChildren().get(1),
255 ParserFindingType.P015_INVALID_SYNTAX_IN_DOCUMENT.toString());
257 assertStatementHasFindingOfType(module.getDeviations().get(0),
258 ParserFindingType.P019_MISSING_REQUIRED_CHILD_STATEMENT.toString());
262 public void test_missing_import_name() {
263 parseAbsoluteImplementsYangModels(Arrays.asList(
264 "src/test/resources/model-yangdom/basic-parsing-test/missing-import-name.yang"));
266 final YModule module = getModule("missing-import-name");
267 assertTrue(module != null);
269 assertTrue(yangDeviceModel.getModuleRegistry().byModuleName("missing-import-name").size() == 1);
271 assertStatementHasFindingOfType(module.getImports().get(0), ParserFindingType.P015_INVALID_SYNTAX_IN_DOCUMENT
276 public void test_missing_prefix_under_import() {
277 parseAbsoluteImplementsYangModels(Arrays.asList(
278 "src/test/resources/model-yangdom/basic-parsing-test/missing-prefix-under-import.yang",
279 "src/test/resources/model-yangdom/basic-parsing-test/basic-empty-module.yang"));
281 final YModule module = getModule("missing-prefix-under-import");
282 assertTrue(module != null);
284 assertTrue(yangDeviceModel.getModuleRegistry().byModuleName("missing-prefix-under-import").size() == 1);
285 assertTrue(yangDeviceModel.getModuleRegistry().byModuleName("basic-empty-module").size() == 1);
287 assertStatementHasFindingOfType(module.getImports().get(0), ParserFindingType.P019_MISSING_REQUIRED_CHILD_STATEMENT
292 public void test_missing_prefix_name_under_import() {
293 parseAbsoluteImplementsYangModels(Arrays.asList(
294 "src/test/resources/model-yangdom/basic-parsing-test/missing-prefix-name-under-import.yang",
295 "src/test/resources/model-yangdom/basic-parsing-test/basic-empty-module.yang"));
297 final YModule module = getModule("missing-prefix-name-under-import");
298 assertTrue(module != null);
300 assertTrue(yangDeviceModel.getModuleRegistry().byModuleName("missing-prefix-name-under-import").size() == 1);
301 assertTrue(yangDeviceModel.getModuleRegistry().byModuleName("basic-empty-module").size() == 1);
303 assertStatementHasFindingOfType(module.getImports().get(0).getPrefix(),
304 ParserFindingType.P015_INVALID_SYNTAX_IN_DOCUMENT.toString());
308 public void test_missing_include_name() {
309 parseAbsoluteImplementsYangModels(Arrays.asList(
310 "src/test/resources/model-yangdom/basic-parsing-test/missing-include-name.yang"));
312 final YModule module = getModule("missing-include-name");
313 assertTrue(module != null);
315 assertTrue(yangDeviceModel.getModuleRegistry().byModuleName("missing-include-name").size() == 1);
317 assertStatementHasFindingOfType(module.getIncludes().get(0), ParserFindingType.P015_INVALID_SYNTAX_IN_DOCUMENT
322 public void test_missing_belongsto() {
323 parseAbsoluteImplementsYangModels(Arrays.asList(
324 "src/test/resources/model-yangdom/basic-parsing-test/basic-module-including.yang",
325 "src/test/resources/model-yangdom/basic-parsing-test/missing-belongsto.yang"));
327 final YModule module = getModule("basic-module-including");
328 assertTrue(module != null);
329 final YSubmodule submodule = getSubModule("basic-submodule");
330 assertTrue(submodule != null);
332 assertTrue(yangDeviceModel.getModuleRegistry().byModuleName("basic-module-including").size() == 1);
333 assertTrue(yangDeviceModel.getModuleRegistry().byModuleName("basic-submodule").size() == 1);
335 assertStatementHasFindingOfType(submodule, ParserFindingType.P019_MISSING_REQUIRED_CHILD_STATEMENT.toString());
339 public void test_missing_belongsto_name() {
340 parseAbsoluteImplementsYangModels(Arrays.asList(
341 "src/test/resources/model-yangdom/basic-parsing-test/basic-module-including.yang",
342 "src/test/resources/model-yangdom/basic-parsing-test/missing-belongsto-name.yang"));
344 final YModule module = getModule("basic-module-including");
345 assertTrue(module != null);
346 final YSubmodule submodule = getSubModule("basic-submodule");
347 assertTrue(submodule != null);
349 assertTrue(yangDeviceModel.getModuleRegistry().byModuleName("basic-module-including").size() == 1);
350 assertTrue(yangDeviceModel.getModuleRegistry().byModuleName("basic-submodule").size() == 1);
352 assertStatementHasFindingOfType(submodule.getBelongsTo(), ParserFindingType.P015_INVALID_SYNTAX_IN_DOCUMENT
357 public void test_missing_prefix_under_belongsto() {
358 parseAbsoluteImplementsYangModels(Arrays.asList(
359 "src/test/resources/model-yangdom/basic-parsing-test/basic-module-including.yang",
360 "src/test/resources/model-yangdom/basic-parsing-test/missing-prefix-under-belongsto.yang"));
362 final YModule module = getModule("basic-module-including");
363 assertTrue(module != null);
364 final YSubmodule submodule = getSubModule("basic-submodule");
365 assertTrue(submodule != null);
367 assertTrue(yangDeviceModel.getModuleRegistry().byModuleName("basic-module-including").size() == 1);
368 assertTrue(yangDeviceModel.getModuleRegistry().byModuleName("basic-submodule").size() == 1);
370 assertStatementHasFindingOfType(submodule.getBelongsTo(), ParserFindingType.P019_MISSING_REQUIRED_CHILD_STATEMENT
375 public void test_missing_prefix_name_under_belongsto() {
376 parseAbsoluteImplementsYangModels(Arrays.asList(
377 "src/test/resources/model-yangdom/basic-parsing-test/basic-module-including.yang",
378 "src/test/resources/model-yangdom/basic-parsing-test/missing-prefix-name-under-belongsto.yang"));
380 final YModule module = getModule("basic-module-including");
381 assertTrue(module != null);
382 final YSubmodule submodule = getSubModule("basic-submodule");
383 assertTrue(submodule != null);
385 assertTrue(yangDeviceModel.getModuleRegistry().byModuleName("basic-module-including").size() == 1);
386 assertTrue(yangDeviceModel.getModuleRegistry().byModuleName("basic-submodule").size() == 1);
388 assertStatementHasFindingOfType(submodule.getBelongsTo().getPrefix(),
389 ParserFindingType.P015_INVALID_SYNTAX_IN_DOCUMENT.toString());
393 public void test_missing_prefix() {
394 parseAbsoluteImplementsYangModels(Arrays.asList(
395 "src/test/resources/model-yangdom/basic-parsing-test/missing-prefix.yang"));
397 final YModule module = getModule("missing-prefix");
398 assertTrue(module != null);
400 assertTrue(yangDeviceModel.getModuleRegistry().byModuleName("missing-prefix").size() == 1);
402 assertStatementHasFindingOfType(module, ParserFindingType.P019_MISSING_REQUIRED_CHILD_STATEMENT.toString());
406 public void test_missing_prefix_name() {
407 parseAbsoluteImplementsYangModels(Arrays.asList(
408 "src/test/resources/model-yangdom/basic-parsing-test/missing-prefix-name.yang"));
410 final YModule module = getModule("missing-prefix-name");
411 assertTrue(module != null);
413 assertTrue(yangDeviceModel.getModuleRegistry().byModuleName("missing-prefix-name").size() == 1);
415 assertStatementHasFindingOfType(module.getPrefix(), ParserFindingType.P015_INVALID_SYNTAX_IN_DOCUMENT.toString());
416 assertFindingCount(1);
420 public void test_missing_namespace() {
421 parseAbsoluteImplementsYangModels(Arrays.asList(
422 "src/test/resources/model-yangdom/basic-parsing-test/missing-namespace.yang"));
424 final YModule module = getModule("missing-namespace");
425 assertTrue(module != null);
427 assertTrue(yangDeviceModel.getModuleRegistry().byModuleName("missing-namespace").size() == 1);
429 assertStatementHasFindingOfType(module, ParserFindingType.P019_MISSING_REQUIRED_CHILD_STATEMENT.toString());
430 assertFindingCount(1);
434 public void test_missing_namespace_name() {
435 parseAbsoluteImplementsYangModels(Arrays.asList(
436 "src/test/resources/model-yangdom/basic-parsing-test/missing-namespace-name.yang"));
438 final YModule module = getModule("missing-namespace-name");
439 assertTrue(module != null);
441 assertTrue(yangDeviceModel.getModuleRegistry().byModuleName("missing-namespace-name").size() == 1);
443 assertStatementHasFindingOfType(module.getNamespace(), ParserFindingType.P015_INVALID_SYNTAX_IN_DOCUMENT
445 assertFindingCount(1);
449 public void test_missing_yangversion_version() {
450 parseAbsoluteImplementsYangModels(Arrays.asList(
451 "src/test/resources/model-yangdom/basic-parsing-test/missing-yangversion-version.yang"));
453 final YModule module = getModule("missing-yangversion-version");
454 assertTrue(module != null);
456 assertTrue(yangDeviceModel.getModuleRegistry().byModuleName("missing-yangversion-version").size() == 1);
458 assertStatementHasFindingOfType(module.getYangVersion(), ParserFindingType.P015_INVALID_SYNTAX_IN_DOCUMENT
460 assertFindingCount(1);
464 public void test_dangling_block_comment() {
465 parseAbsoluteImplementsYangModels(Arrays.asList(
466 "src/test/resources/model-yangdom/basic-parsing-test/dangling-block-comment.yang"));
467 assertHasFindingOfType(ParserFindingType.P014_INVALID_SYNTAX_AT_DOCUMENT_END.toString());
471 public void test_dangling_double_quote() {
472 parseAbsoluteImplementsYangModels(Arrays.asList(
473 "src/test/resources/model-yangdom/basic-parsing-test/dangling-double-quote.yang"));
474 assertHasFindingOfType(ParserFindingType.P014_INVALID_SYNTAX_AT_DOCUMENT_END.toString());
478 public void test_dangling_single_quote() {
479 parseAbsoluteImplementsYangModels(Arrays.asList(
480 "src/test/resources/model-yangdom/basic-parsing-test/dangling-single-quote.yang"));
481 assertHasFindingOfType(ParserFindingType.P014_INVALID_SYNTAX_AT_DOCUMENT_END.toString());
485 public void test_dangling_plus_token() {
486 parseAbsoluteImplementsYangModels(Arrays.asList(
487 "src/test/resources/model-yangdom/basic-parsing-test/dangling-plus-token.yang"));
488 assertHasFindingOfType(ParserFindingType.P014_INVALID_SYNTAX_AT_DOCUMENT_END.toString());
492 public void test_incorrect_string_concatenation() {
493 parseAbsoluteImplementsYangModels(Arrays.asList(
494 "src/test/resources/model-yangdom/basic-parsing-test/incorrect-string-concatenation.yang"));
495 assertHasFindingOfType(ParserFindingType.P015_INVALID_SYNTAX_IN_DOCUMENT.toString());