2 * Copyright (c) 2016 Cisco Systems, Inc. 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.stmt;
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.assertNotNull;
14 import org.junit.jupiter.api.BeforeAll;
15 import org.junit.jupiter.api.Test;
16 import org.opendaylight.yangtools.yang.common.QName;
17 import org.opendaylight.yangtools.yang.common.XMLNamespace;
18 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
19 import org.opendaylight.yangtools.yang.model.api.Module;
20 import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement;
21 import org.opendaylight.yangtools.yang.model.api.stmt.UnrecognizedStatement;
22 import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition;
24 class Bug4623Test extends AbstractYangTest {
25 private static Module TYPES;
28 static void beforeClass() throws Exception {
30 TYPES = assertEffectiveModelDir("/bugs/bug4623").findModules("types").iterator().next();
34 void testStringTypeWithUnknownSchemaNodeAtTheEndOfTypeDefinition() {
36 final var leaf = (LeafSchemaNode) TYPES.getDataChildByName(
37 QName.create(XMLNamespace.of("urn:custom.types.demo"), "leaf-length-pattern-unknown"));
40 final var type = leaf.getType();
43 // here are no effective extensions
44 assertEquals(0, type.getUnknownSchemaNodes().size());
45 assertExtension(leaf);
47 final var lengthConstraint = ((StringTypeDefinition) type).getLengthConstraint().orElseThrow();
48 final var patternConstraints = ((StringTypeDefinition) type).getPatternConstraints();
50 assertNotNull(lengthConstraint);
51 assertNotNull(patternConstraints);
52 assertFalse(lengthConstraint.getAllowedRanges().isEmpty());
53 assertFalse(patternConstraints.isEmpty());
55 final var span = lengthConstraint.getAllowedRanges().span();
56 assertEquals(Integer.valueOf(2), span.lowerEndpoint());
57 assertEquals(Integer.valueOf(10), span.upperEndpoint());
59 final var patternConstraint = patternConstraints.get(0);
60 assertEquals("[0-9a-fA-F]", patternConstraint.getRegularExpressionString());
64 void testStringTypeWithUnknownSchemaNodeBetweenStringRestrictionStatements() {
66 final var leaf = (LeafSchemaNode) TYPES.getDataChildByName(
67 QName.create(XMLNamespace.of("urn:custom.types.demo"), "leaf-length-unknown-pattern"));
72 final var type = leaf.getType();
74 assertEquals(0, type.getUnknownSchemaNodes().size());
75 assertExtension(leaf);
77 final var lengthConstraints = ((StringTypeDefinition) type).getLengthConstraint().orElseThrow();
78 final var patternConstraints = ((StringTypeDefinition) type).getPatternConstraints();
80 assertNotNull(lengthConstraints);
81 assertNotNull(patternConstraints);
82 assertEquals(1, lengthConstraints.getAllowedRanges().asRanges().size());
83 assertFalse(patternConstraints.isEmpty());
85 final var lengthConstraint = lengthConstraints.getAllowedRanges().span();
86 assertEquals(Integer.valueOf(2), lengthConstraint.lowerEndpoint());
87 assertEquals(Integer.valueOf(10), lengthConstraint.upperEndpoint());
89 final var patternConstraint = patternConstraints.get(0);
90 assertEquals("[0-9a-fA-F]", patternConstraint.getRegularExpressionString());
94 void testStringTypeWithUnknownSchemaNodeOnTheStartOfTypeDefinition() {
96 final var leaf = (LeafSchemaNode) TYPES.getDataChildByName(
97 QName.create(XMLNamespace.of("urn:custom.types.demo"), "leaf-unknown-length-pattern"));
100 final var type = leaf.getType();
102 assertEquals(0, type.getUnknownSchemaNodes().size());
103 assertExtension(leaf);
105 final var lengthConstraints = ((StringTypeDefinition) type).getLengthConstraint().orElseThrow();
106 assertEquals(1, lengthConstraints.getAllowedRanges().asRanges().size());
108 final var lengthConstraint = lengthConstraints.getAllowedRanges().span();
109 assertEquals(Integer.valueOf(2), lengthConstraint.lowerEndpoint());
110 assertEquals(Integer.valueOf(10), lengthConstraint.upperEndpoint());
112 final var patternConstraints = ((StringTypeDefinition) type).getPatternConstraints();
113 assertEquals(1, patternConstraints.size());
114 final var patternConstraint = patternConstraints.get(0);
115 assertEquals("[0-9a-fA-F]", patternConstraint.getRegularExpressionString());
118 private static void assertExtension(final LeafSchemaNode leaf) {
119 final var unknownSchemaNodes = leaf.asEffectiveStatement().getDeclared()
120 .findFirstDeclaredSubstatement(TypeStatement.class).orElseThrow()
121 .declaredSubstatements(UnrecognizedStatement.class);
122 assertEquals(1, unknownSchemaNodes.size());
124 final var unknownSchemaNode = unknownSchemaNodes.iterator().next();
125 assertEquals("unknown", unknownSchemaNode.argument());
126 assertEquals(QName.create("urn:simple.extension.typedefs", "unknown"),
127 unknownSchemaNode.statementDefinition().getStatementName());