2f66cb53d1e311697a204313856f15772a5ad70a
[yangtools.git] / yang / yang-parser-rfc7950 / src / test / java / org / opendaylight / yangtools / yang / stmt / EffectiveStatementTypeTest.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 import static org.junit.Assert.assertNull;
14 import static org.junit.Assert.assertTrue;
15 import static org.opendaylight.yangtools.yang.stmt.StmtTestUtils.sourceForResource;
16
17 import com.google.common.collect.Range;
18 import java.util.Iterator;
19 import java.util.List;
20 import java.util.Optional;
21 import org.junit.AfterClass;
22 import org.junit.BeforeClass;
23 import org.junit.Test;
24 import org.opendaylight.yangtools.yang.common.QName;
25 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
26 import org.opendaylight.yangtools.yang.model.api.Module;
27 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
28 import org.opendaylight.yangtools.yang.model.api.Status;
29 import org.opendaylight.yangtools.yang.model.api.stmt.LeafEffectiveStatement;
30 import org.opendaylight.yangtools.yang.model.api.stmt.TypeDefinitionAware;
31 import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement;
32 import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition;
33 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
34 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition.Bit;
35 import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition;
36 import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition;
37 import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
38 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
39 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair;
40 import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition;
41 import org.opendaylight.yangtools.yang.model.api.type.InstanceIdentifierTypeDefinition;
42 import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
43 import org.opendaylight.yangtools.yang.model.api.type.LengthConstraint;
44 import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint;
45 import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition;
46 import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
47 import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.RFC7950Reactors;
48 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
49
50 public class EffectiveStatementTypeTest {
51     private static SchemaContext effectiveSchemaContext;
52     private static Module types;
53
54     private LeafSchemaNode currentLeaf;
55
56     @BeforeClass
57     public static void setup() throws ReactorException {
58         effectiveSchemaContext = RFC7950Reactors.defaultReactor().newBuild()
59                 .addSource(sourceForResource("/type-tests/types.yang"))
60                 .buildEffective();
61         types = effectiveSchemaContext.findModules("types").iterator().next();
62         assertNotNull(types);
63     }
64
65     @AfterClass
66     public static void teardown() {
67         effectiveSchemaContext = null;
68         types = null;
69     }
70
71     @Test
72     public void testBinary() {
73         currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-binary"));
74         assertNotNull(currentLeaf.getType());
75
76         final BinaryTypeDefinition binaryEff = (BinaryTypeDefinition)
77                 ((TypeEffectiveStatement<?>) ((LeafEffectiveStatement) currentLeaf)
78                 .effectiveSubstatements().iterator().next()).getTypeDefinition();
79
80         assertNull(binaryEff.getBaseType());
81         assertEquals(Optional.empty(), binaryEff.getUnits());
82         assertEquals(Optional.empty(), binaryEff.getDefaultValue());
83         assertEquals("binary", binaryEff.getQName().getLocalName());
84         assertFalse(binaryEff.getLengthConstraint().isPresent());
85         assertEquals(Status.CURRENT, binaryEff.getStatus());
86         assertEquals("binary", binaryEff.getPath().getPathFromRoot().iterator().next().getLocalName());
87         assertNotNull(binaryEff.getUnknownSchemaNodes());
88         assertFalse(binaryEff.getDescription().isPresent());
89         assertFalse(binaryEff.getReference().isPresent());
90     }
91
92     @Test
93     public void testBits() {
94         currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-bits"));
95         assertNotNull(currentLeaf.getType());
96
97         final Iterator<? extends Bit> bitsEffIter = ((BitsTypeDefinition) currentLeaf.getType()).getBits().iterator();
98         final Bit bitEff = bitsEffIter.next();
99         final Bit bitEffSecond = bitsEffIter.next();
100
101         final BitsTypeDefinition bitsEff = (BitsTypeDefinition) ((TypeDefinitionAware)
102                 ((LeafEffectiveStatement) currentLeaf).effectiveSubstatements().iterator().next())
103                 .getTypeDefinition();
104
105         assertNull(bitsEff.getBaseType());
106         assertNotNull(bitsEff.getQName());
107         assertEquals("bits", bitsEff.getQName().getLocalName());
108         assertEquals("bits", bitsEff.getPath().getLastComponent().getLocalName());
109         assertNotNull(bitsEff.getUnknownSchemaNodes());
110         assertFalse(bitsEff.getDescription().isPresent());
111         assertFalse(bitsEff.getReference().isPresent());
112         assertEquals(Status.CURRENT, bitsEff.getStatus());
113         assertEquals(Optional.empty(), bitsEff.getUnits());
114         assertNotNull(bitsEff.toString());
115         assertNotNull(bitsEff.hashCode());
116         assertFalse(bitsEff.equals(null));
117         assertFalse(bitsEff.equals("test"));
118         assertTrue(bitsEff.equals(bitsEff));
119         assertEquals(3, bitsEff.getBits().size());
120         assertEquals(Optional.empty(), bitsEff.getDefaultValue());
121
122         assertNotNull(bitEff.getPath());
123         assertNotNull(bitEff.getUnknownSchemaNodes());
124         assertEquals(Optional.of("test bit"), bitEff.getDescription());
125         assertEquals(Optional.of("test bit ref"), bitEff.getReference());
126         assertEquals(Status.CURRENT, bitEff.getStatus());
127         assertNotNull(bitEff.hashCode());
128         assertFalse(bitEff.equals(null));
129         assertFalse(bitEff.equals("test"));
130         assertFalse(bitEff.equals(bitEffSecond));
131         assertNotNull(bitEff.toString());
132         assertEquals("one", bitEff.getName());
133         assertNotNull(bitEff.getQName());
134         assertEquals(0, bitEff.getPosition());
135     }
136
137     @Test
138     public void testBoolean() {
139         currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-boolean"));
140         assertNotNull(currentLeaf.getType());
141         final BooleanTypeDefinition booleanEff = (BooleanTypeDefinition) ((TypeEffectiveStatement<?>)
142                 ((LeafEffectiveStatement) currentLeaf).effectiveSubstatements().iterator().next())
143                 .getTypeDefinition();
144
145         assertNull(booleanEff.getBaseType());
146         assertEquals(Optional.empty(), booleanEff.getUnits());
147         assertEquals(Optional.empty(), booleanEff.getDefaultValue());
148         assertEquals("boolean", booleanEff.getQName().getLocalName());
149         assertNull(booleanEff.getPath().getParent().getParent());
150         assertNotNull(booleanEff.getUnknownSchemaNodes());
151         assertFalse(booleanEff.getDescription().isPresent());
152         assertFalse(booleanEff.getReference().isPresent());
153         assertEquals(Status.CURRENT, booleanEff.getStatus());
154         assertNotNull(booleanEff.toString());
155     }
156
157     @Test
158     public void testDecimal64() {
159         currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-decimal64"));
160         assertNotNull(currentLeaf.getType());
161         final DecimalTypeDefinition decimal64Eff = (DecimalTypeDefinition) ((TypeDefinitionAware)
162                 ((LeafEffectiveStatement) currentLeaf).effectiveSubstatements().iterator().next())
163                 .getTypeDefinition();
164
165         assertNull(decimal64Eff.getBaseType());
166         assertEquals(Optional.empty(), decimal64Eff.getUnits());
167         assertEquals(Optional.empty(), decimal64Eff.getDefaultValue());
168         assertEquals("decimal64", decimal64Eff.getQName().getLocalName());
169         assertNotNull(decimal64Eff.getUnknownSchemaNodes());
170
171         // FIXME: The yang model api is wrong: description/reference/status are not allowed under 'type', how come we
172         // parse it?
173         // allowed under 'type', how come we parse it?
174         assertFalse(decimal64Eff.getDescription().isPresent());
175         assertFalse(decimal64Eff.getReference().isPresent());
176         assertEquals(Status.CURRENT, decimal64Eff.getStatus());
177
178         assertEquals(3, decimal64Eff.getRangeConstraint().get().getAllowedRanges().asRanges().size());
179         assertNotNull(decimal64Eff.toString());
180         assertNotNull(decimal64Eff.hashCode());
181         assertEquals(2, decimal64Eff.getFractionDigits());
182         assertFalse(decimal64Eff.equals(null));
183         assertFalse(decimal64Eff.equals("test"));
184         assertTrue(decimal64Eff.equals(decimal64Eff));
185         assertEquals("decimal64", decimal64Eff.getPath().getLastComponent().getLocalName());
186     }
187
188     @Test
189     public void testEmpty() {
190         currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-empty"));
191         assertNotNull(currentLeaf.getType());
192         final EmptyTypeDefinition emptyEff = (EmptyTypeDefinition) ((TypeEffectiveStatement<?>)
193                 ((LeafEffectiveStatement) currentLeaf).effectiveSubstatements().iterator().next())
194                 .getTypeDefinition();
195
196         assertEquals(Optional.empty(), emptyEff.getUnits());
197         assertEquals(Optional.empty(), emptyEff.getDefaultValue());
198         assertNull(emptyEff.getBaseType());
199         assertEquals("empty", emptyEff.getQName().getLocalName());
200         assertNull(emptyEff.getPath().getParent().getParent());
201         assertNotNull(emptyEff.getUnknownSchemaNodes());
202         assertFalse(emptyEff.getDescription().isPresent());
203         assertFalse(emptyEff.getReference().isPresent());
204         assertEquals("CURRENT", emptyEff.getStatus().toString());
205         assertNotNull(emptyEff.toString());
206     }
207
208     @Test
209     public void testEnum() {
210         currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-enum"));
211         assertNotNull(currentLeaf.getType());
212         final List<EnumTypeDefinition.EnumPair> enumEffIter = ((EnumTypeDefinition) currentLeaf.getType()).getValues();
213         final EnumPair enumEff = enumEffIter.iterator().next();
214
215         final EnumTypeDefinition enumSpecEff = (EnumTypeDefinition) ((TypeDefinitionAware)
216                 ((LeafEffectiveStatement) currentLeaf).effectiveSubstatements().iterator().next())
217                 .getTypeDefinition();
218
219         assertEquals("enumeration", enumSpecEff.getQName().getLocalName());
220         assertEquals("enumeration", enumSpecEff.getPath().getLastComponent().getLocalName());
221         assertEquals(Optional.empty(), enumSpecEff.getDefaultValue());
222         assertEquals(3, enumSpecEff.getValues().size());
223         assertNull(enumSpecEff.getBaseType());
224         assertNotNull(enumSpecEff.getUnknownSchemaNodes());
225         assertEquals(Status.CURRENT, enumSpecEff.getStatus());
226         assertFalse(enumSpecEff.getDescription().isPresent());
227         assertFalse(enumSpecEff.getReference().isPresent());
228         assertEquals(Optional.empty(), enumSpecEff.getUnits());
229         assertNotNull(enumSpecEff.toString());
230         assertNotNull(enumSpecEff.hashCode());
231         assertFalse(enumSpecEff.equals(null));
232         assertFalse(enumSpecEff.equals("test"));
233         assertTrue(enumSpecEff.equals(enumSpecEff));
234
235         assertEquals("zero", enumEff.getName());
236         assertNotNull(enumEff.getUnknownSchemaNodes());
237         assertEquals(Optional.of("test enum"), enumEff.getDescription());
238         assertEquals(Optional.of("test enum ref"), enumEff.getReference());
239         assertEquals(Status.CURRENT, enumEff.getStatus());
240         assertEquals(0, enumEff.getValue());
241     }
242
243     @Test
244     public void testIdentityRef() {
245         currentLeaf = (LeafSchemaNode) types
246                 .getDataChildByName(QName.create(types.getQNameModule(), "leaf-identityref"));
247         assertNotNull(currentLeaf.getType());
248         final IdentityrefTypeDefinition identityRefEff = (IdentityrefTypeDefinition) ((TypeDefinitionAware)
249                 ((LeafEffectiveStatement) currentLeaf).effectiveSubstatements().iterator().next())
250                 .getTypeDefinition();
251
252         assertEquals(Optional.empty(), identityRefEff.getDefaultValue());
253         assertEquals("identityref", identityRefEff.getQName().getLocalName());
254         assertEquals("identityref", identityRefEff.getPath().getLastComponent().getLocalName());
255         assertNull(identityRefEff.getBaseType());
256         assertNotNull(identityRefEff.getUnknownSchemaNodes());
257         assertEquals(Status.CURRENT, identityRefEff.getStatus());
258         assertEquals("test-identity", identityRefEff.getIdentities().iterator().next().getQName().getLocalName());
259         assertFalse(identityRefEff.getDescription().isPresent());
260         assertFalse(identityRefEff.getReference().isPresent());
261         assertNotNull(identityRefEff.toString());
262
263         // FIXME: the model is wrong, but we accept units in 'type' statement
264         assertEquals(Optional.empty(), identityRefEff.getUnits());
265     }
266
267     @Test
268     public void testInstanceIdentifier() {
269         currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(),
270                 "leaf-instance-identifier"));
271         assertNotNull(currentLeaf.getType());
272         final InstanceIdentifierTypeDefinition instanceIdentEff = (InstanceIdentifierTypeDefinition)
273                 ((TypeEffectiveStatement<?>) ((LeafEffectiveStatement) currentLeaf).effectiveSubstatements()
274                         .iterator().next()).getTypeDefinition();
275         assertNotNull(instanceIdentEff.toString());
276
277         assertFalse(instanceIdentEff.requireInstance());
278         assertEquals("instance-identifier", instanceIdentEff.getQName().getLocalName());
279         assertEquals("instance-identifier", instanceIdentEff.getPath().getLastComponent().getLocalName());
280         assertNull(instanceIdentEff.getBaseType());
281         assertEquals(Optional.empty(), instanceIdentEff.getDefaultValue());
282         assertNotNull(instanceIdentEff.getUnknownSchemaNodes());
283         assertFalse(instanceIdentEff.getDescription().isPresent());
284         assertFalse(instanceIdentEff.getReference().isPresent());
285         assertEquals(Optional.empty(), instanceIdentEff.getUnits());
286         assertEquals(Status.CURRENT, instanceIdentEff.getStatus());
287         assertNotNull(instanceIdentEff.hashCode());
288         assertFalse(instanceIdentEff.equals(null));
289         assertFalse(instanceIdentEff.equals("test"));
290         assertTrue(instanceIdentEff.equals(instanceIdentEff));
291     }
292
293     @Test
294     public void testLeafref() {
295         currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-leafref"));
296         assertNotNull(currentLeaf.getType());
297
298         final LeafrefTypeDefinition leafrefEff = (LeafrefTypeDefinition) ((TypeDefinitionAware)
299                 ((LeafEffectiveStatement) currentLeaf).effectiveSubstatements().iterator().next())
300                 .getTypeDefinition();
301
302         assertEquals("/container-test/leaf-test", leafrefEff.getPathStatement().getOriginalString());
303         assertNull(leafrefEff.getBaseType());
304         assertEquals(Optional.empty(), leafrefEff.getUnits());
305         assertEquals(Optional.empty(), leafrefEff.getDefaultValue());
306         assertNotNull(leafrefEff.toString());
307         assertEquals("leafref", leafrefEff.getQName().getLocalName());
308         assertEquals(Status.CURRENT, leafrefEff.getStatus());
309         assertNotNull(leafrefEff.getUnknownSchemaNodes());
310         assertEquals("leafref", leafrefEff.getPath().getLastComponent().getLocalName());
311         assertFalse(leafrefEff.getDescription().isPresent());
312         assertFalse(leafrefEff.getReference().isPresent());
313         assertNotNull(leafrefEff.hashCode());
314         assertFalse(leafrefEff.equals(null));
315         assertFalse(leafrefEff.equals("test"));
316         assertTrue(leafrefEff.equals(leafrefEff));
317     }
318
319     @Test
320     public void testLeafrefWithDeref() {
321         currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName
322                 .create(types.getQNameModule(), "leaf-leafref-deref"));
323         assertNotNull(currentLeaf.getType());
324
325         final LeafrefTypeDefinition leafrefEff = (LeafrefTypeDefinition) ((TypeDefinitionAware)
326                 ((LeafEffectiveStatement) currentLeaf).effectiveSubstatements().iterator().next())
327                 .getTypeDefinition();
328
329         assertEquals("deref(../container-test)/leaf-test",
330                 leafrefEff.getPathStatement().getOriginalString());
331         assertNull(leafrefEff.getBaseType());
332         assertEquals(Optional.empty(), leafrefEff.getUnits());
333         assertEquals(Optional.empty(), leafrefEff.getDefaultValue());
334         assertNotNull(leafrefEff.toString());
335         assertEquals("leafref", leafrefEff.getQName().getLocalName());
336         assertEquals(Status.CURRENT, leafrefEff.getStatus());
337         assertNotNull(leafrefEff.getUnknownSchemaNodes());
338         assertEquals("leafref", leafrefEff.getPath().getLastComponent().getLocalName());
339         assertFalse(leafrefEff.getDescription().isPresent());
340         assertFalse(leafrefEff.getReference().isPresent());
341         assertNotNull(leafrefEff.hashCode());
342         assertFalse(leafrefEff.equals(null));
343         assertFalse(leafrefEff.equals("test"));
344         assertTrue(leafrefEff.equals(leafrefEff));
345     }
346
347     @Test
348     public void testIntAll() {
349         currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-int8"));
350         assertNotNull(currentLeaf.getType());
351         final TypeEffectiveStatement<?> int8Eff = (TypeEffectiveStatement<?>)
352                 ((LeafEffectiveStatement) currentLeaf).effectiveSubstatements().iterator().next();
353         assertNotNull(int8Eff.toString());
354
355         currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-int16"));
356         assertNotNull(currentLeaf.getType());
357         final TypeEffectiveStatement<?> int16Eff = (TypeEffectiveStatement<?>)
358                 ((LeafEffectiveStatement) currentLeaf).effectiveSubstatements().iterator().next();
359         assertNotNull(int16Eff.toString());
360
361         currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-int32"));
362         assertNotNull(currentLeaf.getType());
363         final TypeEffectiveStatement<?> int32Eff = (TypeEffectiveStatement<?>)
364                 ((LeafEffectiveStatement) currentLeaf).effectiveSubstatements().iterator().next();
365         assertNotNull(int32Eff.toString());
366
367         currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-int64"));
368         assertNotNull(currentLeaf.getType());
369         final TypeEffectiveStatement<?> int64Eff = (TypeEffectiveStatement<?>)
370                 ((LeafEffectiveStatement) currentLeaf).effectiveSubstatements().iterator().next();
371         assertNotNull(int64Eff.toString());
372
373         currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-uint8"));
374         assertNotNull(currentLeaf.getType());
375         final TypeEffectiveStatement<?> uint8Eff = (TypeEffectiveStatement<?>)
376                 ((LeafEffectiveStatement) currentLeaf).effectiveSubstatements().iterator().next();
377         assertNotNull(uint8Eff.toString());
378
379         currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-uint16"));
380         assertNotNull(currentLeaf.getType());
381         final TypeEffectiveStatement<?> uint16Eff = (TypeEffectiveStatement<?>)
382                 ((LeafEffectiveStatement) currentLeaf).effectiveSubstatements().iterator().next();
383         assertNotNull(uint16Eff.toString());
384
385         currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-uint32"));
386         assertNotNull(currentLeaf.getType());
387         final TypeEffectiveStatement<?> uint32Eff = (TypeEffectiveStatement<?>)
388                 ((LeafEffectiveStatement) currentLeaf).effectiveSubstatements().iterator().next();
389         assertNotNull(uint32Eff.toString());
390
391         currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-uint64"));
392         assertNotNull(currentLeaf.getType());
393         final TypeEffectiveStatement<?> uint64Eff = (TypeEffectiveStatement<?>)
394                 ((LeafEffectiveStatement) currentLeaf).effectiveSubstatements().iterator().next();
395         assertNotNull(uint64Eff.toString());
396     }
397
398     @Test
399     public void testUnion() {
400         currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-union"));
401         assertNotNull(currentLeaf.getType());
402         final UnionTypeDefinition unionEff = (UnionTypeDefinition) ((TypeDefinitionAware)
403                 ((LeafEffectiveStatement) currentLeaf).effectiveSubstatements().iterator().next())
404                 .getTypeDefinition();
405
406         assertEquals(2, unionEff.getTypes().size());
407         assertEquals("union", unionEff.getQName().getLocalName());
408         assertEquals("CURRENT", unionEff.getStatus().toString());
409         assertNotNull(unionEff.getUnknownSchemaNodes());
410         assertNull(unionEff.getBaseType());
411         assertEquals(Optional.empty(), unionEff.getUnits());
412         assertEquals(Optional.empty(), unionEff.getDefaultValue());
413         assertFalse(unionEff.getDescription().isPresent());
414         assertFalse(unionEff.getReference().isPresent());
415         assertNotNull(unionEff.toString());
416         assertNotNull(unionEff.hashCode());
417         assertFalse(unionEff.equals(null));
418         assertFalse(unionEff.equals("test"));
419         assertTrue(unionEff.equals(unionEff));
420         assertEquals("union", unionEff.getPath().getLastComponent().getLocalName());
421     }
422
423     @Test
424     public void testLengthConstraint() {
425         currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(),
426                 "leaf-length-pattern"));
427
428         final StringTypeDefinition leafType = (StringTypeDefinition) currentLeaf.getType();
429         assertNotNull(leafType);
430         final LengthConstraint lengthConstraint = leafType.getLengthConstraint().get();
431
432         final Range<Integer> span = lengthConstraint.getAllowedRanges().span();
433         assertEquals(1, span.lowerEndpoint().intValue());
434         assertEquals(255, span.upperEndpoint().intValue());
435         assertFalse(lengthConstraint.getReference().isPresent());
436         assertFalse(lengthConstraint.getDescription().isPresent());
437         assertFalse(lengthConstraint.getErrorMessage().isPresent());
438         assertFalse(lengthConstraint.getErrorAppTag().isPresent());
439         assertNotNull(lengthConstraint.toString());
440         assertNotNull(lengthConstraint.hashCode());
441         assertFalse(lengthConstraint.equals(null));
442         assertFalse(lengthConstraint.equals("test"));
443
444         currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(),
445                 "leaf-length-pattern-second"));
446         assertNotNull(currentLeaf.getType());
447         final LengthConstraint lengthConstraintSecond = ((StringTypeDefinition) currentLeaf.getType())
448                 .getLengthConstraint().get();
449         assertFalse(lengthConstraint.equals(lengthConstraintSecond));
450     }
451
452     @Test
453     public void testPatternConstraint() {
454         currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(),
455                 "leaf-length-pattern"));
456         assertNotNull(currentLeaf.getType());
457         final PatternConstraint patternConstraint = ((StringTypeDefinition) currentLeaf.getType())
458                 .getPatternConstraints().get(0);
459         final PatternConstraint patternConstraintThird = ((StringTypeDefinition) currentLeaf.getType())
460                 .getPatternConstraints().get(0);
461         currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(),
462                 "leaf-length-pattern-second"));
463         assertNotNull(currentLeaf.getType());
464         final PatternConstraint patternConstraintSecond = ((StringTypeDefinition) currentLeaf.getType())
465                 .getPatternConstraints().get(0);
466
467         assertEquals("^(?:[0-9a-fA-F]*)$", patternConstraint.getJavaPatternString());
468         assertFalse(patternConstraint.getReference().isPresent());
469         assertFalse(patternConstraint.getDescription().isPresent());
470         assertEquals(Optional.empty(), patternConstraint.getErrorMessage());
471         assertEquals(Optional.of("invalid-regular-expression"), patternConstraint.getErrorAppTag());
472         assertNotNull(patternConstraint.toString());
473         assertNotNull(patternConstraint.hashCode());
474         assertFalse(patternConstraint.equals(null));
475         assertFalse(patternConstraint.equals("test"));
476         assertFalse(patternConstraint.equals(patternConstraintSecond));
477         assertTrue(patternConstraint.equals(patternConstraintThird));
478     }
479
480     @Test
481     public void testString() {
482         currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-string"));
483         assertNotNull(currentLeaf.getType());
484         final StringTypeDefinition stringEff = (StringTypeDefinition) ((TypeEffectiveStatement<?>)
485                 ((LeafEffectiveStatement) currentLeaf).effectiveSubstatements().iterator().next())
486                 .getTypeDefinition();
487
488         assertEquals("string", stringEff.getQName().getLocalName());
489         assertEquals(Status.CURRENT, stringEff.getStatus());
490         assertEquals(Optional.empty(), stringEff.getUnits());
491         assertEquals(Optional.empty(), stringEff.getDefaultValue());
492         assertNotNull(stringEff.getUnknownSchemaNodes());
493         assertNull(stringEff.getBaseType());
494         assertFalse(stringEff.getDescription().isPresent());
495         assertFalse(stringEff.getReference().isPresent());
496         assertNotNull(stringEff.toString());
497         assertNotNull(stringEff.hashCode());
498         assertFalse(stringEff.equals(null));
499         assertFalse(stringEff.equals("test"));
500         assertTrue(stringEff.equals(stringEff));
501         assertEquals("string", stringEff.getPath().getLastComponent().getLocalName());
502         assertFalse(stringEff.getLengthConstraint().isPresent());
503         assertNotNull(stringEff.getPatternConstraints());
504     }
505 }