BUG-8043: correct RangeConstraint definition
[yangtools.git] / yang / yang-model-util / src / test / java / org / opendaylight / yangtools / yang / model / util / type / TypeTest.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
9 package org.opendaylight.yangtools.yang.model.util.type;
10
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.assertSame;
15 import static org.junit.Assert.assertTrue;
16 import static org.mockito.Mockito.mock;
17
18 import com.google.common.collect.ImmutableList;
19 import com.google.common.collect.ImmutableRangeSet;
20 import com.google.common.collect.Range;
21 import com.google.common.collect.RangeSet;
22 import java.util.List;
23 import java.util.Optional;
24 import org.junit.Test;
25 import org.opendaylight.yangtools.concepts.Builder;
26 import org.opendaylight.yangtools.yang.common.QName;
27 import org.opendaylight.yangtools.yang.model.api.ConstraintMetaDefinition;
28 import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode;
29 import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
30 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
31 import org.opendaylight.yangtools.yang.model.api.Status;
32 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
33 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
34 import org.opendaylight.yangtools.yang.model.api.stmt.UnresolvedNumber;
35 import org.opendaylight.yangtools.yang.model.api.stmt.ValueRange;
36 import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition;
37 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
38 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition.Bit;
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.IntegerTypeDefinition;
43 import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint;
44 import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition;
45 import org.opendaylight.yangtools.yang.model.api.type.UnsignedIntegerTypeDefinition;
46 import org.opendaylight.yangtools.yang.model.util.BaseConstraints;
47 import org.opendaylight.yangtools.yang.model.util.RevisionAwareXPathImpl;
48
49 public class TypeTest {
50     private static final QName Q_NAME = QName.create("test.namespace", "2016-01-01", "test-name");
51     private static final SchemaPath SCHEMA_PATH = SchemaPath.create(true, Q_NAME);
52     private static final RevisionAwareXPath REVISION_AWARE_XPATH = new RevisionAwareXPathImpl("/test", true);
53     private static final Bit BIT_A = BitBuilder.create(SCHEMA_PATH, 55L).setDescription("description")
54             .setReference("reference").build();
55     private static final Optional<String> ABSENT = Optional.empty();
56
57     @Test
58     public void binaryTypeTest() {
59         final BaseBinaryType baseBinaryType1 = BaseBinaryType.INSTANCE;
60         final BaseBinaryType baseBinaryType2 = (BaseBinaryType)BaseTypes.binaryType();
61         hashCodeEqualsToStringTest(baseBinaryType1, baseBinaryType2);
62         assertEquals(baseBinaryType1.getLengthConstraint(), baseBinaryType2.getLengthConstraint());
63
64         final DerivedBinaryType derivedBinaryType1 = (DerivedBinaryType)DerivedTypes.derivedTypeBuilder(baseBinaryType1,
65                 SCHEMA_PATH).build();
66         final DerivedBinaryType derivedBinaryType2 = (DerivedBinaryType)DerivedTypes.derivedTypeBuilder(baseBinaryType2,
67                 SCHEMA_PATH).build();
68         hashCodeEqualsToStringTest(derivedBinaryType1, derivedBinaryType2);
69
70         final RestrictedBinaryType restrictedBinaryType1 = (RestrictedBinaryType)RestrictedTypes.newBinaryBuilder(
71                 baseBinaryType1, SCHEMA_PATH).buildType();
72         final RestrictedBinaryType restrictedBinaryType2 = (RestrictedBinaryType)RestrictedTypes.newBinaryBuilder(
73                 baseBinaryType2, SCHEMA_PATH).buildType();
74         hashCodeEqualsToStringTest(restrictedBinaryType1, restrictedBinaryType2);
75
76         final LengthRestrictedTypeBuilder<BinaryTypeDefinition> lengthRestrictedTypeBuilder = RestrictedTypes
77                 .newBinaryBuilder(baseBinaryType1, SCHEMA_PATH);
78         final BaseBinaryType baseBinaryType = (BaseBinaryType)lengthRestrictedTypeBuilder.build();
79         assertEquals(baseBinaryType, baseBinaryType1);
80         concreteBuilderTest(baseBinaryType1, derivedBinaryType1);
81     }
82
83     @Test
84     public void booleanTypeTest() {
85         final BaseBooleanType baseBooleanType1 = BaseBooleanType.INSTANCE;
86         final BaseBooleanType baseBooleanType2 = (BaseBooleanType)BaseTypes.booleanType();
87         hashCodeEqualsToStringTest(baseBooleanType1, baseBooleanType2);
88
89         final DerivedBooleanType derivedBooleanType1 = (DerivedBooleanType)DerivedTypes.derivedTypeBuilder(
90                 baseBooleanType1, SCHEMA_PATH).build();
91         final DerivedBooleanType derivedBooleanType2 = (DerivedBooleanType)DerivedTypes.derivedTypeBuilder(
92                 baseBooleanType1, SCHEMA_PATH).build();
93         hashCodeEqualsToStringTest(derivedBooleanType1, derivedBooleanType2);
94
95         restrictedBuilderTest(RestrictedTypes.newBooleanBuilder(baseBooleanType1, SCHEMA_PATH), RestrictedTypes
96                 .newBooleanBuilder(baseBooleanType2, SCHEMA_PATH));
97         concreteBuilderTest(baseBooleanType1, derivedBooleanType1);
98     }
99
100     @Test
101     public void identityrefTypeTest() {
102         final IdentityrefTypeBuilder identityrefTypeBuilder1 = BaseTypes.identityrefTypeBuilder(SCHEMA_PATH);
103         final IdentitySchemaNode identitySchemaNode = mock(IdentitySchemaNode.class);
104         identityrefTypeBuilder1.addIdentity(identitySchemaNode);
105         final IdentityrefTypeDefinition identityrefTypeDefinition1 = identityrefTypeBuilder1.build();
106         final IdentityrefTypeBuilder identityrefTypeBuilder2 = BaseTypes.identityrefTypeBuilder(SCHEMA_PATH);
107         identityrefTypeBuilder2.addIdentity(identitySchemaNode);
108         final IdentityrefTypeDefinition identityrefTypeDefinition2 = identityrefTypeBuilder2.build();
109         hashCodeEqualsToStringTest(identityrefTypeDefinition1, identityrefTypeDefinition2);
110
111         final DerivedIdentityrefType derivedIdentityrefType1 = (DerivedIdentityrefType)DerivedTypes.derivedTypeBuilder(
112                 identityrefTypeDefinition1, SCHEMA_PATH).build();
113         final DerivedIdentityrefType derivedIdentityrefType2 = (DerivedIdentityrefType)DerivedTypes.derivedTypeBuilder(
114                 identityrefTypeDefinition2, SCHEMA_PATH).build();
115         hashCodeEqualsToStringTest(derivedIdentityrefType1, derivedIdentityrefType2);
116         concreteBuilderTest(identityrefTypeDefinition1, derivedIdentityrefType1);
117
118         restrictedBuilderTest(RestrictedTypes.newIdentityrefBuilder(derivedIdentityrefType1, SCHEMA_PATH),
119                 RestrictedTypes.newIdentityrefBuilder(derivedIdentityrefType2, SCHEMA_PATH));
120     }
121
122     @Test
123     public void decimalTypeTest() {
124         final BaseDecimalType baseDecimalType1 = (BaseDecimalType)BaseTypes.decimalTypeBuilder(SCHEMA_PATH)
125                 .setFractionDigits(1)
126                 .buildType();
127         final BaseDecimalType baseDecimalType2 = (BaseDecimalType)BaseTypes.decimalTypeBuilder(SCHEMA_PATH)
128                 .setFractionDigits(1)
129                 .buildType();
130         hashCodeEqualsToStringTest(baseDecimalType1, baseDecimalType2);
131         assertEquals(baseDecimalType1.getFractionDigits(), baseDecimalType2.getFractionDigits());
132
133         final DerivedDecimalType derivedDecimalType1 = (DerivedDecimalType)DerivedTypes
134                 .derivedTypeBuilder(baseDecimalType1, SCHEMA_PATH).build();
135         final DerivedDecimalType derivedDecimalType2 = (DerivedDecimalType)DerivedTypes
136                 .derivedTypeBuilder(baseDecimalType1, SCHEMA_PATH).build();
137         hashCodeEqualsToStringTest(derivedDecimalType1, derivedDecimalType2);
138
139         final RestrictedDecimalType restrictedDecimalType1 = (RestrictedDecimalType)
140                 RestrictedTypes.newDecima64Builder(baseDecimalType1, SCHEMA_PATH).buildType();
141         final RestrictedDecimalType restrictedDecimalType2 = (RestrictedDecimalType)
142                 RestrictedTypes.newDecima64Builder(baseDecimalType2, SCHEMA_PATH).buildType();
143         hashCodeEqualsToStringTest(restrictedDecimalType1, restrictedDecimalType2);
144         concreteBuilderTest(baseDecimalType1, derivedDecimalType1);
145     }
146
147     @Test
148     public void emptyTypeTest() {
149         final BaseEmptyType baseEmptyType1 = BaseEmptyType.INSTANCE;
150         final BaseEmptyType baseEmptyType2 = (BaseEmptyType)BaseTypes.emptyType();
151         hashCodeEqualsToStringTest(baseEmptyType1, baseEmptyType2);
152
153         final DerivedEmptyType derivedEmptyType1 = (DerivedEmptyType)DerivedTypes.derivedTypeBuilder(
154                 baseEmptyType1, SCHEMA_PATH).build();
155         final DerivedEmptyType derivedEmptyType2 = (DerivedEmptyType)DerivedTypes.derivedTypeBuilder(
156                 baseEmptyType2, SCHEMA_PATH).build();
157         hashCodeEqualsToStringTest(derivedEmptyType1, derivedEmptyType2);
158
159         restrictedBuilderTest(RestrictedTypes.newEmptyBuilder(baseEmptyType1, SCHEMA_PATH),
160                 RestrictedTypes.newEmptyBuilder(baseEmptyType2, SCHEMA_PATH));
161         concreteBuilderTest(baseEmptyType1, derivedEmptyType1);
162     }
163
164     @Test
165     public void instanceIdentifierTypeTest() {
166         final BaseInstanceIdentifierType baseInstanceIdentifierType1 = BaseInstanceIdentifierType.INSTANCE;
167         final BaseInstanceIdentifierType baseInstanceIdentifierType2 = (BaseInstanceIdentifierType)BaseTypes
168                 .instanceIdentifierType();
169         hashCodeEqualsToStringTest(baseInstanceIdentifierType1, baseInstanceIdentifierType2);
170         assertFalse(baseInstanceIdentifierType1.requireInstance());
171
172         final DerivedInstanceIdentifierType derivedInstanceIdentifierType1 = (DerivedInstanceIdentifierType)
173                 DerivedTypes.derivedTypeBuilder(baseInstanceIdentifierType1, SCHEMA_PATH).build();
174         final DerivedInstanceIdentifierType derivedInstanceIdentifierType2 = (DerivedInstanceIdentifierType)
175                 DerivedTypes.derivedTypeBuilder(baseInstanceIdentifierType2, SCHEMA_PATH).build();
176         hashCodeEqualsToStringTest(derivedInstanceIdentifierType1, derivedInstanceIdentifierType2);
177
178         final InstanceIdentifierTypeBuilder instanceIdentifierBuilder1 = RestrictedTypes
179                 .newInstanceIdentifierBuilder(baseInstanceIdentifierType1, SCHEMA_PATH);
180         instanceIdentifierBuilder1.setRequireInstance(true);
181         final InstanceIdentifierTypeDefinition instanceIdentifierTypeDefinition1 = instanceIdentifierBuilder1
182                 .buildType();
183         final InstanceIdentifierTypeBuilder instanceIdentifierBuilder2 = RestrictedTypes
184                 .newInstanceIdentifierBuilder(baseInstanceIdentifierType1, SCHEMA_PATH);
185         instanceIdentifierBuilder2.setRequireInstance(true);
186         final InstanceIdentifierTypeDefinition instanceIdentifierTypeDefinition2 = instanceIdentifierBuilder2
187                 .buildType();
188         hashCodeEqualsToStringTest(instanceIdentifierTypeDefinition2, instanceIdentifierTypeDefinition1);
189         concreteBuilderTest(baseInstanceIdentifierType1, derivedInstanceIdentifierType1);
190     }
191
192     @Test
193     public void integerTypeTest() {
194         final IntegerTypeDefinition integerTypeDefinition8 = BaseTypes.int8Type();
195         final IntegerTypeDefinition integerTypeDefinition16 = BaseTypes.int16Type();
196         final IntegerTypeDefinition integerTypeDefinition32 = BaseTypes.int32Type();
197         final IntegerTypeDefinition integerTypeDefinition64 = BaseTypes.int64Type();
198         assertTrue(BaseTypes.isInt8(integerTypeDefinition8));
199         assertTrue(BaseTypes.isInt16(integerTypeDefinition16));
200         assertTrue(BaseTypes.isInt32(integerTypeDefinition32));
201         assertTrue(BaseTypes.isInt64(integerTypeDefinition64));
202         testInstance(BaseInt8Type.INSTANCE, integerTypeDefinition8);
203         testInstance(BaseInt16Type.INSTANCE, integerTypeDefinition16);
204         testInstance(BaseInt32Type.INSTANCE, integerTypeDefinition32);
205         testInstance(BaseInt64Type.INSTANCE, integerTypeDefinition64);
206
207         final RestrictedIntegerType restrictedIntegerType1 = (RestrictedIntegerType)RestrictedTypes.newIntegerBuilder(
208                 integerTypeDefinition8, SCHEMA_PATH).buildType();
209         final RestrictedIntegerType restrictedIntegerType2 = (RestrictedIntegerType)RestrictedTypes.newIntegerBuilder(
210                 BaseInt8Type.INSTANCE, SCHEMA_PATH).buildType();
211         hashCodeEqualsToStringTest(restrictedIntegerType1, restrictedIntegerType2);
212
213         final UnsignedIntegerTypeDefinition integerTypeDefinitionu8 = BaseTypes.uint8Type();
214         final UnsignedIntegerTypeDefinition integerTypeDefinitionu16 = BaseTypes.uint16Type();
215         final UnsignedIntegerTypeDefinition integerTypeDefinitionu32 = BaseTypes.uint32Type();
216         final UnsignedIntegerTypeDefinition integerTypeDefinitionu64 = BaseTypes.uint64Type();
217         assertTrue(BaseTypes.isUint8(integerTypeDefinitionu8));
218         assertTrue(BaseTypes.isUint16(integerTypeDefinitionu16));
219         assertTrue(BaseTypes.isUint32(integerTypeDefinitionu32));
220         assertTrue(BaseTypes.isUint64(integerTypeDefinitionu64));
221         testInstance(BaseUint8Type.INSTANCE, integerTypeDefinitionu8);
222         testInstance(BaseUint16Type.INSTANCE, integerTypeDefinitionu16);
223         testInstance(BaseUint32Type.INSTANCE, integerTypeDefinitionu32);
224         testInstance(BaseUint64Type.INSTANCE, BaseTypes.baseTypeOf(integerTypeDefinitionu64));
225
226         final DerivedIntegerType derivedIntegerType1 = (DerivedIntegerType)DerivedTypes
227                 .derivedTypeBuilder(integerTypeDefinition8, SCHEMA_PATH).build();
228         final DerivedIntegerType derivedIntegerType2 = (DerivedIntegerType)DerivedTypes
229                 .derivedTypeBuilder(BaseInt8Type.INSTANCE, SCHEMA_PATH).build();
230         hashCodeEqualsToStringTest(derivedIntegerType1, derivedIntegerType2);
231
232         final DerivedUnsignedType derivedUnsignedType1 = (DerivedUnsignedType)DerivedTypes
233                 .derivedTypeBuilder(integerTypeDefinitionu8, SCHEMA_PATH).build();
234         final DerivedUnsignedType derivedUnsignedType2 = (DerivedUnsignedType)DerivedTypes
235                 .derivedTypeBuilder(BaseUint8Type.INSTANCE, SCHEMA_PATH).build();
236         hashCodeEqualsToStringTest(derivedUnsignedType1, derivedUnsignedType2);
237
238         final RestrictedUnsignedType restrictedUnsignedType1 = (RestrictedUnsignedType)RestrictedTypes
239                 .newUnsignedBuilder(integerTypeDefinitionu8, SCHEMA_PATH).buildType();
240         final RestrictedUnsignedType restrictedUnsignedType2 = (RestrictedUnsignedType)RestrictedTypes
241                 .newUnsignedBuilder(BaseUint8Type.INSTANCE, SCHEMA_PATH).buildType();
242         hashCodeEqualsToStringTest(restrictedUnsignedType1, restrictedUnsignedType2);
243         concreteBuilderTest(integerTypeDefinition8, derivedIntegerType1);
244         concreteBuilderTest(integerTypeDefinitionu8, derivedUnsignedType2);
245
246         final DerivedTypeBuilder<?> derivedTypeBuilder = DerivedTypes.derivedTypeBuilder(integerTypeDefinition8,
247                 SCHEMA_PATH);
248         derivedTypeBuilder.setDefaultValue(1);
249         derivedTypeBuilder.setDescription("test-description");
250         derivedTypeBuilder.setReference("test-reference");
251         derivedTypeBuilder.setUnits("Int");
252         derivedTypeBuilder.setStatus(Status.CURRENT);
253         assertEquals(derivedTypeBuilder.getStatus(), Status.CURRENT);
254         assertEquals(derivedTypeBuilder.getDescription(), "test-description");
255         assertEquals(derivedTypeBuilder.getReference(), "test-reference");
256         assertEquals(derivedTypeBuilder.getUnits(), "Int");
257     }
258
259     @Test
260     public void stringTypeTest() {
261         final BaseStringType baseStringType1 = BaseStringType.INSTANCE;
262         final BaseStringType baseStringType2 = (BaseStringType)BaseTypes.stringType();
263         hashCodeEqualsToStringTest(baseStringType1, baseStringType2);
264         assertEquals(baseStringType1.getLengthConstraint(), baseStringType2.getLengthConstraint());
265         assertEquals(baseStringType1.getPatternConstraints(), baseStringType2.getPatternConstraints());
266
267         final DerivedStringType derivedStringType1 = (DerivedStringType)
268                 DerivedTypes.derivedTypeBuilder(baseStringType1, SCHEMA_PATH).build();
269         final DerivedStringType derivedStringType2 = (DerivedStringType)
270                 DerivedTypes.derivedTypeBuilder(baseStringType2, SCHEMA_PATH).build();
271         hashCodeEqualsToStringTest(derivedStringType1, derivedStringType2);
272
273         final RestrictedStringType restrictedStringType1 = (RestrictedStringType)RestrictedTypes
274                 .newStringBuilder(baseStringType1, SCHEMA_PATH).buildType();
275         final RestrictedStringType restrictedStringType2 = (RestrictedStringType)RestrictedTypes
276                 .newStringBuilder(baseStringType2, SCHEMA_PATH).buildType();
277         hashCodeEqualsToStringTest(restrictedStringType1, restrictedStringType2);
278         concreteBuilderTest(baseStringType1, derivedStringType1);
279
280         final StringTypeBuilder stringTypeBuilder = new StringTypeBuilder(baseStringType1, SCHEMA_PATH);
281         final PatternConstraint patternConstraint = BaseConstraints.newPatternConstraint("pattern", ABSENT, ABSENT);
282         stringTypeBuilder.addPatternConstraint(patternConstraint);
283         final StringTypeDefinition stringTypeDefinition = stringTypeBuilder.buildType();
284         assertNotNull(stringTypeDefinition);
285     }
286
287     @Test
288     public void bitsTypeTest() {
289         final BitsTypeBuilder bitsTypeBuilder = BaseTypes.bitsTypeBuilder(SCHEMA_PATH);
290         bitsTypeBuilder.addBit(BIT_A);
291         final BitsTypeDefinition bitsTypeDefinition1 = bitsTypeBuilder.build();
292         final BitsTypeDefinition bitsTypeDefinition2 = bitsTypeBuilder.build();
293         hashCodeEqualsToStringTest(bitsTypeDefinition1, bitsTypeDefinition2);
294         assertEquals(bitsTypeDefinition1.getBits(), bitsTypeDefinition1.getBits());
295
296         final DerivedBitsType derivedBitsType1 = (DerivedBitsType)DerivedTypes
297                 .derivedTypeBuilder(bitsTypeDefinition1, SCHEMA_PATH).build();
298         final DerivedBitsType derivedBitsType2 = (DerivedBitsType)DerivedTypes
299                 .derivedTypeBuilder(bitsTypeDefinition2, SCHEMA_PATH).build();
300         hashCodeEqualsToStringTest(derivedBitsType1, derivedBitsType2);
301
302         restrictedBuilderTest(RestrictedTypes.newBitsBuilder(bitsTypeDefinition1, SCHEMA_PATH),
303                 RestrictedTypes.newBitsBuilder(bitsTypeDefinition2, SCHEMA_PATH));
304         concreteBuilderTest(bitsTypeDefinition1, derivedBitsType1);
305     }
306
307     @Test
308     public void enumerationTypeTest() {
309         final BaseEnumerationType baseEnumerationType1 = (BaseEnumerationType)BaseTypes.enumerationTypeBuilder(
310                 SCHEMA_PATH).build();
311         final BaseEnumerationType baseEnumerationType2 = (BaseEnumerationType)BaseTypes.enumerationTypeBuilder(
312                 SCHEMA_PATH).build();
313         hashCodeEqualsToStringTest(baseEnumerationType1, baseEnumerationType2);
314         assertEquals(baseEnumerationType1.getValues(), baseEnumerationType2.getValues());
315
316         final DerivedEnumerationType derivedEnumerationType1 = (DerivedEnumerationType)DerivedTypes
317                 .derivedTypeBuilder(baseEnumerationType1, SCHEMA_PATH).build();
318         final DerivedEnumerationType derivedEnumerationType2 = (DerivedEnumerationType)DerivedTypes
319                 .derivedTypeBuilder(baseEnumerationType2, SCHEMA_PATH).build();
320         hashCodeEqualsToStringTest(derivedEnumerationType1, derivedEnumerationType2);
321
322         restrictedBuilderTest(RestrictedTypes.newEnumerationBuilder(baseEnumerationType1, SCHEMA_PATH),
323                 RestrictedTypes.newEnumerationBuilder(baseEnumerationType2, SCHEMA_PATH));
324         concreteBuilderTest(baseEnumerationType1, derivedEnumerationType1);
325     }
326
327     @Test
328     public void leafrefTypeTest() {
329         final LeafrefTypeBuilder leafrefTypeBuilder1 = BaseTypes.leafrefTypeBuilder(SCHEMA_PATH);
330         final LeafrefTypeBuilder leafrefTypeBuilder2 = BaseTypes.leafrefTypeBuilder(SCHEMA_PATH);
331         leafrefTypeBuilder1.setPathStatement(REVISION_AWARE_XPATH);
332         leafrefTypeBuilder2.setPathStatement(REVISION_AWARE_XPATH);
333         final BaseLeafrefType baseLeafrefType1 = (BaseLeafrefType)leafrefTypeBuilder1.build();
334         final BaseLeafrefType baseLeafrefType2 = (BaseLeafrefType)leafrefTypeBuilder1.build();
335         hashCodeEqualsToStringTest(baseLeafrefType1, baseLeafrefType2);
336         assertEquals(baseLeafrefType1.getPathStatement(), REVISION_AWARE_XPATH);
337
338         final DerivedLeafrefType derivedLeafrefType1 = (DerivedLeafrefType)DerivedTypes
339                 .derivedTypeBuilder(baseLeafrefType1, SCHEMA_PATH).build();
340         final DerivedLeafrefType derivedLeafrefType2 = (DerivedLeafrefType)DerivedTypes
341                 .derivedTypeBuilder(baseLeafrefType2, SCHEMA_PATH).build();
342         hashCodeEqualsToStringTest(derivedLeafrefType1, derivedLeafrefType2);
343
344         restrictedBuilderTest(RestrictedTypes.newLeafrefBuilder(baseLeafrefType1, SCHEMA_PATH),
345                 RestrictedTypes.newLeafrefBuilder(baseLeafrefType2, SCHEMA_PATH));
346         concreteBuilderTest(baseLeafrefType1, derivedLeafrefType1);
347     }
348
349     @Test
350     public void unionTypeTest() throws IllegalAccessException, InstantiationException {
351         final BaseDecimalType baseDecimalType1 = (BaseDecimalType)BaseTypes.decimalTypeBuilder(SCHEMA_PATH)
352                 .setFractionDigits(1)
353                 .buildType();
354         final BaseDecimalType baseDecimalType2 = (BaseDecimalType)BaseTypes.decimalTypeBuilder(SCHEMA_PATH)
355                 .setFractionDigits(1)
356                 .buildType();
357         final UnionTypeBuilder unionTypeBuilder1 = BaseTypes.unionTypeBuilder(SCHEMA_PATH);
358         final UnionTypeBuilder unionTypeBuilder2 = BaseTypes.unionTypeBuilder(SCHEMA_PATH);
359         unionTypeBuilder1.addType(baseDecimalType1);
360         unionTypeBuilder2.addType(baseDecimalType2);
361         final BaseUnionType baseUnionType1 = (BaseUnionType)unionTypeBuilder1.build();
362         final BaseUnionType baseUnionType2 = (BaseUnionType)unionTypeBuilder2.build();
363         hashCodeEqualsToStringTest(baseUnionType1, baseUnionType2);
364         assertEquals(baseUnionType1.getTypes(), baseUnionType2.getTypes());
365
366         final DerivedUnionType derivedUnionType1 = (DerivedUnionType)DerivedTypes
367                 .derivedTypeBuilder(baseUnionType1, SCHEMA_PATH).build();
368         final DerivedUnionType derivedUnionType2 = (DerivedUnionType)DerivedTypes
369                 .derivedTypeBuilder(baseUnionType2, SCHEMA_PATH).build();
370         hashCodeEqualsToStringTest(derivedUnionType1, derivedUnionType2);
371
372         restrictedBuilderTest(RestrictedTypes.newUnionBuilder(baseUnionType1, SCHEMA_PATH),
373                 RestrictedTypes.newUnionBuilder(baseUnionType2, SCHEMA_PATH));
374         concreteBuilderTest(baseUnionType1, derivedUnionType1);
375     }
376
377     @Test
378     public void abstractTypeDefinitionQnameTest() {
379         final AbstractTypeDefinition<?> abstractTypeDefinition = (AbstractTypeDefinition<?>)
380             BaseTypes.decimalTypeBuilder(SCHEMA_PATH).setFractionDigits(1).buildType();
381         assertEquals(abstractTypeDefinition.getQName(), Q_NAME);
382     }
383
384     @Test
385     public void abstractDerivedTypeTest() {
386         final BaseBinaryType baseBinaryType1 = BaseBinaryType.INSTANCE;
387         final AbstractDerivedType<?> abstractDerivedType = (AbstractDerivedType<?>)
388             DerivedTypes.derivedTypeBuilder(baseBinaryType1, SCHEMA_PATH).build();
389         assertEquals(Optional.empty(), abstractDerivedType.getDescription());
390         assertEquals(Optional.empty(), abstractDerivedType.getReference());
391         assertEquals(Status.CURRENT, abstractDerivedType.getStatus());
392         assertFalse(DerivedTypes.isInt8(baseBinaryType1));
393         assertFalse(DerivedTypes.isUint8(baseBinaryType1));
394         assertFalse(DerivedTypes.isInt16(baseBinaryType1));
395         assertFalse(DerivedTypes.isUint16(baseBinaryType1));
396         assertFalse(DerivedTypes.isInt32(baseBinaryType1));
397         assertFalse(DerivedTypes.isUint32(baseBinaryType1));
398         assertFalse(DerivedTypes.isInt64(baseBinaryType1));
399         assertFalse(DerivedTypes.isUint64(baseBinaryType1));
400     }
401
402     @Test
403     public void concreteTypeBuilderBuildTest() {
404         final BaseEnumerationType baseEnumerationType1 = (BaseEnumerationType)
405             BaseTypes.enumerationTypeBuilder(SCHEMA_PATH).build();
406         final ConcreteTypeBuilder<?> concreteTypeBuilder = ConcreteTypes.concreteTypeBuilder(
407                 baseEnumerationType1, SCHEMA_PATH);
408         final TypeDefinition<?> typeDefinition = concreteTypeBuilder.build();
409         assertNotNull(typeDefinition);
410     }
411
412     @Test
413     public void constraintTypeBuilderTest() throws InvalidLengthConstraintException {
414         final BaseBinaryType baseBinaryType = (BaseBinaryType)BaseTypes.binaryType();
415         final LengthRestrictedTypeBuilder<?> lengthRestrictedTypeBuilder = RestrictedTypes
416                 .newBinaryBuilder(baseBinaryType, SCHEMA_PATH);
417         final Long min = Long.valueOf(0);
418         final UnresolvedNumber max = UnresolvedNumber.max();
419         final List<ValueRange> lengthArrayList = ImmutableList.of(ValueRange.of(min, max));
420         lengthRestrictedTypeBuilder.setLengthConstraint(mock(ConstraintMetaDefinition.class), lengthArrayList);
421         final TypeDefinition<?> typeDefinition = lengthRestrictedTypeBuilder.buildType();
422         assertNotNull(typeDefinition);
423
424         final IntegerTypeDefinition integerTypeDefinition8 = BaseTypes.int8Type();
425         final RangeRestrictedTypeBuilder<?> rangeRestrictedTypeBuilder = RestrictedTypes
426                 .newIntegerBuilder(integerTypeDefinition8, SCHEMA_PATH);
427         rangeRestrictedTypeBuilder.setRangeConstraint(mock(ConstraintMetaDefinition.class), lengthArrayList);
428         final TypeDefinition<?> typeDefinition1 = rangeRestrictedTypeBuilder.buildType();
429         assertNotNull(typeDefinition1);
430     }
431
432     @Test
433     public void exceptionTest() {
434         final UnresolvedNumber min = UnresolvedNumber.min();
435         final UnresolvedNumber max = UnresolvedNumber.max();
436         final EnumPair enumPair = EnumPairBuilder.create("enum1", 1).setDescription("description")
437                 .setReference("reference").setUnknownSchemaNodes(mock(UnknownSchemaNode.class)).build();
438
439         final RangeSet<Integer> rangeset = ImmutableRangeSet.of(Range.closed(1, 2));
440         final InvalidRangeConstraintException invalidRangeConstraintException = new InvalidRangeConstraintException(
441                 rangeset, "error msg", "other important messages");
442         assertSame(rangeset, invalidRangeConstraintException.getOffendingRanges());
443
444         final InvalidBitDefinitionException invalidBitDefinitionException = new InvalidBitDefinitionException(
445                 BIT_A, "error msg", "other important messages");
446         assertEquals(invalidBitDefinitionException.getOffendingBit(), BIT_A);
447
448         final InvalidEnumDefinitionException invalidEnumDefinitionException = new InvalidEnumDefinitionException(
449                 enumPair, "error msg", "other important messages");
450         assertEquals(invalidEnumDefinitionException.getOffendingEnum(), enumPair);
451     }
452
453     @Test(expected = NullPointerException.class)
454     public void identityrefTypeBuilderException() {
455         BaseTypes.identityrefTypeBuilder(SCHEMA_PATH).build();
456     }
457
458     @Test(expected = InvalidBitDefinitionException.class)
459     public void invalidBitDefinitionExceptionTest() {
460         final BitsTypeBuilder bitsTypeBuilder = BaseTypes.bitsTypeBuilder(SCHEMA_PATH);
461         final QName qName = QName.create("test.namespace.1", "2016-01-02", "test-name-1");
462         final SchemaPath schemaPath = SchemaPath.create(true, qName);
463         bitsTypeBuilder.addBit(BIT_A);
464         bitsTypeBuilder.addBit(BitBuilder.create(schemaPath, 55L).build());
465         bitsTypeBuilder.build();
466     }
467
468     @Test(expected = InvalidEnumDefinitionException.class)
469     public void invalidEnumDefinitionExceptionTest() {
470         final UnknownSchemaNode unknown = mock(UnknownSchemaNode.class);
471         final EnumPair enumPair1 = EnumPairBuilder.create("enum1", 1).setDescription("description")
472                 .setReference("reference").setUnknownSchemaNodes(unknown).build();
473         final EnumPair enumPair2 = EnumPairBuilder.create("enum", 1).setDescription("description")
474                 .setReference("reference").setUnknownSchemaNodes(unknown).build();
475         final EnumerationTypeBuilder enumerationTypeBuilder = BaseTypes.enumerationTypeBuilder(SCHEMA_PATH);
476         enumerationTypeBuilder.addEnum(enumPair1);
477         enumerationTypeBuilder.addEnum(enumPair2);
478         enumerationTypeBuilder.build();
479     }
480
481     private static void hashCodeEqualsToStringTest(final TypeDefinition<?> type1, final TypeDefinition<?> type2) {
482         assertEquals(type1.hashCode(), type2.hashCode());
483         assertEquals(type1.toString(), type2.toString());
484         assertTrue(type1.equals(type2));
485     }
486
487     private static <T> void testInstance(final T type1, final T type2) {
488         assertEquals(type1, type2);
489     }
490
491     private static void restrictedBuilderTest(final Builder<?> typeBuilder1, final Builder<?> typeBuilder2) {
492         final TypeDefinition<?> typeDefinition1 = ((AbstractRestrictedTypeBuilder<?>) typeBuilder1).buildType();
493         final TypeDefinition<?> typeDefinition2 = ((AbstractRestrictedTypeBuilder<?>) typeBuilder2).buildType();
494         hashCodeEqualsToStringTest(typeDefinition1, typeDefinition2);
495     }
496
497     private static void concreteBuilderTest(final TypeDefinition<?> baseTypeDef,
498             final TypeDefinition<?> derivedTypeDef) {
499         final ConcreteTypeBuilder<?> concreteTypeBuilder = ConcreteTypes.concreteTypeBuilder(baseTypeDef, SCHEMA_PATH);
500         final TypeDefinition<?> typeDefinition = concreteTypeBuilder.buildType();
501         assertEquals(typeDefinition.getBaseType(), derivedTypeDef.getBaseType());
502     }
503 }