/*
* Copyright (c) 2011 Google 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.google.api.client.util;
import junit.framework.TestCase;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.AbstractList;
import java.util.AbstractMap;
import java.util.AbstractQueue;
import java.util.AbstractSet;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.SortedSet;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.concurrent.ConcurrentMap;
/**
* Tests {@link Data}.
*
* @author Yaniv Inbar
*/
public class DataTest extends TestCase {
public void testNullOf() {
assertEquals("java.lang.Object", Data.nullOf(Object.class).getClass().getName());
assertEquals("java.lang.String", Data.nullOf(String.class).getClass().getName());
assertEquals("java.lang.Integer", Data.nullOf(Integer.class).getClass().getName());
assertEquals("[[[[Ljava.lang.String;", Data.nullOf(String[][][][].class).getClass().getName());
assertEquals("[[[I", Data.nullOf(int[][][].class).getClass().getName());
assertNotNull(Data.nullOf(Object.class));
assertEquals(Data.<Object>nullOf(Object.class), Data.<Object>nullOf(Object.class));
assertFalse(Data.nullOf(String.class).equals(Data.nullOf(Object.class)));
try {
Data.nullOf(int.class);
fail("expected " + IllegalArgumentException.class);
} catch (IllegalArgumentException e) {
}
try {
Data.nullOf(List.class);
fail("expected " + IllegalArgumentException.class);
} catch (IllegalArgumentException e) {
}
}
public void testIsNull() {
assertTrue(Data.isNull(Data.NULL_BOOLEAN));
assertTrue(Data.isNull(Data.NULL_STRING));
assertTrue(Data.isNull(Data.NULL_CHARACTER));
assertTrue(Data.isNull(Data.NULL_BYTE));
assertTrue(Data.isNull(Data.NULL_SHORT));
assertTrue(Data.isNull(Data.NULL_INTEGER));
assertTrue(Data.isNull(Data.NULL_LONG));
assertTrue(Data.isNull(Data.NULL_FLOAT));
assertTrue(Data.isNull(Data.NULL_DOUBLE));
assertTrue(Data.isNull(Data.NULL_BIG_INTEGER));
assertTrue(Data.isNull(Data.NULL_BIG_DECIMAL));
assertTrue(Data.isNull(Data.NULL_DATE_TIME));
assertFalse(Data.isNull(null));
assertFalse(Data.isNull(""));
assertFalse(Data.isNull(false));
assertFalse(Data.isNull(true));
assertFalse(Data.isNull((byte) 0));
assertFalse(Data.isNull((short) 0));
assertFalse(Data.isNull(0));
assertFalse(Data.isNull(0L));
assertFalse(Data.isNull((float) 0));
assertFalse(Data.isNull((double) 0));
assertFalse(Data.isNull(BigDecimal.ZERO));
assertFalse(Data.isNull(BigInteger.ZERO));
}
public void testClone_array() {
String[] orig = new String[] {"a", "b", "c"};
String[] result = Data.clone(orig);
assertTrue(orig != result);
assertTrue(Arrays.equals(orig, result));
}
public void testClone_intArray() {
int[] orig = new int[] {1, 2, 3};
int[] result = Data.clone(orig);
assertTrue(orig != result);
assertTrue(Arrays.equals(orig, result));
}
public void testClone_arrayMap() {
ArrayMap<String, Integer> map = ArrayMap.of();
map.add("a", 1);
assertEquals(map, Data.clone(map));
}
public void testNewCollectionInstance() throws Exception {
assertEquals(ArrayList.class, Data.newCollectionInstance(null).getClass());
assertEquals(ArrayList.class, Data.newCollectionInstance(String[].class).getClass());
assertEquals(ArrayList.class, Data.newCollectionInstance(Object.class).getClass());
assertEquals(ArrayList.class, Data.newCollectionInstance(List.class).getClass());
assertEquals(ArrayList.class, Data.newCollectionInstance(AbstractList.class).getClass());
assertEquals(ArrayList.class, Data.newCollectionInstance(ArrayList.class).getClass());
assertEquals(LinkedList.class, Data.newCollectionInstance(LinkedList.class).getClass());
assertEquals(HashSet.class, Data.newCollectionInstance(Set.class).getClass());
assertEquals(HashSet.class, Data.newCollectionInstance(AbstractSet.class).getClass());
assertEquals(HashSet.class, Data.newCollectionInstance(HashSet.class).getClass());
assertEquals(TreeSet.class, Data.newCollectionInstance(SortedSet.class).getClass());
assertEquals(TreeSet.class, Data.newCollectionInstance(TreeSet.class).getClass());
try {
Data.newMapInstance(AbstractQueue.class);
fail("expected " + IllegalArgumentException.class);
} catch (IllegalArgumentException e) {
// expected
}
try {
Data.newMapInstance(String.class);
fail("expected " + ClassCastException.class);
} catch (ClassCastException e) {
// expected
}
TypeVariable<?> tTypeVar = (TypeVariable<?>) Resolve.class.getField("t").getGenericType();
try {
assertNull(Data.newCollectionInstance(tTypeVar));
fail("expected " + IllegalArgumentException.class);
} catch (IllegalArgumentException e) {
// expected
}
}
public void testNewMapInstance() {
assertEquals(ArrayMap.class, Data.newMapInstance(Object.class).getClass());
assertEquals(ArrayMap.class, Data.newMapInstance(Map.class).getClass());
assertEquals(ArrayMap.class, Data.newMapInstance(Cloneable.class).getClass());
assertEquals(ArrayMap.class, Data.newMapInstance(AbstractMap.class).getClass());
assertEquals(ArrayMap.class, Data.newMapInstance(ArrayMap.class).getClass());
assertEquals(TreeMap.class, Data.newMapInstance(SortedMap.class).getClass());
assertEquals(TreeMap.class, Data.newMapInstance(TreeMap.class).getClass());
assertEquals(HashMap.class, Data.newMapInstance(HashMap.class).getClass());
try {
Data.newMapInstance(ConcurrentMap.class);
fail("expected " + IllegalArgumentException.class);
} catch (IllegalArgumentException e) {
// expected
}
try {
Data.newMapInstance(String.class);
fail("expected " + ClassCastException.class);
} catch (ClassCastException e) {
// expected
}
}
public void testIsPrimitive() {
assertFalse(Data.isPrimitive(null));
assertTrue(Data.isPrimitive(int.class));
assertTrue(Data.isPrimitive(Integer.class));
}
public void testParsePrimitiveValue() {
assertNull(Data.parsePrimitiveValue(Boolean.class, null));
assertEquals("abc", Data.parsePrimitiveValue(null, "abc"));
assertEquals("abc", Data.parsePrimitiveValue(String.class, "abc"));
assertEquals("abc", Data.parsePrimitiveValue(Object.class, "abc"));
assertEquals('a', Data.parsePrimitiveValue(Character.class, "a"));
assertEquals(true, Data.parsePrimitiveValue(boolean.class, "true"));
assertEquals(true, Data.parsePrimitiveValue(Boolean.class, "true"));
assertEquals(new Byte(Byte.MAX_VALUE),
Data.parsePrimitiveValue(Byte.class, String.valueOf(Byte.MAX_VALUE)));
assertEquals(new Byte(Byte.MAX_VALUE),
Data.parsePrimitiveValue(byte.class, String.valueOf(Byte.MAX_VALUE)));
assertEquals(new Short(Short.MAX_VALUE),
Data.parsePrimitiveValue(Short.class, String.valueOf(Short.MAX_VALUE)));
assertEquals(new Short(Short.MAX_VALUE),
Data.parsePrimitiveValue(short.class, String.valueOf(Short.MAX_VALUE)));
assertEquals(new Integer(Integer.MAX_VALUE),
Data.parsePrimitiveValue(Integer.class, String.valueOf(Integer.MAX_VALUE)));
assertEquals(new Integer(Integer.MAX_VALUE),
Data.parsePrimitiveValue(int.class, String.valueOf(Integer.MAX_VALUE)));
assertEquals(new Long(Long.MAX_VALUE),
Data.parsePrimitiveValue(Long.class, String.valueOf(Long.MAX_VALUE)));
assertEquals(new Long(Long.MAX_VALUE),
Data.parsePrimitiveValue(long.class, String.valueOf(Long.MAX_VALUE)));
assertEquals(new Float(Float.MAX_VALUE),
Data.parsePrimitiveValue(Float.class, String.valueOf(Float.MAX_VALUE)));
assertEquals(new Float(Float.MAX_VALUE),
Data.parsePrimitiveValue(float.class, String.valueOf(Float.MAX_VALUE)));
assertEquals(new Double(Double.MAX_VALUE),
Data.parsePrimitiveValue(Double.class, String.valueOf(Double.MAX_VALUE)));
assertEquals(new Double(Double.MAX_VALUE),
Data.parsePrimitiveValue(double.class, String.valueOf(Double.MAX_VALUE)));
BigInteger bigint = BigInteger.valueOf(Long.MAX_VALUE);
assertEquals(
bigint, Data.parsePrimitiveValue(BigInteger.class, String.valueOf(Long.MAX_VALUE)));
BigDecimal bigdec = BigDecimal.valueOf(Double.MAX_VALUE);
assertEquals(
bigdec, Data.parsePrimitiveValue(BigDecimal.class, String.valueOf(Double.MAX_VALUE)));
DateTime now = new DateTime(new Date());
assertEquals(now, Data.parsePrimitiveValue(DateTime.class, now.toStringRfc3339()));
try {
Data.parsePrimitiveValue(char.class, "abc");
fail();
} catch (IllegalArgumentException e) {
// expected
}
assertNull(Data.parsePrimitiveValue(Void.class, "abc"));
}
static class Resolve<X, T extends Number> {
public T t;
public X x;
}
static class IntegerResolve extends Resolve<Boolean, Integer> {
}
static class MedResolve<T extends Number> extends Resolve<Boolean, T> {
}
static class DoubleResolve extends MedResolve<Double> {
}
static class Med2Resolve<T extends Number> extends MedResolve<T> {
}
static class LongResolve extends Med2Resolve<Long> {
}
static class ArrayResolve extends Resolve<Boolean[], Integer> {
}
static class ParameterizedResolve extends Resolve<Collection<Integer>, Integer> {
}
static class MedXResolve<Y extends Number, X extends Y> extends Resolve<X, Integer> {
}
public void testResolveWildcardTypeOrTypeVariable() throws Exception {
// t
TypeVariable<?> tTypeVar = (TypeVariable<?>) Resolve.class.getField("t").getGenericType();
assertEquals(
Number.class, resolveWildcardTypeOrTypeVariable(new Object().getClass(), tTypeVar));
assertEquals(Number.class,
resolveWildcardTypeOrTypeVariable(new Resolve<Boolean, Double>().getClass(), tTypeVar));
assertEquals(Integer.class,
resolveWildcardTypeOrTypeVariable(new IntegerResolve().getClass(), tTypeVar));
assertEquals(
Long.class, resolveWildcardTypeOrTypeVariable(new LongResolve().getClass(), tTypeVar));
assertEquals(
Double.class, resolveWildcardTypeOrTypeVariable(new DoubleResolve().getClass(), tTypeVar));
// partially resolved
assertEquals(Number.class,
resolveWildcardTypeOrTypeVariable(new MedResolve<Double>().getClass(), tTypeVar));
// x
TypeVariable<?> xTypeVar = (TypeVariable<?>) Resolve.class.getField("x").getGenericType();
assertEquals(
Object.class, resolveWildcardTypeOrTypeVariable(new Object().getClass(), xTypeVar));
assertEquals(Boolean.class, Types.getArrayComponentType(
resolveWildcardTypeOrTypeVariable(new ArrayResolve().getClass(), xTypeVar)));
assertEquals(
Collection.class, Types.getRawClass((ParameterizedType) resolveWildcardTypeOrTypeVariable(
new ParameterizedResolve().getClass(), xTypeVar)));
assertEquals(Number.class, resolveWildcardTypeOrTypeVariable(
new MedXResolve<Integer, Integer>().getClass(), xTypeVar));
}
private static Type resolveWildcardTypeOrTypeVariable(
Type context, TypeVariable<?> typeVariable) {
return Data.resolveWildcardTypeOrTypeVariable(Arrays.asList(context), typeVariable);
}
}