package com.after_sunrise.oss.otdb.je.binding; import static org.junit.Assert.assertEquals; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import org.junit.Test; import com.sleepycat.bind.tuple.TupleInput; import com.sleepycat.bind.tuple.TupleOutput; /** * @author takanori.takase */ public class TupleBindingUtilsTest { @Test public void testLargeScale() { // scale 16 BigDecimal value = new BigDecimal("+0.1234567890123456"); // Write TupleOutput out = new TupleOutput(); TupleBindingUtils.write(out, value); byte[] bytes = out.toByteArray(); // Read TupleInput in = new TupleInput(bytes); BigDecimal result = TupleBindingUtils.read(in); assertEquals(value, result); assertEquals(10, bytes.length); } @Test public void testLargeValue() { // Long.MAX_VALUE (9223372036854775807) + 1L BigDecimal value = new BigDecimal("9223372036854775808"); // Write TupleOutput out = new TupleOutput(); TupleBindingUtils.write(out, value); byte[] bytes = out.toByteArray(); // Read TupleInput in = new TupleInput(bytes); BigDecimal result = TupleBindingUtils.read(in); assertEquals(value, result); assertEquals(12, bytes.length); } @Test public void testLargeValue2() { // Long.MIN_VALUE == Long.MAX_VALUE + 1 * -1 BigDecimal value = new BigDecimal(Long.MIN_VALUE); // Write TupleOutput out = new TupleOutput(); TupleBindingUtils.write(out, value); byte[] bytes = out.toByteArray(); // Read TupleInput in = new TupleInput(bytes); BigDecimal result = TupleBindingUtils.read(in); assertEquals(value, result); assertEquals(11, bytes.length); } @Test public void testLargeScaledValue() { // Long.MAX_VALUE (9223372036854775807) + 1L with scale 16 BigDecimal value = new BigDecimal( "9223372036854775808.1234567890123456"); // Write TupleOutput out = new TupleOutput(); TupleBindingUtils.write(out, value); byte[] bytes = out.toByteArray(); // Read TupleInput in = new TupleInput(bytes); BigDecimal result = TupleBindingUtils.read(in); assertEquals(value, result); assertEquals(18, bytes.length); } @Test public void testSingleByte() { List<BigDecimal> list = new ArrayList<>(); list.add(new BigDecimal(Byte.MAX_VALUE)); list.add(new BigDecimal("1")); list.add(new BigDecimal("0")); list.add(new BigDecimal("-1")); list.add(new BigDecimal("-7")); for (BigDecimal value : list) { // Write TupleOutput out = new TupleOutput(); TupleBindingUtils.write(out, value); byte[] bytes = out.toByteArray(); // Read TupleInput in = new TupleInput(bytes); BigDecimal result = TupleBindingUtils.read(in); assertEquals(value, result); assertEquals(value.toPlainString(), 1, bytes.length); } } @Test public void testDoubleByte() { List<BigDecimal> list = new ArrayList<>(); list.add(new BigDecimal("-8")); list.add(new BigDecimal(Byte.MIN_VALUE)); list.add(new BigDecimal("0.0")); list.add(new BigDecimal("+1.1")); list.add(new BigDecimal("-1.2")); list.add(new BigDecimal("+1.3")); list.add(new BigDecimal("-7.4")); list.add(new BigDecimal("1.27")); list.add(new BigDecimal("12.7")); list.add(new BigDecimal("0.0000127")); for (BigDecimal value : list) { // Write TupleOutput out = new TupleOutput(); TupleBindingUtils.write(out, value); byte[] bytes = out.toByteArray(); // Read TupleInput in = new TupleInput(bytes); BigDecimal result = TupleBindingUtils.read(in); assertEquals(value, result); assertEquals(value.toPlainString(), 2, bytes.length); } } @Test public void testTripleByte() { List<BigDecimal> list = new ArrayList<>(); list.add(new BigDecimal("-129")); list.add(new BigDecimal("+128")); list.add(new BigDecimal(Short.MIN_VALUE)); list.add(new BigDecimal(Short.MAX_VALUE)); for (BigDecimal value : list) { // Write TupleOutput out = new TupleOutput(); TupleBindingUtils.write(out, value); byte[] bytes = out.toByteArray(); // Read TupleInput in = new TupleInput(bytes); BigDecimal result = TupleBindingUtils.read(in); assertEquals(value, result); assertEquals(value.toPlainString(), 3, bytes.length); } } @Test public void testNumbers() { List<BigDecimal> list = new ArrayList<>(); BigDecimal ones = BigDecimal.ONE; for (int i = 1; i <= 20; i++) { ones = ones.movePointLeft(1).add(BigDecimal.ONE); // 1.111111... list.add(ones); // 0.00...01 list.add(BigDecimal.ONE.movePointLeft(i)); // 1.00...01 list.add(BigDecimal.ONE.movePointLeft(i).add(BigDecimal.ONE)); } for (BigDecimal value : list) { // Write TupleOutput out = new TupleOutput(); TupleBindingUtils.write(out, value); byte[] bytes = out.toByteArray(); // Read TupleInput in = new TupleInput(bytes); BigDecimal result = TupleBindingUtils.read(in); assertEquals(value, result); // System.out.println(value.toPlainString() + " : " + bytes.length); } } }