Introduce yangtools.binding.meta
[yangtools.git] / parser / yang-parser-rfc7950 / src / test / java / org / opendaylight / yangtools / yang / stmt / Bug4623Test.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. 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.stmt;
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.assertNotNull;
13
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;
23
24 class Bug4623Test extends AbstractYangTest {
25     private static Module TYPES;
26
27     @BeforeAll
28     static void beforeClass() throws Exception {
29         // given
30         TYPES = assertEffectiveModelDir("/bugs/bug4623").findModules("types").iterator().next();
31     }
32
33     @Test
34     void testStringTypeWithUnknownSchemaNodeAtTheEndOfTypeDefinition() {
35         // when
36         final var leaf = (LeafSchemaNode) TYPES.getDataChildByName(
37             QName.create(XMLNamespace.of("urn:custom.types.demo"), "leaf-length-pattern-unknown"));
38
39         // then
40         final var type = leaf.getType();
41         assertNotNull(type);
42
43         // here are no effective extensions
44         assertEquals(0, type.getUnknownSchemaNodes().size());
45         assertExtension(leaf);
46
47         final var lengthConstraint = ((StringTypeDefinition) type).getLengthConstraint().orElseThrow();
48         final var patternConstraints = ((StringTypeDefinition) type).getPatternConstraints();
49
50         assertNotNull(lengthConstraint);
51         assertNotNull(patternConstraints);
52         assertFalse(lengthConstraint.getAllowedRanges().isEmpty());
53         assertFalse(patternConstraints.isEmpty());
54
55         final var span = lengthConstraint.getAllowedRanges().span();
56         assertEquals(Integer.valueOf(2), span.lowerEndpoint());
57         assertEquals(Integer.valueOf(10), span.upperEndpoint());
58
59         final var patternConstraint = patternConstraints.get(0);
60         assertEquals("[0-9a-fA-F]", patternConstraint.getRegularExpressionString());
61     }
62
63     @Test
64     void testStringTypeWithUnknownSchemaNodeBetweenStringRestrictionStatements() {
65         // when
66         final var leaf = (LeafSchemaNode) TYPES.getDataChildByName(
67             QName.create(XMLNamespace.of("urn:custom.types.demo"), "leaf-length-unknown-pattern"));
68
69         // then
70         assertNotNull(leaf);
71
72         final var type = leaf.getType();
73         assertNotNull(type);
74         assertEquals(0, type.getUnknownSchemaNodes().size());
75         assertExtension(leaf);
76
77         final var lengthConstraints = ((StringTypeDefinition) type).getLengthConstraint().orElseThrow();
78         final var patternConstraints = ((StringTypeDefinition) type).getPatternConstraints();
79
80         assertNotNull(lengthConstraints);
81         assertNotNull(patternConstraints);
82         assertEquals(1, lengthConstraints.getAllowedRanges().asRanges().size());
83         assertFalse(patternConstraints.isEmpty());
84
85         final var lengthConstraint = lengthConstraints.getAllowedRanges().span();
86         assertEquals(Integer.valueOf(2), lengthConstraint.lowerEndpoint());
87         assertEquals(Integer.valueOf(10), lengthConstraint.upperEndpoint());
88
89         final var patternConstraint = patternConstraints.get(0);
90         assertEquals("[0-9a-fA-F]", patternConstraint.getRegularExpressionString());
91     }
92
93     @Test
94     void testStringTypeWithUnknownSchemaNodeOnTheStartOfTypeDefinition() {
95         // when
96         final var leaf = (LeafSchemaNode) TYPES.getDataChildByName(
97                 QName.create(XMLNamespace.of("urn:custom.types.demo"), "leaf-unknown-length-pattern"));
98
99         // then
100         final var type = leaf.getType();
101         assertNotNull(type);
102         assertEquals(0, type.getUnknownSchemaNodes().size());
103         assertExtension(leaf);
104
105         final var lengthConstraints = ((StringTypeDefinition) type).getLengthConstraint().orElseThrow();
106         assertEquals(1, lengthConstraints.getAllowedRanges().asRanges().size());
107
108         final var lengthConstraint = lengthConstraints.getAllowedRanges().span();
109         assertEquals(Integer.valueOf(2), lengthConstraint.lowerEndpoint());
110         assertEquals(Integer.valueOf(10), lengthConstraint.upperEndpoint());
111
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());
116     }
117
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());
123
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());
128     }
129 }