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