Populate xpath/ hierarchy
[yangtools.git] / yang / 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.Assert.assertEquals;
11 import static org.junit.Assert.assertFalse;
12 import static org.junit.Assert.assertNotNull;
13
14 import com.google.common.collect.Range;
15 import java.io.File;
16 import java.util.Collection;
17 import java.util.List;
18 import org.junit.Test;
19 import org.opendaylight.yangtools.yang.common.QName;
20 import org.opendaylight.yangtools.yang.common.XMLNamespace;
21 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
22 import org.opendaylight.yangtools.yang.model.api.Module;
23 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
24 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
25 import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement;
26 import org.opendaylight.yangtools.yang.model.api.stmt.UnrecognizedStatement;
27 import org.opendaylight.yangtools.yang.model.api.type.LengthConstraint;
28 import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint;
29 import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition;
30
31 public class Bug4623Test {
32
33     @Test
34     public void testStringTypeWithUnknownSchemaNodeAtTheEndOfTypeDefinition() throws Exception {
35         // given
36         final File extdef = new File(getClass().getResource("/bugs/bug4623/extension-def.yang").toURI());
37         final File stringWithExt = new File(getClass().getResource("/bugs/bug4623/string-with-ext.yang").toURI());
38
39         // when
40         final SchemaContext schemaContext = TestUtils.parseYangSources(extdef, stringWithExt);
41
42         final LeafSchemaNode leaf = (LeafSchemaNode) typesModule(schemaContext).getDataChildByName(
43             QName.create(XMLNamespace.of("urn:custom.types.demo"), "leaf-length-pattern-unknown"));
44
45         // then
46         final TypeDefinition<?> type = leaf.getType();
47         assertNotNull(type);
48
49         // here are no effective extensions
50         assertEquals(0, type.getUnknownSchemaNodes().size());
51         assertExtension(leaf);
52
53         final LengthConstraint lengthConstraint = ((StringTypeDefinition) type).getLengthConstraint().get();
54         final List<PatternConstraint> patternConstraints = ((StringTypeDefinition) type).getPatternConstraints();
55
56         assertNotNull(lengthConstraint);
57         assertNotNull(patternConstraints);
58         assertFalse(lengthConstraint.getAllowedRanges().isEmpty());
59         assertFalse(patternConstraints.isEmpty());
60
61         final Range<Integer> span = lengthConstraint.getAllowedRanges().span();
62         assertEquals(Integer.valueOf(2), span.lowerEndpoint());
63         assertEquals(Integer.valueOf(10), span.upperEndpoint());
64
65         final PatternConstraint patternConstraint = patternConstraints.get(0);
66         assertEquals(patternConstraint.getRegularExpressionString(), "[0-9a-fA-F]");
67     }
68
69     @Test
70     public void testStringTypeWithUnknownSchemaNodeBetweenStringRestrictionStatements() throws Exception {
71         // given
72         final File extdef = new File(getClass().getResource("/bugs/bug4623/extension-def.yang").toURI());
73         final File stringWithExt = new File(getClass().getResource("/bugs/bug4623/string-with-ext.yang").toURI());
74
75         // when
76         final SchemaContext schemaContext = TestUtils.parseYangSources(extdef, stringWithExt);
77
78         final LeafSchemaNode leaf = (LeafSchemaNode) typesModule(schemaContext).getDataChildByName(
79                 QName.create(XMLNamespace.of("urn:custom.types.demo"), "leaf-length-unknown-pattern"));
80
81         // then
82         assertNotNull(leaf);
83
84         final TypeDefinition<?> type = leaf.getType();
85         assertNotNull(type);
86         assertEquals(0, type.getUnknownSchemaNodes().size());
87         assertExtension(leaf);
88
89         final LengthConstraint lengthConstraints = ((StringTypeDefinition) type).getLengthConstraint().get();
90         final List<PatternConstraint> patternConstraints = ((StringTypeDefinition) type).getPatternConstraints();
91
92         assertNotNull(lengthConstraints);
93         assertNotNull(patternConstraints);
94         assertEquals(1, lengthConstraints.getAllowedRanges().asRanges().size());
95         assertFalse(patternConstraints.isEmpty());
96
97         final Range<Integer> lengthConstraint = lengthConstraints.getAllowedRanges().span();
98         assertEquals(Integer.valueOf(2), lengthConstraint.lowerEndpoint());
99         assertEquals(Integer.valueOf(10), lengthConstraint.upperEndpoint());
100
101         final PatternConstraint patternConstraint = patternConstraints.get(0);
102         assertEquals(patternConstraint.getRegularExpressionString(), "[0-9a-fA-F]");
103     }
104
105     @Test
106     public void testStringTypeWithUnknownSchemaNodeOnTheStartOfTypeDefinition() throws Exception {
107         // given
108         final File extdef = new File(getClass().getResource("/bugs/bug4623/extension-def.yang").toURI());
109         final File stringWithExt = new File(getClass().getResource("/bugs/bug4623/string-with-ext.yang").toURI());
110
111         // when
112         final SchemaContext schemaContext = TestUtils.parseYangSources(extdef, stringWithExt);
113
114         final LeafSchemaNode leaf = (LeafSchemaNode) typesModule(schemaContext).getDataChildByName(
115                 QName.create(XMLNamespace.of("urn:custom.types.demo"), "leaf-unknown-length-pattern"));
116
117         // then
118         assertNotNull(leaf);
119
120         final TypeDefinition<?> type = leaf.getType();
121         assertNotNull(type);
122         assertEquals(0, type.getUnknownSchemaNodes().size());
123         assertExtension(leaf);
124
125         final LengthConstraint lengthConstraints =
126                 ((StringTypeDefinition) type).getLengthConstraint().get();
127         final List<PatternConstraint> patternConstraints = ((StringTypeDefinition) type).getPatternConstraints();
128
129         assertNotNull(lengthConstraints);
130         assertNotNull(patternConstraints);
131         assertEquals(1, lengthConstraints.getAllowedRanges().asRanges().size());
132         assertFalse(patternConstraints.size() == 0);
133
134         final Range<Integer> lengthConstraint = lengthConstraints.getAllowedRanges().span();
135         assertEquals(Integer.valueOf(2), lengthConstraint.lowerEndpoint());
136         assertEquals(Integer.valueOf(10), lengthConstraint.upperEndpoint());
137
138         final PatternConstraint patternConstraint = patternConstraints.get(0);
139         assertEquals(patternConstraint.getRegularExpressionString(), "[0-9a-fA-F]");
140     }
141
142     private static void assertExtension(final LeafSchemaNode leaf) {
143         final Collection<? extends UnrecognizedStatement> unknownSchemaNodes = leaf.asEffectiveStatement().getDeclared()
144             .findFirstDeclaredSubstatement(TypeStatement.class).orElseThrow()
145             .declaredSubstatements(UnrecognizedStatement.class);
146         assertEquals(1, unknownSchemaNodes.size());
147
148         final UnrecognizedStatement unknownSchemaNode = unknownSchemaNodes.iterator().next();
149         assertEquals("unknown", unknownSchemaNode.argument());
150         assertEquals(QName.create("urn:simple.extension.typedefs", "unknown"),
151             unknownSchemaNode.statementDefinition().getStatementName());
152     }
153
154     private static Module typesModule(final SchemaContext context) {
155         return context.findModules("types").iterator().next();
156     }
157 }