/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.test.unit;
import java.io.File;
import java.math.BigInteger;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.Random;
import org.h2.test.TestBase;
import org.h2.util.Utils;
/**
* Tests reflection utilities.
*/
public class TestUtils extends TestBase {
/**
* Dummy field
*/
public final String testField = "abc";
/**
* Run just this test.
*
* @param a ignored
*/
public static void main(String... a) throws Exception {
TestBase.createCaller().init().test();
}
public void test() throws Exception {
testWriteReadLong();
testGetNonPrimitiveClass();
testGetNonPrimitiveClass();
testGetNonPrimitiveClass();
testReflectionUtils();
}
private void testWriteReadLong() {
byte[] buff = new byte[8];
for (long x : new long[]{Long.MIN_VALUE, Long.MAX_VALUE, 0, 1, -1,
Integer.MIN_VALUE, Integer.MAX_VALUE}) {
Utils.writeLong(buff, 0, x);
long y = Utils.readLong(buff, 0);
assertEquals(x, y);
}
Random r = new Random(1);
for (int i = 0; i < 1000; i++) {
long x = r.nextLong();
Utils.writeLong(buff, 0, x);
long y = Utils.readLong(buff, 0);
assertEquals(x, y);
}
}
private void testGetNonPrimitiveClass() throws Exception {
testGetNonPrimitiveClass(BigInteger.class, BigInteger.class);
testGetNonPrimitiveClass(Boolean.class, boolean.class);
testGetNonPrimitiveClass(Byte.class, byte.class);
testGetNonPrimitiveClass(Character.class, char.class);
testGetNonPrimitiveClass(Byte.class, byte.class);
testGetNonPrimitiveClass(Double.class, double.class);
testGetNonPrimitiveClass(Float.class, float.class);
testGetNonPrimitiveClass(Integer.class, int.class);
testGetNonPrimitiveClass(Long.class, long.class);
testGetNonPrimitiveClass(Short.class, short.class);
testGetNonPrimitiveClass(Void.class, void.class);
}
private void testGetNonPrimitiveClass(Class<?> expected, Class<?> p) {
assertEquals(expected.getName(), Utils.getNonPrimitiveClass(p).getName());
}
private void testReflectionUtils() throws Exception {
// Static method call
long currentTimeMillis1 = System.currentTimeMillis();
long currentTimeMillis2 = (Long) Utils.callStaticMethod("java.lang.System.currentTimeMillis");
assertTrue(currentTimeMillis1 <= currentTimeMillis2);
// New Instance
Object instance = Utils.newInstance("java.lang.StringBuilder");
// New Instance with int parameter
instance = Utils.newInstance("java.lang.StringBuilder", 10);
// StringBuilder.append or length don't work on JDK 5 due to
// http://bugs.sun.com/view_bug.do?bug_id=4283544
instance = Utils.newInstance("java.lang.Integer", 10);
// Instance methods
long x = (Long) Utils.callMethod(instance, "longValue");
assertEquals(10, x);
// Static fields
String pathSeparator = (String) Utils.getStaticField("java.io.File.pathSeparator");
assertEquals(File.pathSeparator, pathSeparator);
// Instance fields
String test = (String) Utils.getField(this, "testField");
assertEquals(this.testField, test);
// Class present?
assertFalse(Utils.isClassPresent("abc"));
assertTrue(Utils.isClassPresent(getClass().getName()));
Utils.callStaticMethod("java.lang.String.valueOf", "a");
Utils.callStaticMethod("java.awt.AWTKeyStroke.getAWTKeyStroke",
'x', java.awt.event.InputEvent.SHIFT_DOWN_MASK);
// Common comparable superclass
assertFalse(Utils.haveCommonComparableSuperclass(Integer.class, Long.class));
assertTrue(Utils.haveCommonComparableSuperclass(Integer.class, Integer.class));
assertTrue(Utils.haveCommonComparableSuperclass(Timestamp.class, Date.class));
assertFalse(Utils.haveCommonComparableSuperclass(ArrayList.class, Long.class));
assertFalse(Utils.haveCommonComparableSuperclass(Integer.class, ArrayList.class));
}
}