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.statements.yang.test;
23 import static org.junit.Assert.assertEquals;
24 import static org.junit.Assert.assertTrue;
25 import static org.junit.Assert.fail;
27 import java.math.BigDecimal;
28 import java.util.Arrays;
29 import java.util.List;
31 import org.junit.Test;
33 import org.oran.smo.yangtools.parser.findings.ParserFindingType;
34 import org.oran.smo.yangtools.parser.model.resolvers.TypeResolver;
35 import org.oran.smo.yangtools.parser.model.statements.yang.CY;
36 import org.oran.smo.yangtools.parser.model.statements.yang.YContainer;
37 import org.oran.smo.yangtools.parser.model.statements.yang.YLeaf;
38 import org.oran.smo.yangtools.parser.model.statements.yang.YModule;
39 import org.oran.smo.yangtools.parser.model.statements.yang.YType;
40 import org.oran.smo.yangtools.parser.model.yangdom.YangDomElement;
41 import org.oran.smo.yangtools.parser.testutils.YangTestCommon;
42 import org.oran.smo.yangtools.parser.util.NamespaceModuleIdentifier;
44 public class TypedefTest extends YangTestCommon {
46 private static final String TEST_MODULE_NS = "test:typedef-test-module";
47 private static final String TEST_MODULE_NAME = "typedef-test-module";
49 private static final String TEST_IMPORTING_MODULE_NS = "test:typedef-test-importing-module";
50 private static final String TEST_IMPORTING_MODULE_NAME = "typedef-test-importing-module";
53 public void testTypedef() {
55 severityCalculator.suppressFinding(ParserFindingType.P114_TYPEDEF_NOT_USED.toString());
56 severityCalculator.suppressFinding(ParserFindingType.P115_TYPEDEF_USED_ONCE_ONLY.toString());
58 context.setSuppressFindingsOnUnusedSchemaNodes(false);
59 parseRelativeImplementsYangModels(Arrays.asList("typedef-test/typedef-test-module.yang",
60 "typedef-test/typedef-test-submodule.yang", "typedef-test/typedef-test-importing-module.yang"));
62 final YModule module = getModule("typedef-test-module");
63 final YModule importingModule = getModule("typedef-test-importing-module");
65 // - - - - lots of nesting - - - - - - -
67 assertNoFindingsOnStatement(getTypedef(module, "typedef1"));
68 assertDomElementHasFindingOfType(getTypedef(module, "typedef5").getDomElement().getChildren().get(0),
69 ParserFindingType.P112_EXCESSIVE_TYPEDEF_DEPTH.toString());
71 final YContainer cont1 = getContainer(module, "cont1");
73 final YLeaf leaf01 = getLeaf(cont1, "leaf01");
74 assertOriginalTypedefStackSize(leaf01.getType(), 1);
75 assertOriginalTypedef(leaf01.getType(), new NamespaceModuleIdentifier(TEST_MODULE_NS, TEST_MODULE_NAME,
78 final YLeaf leaf02 = getLeaf(cont1, "leaf02");
79 assertOriginalTypedefStackSize(leaf02.getType(), 2);
80 assertOriginalTypedef(leaf02.getType(), new NamespaceModuleIdentifier(TEST_MODULE_NS, TEST_MODULE_NAME,
82 assertOriginalTypedef(leaf02.getType(), 1, new NamespaceModuleIdentifier(TEST_MODULE_NS, TEST_MODULE_NAME,
85 final YLeaf leaf05 = getLeaf(cont1, "leaf05");
86 assertOriginalTypedefStackSize(leaf05.getType(), 5);
87 assertOriginalTypedef(leaf05.getType(), new NamespaceModuleIdentifier(TEST_MODULE_NS, TEST_MODULE_NAME,
89 assertOriginalTypedef(leaf05.getType(), 1, new NamespaceModuleIdentifier(TEST_MODULE_NS, TEST_MODULE_NAME,
91 assertOriginalTypedef(leaf05.getType(), 4, new NamespaceModuleIdentifier(TEST_MODULE_NS, TEST_MODULE_NAME,
94 // - - - - circular - - - - - - -
96 assertStatementHasFindingOfType(getTypedef(module, "typedef7").getType(),
97 ParserFindingType.P111_CIRCULAR_TYPEDEF_REFERENCES.toString());
98 assertStatementHasFindingOfType(getTypedef(module, "typedef8").getType(),
99 ParserFindingType.P111_CIRCULAR_TYPEDEF_REFERENCES.toString());
100 assertStatementHasFindingOfType(getTypedef(module, "typedef9").getType(),
101 ParserFindingType.P111_CIRCULAR_TYPEDEF_REFERENCES.toString());
103 // - - - - bad typedef name - - - - - - -
105 assertStatementHasFindingOfType(getTypedef(module, "uint32"), ParserFindingType.P015_INVALID_SYNTAX_IN_DOCUMENT
107 assertStatementHasFindingOfType(getTypedef(module, ""), ParserFindingType.P015_INVALID_SYNTAX_IN_DOCUMENT
109 assertStatementHasFindingOfType(getTypedef(module, "my custom type"), ParserFindingType.P052_INVALID_YANG_IDENTIFIER
111 assertStatementHasFindingOfType(getTypedef(module, null), ParserFindingType.P015_INVALID_SYNTAX_IN_DOCUMENT
114 // - - - - not resolvable - - - - - - -
116 assertStatementHasFindingOfType(getTypedef(module, "typedef11").getType(),
117 ParserFindingType.P113_UNRESOLVABLE_DERIVED_TYPE.toString());
118 assertStatementHasFindingOfType(getTypedef(module, "typedef12").getType(),
119 ParserFindingType.P116_NESTED_DERIVED_TYPE_NOT_RESOLVABLE.toString());
121 // - - - - - resolvable, with and without prefix - - - - -
123 assertNoFindingsOnStatement(getTypedef(module, "typedef13"));
124 assertNoFindingsOnStatement(getTypedef(module, "typedef14"));
125 assertTrue(getTypedef(module, "typedef14").getType().getDataType().equals("uint32"));
126 assertNoFindingsOnStatement(getTypedef(module, "typedef15"));
127 assertTrue(getTypedef(module, "typedef15").getType().getDataType().equals("uint32"));
129 // - - - - - from submodule - - - - -
131 assertNoFindingsOnStatement(getTypedef(module, "typedef16"));
132 assertNoFindingsOnStatement(getTypedef(module, "typedef17"));
133 assertNoFindingsOnStatement(getTypedef(module, "typedef91"));
134 assertNoFindingsOnStatement(getTypedef(module, "typedef92"));
135 assertNoFindingsOnStatement(getTypedef(module, "typedef93"));
136 assertTrue(getTypedef(module, "typedef16").getType().getDataType().equals("boolean"));
137 assertTrue(getTypedef(module, "typedef17").getType().getDataType().equals("uint32"));
139 assertTrue(getLeaf(importingModule, "leaf1").getType().getDataType().equals("uint32"));
140 assertTrue(getLeaf(importingModule, "leaf2").getType().getDataType().equals("boolean"));
141 assertTrue(getLeaf(importingModule, "leaf3").getType().getDataType().equals("uint32"));
143 final YContainer cont2 = getContainer(module, "cont2");
145 final YLeaf leaf21 = getLeaf(cont2, "leaf21");
146 assertOriginalTypedefStackSize(leaf21.getType(), 3);
147 assertOriginalTypedef(leaf21.getType(), new NamespaceModuleIdentifier(TEST_MODULE_NS, TEST_MODULE_NAME,
149 assertOriginalTypedef(leaf21.getType(), 1, new NamespaceModuleIdentifier(TEST_MODULE_NS, TEST_MODULE_NAME,
151 assertOriginalTypedef(leaf21.getType(), 2, new NamespaceModuleIdentifier(TEST_MODULE_NS, TEST_MODULE_NAME,
154 final YLeaf leaf22 = getLeaf(cont2, "leaf22");
155 assertOriginalTypedefStackSize(leaf22.getType(), 3);
156 assertOriginalTypedef(leaf22.getType(), new NamespaceModuleIdentifier(TEST_MODULE_NS, TEST_MODULE_NAME,
158 assertOriginalTypedef(leaf22.getType(), 1, new NamespaceModuleIdentifier(TEST_MODULE_NS, TEST_MODULE_NAME,
160 assertOriginalTypedef(leaf22.getType(), 2, new NamespaceModuleIdentifier(TEST_MODULE_NS, TEST_MODULE_NAME,
163 // - - - - - bad types - - - - -
165 assertStatementHasFindingOfType(getTypedef(module, "typedef18").getType(),
166 ParserFindingType.P015_INVALID_SYNTAX_IN_DOCUMENT.toString());
167 assertStatementHasFindingOfType(getTypedef(module, "typedef19").getType(),
168 ParserFindingType.P015_INVALID_SYNTAX_IN_DOCUMENT.toString());
169 assertStatementHasFindingOfType(getTypedef(module, "typedef20").getType(),
170 ParserFindingType.P015_INVALID_SYNTAX_IN_DOCUMENT.toString());
171 assertStatementHasFindingOfType(getTypedef(module, "typedef21").getType(),
172 ParserFindingType.P113_UNRESOLVABLE_DERIVED_TYPE.toString());
174 // - - - - - importing - - - - -
176 final YLeaf leaf1 = getLeaf(importingModule, "leaf1");
177 assertOriginalTypedefStackSize(leaf1.getType(), 1);
178 assertOriginalTypedef(leaf1.getType(), new NamespaceModuleIdentifier(TEST_MODULE_NS, TEST_MODULE_NAME,
181 final YLeaf leaf2 = getLeaf(importingModule, "leaf2");
182 assertOriginalTypedefStackSize(leaf2.getType(), 1);
183 assertOriginalTypedef(leaf2.getType(), new NamespaceModuleIdentifier(TEST_MODULE_NS, TEST_MODULE_NAME,
186 final YLeaf leaf4 = getLeaf(importingModule, "leaf4");
187 assertOriginalTypedefStackSize(leaf4.getType(), 3);
188 assertOriginalTypedef(leaf4.getType(), new NamespaceModuleIdentifier(TEST_MODULE_NS, TEST_MODULE_NAME,
190 assertOriginalTypedef(leaf4.getType(), 1, new NamespaceModuleIdentifier(TEST_MODULE_NS, TEST_MODULE_NAME,
192 assertOriginalTypedef(leaf4.getType(), 2, new NamespaceModuleIdentifier(TEST_IMPORTING_MODULE_NS,
193 TEST_IMPORTING_MODULE_NAME, "typedef51"));
195 final YContainer cont6 = getContainer(importingModule, "cont6");
196 final YLeaf leaf5 = getLeaf(cont6, "leaf5");
197 assertOriginalTypedefStackSize(leaf5.getType(), 2);
198 assertOriginalTypedef(leaf5.getType(), new NamespaceModuleIdentifier(TEST_MODULE_NS, TEST_MODULE_NAME,
200 assertOriginalTypedef(leaf5.getType(), 1, new NamespaceModuleIdentifier(TEST_MODULE_NS, TEST_MODULE_NAME,
205 public void test___typedef___not_used_or_used_once_only() {
207 context.setSuppressFindingsOnUnusedSchemaNodes(true);
208 parseRelativeImplementsYangModels(Arrays.asList("typedef-test/typedef-test-not-used-once-used.yang"));
210 final YModule module = getModule("typedef-test-not-used-once-used");
212 assertStatementHasFindingOfType(getTypedef(module, "typedef1"), ParserFindingType.P114_TYPEDEF_NOT_USED.toString());
213 assertStatementHasFindingOfType(getTypedef(module, "typedef2"), ParserFindingType.P115_TYPEDEF_USED_ONCE_ONLY
215 assertNoFindingsOnStatement(getTypedef(module, "typedef3"));
219 public void test_Typedef_no_submodule() {
221 severityCalculator.suppressFinding(ParserFindingType.P114_TYPEDEF_NOT_USED.toString());
222 severityCalculator.suppressFinding(ParserFindingType.P115_TYPEDEF_USED_ONCE_ONLY.toString());
224 context.setSuppressFindingsOnUnusedSchemaNodes(false);
225 parseRelativeImplementsYangModels(Arrays.asList("typedef-test/typedef-test-module.yang",
226 "typedef-test/typedef-test-importing-module.yang"));
228 assertHasFindingOfType(ParserFindingType.P037_UNRESOLVABLE_INCLUDE.toString());
230 final YModule module = getModule("typedef-test-module");
232 // - - - - - from submodule - - - - -
234 assertStatementHasFindingOfType(getTypedef(module, "typedef16").getType(),
235 ParserFindingType.P113_UNRESOLVABLE_DERIVED_TYPE.toString());
236 assertStatementHasFindingOfType(getTypedef(module, "typedef17").getType(),
237 ParserFindingType.P113_UNRESOLVABLE_DERIVED_TYPE.toString());
241 public void test_Typedef_restrictions() {
243 severityCalculator.suppressFinding(ParserFindingType.P114_TYPEDEF_NOT_USED.toString());
244 severityCalculator.suppressFinding(ParserFindingType.P115_TYPEDEF_USED_ONCE_ONLY.toString());
245 severityCalculator.suppressFinding(ParserFindingType.P143_ENUM_WITHOUT_VALUE.toString());
246 severityCalculator.suppressFinding(ParserFindingType.P144_BIT_WITHOUT_POSITION.toString());
248 parseRelativeImplementsYangModels(Arrays.asList("typedef-test/typedef-test-restrictions-module.yang"));
250 final YModule module = getModule("typedef-test-restrictions-module");
252 // - - - - - - no changes - - - - - -
254 final YContainer cont1 = getContainer(module, "cont1");
255 assertSubTreeNoFindings(cont1);
257 assertTrue(getLeaf(cont1, "leaf1").getDefault().getValue().equals("Hello"));
258 assertTrue(getLeaf(cont1, "leaf1").getType().getDataType().equals("string"));
259 assertTrue(getLeaf(cont1, "leaf1").getType().getLength().getBoundaries().size() == 1);
260 assertTrue(getLeaf(cont1, "leaf1").getType().getLength().getBoundaries().get(0).lower == 10);
261 assertTrue(getLeaf(cont1, "leaf1").getType().getLength().getBoundaries().get(0).upper == 20);
262 assertTrue(getLeaf(cont1, "leaf1").getType().getPatterns().size() == 1);
263 assertTrue(getLeaf(cont1, "leaf1").getType().getPatterns().get(0).getPattern().equals("ab*c"));
265 assertTrue(getLeaf(cont1, "leaf2").getDefault().getDecimalDefaultValue().compareTo(BigDecimal.valueOf(35L)) == 0);
266 assertTrue(getLeaf(cont1, "leaf2").getType().getDataType().equals("int32"));
267 assertTrue(getLeaf(cont1, "leaf2").getType().getRange().getBoundaries().size() == 1);
268 assertTrue(getLeaf(cont1, "leaf2").getType().getRange().getBoundaries().get(0).lower.compareTo(BigDecimal.valueOf(
270 assertTrue(getLeaf(cont1, "leaf2").getType().getRange().getBoundaries().get(0).upper.compareTo(BigDecimal.valueOf(
273 assertTrue(getLeaf(cont1, "leaf3").getDefault().getValue().equals("one"));
274 assertTrue(getLeaf(cont1, "leaf3").getType().getDataType().equals("enumeration"));
275 assertTrue(getLeaf(cont1, "leaf3").getType().getEnums().size() == 3);
276 assertTrue(getLeaf(cont1, "leaf3").getType().getEnums().get(0).getEnumName().equals("zero"));
277 assertTrue(getLeaf(cont1, "leaf3").getType().getEnums().get(0).getValue().getValue().equals("10"));
278 assertTrue(getLeaf(cont1, "leaf3").getType().getEnums().get(1).getEnumName().equals("one"));
279 assertTrue(getLeaf(cont1, "leaf3").getType().getEnums().get(1).getValue().getValue().equals("11"));
280 assertTrue(getLeaf(cont1, "leaf3").getType().getEnums().get(2).getEnumName().equals("two"));
281 assertTrue(getLeaf(cont1, "leaf3").getType().getEnums().get(2).getValue().getValue().equals("12"));
283 assertTrue(getLeaf(cont1, "leaf4").getDefault() == null);
284 assertTrue(getLeaf(cont1, "leaf4").getType().getDataType().equals("bits"));
285 assertTrue(getLeaf(cont1, "leaf4").getType().getBits().size() == 3);
286 assertTrue(getLeaf(cont1, "leaf4").getType().getBits().get(0).getBitName().equals("four"));
287 assertTrue(getLeaf(cont1, "leaf4").getType().getBits().get(0).getPosition().getValue().equals("16"));
288 assertTrue(getLeaf(cont1, "leaf4").getType().getBits().get(1).getBitName().equals("five"));
289 assertTrue(getLeaf(cont1, "leaf4").getType().getBits().get(1).getPosition().getValue().equals("17"));
290 assertTrue(getLeaf(cont1, "leaf4").getType().getBits().get(2).getBitName().equals("six"));
291 assertTrue(getLeaf(cont1, "leaf4").getType().getBits().get(2).getPosition().getValue().equals("18"));
293 // - - - - - - some overrides - - - - - -
295 final YContainer cont2 = getContainer(module, "cont2");
296 assertSubTreeNoFindings(cont2);
298 assertTrue(getLeaf(cont2, "leaf7").getDefault().getValue().equals("World"));
299 assertTrue(getLeaf(cont2, "leaf7").getType().getDataType().equals("string"));
300 assertTrue(getLeaf(cont2, "leaf7").getType().getLength().getBoundaries().size() == 1);
301 assertTrue(getLeaf(cont2, "leaf7").getType().getLength().getBoundaries().get(0).lower == 12);
302 assertTrue(getLeaf(cont2, "leaf7").getType().getLength().getBoundaries().get(0).upper == 15);
303 assertTrue(getLeaf(cont2, "leaf7").getType().getPatterns().size() == 2);
304 assertTrue(getLeaf(cont2, "leaf7").getType().getPatterns().get(0).getPattern().equals("ab*c"));
305 assertTrue(getLeaf(cont2, "leaf7").getType().getPatterns().get(1).getPattern().equals("de*f"));
307 assertTrue(getLeaf(cont2, "leaf8").getDefault().getDecimalDefaultValue().compareTo(BigDecimal.valueOf(32L)) == 0);
308 assertTrue(getLeaf(cont2, "leaf8").getType().getDataType().equals("int32"));
309 assertTrue(getLeaf(cont2, "leaf8").getType().getRange().getBoundaries().size() == 1);
310 assertTrue(getLeaf(cont2, "leaf8").getType().getRange().getBoundaries().get(0).lower.compareTo(BigDecimal.valueOf(
312 assertTrue(getLeaf(cont2, "leaf8").getType().getRange().getBoundaries().get(0).upper.compareTo(BigDecimal.valueOf(
315 assertTrue(getLeaf(cont2, "leaf9").getDefault().getValue().equals("zero"));
316 assertTrue(getLeaf(cont2, "leaf9").getType().getDataType().equals("enumeration"));
317 assertTrue(getLeaf(cont2, "leaf9").getType().getEnums().size() == 2);
318 assertTrue(getLeaf(cont2, "leaf9").getType().getEnums().get(0).getEnumName().equals("zero"));
319 assertTrue(getLeaf(cont2, "leaf9").getType().getEnums().get(0).getValue().getValue().equals("10"));
320 assertTrue(getLeaf(cont2, "leaf9").getType().getEnums().get(1).getEnumName().equals("one"));
321 assertTrue(getLeaf(cont2, "leaf9").getType().getEnums().get(1).getValue().getValue().equals("11"));
323 assertTrue(getLeaf(cont2, "leaf10").getDefault().getValue().equals("six"));
324 assertTrue(getLeaf(cont2, "leaf10").getType().getDataType().equals("bits"));
325 assertTrue(getLeaf(cont2, "leaf10").getType().getBits().size() == 2);
326 assertTrue(getLeaf(cont2, "leaf10").getType().getBits().get(0).getBitName().equals("five"));
327 assertTrue(getLeaf(cont2, "leaf10").getType().getBits().get(0).getPosition().getValue().equals("17"));
328 assertTrue(getLeaf(cont2, "leaf10").getType().getBits().get(1).getBitName().equals("six"));
329 assertTrue(getLeaf(cont2, "leaf10").getType().getBits().get(1).getPosition().getValue().equals("18"));
331 // - - - - - - some multi-level overrides - - - - - -
333 final YContainer cont3 = getContainer(module, "cont3");
334 assertSubTreeNoFindings(cont3);
336 assertTrue(getLeaf(cont3, "leaf18").getDefault().getValue().equals("Moon"));
337 assertTrue(getLeaf(cont3, "leaf18").getType().getDataType().equals("string"));
338 assertTrue(getLeaf(cont3, "leaf18").getType().getLength().getBoundaries().size() == 1);
339 assertTrue(getLeaf(cont3, "leaf18").getType().getLength().getBoundaries().get(0).lower == 6);
340 assertTrue(getLeaf(cont3, "leaf18").getType().getLength().getBoundaries().get(0).upper == 7);
341 assertTrue(getLeaf(cont3, "leaf18").getType().getPatterns().size() == 3);
342 assertTrue(getLeaf(cont3, "leaf18").getType().getPatterns().get(0).getPattern().equals("ab*c"));
343 assertTrue(getLeaf(cont3, "leaf18").getType().getPatterns().get(1).getPattern().equals("gh*i"));
344 assertTrue(getLeaf(cont3, "leaf18").getType().getPatterns().get(2).getPattern().equals("mn*o"));
346 assertTrue(getLeaf(cont3, "leaf19").getDefault().getDecimalDefaultValue().compareTo(BigDecimal.valueOf(13L)) == 0);
347 assertTrue(getLeaf(cont3, "leaf19").getType().getDataType().equals("int32"));
348 assertTrue(getLeaf(cont3, "leaf19").getType().getRange().getBoundaries().size() == 1);
349 assertTrue(getLeaf(cont3, "leaf19").getType().getRange().getBoundaries().get(0).lower.compareTo(BigDecimal.valueOf(
351 assertTrue(getLeaf(cont3, "leaf19").getType().getRange().getBoundaries().get(0).upper.compareTo(BigDecimal.valueOf(
354 assertTrue(getLeaf(cont3, "leaf20").getDefault().getValue().equals("one"));
355 assertTrue(getLeaf(cont3, "leaf20").getType().getDataType().equals("enumeration"));
356 assertTrue(getLeaf(cont3, "leaf20").getType().getEnums().size() == 1);
357 assertTrue(getLeaf(cont3, "leaf20").getType().getEnums().get(0).getEnumName().equals("one"));
358 assertTrue(getLeaf(cont3, "leaf20").getType().getEnums().get(0).getValue().getValue().equals("11"));
360 // - - - - - - some illegal statements for restriction - - - - - -
362 final YContainer cont4 = getContainer(module, "cont4");
364 final YangDomElement leaf28domElement = getDomChild(cont4.getDomElement(), CY.LEAF, "leaf28");
365 assertDomElementHasFindingOfType(leaf28domElement, ParserFindingType.P117_ILLEGAL_DATA_TYPE_RESTRICTION.toString());
367 final YangDomElement leaf29domElement = getDomChild(cont4.getDomElement(), CY.LEAF, "leaf29");
368 assertDomElementHasFindingOfType(leaf29domElement, ParserFindingType.P117_ILLEGAL_DATA_TYPE_RESTRICTION.toString());
370 final YangDomElement leaf30domElement = getDomChild(cont4.getDomElement(), CY.LEAF, "leaf30");
371 final YangDomElement typeUnderLeaf30domElement = getDomChild(leaf30domElement, CY.TYPE);
372 assertDomElementHasFindingOfType(typeUnderLeaf30domElement.getChildren().get(0),
373 ParserFindingType.P117_ILLEGAL_DATA_TYPE_RESTRICTION.toString());
374 assertDomElementHasFindingOfType(typeUnderLeaf30domElement.getChildren().get(1),
375 ParserFindingType.P117_ILLEGAL_DATA_TYPE_RESTRICTION.toString());
377 final YangDomElement leaf31domElement = getDomChild(cont4.getDomElement(), CY.LEAF, "leaf31");
378 final YangDomElement typeUnderLeaf31domElement = getDomChild(leaf31domElement, CY.TYPE);
379 assertDomElementHasFindingOfType(typeUnderLeaf31domElement.getChildren().get(0),
380 ParserFindingType.P117_ILLEGAL_DATA_TYPE_RESTRICTION.toString());
381 assertDomElementHasFindingOfType(typeUnderLeaf31domElement.getChildren().get(1),
382 ParserFindingType.P117_ILLEGAL_DATA_TYPE_RESTRICTION.toString());
384 // - - - - - - some legal and illegal length restrictions - - - - - -
386 final YContainer cont5 = getContainer(module, "cont5");
388 assertStatementHasFindingOfType(getLeaf(cont5, "leaf51").getType().getLength(),
389 ParserFindingType.P117_ILLEGAL_DATA_TYPE_RESTRICTION.toString());
390 assertStatementHasFindingOfType(getLeaf(cont5, "leaf52").getType().getLength(),
391 ParserFindingType.P117_ILLEGAL_DATA_TYPE_RESTRICTION.toString());
392 assertStatementHasFindingOfType(getLeaf(cont5, "leaf53").getType().getLength(),
393 ParserFindingType.P117_ILLEGAL_DATA_TYPE_RESTRICTION.toString());
394 assertStatementHasFindingOfType(getLeaf(cont5, "leaf54").getType().getLength(),
395 ParserFindingType.P117_ILLEGAL_DATA_TYPE_RESTRICTION.toString());
396 assertStatementHasFindingOfType(getLeaf(cont5, "leaf55").getType().getLength(),
397 ParserFindingType.P117_ILLEGAL_DATA_TYPE_RESTRICTION.toString());
398 assertStatementHasFindingOfType(getLeaf(cont5, "leaf56").getType().getLength(),
399 ParserFindingType.P117_ILLEGAL_DATA_TYPE_RESTRICTION.toString());
400 assertStatementHasFindingOfType(getLeaf(cont5, "leaf57").getType().getLength(),
401 ParserFindingType.P117_ILLEGAL_DATA_TYPE_RESTRICTION.toString());
402 assertStatementHasFindingOfType(getLeaf(cont5, "leaf58").getType().getLength(),
403 ParserFindingType.P117_ILLEGAL_DATA_TYPE_RESTRICTION.toString());
404 assertStatementHasFindingOfType(getLeaf(cont5, "leaf59").getType().getLength(),
405 ParserFindingType.P117_ILLEGAL_DATA_TYPE_RESTRICTION.toString());
407 assertSubTreeNoFindings(getLeaf(cont5, "leaf61"));
408 assertSubTreeNoFindings(getLeaf(cont5, "leaf62"));
409 assertSubTreeNoFindings(getLeaf(cont5, "leaf63"));
410 assertSubTreeNoFindings(getLeaf(cont5, "leaf64"));
411 assertSubTreeNoFindings(getLeaf(cont5, "leaf65"));
412 assertSubTreeNoFindings(getLeaf(cont5, "leaf66"));
413 assertSubTreeNoFindings(getLeaf(cont5, "leaf67"));
414 assertSubTreeNoFindings(getLeaf(cont5, "leaf68"));
415 assertSubTreeNoFindings(getLeaf(cont5, "leaf69"));
416 assertSubTreeNoFindings(getLeaf(cont5, "leaf70"));
417 assertSubTreeNoFindings(getLeaf(cont5, "leaf71"));
418 assertSubTreeNoFindings(getLeaf(cont5, "leaf72"));
419 assertSubTreeNoFindings(getLeaf(cont5, "leaf73"));
421 // - - - - - - some legal and illegal range restrictions - - - - - -
423 final YContainer cont8 = getContainer(module, "cont8");
425 assertStatementHasFindingOfType(getLeaf(cont8, "leaf81").getType().getRange(),
426 ParserFindingType.P117_ILLEGAL_DATA_TYPE_RESTRICTION.toString());
427 assertStatementHasFindingOfType(getLeaf(cont8, "leaf82").getType().getRange(),
428 ParserFindingType.P117_ILLEGAL_DATA_TYPE_RESTRICTION.toString());
429 assertStatementHasFindingOfType(getLeaf(cont8, "leaf83").getType().getRange(),
430 ParserFindingType.P117_ILLEGAL_DATA_TYPE_RESTRICTION.toString());
431 assertStatementHasFindingOfType(getLeaf(cont8, "leaf84").getType().getRange(),
432 ParserFindingType.P117_ILLEGAL_DATA_TYPE_RESTRICTION.toString());
433 assertStatementHasFindingOfType(getLeaf(cont8, "leaf85").getType().getRange(),
434 ParserFindingType.P117_ILLEGAL_DATA_TYPE_RESTRICTION.toString());
435 assertStatementHasFindingOfType(getLeaf(cont8, "leaf86").getType().getRange(),
436 ParserFindingType.P117_ILLEGAL_DATA_TYPE_RESTRICTION.toString());
437 assertStatementHasFindingOfType(getLeaf(cont8, "leaf87").getType().getRange(),
438 ParserFindingType.P117_ILLEGAL_DATA_TYPE_RESTRICTION.toString());
439 assertStatementHasFindingOfType(getLeaf(cont8, "leaf88").getType().getRange(),
440 ParserFindingType.P117_ILLEGAL_DATA_TYPE_RESTRICTION.toString());
441 assertStatementHasFindingOfType(getLeaf(cont8, "leaf89").getType().getRange(),
442 ParserFindingType.P117_ILLEGAL_DATA_TYPE_RESTRICTION.toString());
444 assertSubTreeNoFindings(getLeaf(cont8, "leaf91"));
445 assertSubTreeNoFindings(getLeaf(cont8, "leaf92"));
446 assertSubTreeNoFindings(getLeaf(cont8, "leaf93"));
447 assertSubTreeNoFindings(getLeaf(cont8, "leaf94"));
450 private static final String USED_TWICE_NS = "test:typedef-test-used-twice";
451 private static final String USED_TWICE_MODULE_NAME = "typedef-test-used-twice";
454 public void test_Typedef_used_twice() {
456 parseRelativeImplementsYangModels(Arrays.asList("typedef-test/typedef-test-used-twice.yang"));
458 final YModule module = getModule("typedef-test-used-twice");
460 final YContainer cont1 = getContainer(module, "cont1");
462 final YLeaf leaf2 = getLeaf(cont1, "leaf2");
463 assertTrue(leaf2.getDefault() != null);
464 assertTrue(leaf2.getDefault().getValue().equals("10"));
465 assertOriginalTypedef(leaf2.getType(), new NamespaceModuleIdentifier(USED_TWICE_NS, USED_TWICE_MODULE_NAME,
468 final YLeaf leaf3 = getLeaf(cont1, "leaf3");
469 assertTrue(leaf3.getDefault() != null);
470 assertTrue(leaf3.getDefault().getValue().equals("5"));
471 assertOriginalTypedef(leaf3.getType(), new NamespaceModuleIdentifier(USED_TWICE_NS, USED_TWICE_MODULE_NAME,
474 final YLeaf leaf4 = getLeaf(cont1, "leaf4");
475 assertTrue(leaf4.getDefault() != null);
476 assertTrue(leaf4.getDefault().getValue().equals("5"));
477 assertOriginalTypedef(leaf4.getType(), new NamespaceModuleIdentifier(USED_TWICE_NS, USED_TWICE_MODULE_NAME,
480 final YLeaf leaf5 = getLeaf(cont1, "leaf5");
481 assertTrue(leaf5.getDefault() != null);
482 assertTrue(leaf5.getDefault().getValue().equals("20"));
483 assertOriginalTypedef(leaf5.getType(), new NamespaceModuleIdentifier(USED_TWICE_NS, USED_TWICE_MODULE_NAME,
485 assertOriginalTypedef(leaf5.getType(), 1, new NamespaceModuleIdentifier(USED_TWICE_NS, USED_TWICE_MODULE_NAME,
488 final YLeaf leaf6 = getLeaf(cont1, "leaf6");
489 assertTrue(leaf6.getDefault() != null);
490 assertTrue(leaf6.getDefault().getValue().equals("20"));
491 assertOriginalTypedef(leaf6.getType(), new NamespaceModuleIdentifier(USED_TWICE_NS, USED_TWICE_MODULE_NAME,
493 assertOriginalTypedef(leaf6.getType(), 1, new NamespaceModuleIdentifier(USED_TWICE_NS, USED_TWICE_MODULE_NAME,
496 final YLeaf leaf7 = getLeaf(cont1, "leaf7");
497 assertTrue(leaf7.getDefault() != null);
498 assertTrue(leaf7.getDefault().getValue().equals("5"));
499 assertOriginalTypedef(leaf7.getType(), new NamespaceModuleIdentifier(USED_TWICE_NS, USED_TWICE_MODULE_NAME,
501 assertOriginalTypedef(leaf7.getType(), 1, new NamespaceModuleIdentifier(USED_TWICE_NS, USED_TWICE_MODULE_NAME,
504 final YLeaf leaf8 = getLeaf(cont1, "leaf8");
505 assertTrue(leaf8.getDefault() != null);
506 assertTrue(leaf8.getDefault().getValue().equals("5"));
507 assertOriginalTypedef(leaf8.getType(), new NamespaceModuleIdentifier(USED_TWICE_NS, USED_TWICE_MODULE_NAME,
509 assertOriginalTypedef(leaf8.getType(), 1, new NamespaceModuleIdentifier(USED_TWICE_NS, USED_TWICE_MODULE_NAME,
514 public void test_Typedef_nested_union() {
516 parseRelativeImplementsYangModels(Arrays.asList("typedef-test/typedef-test-nested-union.yang"));
518 final YModule module = getModule("typedef-test-nested-union-module");
520 final YContainer cont1 = getContainer(module, "cont1");
522 final YLeaf leaf11 = getLeaf(cont1, "leaf11");
523 assertTrue(leaf11.getType().getDataType().equals("union"));
524 assertTrue(leaf11.getType().getTypes().size() == 2);
525 assertTrue(leaf11.getType().getTypes().get(0).getDataType().equals("int16"));
526 assertTrue(leaf11.getType().getTypes().get(1).getDataType().equals("string"));
528 final YLeaf leaf12 = getLeaf(cont1, "leaf12");
529 assertTrue(leaf12.getType().getDataType().equals("union"));
530 assertTrue(leaf12.getType().getTypes().size() == 4);
531 assertTrue(leaf12.getType().getTypes().get(0).getDataType().equals("int16"));
532 assertTrue(leaf12.getType().getTypes().get(1).getDataType().equals("string"));
533 assertTrue(leaf12.getType().getTypes().get(2).getDataType().equals("empty"));
534 assertTrue(leaf12.getType().getTypes().get(3).getDataType().equals("binary"));
536 final YLeaf leaf13 = getLeaf(cont1, "leaf13");
537 assertTrue(leaf13.getType().getDataType().equals("union"));
538 assertTrue(leaf13.getType().getTypes().size() == 4);
539 assertTrue(leaf13.getType().getTypes().get(0).getDataType().equals("empty"));
540 assertTrue(leaf13.getType().getTypes().get(1).getDataType().equals("binary"));
541 assertTrue(leaf13.getType().getTypes().get(2).getDataType().equals("int16"));
542 assertTrue(leaf13.getType().getTypes().get(3).getDataType().equals("string"));
544 final YLeaf leaf14 = getLeaf(cont1, "leaf14");
545 assertTrue(leaf14.getType().getDataType().equals("union"));
546 assertTrue(leaf14.getType().getTypes().size() == 4);
547 assertTrue(leaf14.getType().getTypes().get(0).getDataType().equals("int16"));
548 assertTrue(leaf14.getType().getTypes().get(1).getDataType().equals("empty"));
549 assertTrue(leaf14.getType().getTypes().get(2).getDataType().equals("binary"));
550 assertTrue(leaf14.getType().getTypes().get(3).getDataType().equals("string"));
552 final YLeaf leaf15 = getLeaf(cont1, "leaf15");
553 assertTrue(leaf15.getType().getDataType().equals("union"));
554 assertTrue(leaf15.getType().getTypes().size() == 6);
555 assertTrue(leaf15.getType().getTypes().get(0).getDataType().equals("int16"));
556 assertTrue(leaf15.getType().getTypes().get(1).getDataType().equals("empty"));
557 assertTrue(leaf15.getType().getTypes().get(2).getDataType().equals("int32"));
558 assertTrue(leaf15.getType().getTypes().get(3).getDataType().equals("boolean"));
559 assertTrue(leaf15.getType().getTypes().get(4).getDataType().equals("binary"));
560 assertTrue(leaf15.getType().getTypes().get(5).getDataType().equals("string"));
562 final YContainer cont2 = getContainer(module, "cont2");
564 final YLeaf leaf21 = getLeaf(cont2, "leaf21");
565 assertTrue(leaf21.getType().getDataType().equals("union"));
566 assertTrue(leaf21.getType().getTypes().size() == 2);
567 assertTrue(leaf21.getType().getTypes().get(0).getDataType().equals("binary"));
568 assertTrue(leaf21.getType().getTypes().get(1).getDataType().equals("empty"));
570 final YLeaf leaf22 = getLeaf(cont2, "leaf22");
571 assertTrue(leaf22.getType().getDataType().equals("union"));
572 assertTrue(leaf22.getType().getTypes().size() == 3);
573 assertTrue(leaf22.getType().getTypes().get(0).getDataType().equals("uint64"));
574 assertTrue(leaf22.getType().getTypes().get(1).getDataType().equals("binary"));
575 assertTrue(leaf22.getType().getTypes().get(2).getDataType().equals("empty"));
577 final YLeaf leaf23 = getLeaf(cont2, "leaf23");
578 assertTrue(leaf23.getType().getDataType().equals("union"));
579 assertTrue(leaf23.getType().getTypes().size() == 3);
580 assertTrue(leaf23.getType().getTypes().get(0).getDataType().equals("binary"));
581 assertTrue(leaf23.getType().getTypes().get(1).getDataType().equals("empty"));
582 assertTrue(leaf23.getType().getTypes().get(2).getDataType().equals("uint64"));
584 final YLeaf leaf24 = getLeaf(cont2, "leaf24");
585 assertTrue(leaf24.getType().getDataType().equals("union"));
586 assertTrue(leaf24.getType().getTypes().size() == 1);
587 assertTrue(leaf24.getType().getTypes().get(0).getDataType().equals("int32"));
589 final YLeaf leaf25 = getLeaf(cont2, "leaf25");
590 assertTrue(leaf25.getType().getDataType().equals("union"));
591 assertTrue(leaf25.getType().getTypes().size() == 2);
592 assertTrue(leaf25.getType().getTypes().get(0).getDataType().equals("uint64"));
593 assertTrue(leaf25.getType().getTypes().get(1).getDataType().equals("int32"));
595 final YLeaf leaf26 = getLeaf(cont2, "leaf26");
596 assertTrue(leaf26.getType().getDataType().equals("union"));
597 assertTrue(leaf26.getType().getTypes().size() == 3);
598 assertTrue(leaf26.getType().getTypes().get(0).getDataType().equals("boolean"));
599 assertTrue(leaf26.getType().getTypes().get(1).getDataType().equals("binary"));
600 assertTrue(leaf26.getType().getTypes().get(2).getDataType().equals("empty"));
602 final YLeaf leaf27 = getLeaf(cont2, "leaf27");
603 assertTrue(leaf27.getType().getDataType().equals("union"));
604 assertTrue(leaf27.getType().getTypes().size() == 4);
605 assertTrue(leaf27.getType().getTypes().get(0).getDataType().equals("boolean"));
606 assertTrue(leaf27.getType().getTypes().get(1).getDataType().equals("binary"));
607 assertTrue(leaf27.getType().getTypes().get(2).getDataType().equals("empty"));
608 assertTrue(leaf27.getType().getTypes().get(3).getDataType().equals("uint64"));
610 final YLeaf leaf28 = getLeaf(cont2, "leaf28");
611 assertTrue(leaf28.getType().getDataType().equals("union"));
612 assertTrue(leaf28.getType().getTypes().size() == 6);
613 assertTrue(leaf28.getType().getTypes().get(0).getDataType().equals("uint64"));
614 assertTrue(leaf28.getType().getTypes().get(1).getDataType().equals("boolean"));
615 assertTrue(leaf28.getType().getTypes().get(2).getDataType().equals("binary"));
616 assertTrue(leaf28.getType().getTypes().get(3).getDataType().equals("empty"));
617 assertTrue(leaf28.getType().getTypes().get(4).getDataType().equals("int32"));
618 assertTrue(leaf28.getType().getTypes().get(5).getDataType().equals("string"));
621 private static void assertOriginalTypedefStackSize(final YType yType, final int size) {
622 assertEquals(size, TypeResolver.getTypedefStack(yType).size());
625 private static void assertOriginalTypedef(final YType yType, final NamespaceModuleIdentifier soughtTypedefIdentity) {
626 assertOriginalTypedef(yType, 0, soughtTypedefIdentity);
629 private static void assertOriginalTypedef(final YType yType, final int index,
630 final NamespaceModuleIdentifier soughtTypedefIdentity) {
632 final List<NamespaceModuleIdentifier> stack = TypeResolver.getTypedefStack(yType);
633 if (index >= stack.size()) {
634 fail("Typedef stack index " + index + " does not exist.");
637 final NamespaceModuleIdentifier nsai = stack.get(index);
638 if (!nsai.toString().equals(soughtTypedefIdentity.toString())) {
639 fail("Expected '" + soughtTypedefIdentity + "' but got '" + nsai + "'.");