package com.sebastian_daschner.jaxrs_analyzer.analysis.utils;
import com.sebastian_daschner.jaxrs_analyzer.model.Types;
import org.junit.Test;
import static com.sebastian_daschner.jaxrs_analyzer.model.JavaUtils.*;
import static org.hamcrest.CoreMatchers.hasItems;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.*;
public class JavaUtilsTest {
@Test
public void testGetTypeParameters() {
assertThat(getTypeParameters("B").size(), is(0));
assertThat(getTypeParameters("Z").size(), is(0));
assertThat(getTypeParameters(Types.STRING).size(), is(0));
assertThat(getTypeParameters("[Ljava/lang/String;").size(), is(0));
assertThat(getTypeParameters("Ljava/util/List<Ljava/lang/String;>;"), hasItems(Types.STRING));
assertThat(getTypeParameters("Ljava/lang/Map<Ljava/lang/String;Ljava/lang/Integer;>;"), hasItems(Types.STRING, Types.INTEGER));
assertThat(getTypeParameters("Ljava/util/List<Ljava/util/List<Ljava/lang/Integer;>;>;"), hasItems("Ljava/util/List<Ljava/lang/Integer;>;"));
assertThat(getTypeParameters("Ljava/util/Map<Ljava/util/List<Ljava/lang/Integer;>;Ljava/util/List<Ljava/lang/String;>;>;"), hasItems("Ljava/util/List<Ljava/lang/Integer;>;", "Ljava/util/List<Ljava/lang/String;>;"));
}
@Test
public void testIsAssignableToSame() {
final String sameType = "Ljava/lang/Object;";
assertTrue(isAssignableTo(sameType, Types.OBJECT));
assertTrue(isAssignableTo(Types.OBJECT, sameType));
}
@Test
public void testIsAssignableToPrimitives() {
assertFalse(isAssignableTo(Types.PRIMITIVE_INT, Types.OBJECT));
assertFalse(isAssignableTo(Types.OBJECT, Types.PRIMITIVE_INT));
assertFalse(isAssignableTo(Types.PRIMITIVE_BOOLEAN, Types.PRIMITIVE_INT));
assertTrue(isAssignableTo(Types.PRIMITIVE_INT, Types.PRIMITIVE_INT));
}
@Test
public void testIsAssignableToArray() {
final String intArray = "[I";
final String objectArray = "[Ljava/lang/Object;";
final String listArray = "[Ljava/util/List;";
final String stringListArray = "[Ljava/util/List<Ljava/lang/String;>";
final String linkedListArray = "[Ljava/util/LinkedList;";
assertFalse(isAssignableTo(intArray, Types.PRIMITIVE_INT));
assertFalse(isAssignableTo(Types.PRIMITIVE_INT, intArray));
assertFalse(isAssignableTo(objectArray, intArray));
assertFalse(isAssignableTo(intArray, objectArray));
assertTrue(isAssignableTo(objectArray, objectArray));
assertTrue(isAssignableTo(intArray, intArray));
assertTrue(isAssignableTo(listArray, stringListArray));
assertTrue(isAssignableTo(stringListArray, listArray));
assertTrue(isAssignableTo(linkedListArray, listArray));
assertFalse(isAssignableTo(listArray, linkedListArray));
}
@Test
public void testIsAssignableToInheritance() {
final String parentType = "Ljava/lang/Number;";
final String inheritedType = "Ljava/lang/Integer;";
assertFalse(isAssignableTo(parentType, inheritedType));
assertTrue(isAssignableTo(inheritedType, parentType));
}
@Test
public void testIsAssignableToGeneric() {
final String parentType = "Ljava/util/List;";
final String inheritedType = "Ljava/util/LinkedList;";
assertFalse(isAssignableTo(parentType, inheritedType));
assertTrue(isAssignableTo(inheritedType, parentType));
}
@Test
public void testIsAssignableToParameterized() {
final String parentType = "Ljava/util/List<Ljava/lang/String;>;";
final String inheritedType = "Ljava/util/LinkedList<Ljava/lang/String;>;";
assertFalse(isAssignableTo(parentType, inheritedType));
assertTrue(isAssignableTo(inheritedType, parentType));
}
@Test
public void testIsAssignableToDifferentTypes() {
assertFalse(isAssignableTo(Types.STRING, Types.STREAM));
assertFalse(isAssignableTo(Types.STREAM, Types.STRING));
}
@Test
public void testIsAssignableToParameterizedInheritedParameters() {
final String parentType = "Ljava/util/List<Ljava/lang/Number;>;";
final String inheritedType = "Ljava/util/List<Ljava/lang/Integer;>;";
assertFalse(isAssignableTo(parentType, inheritedType));
assertFalse(isAssignableTo(inheritedType, parentType));
}
@Test
public void testIsAssignableToParameterizedInheritedParametersExtended() {
final String parentType = "Ljava/util/List<Ljava/lang/Number;>;";
final String inheritedType = "Ljava/util/LinkedList<Ljava/lang/Integer;>;";
assertFalse(isAssignableTo(parentType, inheritedType));
assertFalse(isAssignableTo(inheritedType, parentType));
}
@Test
public void testIsAssignableToCollection() {
final String type = "Ljava/util/List<Ljava/lang/String;>;";
assertFalse(isAssignableTo(Types.COLLECTION, type));
assertTrue(isAssignableTo(type, Types.COLLECTION));
}
@Test
public void testIsAssignableToOddParameterizedTypes() {
final String type = "Ljava/util/List<Ljava/lang/String;>;";
final String subType = "Ljava/util/LinkedList<Ljava/lang/String;>;";
final String rawType = "Ljava/util/List;";
final String rawSubType = "Ljava/util/LinkedList;";
assertFalse(isAssignableTo(type, subType));
assertTrue(isAssignableTo(subType, type));
assertTrue(isAssignableTo(type, rawType));
assertTrue(isAssignableTo(rawType, type));
assertFalse(isAssignableTo(type, rawSubType));
assertTrue(isAssignableTo(rawSubType, type));
assertTrue(isAssignableTo(subType, rawType));
assertFalse(isAssignableTo(rawType, subType));
assertTrue(isAssignableTo(subType, rawSubType));
assertTrue(isAssignableTo(rawSubType, subType));
assertFalse(isAssignableTo(rawType, rawSubType));
assertTrue(isAssignableTo(rawSubType, rawType));
}
@Test
public void testDetermineMostSpecificTypeOnlyOne() {
final String actualType = determineMostSpecificType(Types.LIST);
assertEquals(Types.LIST, actualType);
}
@Test
public void testDetermineMostSpecificTypeParameterized() {
final String parameterizedType = "Ljava/util/List<Ljava/lang/String;>;";
String actualType = determineMostSpecificType(Types.LIST, parameterizedType);
assertEquals(parameterizedType, actualType);
actualType = determineMostSpecificType(parameterizedType, Types.LIST);
assertEquals(parameterizedType, actualType);
}
@Test
public void testDetermineMostSpecificTypeArray() {
final String stringArray = "[Ljava/lang/String;";
String actualType = determineMostSpecificType(Types.STRING, stringArray);
assertEquals(stringArray, actualType);
actualType = determineMostSpecificType(stringArray, Types.STRING);
assertEquals(stringArray, actualType);
}
@Test
public void testDetermineMostSpecificTypeObject() {
final String responseType = "Ljavax/ws/rs/core/Response$Status;";
String actualType = determineMostSpecificType(Types.OBJECT, responseType);
assertEquals(responseType, actualType);
actualType = determineMostSpecificType(responseType, Types.OBJECT);
assertEquals(responseType, actualType);
}
@Test
public void testDetermineMostSpecificTypeInheritance() {
final String linkedListType = "Ljava/util/LinkedList;";
String actualType = determineMostSpecificType(Types.LIST, linkedListType);
assertEquals(linkedListType, actualType);
actualType = determineMostSpecificType(linkedListType, Types.LIST);
assertEquals(linkedListType, actualType);
}
@Test
public void testDetermineMostSpecificTypeParameterizedInner() {
final String lockList = "Ljava/util/List<Ljava/util/concurrent/locks/Lock;>;";
final String stampedLockList = "Ljava/util/List<Ljava/util/concurrent/locks/ReentrantLock;>;";
String actualType = determineMostSpecificType(lockList, stampedLockList);
assertEquals(stampedLockList, actualType);
actualType = determineMostSpecificType(stampedLockList, lockList);
assertEquals(stampedLockList, actualType);
}
@Test
public void testDetermineMostSpecificTypeParameterizedInheritance() {
final String lockList = "Ljava/util/List<Ljava/util/concurrent/locks/Lock;>;";
final String lockLinkedList = "Ljava/util/LinkedList<Ljava/util/concurrent/locks/Lock;>;";
String actualType = determineMostSpecificType(lockList, lockLinkedList);
assertEquals(lockLinkedList, actualType);
actualType = determineMostSpecificType(lockLinkedList, lockList);
assertEquals(lockLinkedList, actualType);
}
@Test
public void testDetermineMostSpecificTypeParameterizedInnerInheritance() {
final String lockList = "Ljava/util/List<Ljava/util/concurrent/locks/Lock;>;";
final String stampedLockLinkedList = "Ljava/util/LinkedList<Ljava/util/concurrent/locks/ReentrantLock;>;";
String actualType = determineMostSpecificType(lockList, stampedLockLinkedList);
assertEquals(stampedLockLinkedList, actualType);
actualType = determineMostSpecificType(stampedLockLinkedList, lockList);
assertEquals(stampedLockLinkedList, actualType);
}
}