BUG-4661: Introduce Decimal64, Empty, Uint{8,16,32,64}
[yangtools.git] / yang / yang-common / src / test / java / org / opendaylight / yangtools / yang / common / Decimal64Test.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies s.r.o. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.yangtools.yang.common;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertFalse;
12 import static org.junit.Assert.assertTrue;
13
14 import java.math.BigDecimal;
15 import org.junit.Test;
16
17 public class Decimal64Test {
18
19     @Test(expected = NumberFormatException.class)
20     public void testParseEmpty() {
21         Decimal64.valueOf("");
22     }
23
24     @Test(expected = NumberFormatException.class)
25     public void testParseSingleIllegal() {
26         Decimal64.valueOf("a");
27     }
28
29     @Test(expected = NumberFormatException.class)
30     public void testParseSingleHighIllegal() {
31         Decimal64.valueOf(":");
32     }
33
34     @Test(expected = NumberFormatException.class)
35     public void testParseZeroIllegal() {
36         Decimal64.valueOf("0a");
37     }
38
39     @Test(expected = NumberFormatException.class)
40     public void testParseZeroHighIllegal() {
41         Decimal64.valueOf("0:");
42     }
43
44     @Test(expected = NumberFormatException.class)
45     public void testParseZeroPointIllegal() {
46         Decimal64.valueOf("0.a");
47     }
48
49     @Test(expected = NumberFormatException.class)
50     public void testParseZeroPointHighIllegal() {
51         Decimal64.valueOf("0.:");
52     }
53
54     @Test(expected = NumberFormatException.class)
55     public void testParsePointIllegal() {
56         Decimal64.valueOf(".a");
57     }
58
59     @Test(expected = NullPointerException.class)
60     public void testParseNull() {
61         Decimal64.valueOf((String)null);
62     }
63
64     @Test(expected = NumberFormatException.class)
65     public void testParseMinus() {
66         Decimal64.valueOf("-");
67     }
68
69     @Test(expected = NumberFormatException.class)
70     public void testParsePlus() {
71         Decimal64.valueOf("+");
72     }
73
74     @Test(expected = NumberFormatException.class)
75     public void testParsePeriod() {
76         Decimal64.valueOf(".");
77     }
78
79     @Test(expected = NumberFormatException.class)
80     public void testParseTwoPeriods() {
81         Decimal64.valueOf("..");
82     }
83
84     @Test(expected = NumberFormatException.class)
85     public void testParseTrailingPeriod() {
86         Decimal64.valueOf("0.");
87     }
88
89     @Test(expected = NumberFormatException.class)
90     public void testParseMultiplePeriods() {
91         Decimal64.valueOf("0.1.");
92     }
93
94     @Test
95     public void testParseLongString() {
96         Decimal64.valueOf("123456789012345678");
97     }
98
99     @Test
100     public void testParseLongDecimal() {
101         Decimal64.valueOf("0.12345678901234568");
102     }
103
104     @Test(expected = NumberFormatException.class)
105     public void testParseTooLongString() {
106         Decimal64.valueOf("1234567890123456789");
107     }
108
109     @Test(expected = NumberFormatException.class)
110     public void testParseTooLongDecimal() {
111         Decimal64.valueOf("0.123456789012345689");
112     }
113
114     @Test
115     public void testParse() {
116         assertParsedVariants("0", 0, 0, 1);
117         assertParsedVariants("0.00", 0, 0, 1);
118         assertParsedVariants("00.0", 0, 0, 1);
119         assertParsedVariants("000.0", 0, 0, 1);
120         assertCanonicalVariants("10.0", 10, 0, 1);
121         assertCanonicalVariants("10.09", 10, 9, 2);
122         assertParsedVariants("10.0900900", 10, 9009, 5);
123         assertParsedVariants("0002210.09", 2210, 9, 2);
124
125         Decimal64 parsed = assertParsedString("0.0", 0, 0, 1, false);
126         parsed = assertParsedString("+0.0", 0, 0, 1, false);
127         assertEquals("0.0", parsed.toString());
128         assertEquals("0.0", parsed.toString());
129         parsed = assertParsedString("-0.0", 0, 0, 1, true);
130         assertEquals("0.0", parsed.toString());
131
132         assertCanonicalVariants("1.0", 1, 0, 1);
133         assertCanonicalVariants("2.3", 2, 3, 1);
134     }
135
136     @Test
137     public void testCompare() {
138         final Decimal64 one = Decimal64.valueOf("1");
139         final Decimal64 two = Decimal64.valueOf("2");
140         final Decimal64 three = Decimal64.valueOf("3");
141         final Decimal64 negOne = Decimal64.valueOf("-1");
142         final Decimal64 anotherOne = Decimal64.valueOf("1");
143
144         assertEquals(0, one.compareTo(one));
145         assertEquals(0, one.compareTo(anotherOne));
146         assertEquals(-1, one.compareTo(two));
147         assertEquals(-1, one.compareTo(three));
148         assertEquals(1, one.compareTo(negOne));
149
150         assertEquals(1, two.compareTo(one));
151         assertEquals(1, two.compareTo(anotherOne));
152         assertEquals(-1, two.compareTo(three));
153         assertEquals(1, one.compareTo(negOne));
154     }
155
156     @Test
157     public void testEquals() {
158         final Decimal64 one = Decimal64.valueOf("1");
159         final Decimal64 two = Decimal64.valueOf("2");
160         final Decimal64 anotherOne = Decimal64.valueOf("1");
161
162         assertTrue(one.equals(one));
163         assertTrue(one.equals(anotherOne));
164         assertFalse(one.equals(two));
165         assertTrue(two.equals(two));
166         assertFalse(two.equals(one));
167
168         assertFalse(one.equals(new Object()));
169     }
170
171     @Test
172     public void testConversions() {
173         assertEquals(new BigDecimal("0.12"), Decimal64.valueOf("0.12").decimalValue());
174         assertEquals(new BigDecimal("-0.12"), Decimal64.valueOf("-0.12").decimalValue());
175         assertEquals(new BigDecimal("0.12"), Decimal64.valueOf("+0.12").decimalValue());
176         assertEquals(new BigDecimal("123.456"), Decimal64.valueOf("123.456").decimalValue());
177         assertEquals(new BigDecimal("-123.456"), Decimal64.valueOf("-123.456").decimalValue());
178
179         assertEquals(0.12, Decimal64.valueOf("0.12").doubleValue(), 0);
180         assertEquals(-0.12, Decimal64.valueOf("-0.12").doubleValue(), 0);
181
182         assertEquals((float) 0.12, Decimal64.valueOf("0.12").floatValue(), 0);
183         assertEquals((float) -0.12, Decimal64.valueOf("-0.12").floatValue(), 0);
184
185         assertEquals(12345678901L, Decimal64.valueOf("12345678901").longValue());
186         assertEquals(-12345678901L, Decimal64.valueOf("-12345678901").longValue());
187     }
188
189     @Test
190     public void testFactories() {
191         assertEquals("0.0", Decimal64.valueOf((byte) 0).toString());
192         assertEquals("1.0", Decimal64.valueOf((byte) 1).toString());
193         assertEquals("-1.0", Decimal64.valueOf((byte) -1).toString());
194
195         assertEquals("0.0", Decimal64.valueOf((short) 0).toString());
196         assertEquals("1.0", Decimal64.valueOf((short) 1).toString());
197         assertEquals("-1.0", Decimal64.valueOf((short) -1).toString());
198
199         assertEquals("0.0", Decimal64.valueOf(0).toString());
200         assertEquals("1.0", Decimal64.valueOf(1).toString());
201         assertEquals("-1.0", Decimal64.valueOf(-1).toString());
202
203         assertEquals("0.0", Decimal64.valueOf(0L).toString());
204         assertEquals("1.0", Decimal64.valueOf(1L).toString());
205         assertEquals("-1.0", Decimal64.valueOf(-1L).toString());
206
207         assertEquals("0.0", Decimal64.valueOf(0.0).toString());
208         assertEquals("1.0", Decimal64.valueOf(1.0).toString());
209         assertEquals("-1.0", Decimal64.valueOf(-1.0).toString());
210
211         assertEquals("0.0", Decimal64.valueOf(BigDecimal.ZERO).toString());
212         assertEquals("1.0", Decimal64.valueOf(BigDecimal.ONE).toString());
213         assertEquals("-1.0", Decimal64.valueOf(BigDecimal.ONE.negate()).toString());
214     }
215
216     private static void assertCanonicalVariants(final String str, final long intPart, final long fracPart,
217             final int digits) {
218         assertCanonicalString(str, intPart, fracPart, digits, false);
219         assertCanonicalString("-" + str, intPart, fracPart, digits, true);
220
221         final Decimal64 parsed = assertParsedString("+" + str, intPart, fracPart, digits, false);
222         assertEquals(str, parsed.toString());
223     }
224
225     private static void assertParsedVariants(final String str, final long intPart, final long fracPart,
226             final int digits) {
227         assertParsedString(str, intPart, fracPart, digits, false);
228         assertParsedString("-" + str, intPart, fracPart, digits, true);
229         assertParsedString("+" + str, intPart, fracPart, digits, false);
230     }
231
232     private static void assertCanonicalString(final String str, final long intPart, final long fracPart,
233             final int digits, final boolean negative) {
234         final Decimal64 parsed = assertParsedString(str, intPart, fracPart, digits, negative);
235         assertEquals(str, parsed.toString());
236     }
237
238     private static Decimal64 assertParsedString(final String str, final long intPart, final long fracPart,
239             final int digits, final boolean negative) {
240         final Decimal64 parsed = Decimal64.valueOf(str);
241         assertEquals(new Decimal64((byte) digits, intPart, fracPart, negative), parsed);
242         return parsed;
243     }
244 }