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
9 package org.opendaylight.yangtools.yang.stmt;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertFalse;
13 import static org.junit.Assert.assertNotNull;
14 import static org.junit.Assert.assertNull;
15 import static org.junit.Assert.assertTrue;
16 import static org.opendaylight.yangtools.yang.stmt.StmtTestUtils.sourceForResource;
18 import com.google.common.collect.Range;
19 import java.util.List;
20 import org.junit.BeforeClass;
21 import org.junit.Test;
22 import org.opendaylight.yangtools.yang.common.QName;
23 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
24 import org.opendaylight.yangtools.yang.model.api.Module;
25 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
26 import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement;
27 import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition;
28 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
29 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition.Bit;
30 import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition;
31 import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition;
32 import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
33 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
34 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair;
35 import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition;
36 import org.opendaylight.yangtools.yang.model.api.type.InstanceIdentifierTypeDefinition;
37 import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
38 import org.opendaylight.yangtools.yang.model.api.type.LengthConstraint;
39 import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition;
40 import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
41 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
42 import org.opendaylight.yangtools.yang.parser.spi.source.StatementStreamSource;
43 import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor;
44 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangInferencePipeline;
45 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.LeafEffectiveStatementImpl;
46 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type.BitsSpecificationEffectiveStatementImpl;
47 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type.Decimal64SpecificationEffectiveStatementImpl;
48 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type.EnumSpecificationEffectiveStatementImpl;
49 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type.IdentityRefSpecificationEffectiveStatementImpl;
50 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type.LeafrefSpecificationEffectiveStatementImpl;
51 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type.PatternConstraintEffectiveImpl;
52 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type.UnionSpecificationEffectiveStatementImpl;
54 public class EffectiveStatementTypeTest {
56 private static final StatementStreamSource IMPORTED_MODULE = sourceForResource("/type-tests/types.yang");
57 private static SchemaContext effectiveSchemaContext;
58 private static Module types;
60 private LeafSchemaNode currentLeaf;
63 public static void setup() throws ReactorException {
64 final CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR.newBuild();
65 reactor.addSource(IMPORTED_MODULE);
66 effectiveSchemaContext = reactor.buildEffective();
67 types = effectiveSchemaContext.findModuleByName("types", null);
72 public void testBinary() {
73 currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-binary"));
74 assertNotNull(currentLeaf.getType());
76 final BinaryTypeDefinition binaryEff = (BinaryTypeDefinition)
77 ((TypeEffectiveStatement<?>) ((LeafEffectiveStatementImpl) currentLeaf)
78 .effectiveSubstatements().iterator().next()).getTypeDefinition();
80 assertNull(binaryEff.getBaseType());
81 assertNull(binaryEff.getUnits());
82 assertNull(binaryEff.getDefaultValue());
83 assertEquals("binary", binaryEff.getQName().getLocalName());
84 assertFalse(binaryEff.getLengthConstraint().isPresent());
85 assertEquals("CURRENT", binaryEff.getStatus().toString());
86 assertEquals("binary", binaryEff.getPath().getPathFromRoot().iterator().next().getLocalName());
87 assertNotNull(binaryEff.getUnknownSchemaNodes());
88 assertNull(binaryEff.getDescription());
89 assertNull(binaryEff.getReference());
93 public void testBits() {
94 currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-bits"));
95 assertNotNull(currentLeaf.getType());
97 final List<BitsTypeDefinition.Bit> bitsEffIter = ((BitsTypeDefinition) currentLeaf.getType()).getBits();
98 final Bit bitEff = bitsEffIter.get(0);
99 final Bit bitEffSecond = bitsEffIter.get(1);
101 final BitsTypeDefinition bitsEff = ((BitsSpecificationEffectiveStatementImpl) ((LeafEffectiveStatementImpl) currentLeaf)
102 .effectiveSubstatements().iterator().next()).getTypeDefinition();
104 assertNull(bitsEff.getBaseType());
105 assertNotNull(bitsEff.getQName());
106 assertEquals("bits", bitsEff.getQName().getLocalName());
107 assertEquals("bits", bitsEff.getPath().getLastComponent().getLocalName());
108 assertNotNull(bitsEff.getUnknownSchemaNodes());
109 assertNull(bitsEff.getDescription());
110 assertNull(bitsEff.getReference());
111 assertEquals("CURRENT", bitsEff.getStatus().toString());
112 assertNull(bitsEff.getUnits());
113 assertNotNull(bitsEff.toString());
114 assertNotNull(bitsEff.hashCode());
115 assertFalse(bitsEff.equals(null));
116 assertFalse(bitsEff.equals("test"));
117 assertTrue(bitsEff.equals(bitsEff));
118 assertEquals(3, bitsEff.getBits().size());
119 assertNull(bitsEff.getDefaultValue());
121 assertNotNull(bitEff.getPath());
122 assertNotNull(bitEff.getUnknownSchemaNodes());
123 assertEquals("test bit", bitEff.getDescription());
124 assertEquals("test bit ref", bitEff.getReference());
125 assertEquals("CURRENT", bitEff.getStatus().toString());
126 assertNotNull(bitEff.hashCode());
127 assertFalse(bitEff.equals(null));
128 assertFalse(bitEff.equals("test"));
129 assertFalse(bitEff.equals(bitEffSecond));
130 assertNotNull(bitEff.toString());
131 assertEquals("one", bitEff.getName());
132 assertNotNull(bitEff.getQName());
133 assertEquals(0, bitEff.getPosition());
137 public void testBoolean() {
138 currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-boolean"));
139 assertNotNull(currentLeaf.getType());
140 final BooleanTypeDefinition booleanEff = (BooleanTypeDefinition) ((TypeEffectiveStatement<?>) ((LeafEffectiveStatementImpl) currentLeaf)
141 .effectiveSubstatements().iterator().next()).getTypeDefinition();
143 assertNull(booleanEff.getBaseType());
144 assertNull(booleanEff.getUnits());
145 assertNull(booleanEff.getDefaultValue());
146 assertEquals("boolean", booleanEff.getQName().getLocalName());
147 assertNull(booleanEff.getPath().getParent().getParent());
148 assertNotNull(booleanEff.getUnknownSchemaNodes());
149 assertNull(booleanEff.getDescription());
150 assertNull(booleanEff.getReference());
151 assertEquals("CURRENT", booleanEff.getStatus().toString());
152 assertNotNull(booleanEff.toString());
156 public void testDecimal64() {
157 currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-decimal64"));
158 assertNotNull(currentLeaf.getType());
159 final DecimalTypeDefinition decimal64Eff = ((Decimal64SpecificationEffectiveStatementImpl) ((LeafEffectiveStatementImpl) currentLeaf)
160 .effectiveSubstatements().iterator().next()).getTypeDefinition();
162 assertNull(decimal64Eff.getBaseType());
163 assertNull(decimal64Eff.getUnits());
164 assertNull(decimal64Eff.getDefaultValue());
165 assertEquals("decimal64", decimal64Eff.getQName().getLocalName());
166 assertNotNull(decimal64Eff.getUnknownSchemaNodes());
168 // FIXME: The yang model api is wrong: description/reference/status are not allowed under 'type', how come we parse it?
169 // allowed under 'type', how come we parse it?
170 assertNull(decimal64Eff.getDescription());
171 assertNull(decimal64Eff.getReference());
172 assertEquals("CURRENT", decimal64Eff.getStatus().toString());
174 assertEquals(3, decimal64Eff.getRangeConstraints().size());
175 assertNotNull(decimal64Eff.toString());
176 assertNotNull(decimal64Eff.hashCode());
177 assertTrue(decimal64Eff.getFractionDigits().equals(2));
178 assertFalse(decimal64Eff.equals(null));
179 assertFalse(decimal64Eff.equals("test"));
180 assertTrue(decimal64Eff.equals(decimal64Eff));
181 assertEquals("decimal64", decimal64Eff.getPath().getLastComponent().getLocalName());
185 public void testEmpty() {
186 currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-empty"));
187 assertNotNull(currentLeaf.getType());
188 final EmptyTypeDefinition emptyEff = (EmptyTypeDefinition) ((TypeEffectiveStatement<?>) ((LeafEffectiveStatementImpl) currentLeaf)
189 .effectiveSubstatements().iterator().next()).getTypeDefinition();
191 assertNull(emptyEff.getUnits());
192 assertNull(emptyEff.getDefaultValue());
193 assertNull(emptyEff.getBaseType());
194 assertEquals("empty", emptyEff.getQName().getLocalName());
195 assertNull(emptyEff.getPath().getParent().getParent());
196 assertNotNull(emptyEff.getUnknownSchemaNodes());
197 assertNull(emptyEff.getDescription());
198 assertNull(emptyEff.getReference());
199 assertEquals("CURRENT", emptyEff.getStatus().toString());
200 assertNotNull(emptyEff.toString());
204 public void testEnum() {
205 currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-enum"));
206 assertNotNull(currentLeaf.getType());
207 final List<EnumTypeDefinition.EnumPair> enumEffIter = ((EnumTypeDefinition) currentLeaf.getType()).getValues();
208 final EnumPair enumEff = enumEffIter.iterator().next();
210 final EnumTypeDefinition enumSpecEff = ((EnumSpecificationEffectiveStatementImpl) ((LeafEffectiveStatementImpl) currentLeaf)
211 .effectiveSubstatements().iterator().next()).getTypeDefinition();
213 assertEquals("enumeration", enumSpecEff.getQName().getLocalName());
214 assertEquals("enumeration", enumSpecEff.getPath().getLastComponent().getLocalName());
215 assertNull(enumSpecEff.getDefaultValue());
216 assertEquals(3, enumSpecEff.getValues().size());
217 assertNull(enumSpecEff.getBaseType());
218 assertNotNull(enumSpecEff.getUnknownSchemaNodes());
219 assertEquals("CURRENT", enumSpecEff.getStatus().toString());
220 assertNull(enumSpecEff.getDescription());
221 assertNull(enumSpecEff.getReference());
222 assertNull(enumSpecEff.getUnits());
223 assertNotNull(enumSpecEff.toString());
224 assertNotNull(enumSpecEff.hashCode());
225 assertFalse(enumSpecEff.equals(null));
226 assertFalse(enumSpecEff.equals("test"));
227 assertTrue(enumSpecEff.equals(enumSpecEff));
229 assertEquals("zero", enumEff.getName());
230 assertNotNull(enumEff.getUnknownSchemaNodes());
231 assertEquals("test enum", enumEff.getDescription());
232 assertEquals("test enum ref", enumEff.getReference());
233 assertEquals("CURRENT", enumEff.getStatus().toString());
234 assertEquals(0, enumEff.getValue());
238 public void testIdentityRef() {
239 currentLeaf = (LeafSchemaNode) types
240 .getDataChildByName(QName.create(types.getQNameModule(), "leaf-identityref"));
241 assertNotNull(currentLeaf.getType());
242 final IdentityrefTypeDefinition identityRefEff = ((IdentityRefSpecificationEffectiveStatementImpl) ((LeafEffectiveStatementImpl) currentLeaf)
243 .effectiveSubstatements().iterator().next()).getTypeDefinition();
245 assertNull(identityRefEff.getDefaultValue());
246 assertEquals("identityref", identityRefEff.getQName().getLocalName());
247 assertEquals("identityref", identityRefEff.getPath().getLastComponent().getLocalName());
248 assertNull(identityRefEff.getBaseType());
249 assertNotNull(identityRefEff.getUnknownSchemaNodes());
250 assertEquals("CURRENT", identityRefEff.getStatus().toString());
251 assertEquals("test-identity", identityRefEff.getIdentity().getQName().getLocalName());
252 assertNull(identityRefEff.getDescription());
253 assertNull(identityRefEff.getReference());
254 assertNotNull(identityRefEff.toString());
256 // FIXME: the model is wrong, but we accept units in 'type' statement
257 assertNull(identityRefEff.getUnits());
261 public void testInstanceIdentifier() {
262 currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(),
263 "leaf-instance-identifier"));
264 assertNotNull(currentLeaf.getType());
265 final InstanceIdentifierTypeDefinition instanceIdentEff = (InstanceIdentifierTypeDefinition) ((TypeEffectiveStatement<?>) ((LeafEffectiveStatementImpl) currentLeaf)
266 .effectiveSubstatements().iterator().next()).getTypeDefinition();
267 assertNotNull(instanceIdentEff.toString());
269 assertFalse(instanceIdentEff.requireInstance());
270 assertEquals("instance-identifier", instanceIdentEff.getQName().getLocalName());
271 assertEquals("instance-identifier", instanceIdentEff.getPath().getLastComponent().getLocalName());
272 assertNull(instanceIdentEff.getBaseType());
273 assertNull(instanceIdentEff.getDefaultValue());
274 assertNotNull(instanceIdentEff.getUnknownSchemaNodes());
275 assertNull(instanceIdentEff.getDescription());
276 assertNull(instanceIdentEff.getReference());
277 assertNull(instanceIdentEff.getUnits());
278 assertEquals("CURRENT", instanceIdentEff.getStatus().toString());
279 assertNotNull(instanceIdentEff.hashCode());
280 assertFalse(instanceIdentEff.equals(null));
281 assertFalse(instanceIdentEff.equals("test"));
282 assertTrue(instanceIdentEff.equals(instanceIdentEff));
286 public void testLeafref() {
287 currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-leafref"));
288 assertNotNull(currentLeaf.getType());
290 final LeafrefTypeDefinition leafrefEff = ((LeafrefSpecificationEffectiveStatementImpl) ((LeafEffectiveStatementImpl) currentLeaf)
291 .effectiveSubstatements().iterator().next()).getTypeDefinition();
293 assertEquals("/container-test/leaf-test", leafrefEff.getPathStatement().toString());
294 assertNull(leafrefEff.getBaseType());
295 assertNull(leafrefEff.getUnits());
296 assertNull(leafrefEff.getDefaultValue());
297 assertNotNull(leafrefEff.toString());
298 assertEquals("leafref", leafrefEff.getQName().getLocalName());
299 assertEquals("CURRENT", leafrefEff.getStatus().toString());
300 assertNotNull(leafrefEff.getUnknownSchemaNodes());
301 assertEquals("leafref", leafrefEff.getPath().getLastComponent().getLocalName());
302 assertNull(leafrefEff.getDescription());
303 assertNull(leafrefEff.getReference());
304 assertNotNull(leafrefEff.hashCode());
305 assertFalse(leafrefEff.equals(null));
306 assertFalse(leafrefEff.equals("test"));
307 assertTrue(leafrefEff.equals(leafrefEff));
311 public void testIntAll() {
312 currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-int8"));
313 assertNotNull(currentLeaf.getType());
314 final TypeEffectiveStatement<?> int8Eff = (TypeEffectiveStatement<?>) ((LeafEffectiveStatementImpl) currentLeaf)
315 .effectiveSubstatements().iterator().next();
316 assertNotNull(int8Eff.toString());
318 currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-int16"));
319 assertNotNull(currentLeaf.getType());
320 final TypeEffectiveStatement<?> int16Eff = (TypeEffectiveStatement<?>) ((LeafEffectiveStatementImpl) currentLeaf)
321 .effectiveSubstatements().iterator().next();
322 assertNotNull(int16Eff.toString());
324 currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-int32"));
325 assertNotNull(currentLeaf.getType());
326 final TypeEffectiveStatement<?> int32Eff = (TypeEffectiveStatement<?>) ((LeafEffectiveStatementImpl) currentLeaf)
327 .effectiveSubstatements().iterator().next();
328 assertNotNull(int32Eff.toString());
330 currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-int64"));
331 assertNotNull(currentLeaf.getType());
332 final TypeEffectiveStatement<?> int64Eff = (TypeEffectiveStatement<?>) ((LeafEffectiveStatementImpl) currentLeaf)
333 .effectiveSubstatements().iterator().next();
334 assertNotNull(int64Eff.toString());
336 currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-uint8"));
337 assertNotNull(currentLeaf.getType());
338 final TypeEffectiveStatement<?> uint8Eff = (TypeEffectiveStatement<?>) ((LeafEffectiveStatementImpl) currentLeaf)
339 .effectiveSubstatements().iterator().next();
340 assertNotNull(uint8Eff.toString());
342 currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-uint16"));
343 assertNotNull(currentLeaf.getType());
344 final TypeEffectiveStatement<?> uint16Eff = (TypeEffectiveStatement<?>) ((LeafEffectiveStatementImpl) currentLeaf)
345 .effectiveSubstatements().iterator().next();
346 assertNotNull(uint16Eff.toString());
348 currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-uint32"));
349 assertNotNull(currentLeaf.getType());
350 final TypeEffectiveStatement<?> uint32Eff = (TypeEffectiveStatement<?>) ((LeafEffectiveStatementImpl) currentLeaf)
351 .effectiveSubstatements().iterator().next();
352 assertNotNull(uint32Eff.toString());
354 currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-uint64"));
355 assertNotNull(currentLeaf.getType());
356 final TypeEffectiveStatement<?> uint64Eff = (TypeEffectiveStatement<?>) ((LeafEffectiveStatementImpl) currentLeaf)
357 .effectiveSubstatements().iterator().next();
358 assertNotNull(uint64Eff.toString());
362 public void testUnion() {
363 currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-union"));
364 assertNotNull(currentLeaf.getType());
365 final UnionTypeDefinition unionEff = ((UnionSpecificationEffectiveStatementImpl) ((LeafEffectiveStatementImpl) currentLeaf)
366 .effectiveSubstatements().iterator().next()).getTypeDefinition();
368 assertEquals(2, unionEff.getTypes().size());
369 assertEquals("union", unionEff.getQName().getLocalName());
370 assertEquals("CURRENT", unionEff.getStatus().toString());
371 assertNotNull(unionEff.getUnknownSchemaNodes());
372 assertNull(unionEff.getBaseType());
373 assertNull(unionEff.getUnits());
374 assertNull(unionEff.getDefaultValue());
375 assertNull(unionEff.getDescription());
376 assertNull(unionEff.getReference());
377 assertNotNull(unionEff.toString());
378 assertNotNull(unionEff.hashCode());
379 assertFalse(unionEff.equals(null));
380 assertFalse(unionEff.equals("test"));
381 assertTrue(unionEff.equals(unionEff));
382 assertEquals("union", unionEff.getPath().getLastComponent().getLocalName());
386 public void testLengthConstraint() {
387 currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(),
388 "leaf-length-pattern"));
390 final StringTypeDefinition leafType = (StringTypeDefinition) currentLeaf.getType();
391 assertNotNull(leafType);
392 final LengthConstraint lengthConstraint = leafType.getLengthConstraint().get();
394 final Range<Integer> span = lengthConstraint.getAllowedRanges().span();
395 assertEquals(1, span.lowerEndpoint().intValue());
396 assertEquals(255, span.upperEndpoint().intValue());
397 assertNull(lengthConstraint.getReference());
398 assertNull(lengthConstraint.getDescription());
399 assertNull(lengthConstraint.getErrorMessage());
400 assertNull(lengthConstraint.getErrorAppTag());
401 assertNotNull(lengthConstraint.toString());
402 assertNotNull(lengthConstraint.hashCode());
403 assertFalse(lengthConstraint.equals(null));
404 assertFalse(lengthConstraint.equals("test"));
406 currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(),
407 "leaf-length-pattern-second"));
408 assertNotNull(currentLeaf.getType());
409 final LengthConstraint lengthConstraintSecond = ((StringTypeDefinition) currentLeaf.getType())
410 .getLengthConstraint().get();
411 assertFalse(lengthConstraint.equals(lengthConstraintSecond));
415 public void testPatternConstraint() {
416 currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(),
417 "leaf-length-pattern"));
418 assertNotNull(currentLeaf.getType());
419 final PatternConstraintEffectiveImpl patternConstraint = (PatternConstraintEffectiveImpl) ((StringTypeDefinition) currentLeaf
420 .getType()).getPatternConstraints().get(0);
421 final PatternConstraintEffectiveImpl patternConstraintThird = (PatternConstraintEffectiveImpl) ((StringTypeDefinition) currentLeaf
422 .getType()).getPatternConstraints().get(0);
423 currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(),
424 "leaf-length-pattern-second"));
425 assertNotNull(currentLeaf.getType());
426 final PatternConstraintEffectiveImpl patternConstraintSecond = (PatternConstraintEffectiveImpl) ((StringTypeDefinition) currentLeaf
427 .getType()).getPatternConstraints().get(0);
429 assertEquals("^[0-9a-fA-F]*$", patternConstraint.getRegularExpression());
430 assertNull(patternConstraint.getReference());
431 assertNull(patternConstraint.getDescription());
432 assertEquals("Supplied value does not match the regular expression ^[0-9a-fA-F]*$.", patternConstraint.getErrorMessage());
433 assertEquals("invalid-regular-expression", patternConstraint.getErrorAppTag());
434 assertNotNull(patternConstraint.toString());
435 assertNotNull(patternConstraint.hashCode());
436 assertFalse(patternConstraint.equals(null));
437 assertFalse(patternConstraint.equals("test"));
438 assertFalse(patternConstraint.equals(patternConstraintSecond));
439 assertTrue(patternConstraint.equals(patternConstraintThird));
443 public void testString() {
444 currentLeaf = (LeafSchemaNode) types.getDataChildByName(QName.create(types.getQNameModule(), "leaf-string"));
445 assertNotNull(currentLeaf.getType());
446 final StringTypeDefinition stringEff = (StringTypeDefinition) ((TypeEffectiveStatement<?>) ((LeafEffectiveStatementImpl) currentLeaf)
447 .effectiveSubstatements().iterator().next()).getTypeDefinition();
449 assertEquals("string", stringEff.getQName().getLocalName());
450 assertEquals("CURRENT", stringEff.getStatus().toString());
451 assertNull(stringEff.getUnits());
452 assertNull(stringEff.getDefaultValue());
453 assertNotNull(stringEff.getUnknownSchemaNodes());
454 assertNull(stringEff.getBaseType());
455 assertNull(stringEff.getDescription());
456 assertNull(stringEff.getReference());
457 assertNotNull(stringEff.toString());
458 assertNotNull(stringEff.hashCode());
459 assertFalse(stringEff.equals(null));
460 assertFalse(stringEff.equals("test"));
461 assertTrue(stringEff.equals(stringEff));
462 assertEquals("string", stringEff.getPath().getLastComponent().getLocalName());
463 assertFalse(stringEff.getLengthConstraint().isPresent());
464 assertNotNull(stringEff.getPatternConstraints());