2 * Copyright (c) 2017 Pantheon Technologies s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.yangtools.yang.common;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertFalse;
12 import static org.junit.Assert.assertTrue;
14 import java.math.BigDecimal;
15 import org.junit.Test;
17 public class Decimal64Test {
19 @Test(expected = NumberFormatException.class)
20 public void testParseEmpty() {
21 Decimal64.valueOf("");
24 @Test(expected = NumberFormatException.class)
25 public void testParseSingleIllegal() {
26 Decimal64.valueOf("a");
29 @Test(expected = NumberFormatException.class)
30 public void testParseSingleHighIllegal() {
31 Decimal64.valueOf(":");
34 @Test(expected = NumberFormatException.class)
35 public void testParseZeroIllegal() {
36 Decimal64.valueOf("0a");
39 @Test(expected = NumberFormatException.class)
40 public void testParseZeroHighIllegal() {
41 Decimal64.valueOf("0:");
44 @Test(expected = NumberFormatException.class)
45 public void testParseZeroPointIllegal() {
46 Decimal64.valueOf("0.a");
49 @Test(expected = NumberFormatException.class)
50 public void testParseZeroPointHighIllegal() {
51 Decimal64.valueOf("0.:");
54 @Test(expected = NumberFormatException.class)
55 public void testParsePointIllegal() {
56 Decimal64.valueOf(".a");
59 @Test(expected = NumberFormatException.class)
60 public void testParseMinus() {
61 Decimal64.valueOf("-");
64 @Test(expected = NumberFormatException.class)
65 public void testParsePlus() {
66 Decimal64.valueOf("+");
69 @Test(expected = NumberFormatException.class)
70 public void testParsePeriod() {
71 Decimal64.valueOf(".");
74 @Test(expected = NumberFormatException.class)
75 public void testParseTwoPeriods() {
76 Decimal64.valueOf("..");
79 @Test(expected = NumberFormatException.class)
80 public void testParseTrailingPeriod() {
81 Decimal64.valueOf("0.");
84 @Test(expected = NumberFormatException.class)
85 public void testParseMultiplePeriods() {
86 Decimal64.valueOf("0.1.");
90 public void testParseLongString() {
91 Decimal64.valueOf("123456789012345678");
95 public void testParseLongDecimal() {
96 Decimal64.valueOf("0.12345678901234568");
99 @Test(expected = NumberFormatException.class)
100 public void testParseTooLongString() {
101 Decimal64.valueOf("1234567890123456789");
104 @Test(expected = NumberFormatException.class)
105 public void testParseTooLongDecimal() {
106 Decimal64.valueOf("0.123456789012345689");
110 public void testParse() {
111 assertParsedVariants("0", 0, 0, 1);
112 assertParsedVariants("0.00", 0, 0, 1);
113 assertParsedVariants("00.0", 0, 0, 1);
114 assertParsedVariants("000.0", 0, 0, 1);
115 assertCanonicalVariants("10.0", 10, 0, 1);
116 assertCanonicalVariants("10.09", 10, 9, 2);
117 assertParsedVariants("10.0900900", 10, 9009, 5);
118 assertParsedVariants("0002210.09", 2210, 9, 2);
120 Decimal64 parsed = assertParsedString("0.0", 0, 0, 1, false);
121 parsed = assertParsedString("+0.0", 0, 0, 1, false);
122 assertEquals("0.0", parsed.toString());
123 assertEquals("0.0", parsed.toString());
124 parsed = assertParsedString("-0.0", 0, 0, 1, true);
125 assertEquals("0.0", parsed.toString());
127 assertCanonicalVariants("1.0", 1, 0, 1);
128 assertCanonicalVariants("2.3", 2, 3, 1);
132 public void testCompare() {
133 final Decimal64 one = Decimal64.valueOf("1");
134 final Decimal64 two = Decimal64.valueOf("2");
135 final Decimal64 three = Decimal64.valueOf("3");
136 final Decimal64 negOne = Decimal64.valueOf("-1");
137 final Decimal64 anotherOne = Decimal64.valueOf("1");
139 assertEquals(0, one.compareTo(one));
140 assertEquals(0, one.compareTo(anotherOne));
141 assertEquals(-1, one.compareTo(two));
142 assertEquals(-1, one.compareTo(three));
143 assertEquals(1, one.compareTo(negOne));
145 assertEquals(1, two.compareTo(one));
146 assertEquals(1, two.compareTo(anotherOne));
147 assertEquals(-1, two.compareTo(three));
148 assertEquals(1, one.compareTo(negOne));
152 public void testEquals() {
153 final Decimal64 one = Decimal64.valueOf("1");
154 final Decimal64 two = Decimal64.valueOf("2");
155 final Decimal64 anotherOne = Decimal64.valueOf("1");
157 assertTrue(one.equals(one));
158 assertTrue(one.equals(anotherOne));
159 assertFalse(one.equals(two));
160 assertTrue(two.equals(two));
161 assertFalse(two.equals(one));
163 assertFalse(one.equals(new Object()));
167 public void testConversions() {
168 assertEquals(new BigDecimal("0.12"), Decimal64.valueOf("0.12").decimalValue());
169 assertEquals(new BigDecimal("-0.12"), Decimal64.valueOf("-0.12").decimalValue());
170 assertEquals(new BigDecimal("0.12"), Decimal64.valueOf("+0.12").decimalValue());
171 assertEquals(new BigDecimal("123.456"), Decimal64.valueOf("123.456").decimalValue());
172 assertEquals(new BigDecimal("-123.456"), Decimal64.valueOf("-123.456").decimalValue());
174 assertEquals(0.12, Decimal64.valueOf("0.12").doubleValue(), 0);
175 assertEquals(-0.12, Decimal64.valueOf("-0.12").doubleValue(), 0);
177 assertEquals((float) 0.12, Decimal64.valueOf("0.12").floatValue(), 0);
178 assertEquals((float) -0.12, Decimal64.valueOf("-0.12").floatValue(), 0);
180 assertEquals(12345678901L, Decimal64.valueOf("12345678901").longValue());
181 assertEquals(-12345678901L, Decimal64.valueOf("-12345678901").longValue());
185 public void testFactories() {
186 assertEquals("0.0", Decimal64.valueOf((byte) 0).toString());
187 assertEquals("1.0", Decimal64.valueOf((byte) 1).toString());
188 assertEquals("-1.0", Decimal64.valueOf((byte) -1).toString());
190 assertEquals("0.0", Decimal64.valueOf((short) 0).toString());
191 assertEquals("1.0", Decimal64.valueOf((short) 1).toString());
192 assertEquals("-1.0", Decimal64.valueOf((short) -1).toString());
194 assertEquals("0.0", Decimal64.valueOf(0).toString());
195 assertEquals("1.0", Decimal64.valueOf(1).toString());
196 assertEquals("-1.0", Decimal64.valueOf(-1).toString());
198 assertEquals("0.0", Decimal64.valueOf(0L).toString());
199 assertEquals("1.0", Decimal64.valueOf(1L).toString());
200 assertEquals("-1.0", Decimal64.valueOf(-1L).toString());
202 assertEquals("0.0", Decimal64.valueOf(0.0).toString());
203 assertEquals("1.0", Decimal64.valueOf(1.0).toString());
204 assertEquals("-1.0", Decimal64.valueOf(-1.0).toString());
206 assertEquals("0.0", Decimal64.valueOf(BigDecimal.ZERO).toString());
207 assertEquals("1.0", Decimal64.valueOf(BigDecimal.ONE).toString());
208 assertEquals("-1.0", Decimal64.valueOf(BigDecimal.ONE.negate()).toString());
212 public void testBoundaries() {
213 assertEquals(-128L, Decimal64.valueOf(Byte.MIN_VALUE).longValue());
214 assertEquals(127L, Decimal64.valueOf(Byte.MAX_VALUE).longValue());
215 assertEquals(-32768L, Decimal64.valueOf(Short.MIN_VALUE).longValue());
216 assertEquals(32767L, Decimal64.valueOf(Short.MAX_VALUE).longValue());
217 assertEquals(-2147483648L, Decimal64.valueOf(Integer.MIN_VALUE).longValue());
218 assertEquals(2147483647L, Decimal64.valueOf(Integer.MAX_VALUE).longValue());
222 public void testByteValueExact() {
223 assertEquals(Byte.MIN_VALUE, Decimal64.valueOf(Byte.MIN_VALUE).byteValueExact());
224 assertEquals(Byte.MAX_VALUE, Decimal64.valueOf(Byte.MAX_VALUE).byteValueExact());
227 @Test(expected = ArithmeticException.class)
228 public void testByteValueExactFrac() {
229 Decimal64.valueOf("1.1").byteValueExact();
232 @Test(expected = ArithmeticException.class)
233 public void testByteValueExactRange() {
234 Decimal64.valueOf(Byte.MAX_VALUE + 1).byteValueExact();
238 public void testShortValueExact() {
239 assertEquals(Short.MIN_VALUE, Decimal64.valueOf(Short.MIN_VALUE).shortValueExact());
240 assertEquals(Short.MAX_VALUE, Decimal64.valueOf(Short.MAX_VALUE).shortValueExact());
243 @Test(expected = ArithmeticException.class)
244 public void testShortValueExactFrac() {
245 Decimal64.valueOf("1.1").shortValueExact();
248 @Test(expected = ArithmeticException.class)
249 public void testShortValueExactRange() {
250 Decimal64.valueOf(Short.MAX_VALUE + 1).shortValueExact();
254 public void testIntValueExact() {
255 assertEquals(Integer.MIN_VALUE, Decimal64.valueOf(Integer.MIN_VALUE).intValueExact());
256 assertEquals(Integer.MAX_VALUE, Decimal64.valueOf(Integer.MAX_VALUE).intValueExact());
259 @Test(expected = ArithmeticException.class)
260 public void testIntValueExactFrac() {
261 Decimal64.valueOf("1.1").intValueExact();
264 @Test(expected = ArithmeticException.class)
265 public void testIntValueExactRange() {
266 Decimal64.valueOf(Integer.MAX_VALUE + 1L).intValueExact();
269 @Test(expected = ArithmeticException.class)
270 public void testLongValueExactFrac() {
271 Decimal64.valueOf("1.1").longValueExact();
274 private static void assertCanonicalVariants(final String str, final long intPart, final long fracPart,
276 assertCanonicalString(str, intPart, fracPart, digits, false);
277 assertCanonicalString("-" + str, intPart, fracPart, digits, true);
279 final Decimal64 parsed = assertParsedString("+" + str, intPart, fracPart, digits, false);
280 assertEquals(str, parsed.toString());
283 private static void assertParsedVariants(final String str, final long intPart, final long fracPart,
285 assertParsedString(str, intPart, fracPart, digits, false);
286 assertParsedString("-" + str, intPart, fracPart, digits, true);
287 assertParsedString("+" + str, intPart, fracPart, digits, false);
290 private static void assertCanonicalString(final String str, final long intPart, final long fracPart,
291 final int digits, final boolean negative) {
292 final Decimal64 parsed = assertParsedString(str, intPart, fracPart, digits, negative);
293 assertEquals(str, parsed.toString());
296 private static Decimal64 assertParsedString(final String str, final long intPart, final long fracPart,
297 final int digits, final boolean negative) {
298 final Decimal64 parsed = Decimal64.valueOf(str);
299 assertEquals(new Decimal64((byte) digits, intPart, fracPart, negative), parsed);