/** * Copyright 2005-2012 Akiban Technologies, Inc. * * 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.persistit.unit; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.Serializable; import java.lang.reflect.Array; import java.math.BigDecimal; import java.math.BigInteger; import java.util.ArrayList; import java.util.Date; import java.util.TreeMap; import org.junit.Test; import com.persistit.PersistitUnitTestCase; import com.persistit.Value; import com.persistit.util.Util; public class ValueTest1 extends PersistitUnitTestCase { private static class S implements Serializable { /** * */ private static final long serialVersionUID = 1L; } @Test public void test1() { System.out.print("test1 "); final Value value = new Value(_persistit); value.put(1); assertEquals(value.getType(), int.class); assertEquals(value.getInt(), 1); assertEquals(value.get(), new Integer(1)); value.put("foobar"); assertEquals(value.getType(), String.class); assertEquals(value.getString(), "foobar"); assertEquals(value.get(), "foobar"); final StringBuilder sb = new StringBuilder(); value.getString(sb); assertEquals(sb.toString(), "foobar"); value.put(new byte[] { 1, 2, 3, 4, 5 }); assertEquals(value.getType(), byte[].class); assertTrue(equals(value.get(), new byte[] { 1, 2, 3, 4, 5 })); assertTrue(equals(value.getByteArray(), new byte[] { 1, 2, 3, 4, 5 })); final byte[] target = new byte[2]; value.getByteArray(target, 2, 0, 3); assertTrue(equals(target, new byte[] { 3, 4 })); System.out.println("- done"); } @Test public void test2() { System.out.print("test2 "); final Value value = new Value(_persistit); value.setStreamMode(true); value.putString("abc"); value.putString("abcdefghijklmnopqrstuvxwyz"); value.putString("abcdefghijklmnopqrstuvxwyz0123456789"); value.put(new byte[1000]); value.put(1.234F); value.put(1.23456D); value.setStreamMode(true); final String a = value.getString(); final String b = (String) value.get(); final String c = value.getString(); final byte[] d = (byte[]) value.get(); final Float e = (Float) value.get(); final Double f = (Double) value.get(); assertEquals(a, "abc"); assertEquals(b, "abcdefghijklmnopqrstuvxwyz"); assertEquals(c, "abcdefghijklmnopqrstuvxwyz0123456789"); assertTrue(equals(d, new byte[1000])); assertEquals(e, new Float(1.234F)); assertEquals(f, new Double(1.23456D)); System.out.println("- done"); } @Test public void test3() { System.out.print("test3 "); final Value value = new Value(_persistit); value.setStreamMode(true); final byte[] b1 = { -3, -2, -1, 0, 1, 2, 3 }; final short[] s1 = { 1, 2, 3, -1, -2, -3 }; final char[] c1 = { 1, 2, 3, 65533, 65534, 65535 }; final int[] i1 = { Integer.MIN_VALUE, -2, -1, 0, 1, 2, Integer.MAX_VALUE }; final boolean[] bo1 = new boolean[] { true, true, false, true, false, false }; final float[] f1 = { 1.1F, 1.2F, 1.3F, -1.1F, -1.2F, -1.3F }; final double[] d1 = { 1.1, 1.2, 1.3, -1.1, -1.2, -1.3 }; value.put(bo1); value.put(b1); value.put(s1); value.put(c1); value.put(i1); value.put(f1); value.put(d1); value.setStreamMode(true); final boolean[] bo2 = (boolean[]) value.get(); final byte[] b2 = (byte[]) value.get(); final short[] s2 = (short[]) value.get(); final char[] c2 = (char[]) value.get(); final int[] i2 = (int[]) value.get(); final float[] f2 = (float[]) value.get(); final double[] d2 = (double[]) value.get(); assertTrue(equals(bo1, bo2)); assertTrue(equals(b1, b2)); assertTrue(equals(s1, s2)); assertTrue(equals(c1, c2)); assertTrue(equals(i1, i2)); assertTrue(equals(f1, f2)); assertTrue(equals(d1, d2)); System.out.println("- done"); } @Test public void test4() { System.out.print("test4 "); final Value value = new Value(_persistit); final TreeMap map1 = new TreeMap(); map1.put("a", "A"); map1.put("b", "B"); map1.put("c", "C"); for (int index = 0; index < 1000; index++) { map1.put("x", new Integer(index)); value.put(map1); final TreeMap map2 = (TreeMap) value.get(); assertEquals(map1, map2); } System.out.println("- done"); } @Test public void test5() { System.out.print("test5 "); final Value value = new Value(_persistit); final String[] sa1 = { "a", "bb", "ccc", "dddd", "eeeee" }; value.put(sa1); assertEquals(sa1.getClass(), value.getType()); // repeat to test array class cache. assertEquals(sa1.getClass(), value.getType()); assertEquals(sa1.getClass(), value.getType()); final String[] sa2 = (String[]) value.get(); final String[] sa2a = (String[]) value.getArray(); assertTrue(equals(sa2, sa1)); assertTrue(equals(sa2a, sa1)); System.out.println("- done"); } @Test public void test6() { System.out.print("test6 "); final Value value = new Value(_persistit); final byte[][] ba1 = { { 1, 2, 3 }, { -4, -5, -6 }, null, { 7, 8, 9, 10, 11, 12 } }; value.put(ba1); final byte[][] ba2 = (byte[][]) value.get(); assertEquals(ba1.getClass(), value.getType()); assertTrue(equals(ba1, ba2)); final byte[][][] bb1 = new byte[][][] { ba1, ba1 }; value.put(bb1); final byte[][][] bb2 = (byte[][][]) value.getArray(); assertTrue(equals(bb1, bb2)); System.out.println("- done"); } @Test public void test7() { System.out.print("test7 "); final Value value = new Value(_persistit); final String[][] sa1 = { { "a", "bb", "ccc", "dddd", "eeeee" }, { "a", "bb", "ccc", "dddd", "eeeee" }, { "A", "BB", "CCC", "DDDD", "EEEEE", "FFFFFF" }, { "a", "bb", "ccc", "dddd", "eeeee" }, { "A", "BB", "CCC", "DDDD", "EEEEE", "GGGGGG" }, { "a", "bb", "ccc", "dddd", "eeeee" }, { "A", "BB", "CCC", "DDDD", "EEEEE", "HHHHHH" }, { "a", "bb", "ccc", "dddd", "eeeee" }, { "A", "BB", "CCC", "DDDD", "EEEEE", "IIIIII" }, { "a", "bb", "ccc", "dddd", "eeeee" }, { "A", "BB", "CCC", "DDDD", "EEEEE", "JJJJJJ" }, {} }; value.put(sa1); assertEquals(sa1.getClass(), value.getType()); final String[][] sa2 = (String[][]) value.get(); assertTrue(equals(sa2, sa1)); final String[][][] sb1 = new String[][][] { sa1, sa1 }; value.put(sb1); final String[][][] sb2 = (String[][][]) value.get(); assertTrue(equals(sb1, sb2)); assertEquals(sb1.getClass(), value.getType()); System.out.println("- done"); } @Test public void test8() { System.out.print("test8 "); final Value value = new Value(_persistit); final Date date = new Date(); value.put(date); final Date date2 = value.getDate(); assertEquals(date2, date); final BigInteger bi = new BigInteger("123456"); value.put(bi); final BigInteger bi2 = value.getBigInteger(); assertEquals(bi2, bi); final BigDecimal bd = new BigDecimal("123456.654321"); value.put(bd); final BigDecimal bd2 = value.getBigDecimal(); assertEquals(bd, bd2); final Date[] dates = new Date[] { new Date(), new Date() }; value.put(dates); final Date[] dates2 = (Date[]) value.get(); assertTrue(equals(dates2, dates)); final BigInteger[] bis = new BigInteger[] { new BigInteger("1"), new BigInteger("2"), }; value.put(bis); final BigInteger[] bis2 = (BigInteger[]) value.get(); assertTrue(equals(bis2, bis)); final Object[] objects = new Object[] { dates, bis }; value.put(objects); final Object[] objects2 = (Object[]) value.get(); assertTrue(equals(objects, objects2)); System.out.println("- done"); } @Test public void test9() { System.out.print("test9 "); final Object[] objects = new Object[8]; objects[0] = new Date(); objects[1] = new TreeMap(); objects[2] = new BigInteger("39852357023498572034958723495872349582305"); objects[3] = new BigInteger("-39852357023498572034958723495872349582305"); objects[4] = new BigDecimal("-991231.2123123123123123122349872e123"); objects[5] = new BigInteger[] { new BigInteger("-39852357023498572034958723495872349582305"), new BigInteger("3498572034958723495872349582305"), new BigInteger("1239123912392339852357023498572034958723495872349582305"), new BigInteger("44"), }; objects[6] = new BigDecimal[] { new BigDecimal("3.14159265"), new BigDecimal("0"), new BigDecimal("-9999999999999999999999999999999999.999999e999") }; objects[7] = "The End"; final Value value = new Value(_persistit); value.put(objects); final Object objects2 = value.get(); assertTrue(equals(objects2, objects)); System.out.println("- done"); } @Test public void test10() { System.out.print("test10 "); final ArrayList list = new ArrayList(); list.add(new Boolean(false)); list.add(new Boolean(true)); list.add(null); list.add(new Byte((byte) 1)); list.add(new Short((short) 2)); list.add(new Character((char) 3)); list.add(new Integer(4)); list.add(new Long(5)); list.add(new Float(6.0f)); list.add(new Double(7.0d)); list.add(new Byte((byte) -1)); list.add(new Short((short) -2)); list.add(new Character((char) -3)); list.add(new Integer(-4)); list.add(new Long(-5)); list.add(new Float(-6.0f)); list.add(new Double(-7.0d)); list.add(new String("Eight")); list.add(new Date()); list.add(BigInteger.valueOf(9)); list.add(BigDecimal.valueOf(10)); list.add(new Object[] { new S(), new S(), new S() }); list.add(new Object[][] { new Object[] { new S(), new S(), new S() } }); final Value value = new Value(_persistit); final Object[] objects1 = list.toArray(); value.put(objects1); final Object[] objects2 = (Object[]) value.get(); assertTrue(equals(objects2, objects2)); System.out.println("- done"); } @Test public void nonAsciiStrings() { final String[] TEST_STRS = { STR_LOW_CHARS, STR_AVG_CHARS, STR_MED_CHARS, STR_HIGH_CHARS }; final Value value = new Value(_persistit); for (final String expected : TEST_STRS) { value.clear(); value.put(expected); final Object actual = value.get(); assertEquals(expected, actual); } } @Test public void nonAsciiStringsStreamMode() { final String[] TEST_STRS = { STR_LOW_CHARS, STR_AVG_CHARS, STR_MED_CHARS, STR_HIGH_CHARS }; final Value value = new Value(_persistit); for (final String expected : TEST_STRS) { value.clear(); value.setStreamMode(true); value.put(expected); value.setStreamMode(true); final Object actual = value.get(); assertEquals(expected, actual); } } @Test public void nonAsciiStringsStreamModeCausingGrowth() { final String[] TEST_STRS = { STR_MED_CHARS + STR_AVG_CHARS, STR_LOW_CHARS, STR_AVG_CHARS, STR_MED_CHARS, STR_HIGH_CHARS, }; for (final String expected : TEST_STRS) { final Value value = new Value(_persistit, expected.length() + 1); value.clear(); value.setStreamMode(true); value.put(expected); value.setStreamMode(true); final Object actual = value.get(); assertEquals(expected, actual); } } @Test public void streamModePutStringCausesGrowth() { // Byte size in value is 3*string.length()+1 final String TEST_STR = STR_HIGH_CHARS + STR_HIGH_CHARS + STR_HIGH_CHARS; final Value value = new Value(_persistit, TEST_STR.length() + 5); value.clear(); value.setStreamMode(true); value.put(TEST_STR); value.setStreamMode(true); final Object decoded = value.get(); assertEquals(TEST_STR, decoded); } @Test public void nonAsciiCharSequenceStreamModeCausingGrowth() { final String[] TEST_STRS = { STR_MED_CHARS + STR_AVG_CHARS, STR_LOW_CHARS, STR_AVG_CHARS, STR_MED_CHARS, STR_HIGH_CHARS, }; for (final String expectedStr : TEST_STRS) { final CharSequence expected = expectedStr; final Value value = new Value(_persistit, expected.length() + 1); value.clear(); value.setStreamMode(true); value.putString(expected); value.setStreamMode(true); final Object actual = value.get(); assertEquals(expected.toString(), actual.toString()); } } public boolean equals(final Object a, final Object b) { if ((a == null) || (b == null)) { return a == b; } if (a.getClass().isArray()) { if (!b.getClass().isArray()) { return false; } if (a.getClass().getComponentType() != b.getClass().getComponentType()) { return false; } if (Array.getLength(a) != Array.getLength(b)) { return false; } for (int index = Array.getLength(a); --index >= 0;) { if (!equals(Array.get(a, index), Array.get(b, index))) { return false; } } return true; } else if (a.getClass().isPrimitive()) { return a == b; } else { return a.equals(b); } } public static void main(final String[] args) throws Exception { new ValueTest1().initAndRunTest(); } @Override public void runAllTests() throws Exception { test1(); test2(); test3(); test4(); test5(); test6(); test7(); test8(); test9(); test10(); } private String floatBits(final float v) { final int bits = Float.floatToIntBits(v); final StringBuilder sb = new StringBuilder(); Util.hex(sb, bits, 8); return sb.toString(); } private String doubleBits(final double v) { final long bits = Double.doubleToLongBits(v); final StringBuilder sb = new StringBuilder(); Util.hex(sb, bits, 16); return sb.toString(); } private void debug(final boolean condition) { if (!condition) { return; } return; // <-- breakpoint here } /** Small/control, values c <= 0x1F **/ private final static String STR_LOW_CHARS = "\u0000\u0001\u0009\u0015\u001F"; /** Printable ASCII, values 0x20 <= c <= 0x7F **/ private final static String STR_AVG_CHARS = " 1Az}"; /** Wide characters, values 0x7F <= c <= 0x7FF **/ private final static String STR_MED_CHARS = "\u03A3\u03A4\u03A6\u03A8\u03A9"; // sigma, // tau, // phi, // psi, // omega /** Wide characters, values c > 0x7FF **/ private final static String STR_HIGH_CHARS = "\u2654\u2655\u2656\u2657\u2658"; // king, // queen, // rook, // bishop, // knight }