| /* |
| * Copyright 2017 HugeGraph Authors |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with this |
| * work for additional information regarding copyright ownership. The ASF |
| * licenses this file to You 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.baidu.hugegraph.unit.util; |
| |
| import java.math.BigDecimal; |
| import java.text.ParseException; |
| import java.text.SimpleDateFormat; |
| import java.util.Date; |
| import java.util.Random; |
| import java.util.TimeZone; |
| |
| import org.junit.Test; |
| |
| import com.baidu.hugegraph.testutil.Assert; |
| import com.baidu.hugegraph.unit.BaseUnitTest; |
| import com.baidu.hugegraph.util.Bytes; |
| import com.baidu.hugegraph.util.LongEncoding; |
| import com.baidu.hugegraph.util.NumericUtil; |
| |
| public class LongEncodingTest extends BaseUnitTest { |
| |
| @Test |
| public void testValidB64Char() { |
| Assert.assertTrue(LongEncoding.validB64Char('0')); |
| Assert.assertTrue(LongEncoding.validB64Char('1')); |
| Assert.assertTrue(LongEncoding.validB64Char('9')); |
| Assert.assertTrue(LongEncoding.validB64Char('A')); |
| Assert.assertTrue(LongEncoding.validB64Char('Z')); |
| Assert.assertTrue(LongEncoding.validB64Char('_')); |
| Assert.assertTrue(LongEncoding.validB64Char('a')); |
| Assert.assertTrue(LongEncoding.validB64Char('z')); |
| Assert.assertTrue(LongEncoding.validB64Char('~')); |
| |
| Assert.assertFalse(LongEncoding.validB64Char('`')); |
| Assert.assertFalse(LongEncoding.validB64Char('!')); |
| Assert.assertFalse(LongEncoding.validB64Char('@')); |
| Assert.assertFalse(LongEncoding.validB64Char('#')); |
| Assert.assertFalse(LongEncoding.validB64Char('$')); |
| Assert.assertFalse(LongEncoding.validB64Char('%')); |
| Assert.assertFalse(LongEncoding.validB64Char('^')); |
| Assert.assertFalse(LongEncoding.validB64Char('&')); |
| Assert.assertFalse(LongEncoding.validB64Char('*')); |
| Assert.assertFalse(LongEncoding.validB64Char('(')); |
| Assert.assertFalse(LongEncoding.validB64Char(')')); |
| Assert.assertFalse(LongEncoding.validB64Char('-')); |
| Assert.assertFalse(LongEncoding.validB64Char('+')); |
| Assert.assertFalse(LongEncoding.validB64Char('=')); |
| Assert.assertFalse(LongEncoding.validB64Char('[')); |
| Assert.assertFalse(LongEncoding.validB64Char(']')); |
| Assert.assertFalse(LongEncoding.validB64Char('{')); |
| Assert.assertFalse(LongEncoding.validB64Char('}')); |
| Assert.assertFalse(LongEncoding.validB64Char('|')); |
| Assert.assertFalse(LongEncoding.validB64Char('\\')); |
| Assert.assertFalse(LongEncoding.validB64Char(';')); |
| Assert.assertFalse(LongEncoding.validB64Char(':')); |
| Assert.assertFalse(LongEncoding.validB64Char('\'')); |
| Assert.assertFalse(LongEncoding.validB64Char('\"')); |
| Assert.assertFalse(LongEncoding.validB64Char('<')); |
| Assert.assertFalse(LongEncoding.validB64Char(',')); |
| Assert.assertFalse(LongEncoding.validB64Char('>')); |
| Assert.assertFalse(LongEncoding.validB64Char('.')); |
| Assert.assertFalse(LongEncoding.validB64Char('?')); |
| Assert.assertFalse(LongEncoding.validB64Char('/')); |
| Assert.assertFalse(LongEncoding.validB64Char('\t')); |
| Assert.assertFalse(LongEncoding.validB64Char('\b')); |
| } |
| |
| @Test |
| public void testEncode() { |
| String val0 = LongEncoding.encodeB64(0); |
| Assert.assertEquals("0", val0); |
| |
| String val1 = LongEncoding.encodeB64(1); |
| Assert.assertEquals("1", val1); |
| |
| String val9 = LongEncoding.encodeB64(9); |
| Assert.assertEquals("9", val9); |
| |
| String val10 = LongEncoding.encodeB64(10); |
| Assert.assertEquals("A", val10); |
| |
| String val35 = LongEncoding.encodeB64(35); |
| Assert.assertEquals("Z", val35); |
| |
| String val36 = LongEncoding.encodeB64(36); |
| Assert.assertEquals("_", val36); |
| |
| String val37 = LongEncoding.encodeB64(37); |
| Assert.assertEquals("a", val37); |
| |
| String val62 = LongEncoding.encodeB64(62); |
| Assert.assertEquals("z", val62); |
| |
| String val63 = LongEncoding.encodeB64(63); |
| Assert.assertEquals("~", val63); |
| } |
| |
| @Test |
| public void testEncodeWithMultiString() { |
| Assert.assertEquals("0", LongEncoding.encode(0L, "0123456789")); |
| Assert.assertEquals("1", LongEncoding.encode(1L, "0123456789")); |
| Assert.assertEquals("123", LongEncoding.encode(123L, "0123456789")); |
| Assert.assertEquals("13579", LongEncoding.encode(13579L, "0123456789")); |
| Assert.assertEquals("24680", LongEncoding.encode(24680L, "0123456789")); |
| |
| String val64 = LongEncoding.encodeB64(64); |
| Assert.assertEquals("10", val64); |
| |
| String val65 = LongEncoding.encodeB64(65); |
| Assert.assertEquals("11", val65); |
| |
| String val99 = LongEncoding.encodeB64(99); |
| Assert.assertEquals("1Z", val99); |
| |
| String val100 = LongEncoding.encodeB64(100); |
| Assert.assertEquals("1_", val100); |
| |
| String val126 = LongEncoding.encodeB64(126); |
| Assert.assertEquals("1z", val126); |
| |
| String val127 = LongEncoding.encodeB64(127); |
| Assert.assertEquals("1~", val127); |
| |
| String val128 = LongEncoding.encodeB64(128); |
| Assert.assertEquals("20", val128); |
| |
| String val200 = LongEncoding.encodeB64(200); |
| Assert.assertEquals("38", val200); |
| |
| String val1000 = LongEncoding.encodeB64(1000); |
| Assert.assertEquals("Fd", val1000); |
| |
| String val1234 = LongEncoding.encodeB64(1234); |
| Assert.assertEquals("JI", val1234); |
| |
| String val10000 = LongEncoding.encodeB64(10000); |
| Assert.assertEquals("2SG", val10000); |
| |
| String val12345 = LongEncoding.encodeB64(12345); |
| Assert.assertEquals("30u", val12345); |
| |
| String val22345 = LongEncoding.encodeB64(22345); |
| Assert.assertEquals("5T9", val22345); |
| |
| String val92345 = LongEncoding.encodeB64(92345); |
| Assert.assertEquals("MYu", val92345); |
| |
| String val12345678 = LongEncoding.encodeB64(12345678); |
| Assert.assertEquals("k65E", val12345678); |
| |
| String val112345678 = LongEncoding.encodeB64(112345678); |
| Assert.assertEquals("6h_9E", val112345678); |
| |
| String valIntMax = LongEncoding.encodeB64(Integer.MAX_VALUE); |
| Assert.assertEquals("1~~~~~", valIntMax); |
| |
| String valLongMax = LongEncoding.encodeB64(Long.MAX_VALUE); |
| Assert.assertEquals("7~~~~~~~~~~", valLongMax); |
| } |
| |
| @Test |
| public void testEncodeWithError() { |
| Assert.assertThrows(IllegalArgumentException.class, () -> { |
| LongEncoding.encode(1, ""); |
| }, e -> { |
| Assert.assertEquals("The symbols parameter can't be empty", |
| e.getMessage()); |
| }); |
| |
| Assert.assertThrows(IllegalArgumentException.class, () -> { |
| LongEncoding.encode(-1, ""); |
| }, e -> { |
| Assert.assertContains("Expected non-negative number", |
| e.getMessage()); |
| }); |
| |
| Assert.assertThrows(IllegalArgumentException.class, () -> { |
| LongEncoding.encodeB64(-1); |
| }, e -> { |
| Assert.assertContains("Expected non-negative number", |
| e.getMessage()); |
| }); |
| |
| Assert.assertThrows(IllegalArgumentException.class, () -> { |
| LongEncoding.encodeB64(Long.MIN_VALUE); |
| }, e -> { |
| Assert.assertContains("Expected non-negative number", |
| e.getMessage()); |
| }); |
| } |
| |
| @Test |
| public void testDecode() { |
| long valEmpty = LongEncoding.decodeB64(""); |
| Assert.assertEquals(0, valEmpty); |
| |
| long val0 = LongEncoding.decodeB64("0"); |
| Assert.assertEquals(0, val0); |
| |
| long val1 = LongEncoding.decodeB64("1"); |
| Assert.assertEquals(1, val1); |
| |
| long val9 = LongEncoding.decodeB64("9"); |
| Assert.assertEquals(9, val9); |
| |
| long val10 = LongEncoding.decodeB64("A"); |
| Assert.assertEquals(10, val10); |
| |
| long val35 = LongEncoding.decodeB64("Z"); |
| Assert.assertEquals(35, val35); |
| |
| long val36 = LongEncoding.decodeB64("_"); |
| Assert.assertEquals(36, val36); |
| |
| long val37 = LongEncoding.decodeB64("a"); |
| Assert.assertEquals(37, val37); |
| |
| long val62 = LongEncoding.decodeB64("z"); |
| Assert.assertEquals(62, val62); |
| |
| long val63 = LongEncoding.decodeB64("~"); |
| Assert.assertEquals(63, val63); |
| } |
| |
| @Test |
| public void testDecodeWithMultiString() { |
| Assert.assertEquals(0L, LongEncoding.decode("0", "0123456789")); |
| Assert.assertEquals(1L, LongEncoding.decode("1", "0123456789")); |
| Assert.assertEquals(123L, LongEncoding.decode("123", "0123456789")); |
| Assert.assertEquals(13579L, LongEncoding.decode("13579", "0123456789")); |
| Assert.assertEquals(24680L, LongEncoding.decode("24680", "0123456789")); |
| |
| long val64 = LongEncoding.decodeB64("10"); |
| Assert.assertEquals(64, val64); |
| |
| long val65 = LongEncoding.decodeB64("11"); |
| Assert.assertEquals(65, val65); |
| |
| long val99 = LongEncoding.decodeB64("1Z"); |
| Assert.assertEquals(99, val99); |
| |
| long val100 = LongEncoding.decodeB64("1_"); |
| Assert.assertEquals(100, val100); |
| |
| long val126 = LongEncoding.decodeB64("1z"); |
| Assert.assertEquals(126, val126); |
| |
| long val127 = LongEncoding.decodeB64("1~"); |
| Assert.assertEquals(127, val127); |
| |
| long val128 = LongEncoding.decodeB64("20"); |
| Assert.assertEquals(128, val128); |
| |
| long val200 = LongEncoding.decodeB64("38"); |
| Assert.assertEquals(200, val200); |
| |
| long val1000 = LongEncoding.decodeB64("Fd"); |
| Assert.assertEquals(1000, val1000); |
| |
| long val1234 = LongEncoding.decodeB64("JI"); |
| Assert.assertEquals(1234, val1234); |
| |
| long val10000 = LongEncoding.decodeB64("2SG"); |
| Assert.assertEquals(10000, val10000); |
| |
| long val12345 = LongEncoding.decodeB64("30u"); |
| Assert.assertEquals(12345, val12345); |
| |
| long val22345 = LongEncoding.decodeB64("5T9"); |
| Assert.assertEquals(22345, val22345); |
| |
| long val92345 = LongEncoding.decodeB64("MYu"); |
| Assert.assertEquals(92345, val92345); |
| |
| long val12345678 = LongEncoding.decodeB64("k65E"); |
| Assert.assertEquals(12345678, val12345678); |
| |
| long val112345678 = LongEncoding.decodeB64("6h_9E"); |
| Assert.assertEquals(112345678, val112345678); |
| |
| long valIntMax = LongEncoding.decodeB64("1~~~~~"); |
| Assert.assertEquals(Integer.MAX_VALUE, valIntMax); |
| |
| long valLongMax = LongEncoding.decodeB64("7~~~~~~~~~~"); |
| Assert.assertEquals(Long.MAX_VALUE, valLongMax); |
| } |
| |
| @Test |
| public void testDecodeWithError() { |
| Assert.assertThrows(IllegalArgumentException.class, () -> { |
| LongEncoding.decode("1", ""); |
| }, e -> { |
| Assert.assertEquals("The symbols parameter can't be empty", |
| e.getMessage()); |
| }); |
| |
| Assert.assertThrows(IllegalArgumentException.class, () -> { |
| LongEncoding.decode("1a", "0123456789"); |
| }, e -> { |
| Assert.assertEquals("Can't decode symbol 'a' in string '1a'", |
| e.getMessage()); |
| }); |
| } |
| |
| @Test |
| public void testEncodeSignedB64() { |
| String val1234 = LongEncoding.encodeSignedB64(1234); |
| Assert.assertEquals("JI", val1234); |
| |
| String val23 = LongEncoding.encodeSignedB64(23); |
| Assert.assertEquals("N", val23); |
| |
| String valIntMax = LongEncoding.encodeSignedB64(Integer.MAX_VALUE); |
| Assert.assertEquals("1~~~~~", valIntMax); |
| |
| String valLongMax = LongEncoding.encodeSignedB64(Long.MAX_VALUE); |
| Assert.assertEquals("7~~~~~~~~~~", valLongMax); |
| |
| String val0 = LongEncoding.encodeSignedB64(0); |
| Assert.assertEquals("0", val0); |
| |
| String valNeg1 = LongEncoding.encodeSignedB64(-1); |
| Assert.assertEquals("-1", valNeg1); |
| |
| String valIntMinP1 = LongEncoding.encodeSignedB64(Integer.MIN_VALUE + |
| 1L); |
| Assert.assertEquals("-1~~~~~", valIntMinP1); |
| |
| String valIntMin = LongEncoding.encodeSignedB64(Integer.MIN_VALUE); |
| Assert.assertEquals("-200000", valIntMin); |
| |
| String valLongMinPlus1 = LongEncoding.encodeSignedB64(Long.MIN_VALUE + |
| 1L); |
| Assert.assertEquals("-7~~~~~~~~~~", valLongMinPlus1); |
| |
| String valLongMin = LongEncoding.encodeSignedB64(Long.MIN_VALUE); |
| Assert.assertEquals("-80000000000", valLongMin); |
| } |
| |
| @Test |
| public void testDecodeSignedB64() { |
| long val1234 = LongEncoding.decodeSignedB64("JI"); |
| Assert.assertEquals(1234, val1234); |
| |
| long val23 = LongEncoding.decodeSignedB64("N"); |
| Assert.assertEquals(23, val23); |
| |
| long valIntMax = LongEncoding.decodeSignedB64("1~~~~~"); |
| Assert.assertEquals(Integer.MAX_VALUE, valIntMax); |
| |
| long valLongMax = LongEncoding.decodeSignedB64("7~~~~~~~~~~"); |
| Assert.assertEquals(Long.MAX_VALUE, valLongMax); |
| |
| long val0 = LongEncoding.decodeSignedB64("0"); |
| Assert.assertEquals(0, val0); |
| |
| long valn1 = LongEncoding.decodeSignedB64("-1"); |
| Assert.assertEquals(-1, valn1); |
| |
| long valIntMinPlus1 = LongEncoding.decodeSignedB64("-1~~~~~"); |
| Assert.assertEquals(Integer.MIN_VALUE + 1L, valIntMinPlus1); |
| |
| long valIntMin = LongEncoding.decodeSignedB64("-200000"); |
| Assert.assertEquals(Integer.MIN_VALUE, valIntMin); |
| |
| long valLongMinPlus1 = LongEncoding.decodeSignedB64("-7~~~~~~~~~~"); |
| Assert.assertEquals(Long.MIN_VALUE + 1L, valLongMinPlus1); |
| |
| long valLongMin = LongEncoding.decodeSignedB64("-80000000000"); |
| Assert.assertEquals(Long.MIN_VALUE, valLongMin); |
| } |
| |
| @Test |
| public void testDecodeSignedB64Overflow() { |
| long valOverflow = LongEncoding.decodeSignedB64("80000000000"); |
| Assert.assertEquals(Long.MIN_VALUE, valOverflow); |
| |
| long valOverflow2 = LongEncoding.decodeSignedB64("80000000001"); |
| Assert.assertEquals(Long.MIN_VALUE + 1L, valOverflow2); |
| |
| long valOverflow3 = LongEncoding.decodeSignedB64("800000000001"); |
| Assert.assertEquals(1L, valOverflow3); |
| |
| long valOverflow4 = LongEncoding.decodeSignedB64("80000000000JI"); |
| Assert.assertEquals(1234L, valOverflow4); |
| |
| long valOverflow5 = LongEncoding.decodeSignedB64("80000000000N"); |
| Assert.assertEquals(23L, valOverflow5); |
| |
| long valOverflow6 = LongEncoding.decodeSignedB64("80000000000" + |
| "7~~~~~~~~~~"); |
| Assert.assertEquals(Long.MAX_VALUE, valOverflow6); |
| } |
| |
| @Test |
| public void testEncodeSortable() { |
| String val1234 = LongEncoding.encodeSortable(1234); |
| Assert.assertEquals("2JI", val1234); |
| |
| String val23 = LongEncoding.encodeSortable(23); |
| Assert.assertEquals("1N", val23); |
| |
| String valIntMax = LongEncoding.encodeSortable(Integer.MAX_VALUE); |
| Assert.assertEquals("61~~~~~", valIntMax); |
| |
| String valLongMax = LongEncoding.encodeSortable(Long.MAX_VALUE); |
| Assert.assertEquals("B7~~~~~~~~~~", valLongMax); |
| |
| String val0 = LongEncoding.encodeSortable(0); |
| Assert.assertEquals("10", val0); |
| |
| String valNeg1 = LongEncoding.encodeSortable(-1); |
| Assert.assertEquals("0B7~~~~~~~~~~", valNeg1); |
| |
| String valIntMin = LongEncoding.encodeSortable(Integer.MIN_VALUE); |
| Assert.assertEquals("0B7~~~~z00000", valIntMin); |
| |
| String valLongMin = LongEncoding.encodeSortable(Long.MIN_VALUE); |
| Assert.assertEquals("010", valLongMin); |
| } |
| |
| @Test |
| public void testDecodeSortable() { |
| long val1234 = LongEncoding.decodeSortable("2JI"); |
| Assert.assertEquals(1234, val1234); |
| |
| long val23 = LongEncoding.decodeSortable("1N"); |
| Assert.assertEquals(23, val23); |
| |
| long valIntMax = LongEncoding.decodeSortable("61~~~~~"); |
| Assert.assertEquals(Integer.MAX_VALUE, valIntMax); |
| |
| long valLongMax = LongEncoding.decodeSortable("B7~~~~~~~~~~"); |
| Assert.assertEquals(Long.MAX_VALUE, valLongMax); |
| |
| long val0 = LongEncoding.decodeSortable("10"); |
| Assert.assertEquals(0, val0); |
| |
| long valn1 = LongEncoding.decodeSortable("0B7~~~~~~~~~~"); |
| Assert.assertEquals(-1, valn1); |
| |
| long valIntMin = LongEncoding.decodeSortable("0B7~~~~z00000"); |
| Assert.assertEquals(Integer.MIN_VALUE, valIntMin); |
| |
| long valLongMin = LongEncoding.decodeSortable("010"); |
| Assert.assertEquals(Long.MIN_VALUE, valLongMin); |
| } |
| |
| @Test |
| public void testDecodeIllegalSortable() { |
| // Length is 1, actual length is 0 |
| Assert.assertThrows(IllegalArgumentException.class, () -> { |
| LongEncoding.decodeSortable("1"); |
| }); |
| |
| // Length is 1, actual length is 2 |
| Assert.assertThrows(IllegalArgumentException.class, () -> { |
| LongEncoding.decodeSortable("123"); |
| }); |
| |
| // Length is 1, actual length is 0 |
| Assert.assertThrows(IllegalArgumentException.class, () -> { |
| LongEncoding.decodeSortable("01"); |
| }); |
| |
| // Length is 1, actual length is 2 |
| Assert.assertThrows(IllegalArgumentException.class, () -> { |
| LongEncoding.decodeSortable("0123"); |
| }); |
| } |
| |
| @Test |
| public void testEncodeNumber() throws ParseException { |
| String l1234 = LongEncoding.encodeNumber(1234); |
| Assert.assertEquals("2JI", l1234); |
| |
| String d1234 = LongEncoding.encodeNumber(1.234); |
| Assert.assertEquals("B3~okcR8i3aO", d1234); |
| |
| String d21 = LongEncoding.encodeNumber(2.1); |
| Assert.assertEquals("B400oCoCoCoD", d21); |
| |
| String dpi = LongEncoding.encodeNumber(3.1415926); |
| Assert.assertEquals("B4098ViD4iXA", dpi); |
| |
| String fpi = LongEncoding.encodeNumber(3.1415926f); |
| Assert.assertEquals("610IG~Q", fpi); |
| |
| String fn1 = LongEncoding.encodeNumber(-1.0f); |
| Assert.assertEquals("0B7~~~~~0V~~~", fn1); |
| |
| String bMax = LongEncoding.encodeNumber(Byte.MAX_VALUE); |
| Assert.assertEquals("21~", bMax); |
| |
| String bMin = LongEncoding.encodeNumber(Byte.MIN_VALUE); |
| Assert.assertEquals("0B7~~~~~~~~z0", bMin); |
| |
| String sMax = LongEncoding.encodeNumber(Short.MAX_VALUE); |
| Assert.assertEquals("37~~", sMax); |
| |
| String sMin = LongEncoding.encodeNumber(Short.MIN_VALUE); |
| Assert.assertEquals("0B7~~~~~~~t00", sMin); |
| |
| String iMax = LongEncoding.encodeNumber(Integer.MAX_VALUE); |
| Assert.assertEquals("61~~~~~", iMax); |
| |
| String iMin = LongEncoding.encodeNumber(Integer.MIN_VALUE); |
| Assert.assertEquals("0B7~~~~z00000", iMin); |
| |
| String lMax = LongEncoding.encodeNumber(Long.MAX_VALUE); |
| Assert.assertEquals("B7~~~~~~~~~~", lMax); |
| |
| String lMin = LongEncoding.encodeNumber(Long.MIN_VALUE); |
| Assert.assertEquals("010", lMin); |
| |
| String fMax = LongEncoding.encodeNumber(Float.MAX_VALUE); |
| Assert.assertEquals("61~V~~~", fMax); |
| |
| String fMin = LongEncoding.encodeNumber(Float.MIN_VALUE); |
| Assert.assertEquals("11", fMin); |
| |
| String dMax = LongEncoding.encodeNumber(Double.MAX_VALUE); |
| Assert.assertEquals("B7~k~~~~~~~~", dMax); |
| |
| String dMin = LongEncoding.encodeNumber(Double.MIN_VALUE); |
| Assert.assertEquals("11", dMin); |
| |
| String bdLong = LongEncoding.encodeNumber(new BigDecimal("1234")); |
| Assert.assertEquals("2JI", bdLong); |
| |
| String bdFLong = LongEncoding.encodeNumber(new BigDecimal("1234.00")); |
| Assert.assertEquals("2JI", bdFLong); |
| |
| String bdDouble = LongEncoding.encodeNumber(new BigDecimal("1.234")); |
| Assert.assertEquals("B3~okcR8i3aO", bdDouble); |
| |
| SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); |
| dateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); |
| Date time = dateFormat.parse("2018-12-18"); |
| String date = LongEncoding.encodeNumber(time); |
| Assert.assertEquals("7MUxuK00", date); |
| } |
| |
| @Test |
| public void testDecodeNumber() { |
| Number l1234 = LongEncoding.decodeNumber("2JI", Long.class); |
| Assert.assertEquals(1234L, l1234); |
| |
| Number d1234 = LongEncoding.decodeNumber("B3~okcR8i3aO", Double.class); |
| Assert.assertEquals(1.234, d1234); |
| |
| Number d21 = LongEncoding.decodeNumber("B400oCoCoCoD", Double.class); |
| Assert.assertEquals(2.1, d21); |
| |
| Number dpi = LongEncoding.decodeNumber("B4098ViD4iXA", Double.class); |
| Assert.assertEquals(3.1415926, dpi); |
| |
| Number fpi = LongEncoding.decodeNumber("610IG~Q", Float.class); |
| Assert.assertEquals(3.1415926f, fpi); |
| |
| Number fn1 = LongEncoding.decodeNumber("0B7~~~~~0V~~~", Float.class); |
| Assert.assertEquals(-1.0f, fn1); |
| |
| Number bMax = LongEncoding.decodeNumber("21~", Byte.class); |
| Assert.assertEquals(Byte.MAX_VALUE, bMax); |
| |
| Number bMin = LongEncoding.decodeNumber("0B7~~~~~~~~z0", Byte.class); |
| Assert.assertEquals(Byte.MIN_VALUE, bMin); |
| |
| Number sMax = LongEncoding.decodeNumber("37~~", Short.class); |
| Assert.assertEquals(Short.MAX_VALUE, sMax); |
| |
| Number sMin = LongEncoding.decodeNumber("0B7~~~~~~~t00", Short.class); |
| Assert.assertEquals(Short.MIN_VALUE, sMin); |
| |
| Number iMax = LongEncoding.decodeNumber("61~~~~~", Integer.class); |
| Assert.assertEquals(Integer.MAX_VALUE, iMax); |
| |
| Number iMin = LongEncoding.decodeNumber("0B7~~~~z00000", Integer.class); |
| Assert.assertEquals(Integer.MIN_VALUE, iMin); |
| |
| Number lMax = LongEncoding.decodeNumber("B7~~~~~~~~~~", Long.class); |
| Assert.assertEquals(Long.MAX_VALUE, lMax); |
| |
| Number lMin = LongEncoding.decodeNumber("010", Long.class); |
| Assert.assertEquals(Long.MIN_VALUE, lMin); |
| |
| Number fMax = LongEncoding.decodeNumber("61~V~~~", Float.class); |
| Assert.assertEquals(Float.MAX_VALUE, fMax); |
| |
| Number fMin = LongEncoding.decodeNumber("11", Float.class); |
| Assert.assertEquals(Float.MIN_VALUE, fMin); |
| |
| Number dMax = LongEncoding.decodeNumber("B7~k~~~~~~~~", Double.class); |
| Assert.assertEquals(Double.MAX_VALUE, dMax); |
| |
| Number dMin = LongEncoding.decodeNumber("11", Double.class); |
| Assert.assertEquals(Double.MIN_VALUE, dMin); |
| } |
| |
| @Test |
| public void testEncodeSortableThenCompare() { |
| int count = 100000; |
| Random random1 = new Random(); |
| Random random2 = new Random(); |
| for (int i = 0; i < count; i++) { |
| long num1 = random1.nextLong(); |
| long num2 = random2.nextLong(); |
| |
| String encoded1 = LongEncoding.encodeSortable(num1); |
| String encoded2 = LongEncoding.encodeSortable(num2); |
| int cmp = Bytes.compare(encoded1.getBytes(), encoded2.getBytes()); |
| |
| if (num1 == num2) { |
| Assert.assertTrue(cmp == 0); |
| } else if (num1 > num2) { |
| Assert.assertTrue(cmp > 0); |
| } else { |
| assert num1 < num2; |
| Assert.assertTrue(cmp < 0); |
| } |
| } |
| } |
| |
| @Test |
| public void testEncodeNumberThenCompare() { |
| int count = 100000; |
| Random random1 = new Random(); |
| Random random2 = new Random(); |
| |
| for (int i = 0; i < count; i++) { |
| compareEncodedNumber(random1.nextInt(), random2.nextInt()); |
| } |
| for (int i = 0; i < count; i++) { |
| compareEncodedNumber(random1.nextLong(), random2.nextLong()); |
| } |
| |
| for (int i = 0; i < count; i++) { |
| compareEncodedNumber(random1.nextInt(), random2.nextLong()); |
| } |
| for (int i = 0; i < count; i++) { |
| compareEncodedNumber(random1.nextLong(), random2.nextInt()); |
| } |
| |
| for (int i = 0; i < count; i++) { |
| compareEncodedNumber(random1.nextFloat(), random2.nextFloat()); |
| } |
| for (int i = 0; i < count; i++) { |
| compareEncodedNumber(random1.nextDouble(), random2.nextDouble()); |
| } |
| } |
| |
| private static void compareEncodedNumber(Number num1, Number num2) { |
| int cmpExpected = NumericUtil.compareNumber(num1, num2); |
| |
| String encoded1 = LongEncoding.encodeNumber(num1); |
| String encoded2 = LongEncoding.encodeNumber(num2); |
| int cmp = Bytes.compare(encoded1.getBytes(), encoded2.getBytes()); |
| |
| if (cmpExpected == 0) { |
| Assert.assertTrue(cmp == 0); |
| } else if (cmpExpected > 0) { |
| Assert.assertTrue(cmp > 0); |
| } else { |
| assert cmpExpected < 0; |
| Assert.assertTrue(cmp < 0); |
| } |
| } |
| } |