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