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.Assert.assertEquals;
11 import static org.junit.Assert.assertFalse;
12 import static org.junit.Assert.assertNotNull;
14 import com.google.common.collect.Range;
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;
31 public class Bug4623Test {
34 public void testStringTypeWithUnknownSchemaNodeAtTheEndOfTypeDefinition() throws Exception {
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());
40 final SchemaContext schemaContext = TestUtils.parseYangSources(extdef, stringWithExt);
42 final LeafSchemaNode leaf = (LeafSchemaNode) typesModule(schemaContext).getDataChildByName(
43 QName.create(XMLNamespace.of("urn:custom.types.demo"), "leaf-length-pattern-unknown"));
46 final TypeDefinition<?> type = leaf.getType();
49 // here are no effective extensions
50 assertEquals(0, type.getUnknownSchemaNodes().size());
51 assertExtension(leaf);
53 final LengthConstraint lengthConstraint = ((StringTypeDefinition) type).getLengthConstraint().get();
54 final List<PatternConstraint> patternConstraints = ((StringTypeDefinition) type).getPatternConstraints();
56 assertNotNull(lengthConstraint);
57 assertNotNull(patternConstraints);
58 assertFalse(lengthConstraint.getAllowedRanges().isEmpty());
59 assertFalse(patternConstraints.isEmpty());
61 final Range<Integer> span = lengthConstraint.getAllowedRanges().span();
62 assertEquals(Integer.valueOf(2), span.lowerEndpoint());
63 assertEquals(Integer.valueOf(10), span.upperEndpoint());
65 final PatternConstraint patternConstraint = patternConstraints.get(0);
66 assertEquals(patternConstraint.getRegularExpressionString(), "[0-9a-fA-F]");
70 public void testStringTypeWithUnknownSchemaNodeBetweenStringRestrictionStatements() throws Exception {
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());
76 final SchemaContext schemaContext = TestUtils.parseYangSources(extdef, stringWithExt);
78 final LeafSchemaNode leaf = (LeafSchemaNode) typesModule(schemaContext).getDataChildByName(
79 QName.create(XMLNamespace.of("urn:custom.types.demo"), "leaf-length-unknown-pattern"));
84 final TypeDefinition<?> type = leaf.getType();
86 assertEquals(0, type.getUnknownSchemaNodes().size());
87 assertExtension(leaf);
89 final LengthConstraint lengthConstraints = ((StringTypeDefinition) type).getLengthConstraint().get();
90 final List<PatternConstraint> patternConstraints = ((StringTypeDefinition) type).getPatternConstraints();
92 assertNotNull(lengthConstraints);
93 assertNotNull(patternConstraints);
94 assertEquals(1, lengthConstraints.getAllowedRanges().asRanges().size());
95 assertFalse(patternConstraints.isEmpty());
97 final Range<Integer> lengthConstraint = lengthConstraints.getAllowedRanges().span();
98 assertEquals(Integer.valueOf(2), lengthConstraint.lowerEndpoint());
99 assertEquals(Integer.valueOf(10), lengthConstraint.upperEndpoint());
101 final PatternConstraint patternConstraint = patternConstraints.get(0);
102 assertEquals(patternConstraint.getRegularExpressionString(), "[0-9a-fA-F]");
106 public void testStringTypeWithUnknownSchemaNodeOnTheStartOfTypeDefinition() throws Exception {
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());
112 final SchemaContext schemaContext = TestUtils.parseYangSources(extdef, stringWithExt);
114 final LeafSchemaNode leaf = (LeafSchemaNode) typesModule(schemaContext).getDataChildByName(
115 QName.create(XMLNamespace.of("urn:custom.types.demo"), "leaf-unknown-length-pattern"));
120 final TypeDefinition<?> type = leaf.getType();
122 assertEquals(0, type.getUnknownSchemaNodes().size());
123 assertExtension(leaf);
125 final LengthConstraint lengthConstraints =
126 ((StringTypeDefinition) type).getLengthConstraint().get();
127 final List<PatternConstraint> patternConstraints = ((StringTypeDefinition) type).getPatternConstraints();
129 assertNotNull(lengthConstraints);
130 assertNotNull(patternConstraints);
131 assertEquals(1, lengthConstraints.getAllowedRanges().asRanges().size());
132 assertFalse(patternConstraints.size() == 0);
134 final Range<Integer> lengthConstraint = lengthConstraints.getAllowedRanges().span();
135 assertEquals(Integer.valueOf(2), lengthConstraint.lowerEndpoint());
136 assertEquals(Integer.valueOf(10), lengthConstraint.upperEndpoint());
138 final PatternConstraint patternConstraint = patternConstraints.get(0);
139 assertEquals(patternConstraint.getRegularExpressionString(), "[0-9a-fA-F]");
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());
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());
154 private static Module typesModule(final SchemaContext context) {
155 return context.findModules("types").iterator().next();