package org.araqne.logdb;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.UnknownHostException;
import java.util.Calendar;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
public class ObjectComparatorTest {
private static Comparator<Object> cmp;
private static Object NULL1;
private static Object NULL2;
private static Boolean BOOL1;
private static Boolean BOOL2;
private static Short SHORT1;
private static Integer INT1;
private static Long LONG1;
private static Float FLOAT1;
private static Double DOUBLE1;
private static Short SHORT2;
private static Integer INT2;
private static Long LONG2;
private static Float FLOAT2;
private static Double DOUBLE2;
private static Date DATE1;
private static Date DATE2;
private static Inet4Address IPV4_1;
private static Inet4Address IPV4_2;
private static Inet6Address IPV6_1;
private static Inet6Address IPV6_2;
private static String STRING1;
private static String STRING2;
private static Object APPLE;
private static Object BANANA;
private static Object PEAR;
private static Object TIGER1;
private static Object TIGER2;
private Object[] ARRAY;
private Map<Object, Object> MAP;
private byte[] BLOB;
@Before
public void before() throws UnknownHostException {
cmp = new ObjectComparator();
NULL1 = null;
NULL2 = null;
BOOL1 = false;
BOOL2 = true;
SHORT1 = 0;
SHORT2 = 1;
INT1 = 0;
INT2 = 1;
LONG1 = (long) 0;
LONG2 = (long) 1;
FLOAT1 = 0.0f;
FLOAT2 = 1.0f;
DOUBLE1 = 0.0d;
DOUBLE2 = 1.0d;
Calendar cal = Calendar.getInstance();
DATE2 = cal.getTime();
// diff should be larger than 25 days because
// when 25 days converted to millisec, it's becomes larger than INT_MAX (2160000000 > 2147483647)
cal.add(Calendar.MONTH, -1);
DATE1 = cal.getTime();
DATE1 = cal.getTime();
IPV4_1 = (Inet4Address) Inet4Address.getByAddress(new byte[] { 10, 0, 0, 1 });
IPV4_2 = (Inet4Address) Inet4Address.getByAddress(new byte[] { 10, 0, 0, 2 });
IPV6_1 = (Inet6Address) Inet6Address.getByAddress(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16 });
IPV6_2 = (Inet6Address) Inet6Address.getByAddress(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 17 });
STRING1 = "A";
STRING2 = "B";
APPLE = new Apple();
BANANA = new Banana();
PEAR = new Pear();
TIGER1 = new Tiger();
TIGER2 = new Tiger();
ARRAY = new Object[] { STRING1 };
MAP = new HashMap<Object, Object>();
BLOB = new byte[] { 1 };
}
@Test
public void numTypeTest() {
assertTrue(cmp.compare(SHORT1, SHORT2) < 0);
assertTrue(cmp.compare(SHORT2, SHORT1) > 0);
assertTrue(cmp.compare(INT1, INT2) < 0);
assertTrue(cmp.compare(INT2, INT1) > 0);
assertTrue(cmp.compare(LONG1, LONG2) < 0);
assertTrue(cmp.compare(LONG2, LONG1) > 0);
assertTrue(cmp.compare(FLOAT1, FLOAT2) < 0);
assertTrue(cmp.compare(FLOAT2, FLOAT1) > 0);
assertTrue(cmp.compare(DOUBLE1, DOUBLE2) < 0);
assertTrue(cmp.compare(DOUBLE2, DOUBLE1) > 0);
assertTrue(cmp.compare(SHORT1, INT2) < 0);
assertTrue(cmp.compare(INT2, SHORT1) > 0);
assertTrue(cmp.compare(SHORT1, LONG2) < 0);
assertTrue(cmp.compare(LONG2, SHORT1) > 0);
assertTrue(cmp.compare(SHORT1, FLOAT2) < 0);
assertTrue(cmp.compare(FLOAT2, SHORT1) > 0);
assertTrue(cmp.compare(SHORT1, DOUBLE2) < 0);
assertTrue(cmp.compare(DOUBLE2, SHORT1) > 0);
assertTrue(cmp.compare(INT1, LONG2) < 0);
assertTrue(cmp.compare(LONG2, INT1) > 0);
assertTrue(cmp.compare(INT1, FLOAT2) < 0);
assertTrue(cmp.compare(FLOAT2, INT1) > 0);
assertTrue(cmp.compare(INT1, DOUBLE2) < 0);
assertTrue(cmp.compare(DOUBLE2, INT1) > 0);
assertTrue(cmp.compare(LONG1, FLOAT2) < 0);
assertTrue(cmp.compare(FLOAT2, LONG1) > 0);
assertTrue(cmp.compare(LONG1, DOUBLE2) < 0);
assertTrue(cmp.compare(DOUBLE2, LONG1) > 0);
assertTrue(cmp.compare(FLOAT1, DOUBLE2) < 0);
assertTrue(cmp.compare(DOUBLE2, FLOAT1) > 0);
}
@Test
public void nullTypeTest() {
assertTrue(cmp.compare(NULL1, NULL2) == 0);
assertTrue(cmp.compare(NULL2, NULL1) == 0);
}
@Test
public void booleanTypeTest() {
assertTrue(cmp.compare(BOOL1, BOOL2) < 0);
assertTrue(cmp.compare(BOOL2, BOOL1) > 0);
}
@Test
public void dateTypeTest() {
assertTrue(cmp.compare(DATE1, DATE2) < 0);
assertTrue(cmp.compare(DATE2, DATE1) > 0);
}
@Test
public void ipv4TypeTest() {
assertTrue(cmp.compare(IPV4_1, IPV4_2) < 0);
assertTrue(cmp.compare(IPV4_2, IPV4_1) > 0);
}
public void ipv6TypeTest() {
assertTrue(cmp.compare(IPV6_1, IPV6_2) < 0);
assertTrue(cmp.compare(IPV6_2, IPV6_1) > 0);
}
@Test
public void stringTypeTest() {
assertTrue(cmp.compare(STRING1, STRING2) < 0);
assertTrue(cmp.compare(STRING2, STRING1) > 0);
}
@Test
public void arrayTypeTest1() {
Object[] array1 = { STRING1 };
Object[] array2 = { STRING1, INT1 };
assertTrue(cmp.compare(array1, array2) < 0);
assertTrue(cmp.compare(array2, array1) > 0);
}
@Test
public void arrayTypeTest2() {
Object[] array1 = { STRING1, INT1 };
Object[] array2 = { STRING1, INT2 };
assertTrue(cmp.compare(array1, array2) < 0);
assertTrue(cmp.compare(array2, array1) > 0);
}
@Test
public void arrayTypeTest3() {
Object[] array1 = { STRING1, INT1 };
Object[] array2 = { STRING2, INT1 };
assertTrue(cmp.compare(array1, array2) < 0);
assertTrue(cmp.compare(array2, array1) > 0);
}
@Test
public void arrayTypeTest4() {
Object[] array1 = { STRING1, INT1 };
Object[] array2 = { STRING1, INT1, INT2 };
assertTrue(cmp.compare(array1, array2) < 0);
assertTrue(cmp.compare(array2, array1) > 0);
}
@Test
public void arrayTypeTest5() {
Object[] array1 = { APPLE };
Object[] array2 = { APPLE };
assertTrue(cmp.compare(array1, array2) == 0);
assertTrue(cmp.compare(array2, array1) == 0);
}
@Test
public void arrayTypeTest6() {
Object[] array1 = { APPLE };
Object[] array2 = { BANANA };
assertTrue(cmp.compare(array1, array2) < 0);
assertTrue(cmp.compare(array2, array1) > 0);
}
@Test
public void arrayTypeTest7() {
Object[] array1 = { APPLE, STRING1, BANANA };
Object[] array2 = { APPLE, STRING1, TIGER1 };
assertTrue(cmp.compare(array1, array2) < 0);
assertTrue(cmp.compare(array2, array1) > 0);
}
@Test
public void arrayTypeTest8() {
Object[] array1 = { APPLE, STRING1, TIGER1 };
Object[] array2 = { APPLE, STRING1, TIGER1, BANANA };
assertTrue(cmp.compare(array1, array2) < 0);
assertTrue(cmp.compare(array2, array1) > 0);
}
@Test
public void mapTypeTest1() {
Map<Object, Object> map1 = new HashMap<Object, Object>();
Map<Object, Object> map2 = new HashMap<Object, Object>();
map1.put("a", 0);
map1.put("b", 0);
map2.put("a", 0);
map2.put("b", 1);
assertTrue(cmp.compare(map1, map2) == 0);
}
@Test
public void blobTypeTest1() {
byte[] array1 = { 0 };
byte[] array2 = { 0 };
assertTrue(cmp.compare(array1, array2) == 0);
assertTrue(cmp.compare(array2, array1) == 0);
}
@Test
public void blobTypeTest2() {
byte[] array1 = { 0 };
byte[] array2 = { 0, 1 };
assertTrue(cmp.compare(array1, array2) < 0);
assertTrue(cmp.compare(array2, array1) > 0);
}
@Test
public void blobTypeTest3() {
byte[] array1 = { 0, 1 };
byte[] array2 = { 0, 2 };
assertTrue(cmp.compare(array1, array2) < 0);
assertTrue(cmp.compare(array2, array1) > 0);
}
@Test
public void blobTypeTest4() {
byte[] array1 = { 0, 1 };
byte[] array2 = { 1, 1 };
assertTrue(cmp.compare(array1, array2) < 0);
assertTrue(cmp.compare(array2, array1) > 0);
}
@Test
public void blobTypeTest5() {
byte[] array1 = { 0, 1 };
byte[] array2 = { 1, 1, 2 };
assertTrue(cmp.compare(array1, array2) < 0);
assertTrue(cmp.compare(array2, array1) > 0);
}
@Test
public void elseTypeTest1() {
assertTrue(cmp.compare(APPLE, BANANA) < 0);
assertTrue(cmp.compare(BANANA, APPLE) > 0);
}
@Test
public void elseTypeTest2() {
assertTrue(cmp.compare(APPLE, PEAR) < 0);
assertTrue(cmp.compare(PEAR, APPLE) > 0);
}
@Test
public void elseTypeTest3() {
assertTrue(cmp.compare(PEAR, BANANA) < 0);
assertTrue(cmp.compare(BANANA, PEAR) > 0);
}
@Test
public void elseTypeTest4() {
assertTrue(cmp.compare(APPLE, APPLE) == 0);
assertTrue(cmp.compare(BANANA, BANANA) == 0);
assertTrue(cmp.compare(PEAR, PEAR) == 0);
}
@Test
public void elseTypeTest5() {
assertTrue(cmp.compare(TIGER1, TIGER2) == 0);
assertTrue(cmp.compare(TIGER2, TIGER1) == 0);
}
@Test
public void elseTypeTest6() {
assertTrue(cmp.compare(STRING1, TIGER1) < 0);
assertTrue(cmp.compare(TIGER1, STRING1) > 0);
}
@Test
public void elseTypeTest7() {
assertTrue(cmp.compare(BANANA, TIGER1) < 0);
assertTrue(cmp.compare(TIGER1, BANANA) > 0);
}
@Test
public void nullAndOtherTypeTest() {
assertTrue(cmp.compare(NULL1, BOOL1) < 0);
assertTrue(cmp.compare(NULL1, BOOL2) < 0);
assertTrue(cmp.compare(NULL1, LONG1) < 0);
assertTrue(cmp.compare(NULL1, LONG2) < 0);
assertTrue(cmp.compare(NULL1, INT1) < 0);
assertTrue(cmp.compare(NULL1, INT2) < 0);
assertTrue(cmp.compare(NULL1, SHORT1) < 0);
assertTrue(cmp.compare(NULL1, SHORT2) < 0);
assertTrue(cmp.compare(NULL1, DOUBLE1) < 0);
assertTrue(cmp.compare(NULL1, DOUBLE2) < 0);
assertTrue(cmp.compare(NULL1, FLOAT1) < 0);
assertTrue(cmp.compare(NULL1, FLOAT2) < 0);
assertTrue(cmp.compare(NULL1, DATE1) < 0);
assertTrue(cmp.compare(NULL1, DATE2) < 0);
assertTrue(cmp.compare(NULL1, IPV4_1) < 0);
assertTrue(cmp.compare(NULL1, IPV4_2) < 0);
assertTrue(cmp.compare(NULL1, IPV6_1) < 0);
assertTrue(cmp.compare(NULL1, IPV6_2) < 0);
assertTrue(cmp.compare(NULL1, STRING1) < 0);
assertTrue(cmp.compare(NULL1, STRING2) < 0);
assertTrue(cmp.compare(NULL1, ARRAY) < 0);
assertTrue(cmp.compare(NULL1, MAP) < 0);
assertTrue(cmp.compare(NULL1, BLOB) < 0);
}
@Test
public void booleanAndOtherTypeTest() {
assertTrue(cmp.compare(BOOL1, NULL1) > 0);
assertTrue(cmp.compare(BOOL1, NULL2) > 0);
assertTrue(cmp.compare(BOOL1, LONG1) < 0);
assertTrue(cmp.compare(BOOL1, LONG2) < 0);
assertTrue(cmp.compare(BOOL1, INT1) < 0);
assertTrue(cmp.compare(BOOL1, INT2) < 0);
assertTrue(cmp.compare(BOOL1, SHORT1) < 0);
assertTrue(cmp.compare(BOOL1, SHORT2) < 0);
assertTrue(cmp.compare(BOOL1, DOUBLE1) < 0);
assertTrue(cmp.compare(BOOL1, DOUBLE2) < 0);
assertTrue(cmp.compare(BOOL1, FLOAT1) < 0);
assertTrue(cmp.compare(BOOL1, FLOAT2) < 0);
assertTrue(cmp.compare(BOOL1, DATE1) < 0);
assertTrue(cmp.compare(BOOL1, DATE2) < 0);
assertTrue(cmp.compare(BOOL1, IPV4_1) < 0);
assertTrue(cmp.compare(BOOL1, IPV4_2) < 0);
assertTrue(cmp.compare(BOOL1, IPV6_1) < 0);
assertTrue(cmp.compare(BOOL1, IPV6_2) < 0);
assertTrue(cmp.compare(BOOL1, STRING1) < 0);
assertTrue(cmp.compare(BOOL1, STRING2) < 0);
assertTrue(cmp.compare(BOOL1, ARRAY) < 0);
assertTrue(cmp.compare(BOOL1, MAP) < 0);
assertTrue(cmp.compare(BOOL1, BLOB) < 0);
}
@Test
public void numAndOtherTypeTest() {
assertTrue(cmp.compare(LONG1, NULL1) > 0);
assertTrue(cmp.compare(LONG1, NULL2) > 0);
assertTrue(cmp.compare(LONG1, BOOL1) > 0);
assertTrue(cmp.compare(LONG1, BOOL2) > 0);
assertTrue(cmp.compare(LONG1, DATE1) < 0);
assertTrue(cmp.compare(LONG1, DATE2) < 0);
assertTrue(cmp.compare(LONG1, IPV4_1) < 0);
assertTrue(cmp.compare(LONG1, IPV4_2) < 0);
assertTrue(cmp.compare(LONG1, IPV6_1) < 0);
assertTrue(cmp.compare(LONG1, IPV6_2) < 0);
assertTrue(cmp.compare(LONG1, STRING1) < 0);
assertTrue(cmp.compare(LONG1, STRING2) < 0);
assertTrue(cmp.compare(LONG1, ARRAY) < 0);
assertTrue(cmp.compare(LONG1, MAP) < 0);
assertTrue(cmp.compare(LONG1, BLOB) < 0);
}
@Test
public void dateAndOtherTypeTest() {
assertTrue(cmp.compare(DATE1, NULL1) > 0);
assertTrue(cmp.compare(DATE1, NULL2) > 0);
assertTrue(cmp.compare(DATE1, BOOL1) > 0);
assertTrue(cmp.compare(DATE1, BOOL2) > 0);
assertTrue(cmp.compare(DATE1, LONG1) > 0);
assertTrue(cmp.compare(DATE1, LONG2) > 0);
assertTrue(cmp.compare(DATE1, IPV4_1) < 0);
assertTrue(cmp.compare(DATE1, IPV4_2) < 0);
assertTrue(cmp.compare(DATE1, IPV6_1) < 0);
assertTrue(cmp.compare(DATE1, IPV6_2) < 0);
assertTrue(cmp.compare(DATE1, STRING1) < 0);
assertTrue(cmp.compare(DATE1, STRING2) < 0);
assertTrue(cmp.compare(DATE1, ARRAY) < 0);
assertTrue(cmp.compare(DATE1, MAP) < 0);
assertTrue(cmp.compare(DATE1, BLOB) < 0);
}
@Test
public void ipv4AndOtherTypeTest() {
assertTrue(cmp.compare(IPV4_1, NULL1) > 0);
assertTrue(cmp.compare(IPV4_1, NULL2) > 0);
assertTrue(cmp.compare(IPV4_1, BOOL1) > 0);
assertTrue(cmp.compare(IPV4_1, BOOL2) > 0);
assertTrue(cmp.compare(IPV4_1, LONG1) > 0);
assertTrue(cmp.compare(IPV4_1, LONG2) > 0);
assertTrue(cmp.compare(IPV4_1, DATE1) > 0);
assertTrue(cmp.compare(IPV4_1, DATE2) > 0);
assertTrue(cmp.compare(IPV4_1, IPV6_1) < 0);
assertTrue(cmp.compare(IPV4_1, IPV6_2) < 0);
assertTrue(cmp.compare(IPV4_1, STRING1) < 0);
assertTrue(cmp.compare(IPV4_1, STRING2) < 0);
assertTrue(cmp.compare(IPV4_1, ARRAY) < 0);
assertTrue(cmp.compare(IPV4_1, MAP) < 0);
assertTrue(cmp.compare(IPV4_1, BLOB) < 0);
}
@Test
public void ipv6AndOtherTypeTest() {
assertTrue(cmp.compare(IPV6_1, NULL1) > 0);
assertTrue(cmp.compare(IPV6_1, NULL2) > 0);
assertTrue(cmp.compare(IPV6_1, BOOL1) > 0);
assertTrue(cmp.compare(IPV6_1, BOOL2) > 0);
assertTrue(cmp.compare(IPV6_1, LONG1) > 0);
assertTrue(cmp.compare(IPV6_1, LONG2) > 0);
assertTrue(cmp.compare(IPV6_1, DATE1) > 0);
assertTrue(cmp.compare(IPV6_1, DATE2) > 0);
assertTrue(cmp.compare(IPV6_1, IPV4_1) > 0);
assertTrue(cmp.compare(IPV6_1, IPV4_2) > 0);
assertTrue(cmp.compare(IPV6_1, STRING1) < 0);
assertTrue(cmp.compare(IPV6_1, STRING2) < 0);
assertTrue(cmp.compare(IPV6_1, STRING1) < 0);
assertTrue(cmp.compare(IPV6_1, STRING2) < 0);
assertTrue(cmp.compare(IPV6_1, ARRAY) < 0);
assertTrue(cmp.compare(IPV6_1, MAP) < 0);
assertTrue(cmp.compare(IPV6_1, BLOB) < 0);
}
@Test
public void stringAndOtherTypeTest() {
assertTrue(cmp.compare(STRING1, NULL1) > 0);
assertTrue(cmp.compare(STRING1, NULL2) > 0);
assertTrue(cmp.compare(STRING1, BOOL1) > 0);
assertTrue(cmp.compare(STRING1, BOOL2) > 0);
assertTrue(cmp.compare(STRING1, LONG1) > 0);
assertTrue(cmp.compare(STRING1, LONG2) > 0);
assertTrue(cmp.compare(STRING1, DATE1) > 0);
assertTrue(cmp.compare(STRING1, DATE2) > 0);
assertTrue(cmp.compare(STRING1, IPV4_1) > 0);
assertTrue(cmp.compare(STRING1, IPV4_2) > 0);
assertTrue(cmp.compare(STRING1, IPV6_1) > 0);
assertTrue(cmp.compare(STRING1, IPV6_2) > 0);
assertTrue(cmp.compare(STRING1, ARRAY) < 0);
assertTrue(cmp.compare(STRING1, MAP) < 0);
assertTrue(cmp.compare(STRING1, BLOB) < 0);
}
@Test
public void arrayAndOtherTypeTest() {
assertTrue(cmp.compare(ARRAY, NULL1) > 0);
assertTrue(cmp.compare(ARRAY, NULL2) > 0);
assertTrue(cmp.compare(ARRAY, BOOL1) > 0);
assertTrue(cmp.compare(ARRAY, BOOL2) > 0);
assertTrue(cmp.compare(ARRAY, LONG1) > 0);
assertTrue(cmp.compare(ARRAY, LONG2) > 0);
assertTrue(cmp.compare(ARRAY, DATE1) > 0);
assertTrue(cmp.compare(ARRAY, DATE2) > 0);
assertTrue(cmp.compare(ARRAY, IPV4_1) > 0);
assertTrue(cmp.compare(ARRAY, IPV4_2) > 0);
assertTrue(cmp.compare(ARRAY, IPV6_1) > 0);
assertTrue(cmp.compare(ARRAY, IPV6_2) > 0);
assertTrue(cmp.compare(ARRAY, STRING1) > 0);
assertTrue(cmp.compare(ARRAY, MAP) < 0);
assertTrue(cmp.compare(ARRAY, BLOB) < 0);
}
@Test
public void mapAndOtherTypeTest() {
assertTrue(cmp.compare(MAP, NULL1) > 0);
assertTrue(cmp.compare(MAP, NULL2) > 0);
assertTrue(cmp.compare(MAP, BOOL1) > 0);
assertTrue(cmp.compare(MAP, BOOL2) > 0);
assertTrue(cmp.compare(MAP, LONG1) > 0);
assertTrue(cmp.compare(MAP, LONG2) > 0);
assertTrue(cmp.compare(MAP, DATE1) > 0);
assertTrue(cmp.compare(MAP, DATE2) > 0);
assertTrue(cmp.compare(MAP, IPV4_1) > 0);
assertTrue(cmp.compare(MAP, IPV4_2) > 0);
assertTrue(cmp.compare(MAP, IPV6_1) > 0);
assertTrue(cmp.compare(MAP, IPV6_2) > 0);
assertTrue(cmp.compare(MAP, STRING1) > 0);
assertTrue(cmp.compare(MAP, ARRAY) > 0);
assertTrue(cmp.compare(MAP, BLOB) < 0);
}
@Test
public void blobAndOtherTypeTest() {
assertTrue(cmp.compare(BLOB, NULL1) > 0);
assertTrue(cmp.compare(BLOB, NULL2) > 0);
assertTrue(cmp.compare(BLOB, BOOL1) > 0);
assertTrue(cmp.compare(BLOB, BOOL2) > 0);
assertTrue(cmp.compare(BLOB, LONG1) > 0);
assertTrue(cmp.compare(BLOB, LONG2) > 0);
assertTrue(cmp.compare(BLOB, DATE1) > 0);
assertTrue(cmp.compare(BLOB, DATE2) > 0);
assertTrue(cmp.compare(BLOB, IPV4_1) > 0);
assertTrue(cmp.compare(BLOB, IPV4_2) > 0);
assertTrue(cmp.compare(BLOB, IPV6_1) > 0);
assertTrue(cmp.compare(BLOB, IPV6_2) > 0);
assertTrue(cmp.compare(BLOB, STRING1) > 0);
assertTrue(cmp.compare(BLOB, ARRAY) > 0);
assertTrue(cmp.compare(BLOB, MAP) > 0);
}
@SuppressWarnings("rawtypes")
abstract class Fruit implements Comparable {
abstract public int getType();
@Override
public int compareTo(Object other) {
if (other instanceof Fruit)
return this.getType() - ((Fruit) other).getType();
else
throw new ClassCastException("WRONG");
}
}
class Apple extends Fruit {
public int getType() {
return 1;
}
}
class Pear extends Fruit {
public int getType() {
return 2;
}
}
class Banana extends Fruit {
public int getType() {
return 3;
}
}
class Tiger {
}
}