+ @Test
+ public void testLongValueOfBits() {
+ final Decimal64 dec = Decimal64.valueOf(2, 25552555555L);
+ assertEquals(2, dec.scale());
+ assertEquals(2555255555500L, dec.unscaledValue());
+ }
+
+ @Test
+ public void testLongValueOfNegativeBits() {
+ final Decimal64 dec = Decimal64.valueOf(2, -25552555555L);
+ assertEquals(2, dec.scale());
+ assertEquals(-2555255555500L, dec.unscaledValue());
+ }
+
+ @Test
+ public void testByteRange() {
+ for (int i = 1; i <= 16; ++i) {
+ assertEquals(Byte.MIN_VALUE, Decimal64.valueOf(i, Byte.MIN_VALUE).byteValueExact());
+ assertEquals(Byte.MAX_VALUE, Decimal64.valueOf(i, Byte.MAX_VALUE).byteValueExact());
+ }
+ for (int i = 17; i <= 18; ++i) {
+ int scale = i;
+ assertThrows(IllegalArgumentException.class, () -> Decimal64.valueOf(scale, Byte.MIN_VALUE));
+ assertThrows(IllegalArgumentException.class, () -> Decimal64.valueOf(scale, Byte.MAX_VALUE));
+ }
+ }
+
+ @Test
+ public void testShortRange() {
+ for (int i = 1; i <= 14; ++i) {
+ assertEquals(Short.MIN_VALUE, Decimal64.valueOf(i, Short.MIN_VALUE).shortValueExact());
+ assertEquals(Short.MAX_VALUE, Decimal64.valueOf(i, Short.MAX_VALUE).shortValueExact());
+ }
+ for (int i = 15; i <= 18; ++i) {
+ int scale = i;
+ assertThrows(IllegalArgumentException.class, () -> Decimal64.valueOf(scale, Short.MIN_VALUE));
+ assertThrows(IllegalArgumentException.class, () -> Decimal64.valueOf(scale, Short.MAX_VALUE));
+ }
+ }
+
+ @Test
+ public void testIntRange() {
+ for (int i = 1; i <= 9; ++i) {
+ assertEquals(Integer.MIN_VALUE, Decimal64.valueOf(i, Integer.MIN_VALUE).intValueExact());
+ assertEquals(Integer.MAX_VALUE, Decimal64.valueOf(i, Integer.MAX_VALUE).intValueExact());
+ }
+ for (int i = 10; i <= 18; ++i) {
+ int scale = i;
+ assertThrows(IllegalArgumentException.class, () -> Decimal64.valueOf(scale, Integer.MIN_VALUE));
+ assertThrows(IllegalArgumentException.class, () -> Decimal64.valueOf(scale, Integer.MAX_VALUE));
+ }
+ }
+
+ @Test
+ public void testLongRange() {
+ for (int i = 1; i <= 18; ++i) {
+ int scale = i;
+ assertThrows(IllegalArgumentException.class, () -> Decimal64.valueOf(scale, Long.MIN_VALUE));
+ assertThrows(IllegalArgumentException.class, () -> Decimal64.valueOf(scale, Long.MAX_VALUE));
+ }
+ }
+