/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.facebook.presto.spi.type; import io.airlift.slice.Slice; import org.testng.annotations.Test; import java.math.BigInteger; import static com.facebook.presto.spi.type.DecimalType.createDecimalType; import static org.testng.Assert.assertEquals; public class TestDecimals { @Test public void testParse() throws Exception { assertParseResult("0", 0L, 1, 0); assertParseResult("+0", 0L, 1, 0); assertParseResult("-0", 0L, 1, 0); assertParseResult("000", 0L, 1, 0); assertParseResult("+000", 0L, 1, 0); assertParseResult("-000", 0L, 1, 0); assertParseResult("0000000000000000000000000000", 0L, 1, 0); assertParseResult("+0000000000000000000000000000", 0L, 1, 0); assertParseResult("-0000000000000000000000000000", 0L, 1, 0); assertParseResult("1.1", 11L, 2, 1); assertParseResult("+1.1", 11L, 2, 1); assertParseResult("-1.1", -11L, 2, 1); assertParseResult("0001.1", 11L, 2, 1); assertParseResult("+0001.1", 11L, 2, 1); assertParseResult("-0001.1", -11L, 2, 1); assertParseResult("0.1", 1L, 1, 1); assertParseResult("+0.1", 1L, 1, 1); assertParseResult("-0.1", -1L, 1, 1); assertParseResult(".1", 1L, 1, 1); assertParseResult("+.1", 1L, 1, 1); assertParseResult("-.1", -1L, 1, 1); assertParseResult("000.1", 1L, 1, 1); assertParseResult("+000.1", 1L, 1, 1); assertParseResult("-000.1", -1L, 1, 1); assertParseResult("12345678901234567", 12345678901234567L, 17, 0); assertParseResult("+12345678901234567", 12345678901234567L, 17, 0); assertParseResult("-12345678901234567", -12345678901234567L, 17, 0); assertParseResult("00012345678901234567", 12345678901234567L, 17, 0); assertParseResult("+00012345678901234567", 12345678901234567L, 17, 0); assertParseResult("-00012345678901234567", -12345678901234567L, 17, 0); assertParseResult("0.12345678901234567", 12345678901234567L, 17, 17); assertParseResult("+0.12345678901234567", 12345678901234567L, 17, 17); assertParseResult("-0.12345678901234567", -12345678901234567L, 17, 17); assertParseResult("000.12345678901234567", 12345678901234567L, 17, 17); assertParseResult("+000.12345678901234567", 12345678901234567L, 17, 17); assertParseResult("-000.12345678901234567", -12345678901234567L, 17, 17); assertParseResult("12345678901234567890.123456789012345678", encodeUnscaledValue("12345678901234567890123456789012345678"), 38, 18); assertParseResult("+12345678901234567890.123456789012345678", encodeUnscaledValue("12345678901234567890123456789012345678"), 38, 18); assertParseResult("-12345678901234567890.123456789012345678", encodeUnscaledValue("-12345678901234567890123456789012345678"), 38, 18); assertParseResult("00012345678901234567890.123456789012345678", encodeUnscaledValue("12345678901234567890123456789012345678"), 38, 18); assertParseResult("+00012345678901234567890.123456789012345678", encodeUnscaledValue("12345678901234567890123456789012345678"), 38, 18); assertParseResult("-00012345678901234567890.123456789012345678", encodeUnscaledValue("-12345678901234567890123456789012345678"), 38, 18); assertParseResult("0.12345678901234567890123456789012345678", encodeUnscaledValue("12345678901234567890123456789012345678"), 38, 38); assertParseResult("+0.12345678901234567890123456789012345678", encodeUnscaledValue("12345678901234567890123456789012345678"), 38, 38); assertParseResult("-0.12345678901234567890123456789012345678", encodeUnscaledValue("-12345678901234567890123456789012345678"), 38, 38); assertParseResult(".12345678901234567890123456789012345678", encodeUnscaledValue("12345678901234567890123456789012345678"), 38, 38); assertParseResult("+.12345678901234567890123456789012345678", encodeUnscaledValue("12345678901234567890123456789012345678"), 38, 38); assertParseResult("-.12345678901234567890123456789012345678", encodeUnscaledValue("-12345678901234567890123456789012345678"), 38, 38); assertParseResult("0000.12345678901234567890123456789012345678", encodeUnscaledValue("12345678901234567890123456789012345678"), 38, 38); assertParseResult("+0000.12345678901234567890123456789012345678", encodeUnscaledValue("12345678901234567890123456789012345678"), 38, 38); assertParseResult("-0000.12345678901234567890123456789012345678", encodeUnscaledValue("-12345678901234567890123456789012345678"), 38, 38); } @Test public void testParseIncludeLeadingZerosInPrecision() throws Exception { assertParseResultIncludeLeadingZerosInPrecision("0", 0L, 1, 0); assertParseResultIncludeLeadingZerosInPrecision("+0", 0L, 1, 0); assertParseResultIncludeLeadingZerosInPrecision("-0", 0L, 1, 0); assertParseResultIncludeLeadingZerosInPrecision("00000000000000000", 0L, 17, 0); assertParseResultIncludeLeadingZerosInPrecision("+00000000000000000", 0L, 17, 0); assertParseResultIncludeLeadingZerosInPrecision("-00000000000000000", 0L, 17, 0); assertParseResultIncludeLeadingZerosInPrecision("1.1", 11L, 2, 1); assertParseResultIncludeLeadingZerosInPrecision("+1.1", 11L, 2, 1); assertParseResultIncludeLeadingZerosInPrecision("-1.1", -11L, 2, 1); assertParseResultIncludeLeadingZerosInPrecision("0001.1", 11L, 5, 1); assertParseResultIncludeLeadingZerosInPrecision("+0001.1", 11L, 5, 1); assertParseResultIncludeLeadingZerosInPrecision("-0001.1", -11L, 5, 1); assertParseResultIncludeLeadingZerosInPrecision("000", 0L, 3, 0); assertParseResultIncludeLeadingZerosInPrecision("+000", 0L, 3, 0); assertParseResultIncludeLeadingZerosInPrecision("-000", -0L, 3, 0); assertParseResultIncludeLeadingZerosInPrecision("000.1", 1L, 4, 1); assertParseResultIncludeLeadingZerosInPrecision("+000.1", 1L, 4, 1); assertParseResultIncludeLeadingZerosInPrecision("-000.1", -1L, 4, 1); assertParseResultIncludeLeadingZerosInPrecision("000000000000000000", 0L, 18, 0); assertParseResultIncludeLeadingZerosInPrecision("+000000000000000000", 0L, 18, 0); assertParseResultIncludeLeadingZerosInPrecision("-000000000000000000", 0L, 18, 0); assertParseResultIncludeLeadingZerosInPrecision("000000000000000000.123", encodeUnscaledValue("123"), 21, 3); assertParseResultIncludeLeadingZerosInPrecision("+000000000000000000.123", encodeUnscaledValue("123"), 21, 3); assertParseResultIncludeLeadingZerosInPrecision("-000000000000000000.123", encodeUnscaledValue("-123"), 21, 3); } private void assertParseResult(String value, Object expectedObject, int expectedPrecision, int expectedScale) { assertEquals(Decimals.parse(value), new DecimalParseResult( expectedObject, createDecimalType(expectedPrecision, expectedScale))); } private void assertParseResultIncludeLeadingZerosInPrecision(String value, Object expectedObject, int expectedPrecision, int expectedScale) { assertEquals(Decimals.parseIncludeLeadingZerosInPrecision(value), new DecimalParseResult( expectedObject, createDecimalType(expectedPrecision, expectedScale))); } private static Slice encodeUnscaledValue(String unscaledValue) { return Decimals.encodeUnscaledValue(new BigInteger(unscaledValue)); } }