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.assertThrows;
13 import static org.junit.Assert.assertTrue;
15 import java.math.BigDecimal;
16 import org.junit.Test;
18 public class Decimal64Test {
20 public void testParseEmpty() {
21 assertThrows(NumberFormatException.class, () -> Decimal64.valueOf(""));
25 public void testParseSingleIllegal() {
26 assertThrows(NumberFormatException.class, () -> Decimal64.valueOf("a"));
30 public void testParseSingleHighIllegal() {
31 assertThrows(NumberFormatException.class, () -> Decimal64.valueOf(":"));
35 public void testParseZeroIllegal() {
36 assertThrows(NumberFormatException.class, () -> Decimal64.valueOf("0a"));
40 public void testParseZeroHighIllegal() {
41 assertThrows(NumberFormatException.class, () -> Decimal64.valueOf("0:"));
45 public void testParseZeroPointIllegal() {
46 assertThrows(NumberFormatException.class, () -> Decimal64.valueOf("0.a"));
50 public void testParseZeroPointHighIllegal() {
51 assertThrows(NumberFormatException.class, () -> Decimal64.valueOf("0.:"));
55 public void testParsePointIllegal() {
56 assertThrows(NumberFormatException.class, () -> Decimal64.valueOf(".a"));
60 public void testParseMinus() {
61 assertThrows(NumberFormatException.class, () -> Decimal64.valueOf("-"));
65 public void testParsePlus() {
66 assertThrows(NumberFormatException.class, () -> Decimal64.valueOf("+"));
70 public void testParsePeriod() {
71 assertThrows(NumberFormatException.class, () -> Decimal64.valueOf("."));
75 public void testParseTwoPeriods() {
76 assertThrows(NumberFormatException.class, () -> Decimal64.valueOf(".."));
80 public void testParseTrailingPeriod() {
81 assertThrows(NumberFormatException.class, () -> Decimal64.valueOf("0."));
85 public void testParseMultiplePeriods() {
86 assertThrows(NumberFormatException.class, () -> Decimal64.valueOf("0.1."));
90 public void testParseLongString() {
91 Decimal64.valueOf("123456789012345678");
95 public void testParseLongDecimal() {
96 Decimal64.valueOf("0.12345678901234568");
100 public void testFractionLimits() {
101 Decimal64.valueOf("922337203685477580.7");
102 Decimal64.valueOf("9.223372036854775807");
104 assertThrows(NumberFormatException.class, () -> Decimal64.valueOf("922337203685477580.71"));
105 assertThrows(NumberFormatException.class, () -> Decimal64.valueOf("9.2233720368547758071"));
109 public void testParseTooLongString() {
110 assertThrows(NumberFormatException.class, () -> Decimal64.valueOf("1234567890123456789"));
114 public void testParseTooLongDecimal() {
115 assertThrows(NumberFormatException.class, () -> Decimal64.valueOf("0.1234567890123456789"));
119 public void testParse() {
120 assertParsedVariants("0", 0, 0, 1);
121 assertParsedVariants("0.00", 0, 0, 1);
122 assertParsedVariants("00.0", 0, 0, 1);
123 assertParsedVariants("000.0", 0, 0, 1);
124 assertCanonicalVariants("10.0", 10, 0, 1);
125 assertCanonicalVariants("10.09", 10, 9, 2);
126 assertParsedVariants("10.0900900", 10, 9009, 5);
127 assertParsedVariants("0002210.09", 2210, 9, 2);
129 Decimal64 parsed = assertParsedString("0.0", 0, 0, 1, false);
130 parsed = assertParsedString("+0.0", 0, 0, 1, false);
131 assertEquals("0.0", parsed.toString());
132 assertEquals("0.0", parsed.toString());
133 parsed = assertParsedString("-0.0", 0, 0, 1, true);
134 assertEquals("0.0", parsed.toString());
136 assertCanonicalVariants("1.0", 1, 0, 1);
137 assertCanonicalVariants("2.3", 2, 3, 1);
141 public void testCompare() {
142 final Decimal64 one = Decimal64.valueOf("1");
143 final Decimal64 two = Decimal64.valueOf("2");
144 final Decimal64 three = Decimal64.valueOf("3");
145 final Decimal64 negOne = Decimal64.valueOf("-1");
146 final Decimal64 anotherOne = Decimal64.valueOf("1");
148 assertEquals(0, one.compareTo(one));
149 assertEquals(0, one.compareTo(anotherOne));
150 assertEquals(-1, one.compareTo(two));
151 assertEquals(-1, one.compareTo(three));
152 assertEquals(1, one.compareTo(negOne));
154 assertEquals(1, two.compareTo(one));
155 assertEquals(1, two.compareTo(anotherOne));
156 assertEquals(-1, two.compareTo(three));
157 assertEquals(1, one.compareTo(negOne));
161 public void testEquals() {
162 final Decimal64 one = Decimal64.valueOf("1");
163 final Decimal64 two = Decimal64.valueOf("2");
164 final Decimal64 anotherOne = Decimal64.valueOf("1");
166 assertTrue(one.equals(one));
167 assertTrue(one.equals(anotherOne));
168 assertFalse(one.equals(two));
169 assertTrue(two.equals(two));
170 assertFalse(two.equals(one));
172 assertFalse(one.equals(new Object()));
176 public void testConversions() {
177 assertEquals(new BigDecimal("0.12"), Decimal64.valueOf("0.12").decimalValue());
178 assertEquals(new BigDecimal("-0.12"), Decimal64.valueOf("-0.12").decimalValue());
179 assertEquals(new BigDecimal("0.12"), Decimal64.valueOf("+0.12").decimalValue());
180 assertEquals(new BigDecimal("123.456"), Decimal64.valueOf("123.456").decimalValue());
181 assertEquals(new BigDecimal("-123.456"), Decimal64.valueOf("-123.456").decimalValue());
183 assertEquals(0.12, Decimal64.valueOf("0.12").doubleValue(), 0);
184 assertEquals(-0.12, Decimal64.valueOf("-0.12").doubleValue(), 0);
186 assertEquals((float) 0.12, Decimal64.valueOf("0.12").floatValue(), 0);
187 assertEquals((float) -0.12, Decimal64.valueOf("-0.12").floatValue(), 0);
189 assertEquals(12345678901L, Decimal64.valueOf("12345678901").longValue());
190 assertEquals(-12345678901L, Decimal64.valueOf("-12345678901").longValue());
194 public void testFactories() {
195 assertEquals("0.0", Decimal64.valueOf((byte) 0).toString());
196 assertEquals("1.0", Decimal64.valueOf((byte) 1).toString());
197 assertEquals("-1.0", Decimal64.valueOf((byte) -1).toString());
199 assertEquals("0.0", Decimal64.valueOf((short) 0).toString());
200 assertEquals("1.0", Decimal64.valueOf((short) 1).toString());
201 assertEquals("-1.0", Decimal64.valueOf((short) -1).toString());
203 assertEquals("0.0", Decimal64.valueOf(0).toString());
204 assertEquals("1.0", Decimal64.valueOf(1).toString());
205 assertEquals("-1.0", Decimal64.valueOf(-1).toString());
207 assertEquals("0.0", Decimal64.valueOf(0L).toString());
208 assertEquals("1.0", Decimal64.valueOf(1L).toString());
209 assertEquals("-1.0", Decimal64.valueOf(-1L).toString());
211 assertEquals("0.0", Decimal64.valueOf(0.0).toString());
212 assertEquals("1.0", Decimal64.valueOf(1.0).toString());
213 assertEquals("-1.0", Decimal64.valueOf(-1.0).toString());
215 assertEquals("0.0", Decimal64.valueOf(BigDecimal.ZERO).toString());
216 assertEquals("1.0", Decimal64.valueOf(BigDecimal.ONE).toString());
217 assertEquals("-1.0", Decimal64.valueOf(BigDecimal.ONE.negate()).toString());
221 public void testBoundaries() {
222 assertEquals(-128L, Decimal64.valueOf(Byte.MIN_VALUE).longValue());
223 assertEquals(127L, Decimal64.valueOf(Byte.MAX_VALUE).longValue());
224 assertEquals(-32768L, Decimal64.valueOf(Short.MIN_VALUE).longValue());
225 assertEquals(32767L, Decimal64.valueOf(Short.MAX_VALUE).longValue());
226 assertEquals(-2147483648L, Decimal64.valueOf(Integer.MIN_VALUE).longValue());
227 assertEquals(2147483647L, Decimal64.valueOf(Integer.MAX_VALUE).longValue());
231 public void testByteValueExact() {
232 assertEquals(Byte.MIN_VALUE, Decimal64.valueOf(Byte.MIN_VALUE).byteValueExact());
233 assertEquals(Byte.MAX_VALUE, Decimal64.valueOf(Byte.MAX_VALUE).byteValueExact());
237 public void testByteValueExactFrac() {
238 final Decimal64 dec = Decimal64.valueOf("1.1");
239 assertThrows(ArithmeticException.class, () -> dec.byteValueExact());
243 public void testByteValueExactRange() {
244 final Decimal64 dec = Decimal64.valueOf(Byte.MAX_VALUE + 1);
245 assertThrows(ArithmeticException.class, () -> dec.byteValueExact());
249 public void testShortValueExact() {
250 assertEquals(Short.MIN_VALUE, Decimal64.valueOf(Short.MIN_VALUE).shortValueExact());
251 assertEquals(Short.MAX_VALUE, Decimal64.valueOf(Short.MAX_VALUE).shortValueExact());
255 public void testShortValueExactFrac() {
256 final Decimal64 dec = Decimal64.valueOf("1.1");
257 assertThrows(ArithmeticException.class, () -> dec.shortValueExact());
261 public void testShortValueExactRange() {
262 final Decimal64 dec = Decimal64.valueOf(Short.MAX_VALUE + 1);
263 assertThrows(ArithmeticException.class, () -> dec.shortValueExact());
267 public void testIntValueExact() {
268 assertEquals(Integer.MIN_VALUE, Decimal64.valueOf(Integer.MIN_VALUE).intValueExact());
269 assertEquals(Integer.MAX_VALUE, Decimal64.valueOf(Integer.MAX_VALUE).intValueExact());
273 public void testIntValueExactFrac() {
274 final Decimal64 dec = Decimal64.valueOf("1.1");
275 assertThrows(ArithmeticException.class, () -> dec.intValueExact());
279 public void testIntValueExactRange() {
280 final Decimal64 dec = Decimal64.valueOf(Integer.MAX_VALUE + 1L);
281 assertThrows(ArithmeticException.class, () -> dec.intValueExact());
285 public void testLongValueExactFrac() {
286 final Decimal64 dec = Decimal64.valueOf("1.1");
287 assertThrows(ArithmeticException.class, () -> dec.longValueExact());
290 private static void assertCanonicalVariants(final String str, final long intPart, final long fracPart,
292 assertCanonicalString(str, intPart, fracPart, digits, false);
293 assertCanonicalString("-" + str, intPart, fracPart, digits, true);
295 final Decimal64 parsed = assertParsedString("+" + str, intPart, fracPart, digits, false);
296 assertEquals(str, parsed.toString());
299 private static void assertParsedVariants(final String str, final long intPart, final long fracPart,
301 assertParsedString(str, intPart, fracPart, digits, false);
302 assertParsedString("-" + str, intPart, fracPart, digits, true);
303 assertParsedString("+" + str, intPart, fracPart, digits, false);
306 private static void assertCanonicalString(final String str, final long intPart, final long fracPart,
307 final int digits, final boolean negative) {
308 final Decimal64 parsed = assertParsedString(str, intPart, fracPart, digits, negative);
309 assertEquals(str, parsed.toString());
312 private static Decimal64 assertParsedString(final String str, final long intPart, final long fracPart,
313 final int digits, final boolean negative) {
314 final Decimal64 parsed = Decimal64.valueOf(str);
315 assertEquals(new Decimal64((byte) digits, intPart, fracPart, negative), parsed);