JClassType implements12 = to.getType("Implements12");
JClassType implementsNeither = to.getType("ImplementsNeither");
JClassType string = to.getType(String.class.getCanonicalName());
JClassType sub = to.getType("Sub");
JClassType sup = to.getType("Sup");
JGenericType holder = to.getType("Holder").isGenericType();
JClassType arrayOfInt = to.getArrayType(JPrimitiveType.INT);
JClassType arrayOfFloat = to.getArrayType(JPrimitiveType.FLOAT);
JClassType arrayOfString = to.getArrayType(string);
JClassType arrayOfWildExtString =
to.getArrayType(to.getWildcardType(BoundType.EXTENDS, string));
JClassType holderOfString =
to.getParameterizedType(holder, makeArray(to.getWildcardType(BoundType.EXTENDS, string)));
JClassType holderOfSub =
to.getParameterizedType(holder, makeArray(to.getWildcardType(BoundType.EXTENDS, sub)));
JClassType holderOfSup =
to.getParameterizedType(holder, makeArray(to.getWildcardType(BoundType.EXTENDS, sup)));
TypeConstrainer typeConstrainer = new TypeConstrainer(to);
Map<JTypeParameter, JClassType> emptyConstraints = new HashMap<JTypeParameter, JClassType>();
assertTrue(typeConstrainer.typesMatch(intf1, intf2, emptyConstraints));
assertFalse(typeConstrainer.typesMatch(intf1, intf3, emptyConstraints));
assertTrue(typeConstrainer.typesMatch(implements12, intf1, emptyConstraints));
assertFalse(typeConstrainer.typesMatch(implements12, intf3, emptyConstraints));
assertFalse(typeConstrainer.typesMatch(implementsNeither, intf1, emptyConstraints));
assertTrue(typeConstrainer.typesMatch(to.getJavaLangObject(), arrayOfString, emptyConstraints));
assertTrue(typeConstrainer.typesMatch(arrayOfString, to.getJavaLangObject(), emptyConstraints));
assertTrue(typeConstrainer.typesMatch(sub, sup, emptyConstraints));
assertTrue(typeConstrainer.typesMatch(sub, sub, emptyConstraints));
assertTrue(typeConstrainer.typesMatch(arrayOfFloat, arrayOfFloat, emptyConstraints));
assertFalse(typeConstrainer.typesMatch(arrayOfFloat, arrayOfInt, emptyConstraints));
assertFalse(typeConstrainer.typesMatch(arrayOfFloat, arrayOfString, emptyConstraints));
assertTrue(typeConstrainer.typesMatch(arrayOfString, arrayOfString, emptyConstraints));
assertTrue(typeConstrainer.typesMatch(arrayOfString, arrayOfWildExtString, emptyConstraints));
assertTrue(typeConstrainer.typesMatch(holderOfSub, holderOfSup, emptyConstraints));
assertFalse(typeConstrainer.typesMatch(holderOfSub, holderOfString, emptyConstraints));
assertTrue(typeConstrainer.typesMatch(holder.getRawType(), holderOfSub, emptyConstraints));
assertTrue(typeConstrainer.typesMatch(holderOfSub, holder.getRawType(), emptyConstraints));
assertFalse(typeConstrainer.typesMatch(holder.getRawType(), intf1, emptyConstraints));
assertTrue(emptyConstraints.isEmpty());
}