blob: 00eb5715083c7160b15e36d8f59c461064edff19 [file] [log] [blame]
/*
* Copyright 2019 Google Inc. All Rights Reserved.
*
* 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.turbine.processing;
import static com.google.common.truth.Truth.assertWithMessage;
import static com.google.common.truth.TruthJUnit.assume;
import static org.junit.Assert.assertThrows;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableSet;
import com.google.turbine.types.Deannotate;
import javax.lang.model.type.PrimitiveType;
import javax.lang.model.type.TypeKind;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.Types;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public class TurbineTypesUnaryTest extends AbstractTurbineTypesTest {
@Parameters(name = "{index}: {0}")
public static Iterable<Object[]> parameters() throws Exception {
return unaryParameters();
}
final String testDescription;
final Types javacTypes;
final TypeMirror javacA;
final Types turbineTypes;
final TypeMirror turbineA;
public TurbineTypesUnaryTest(
String testDescription,
Types javacTypes,
TypeMirror javacA,
Types turbineTypes,
TypeMirror turbineA) {
this.testDescription = testDescription;
this.javacTypes = javacTypes;
this.javacA = javacA;
this.turbineTypes = turbineTypes;
this.turbineA = turbineA;
}
@Test
public void unboxedType() {
IllegalArgumentException thrown = null;
String expectedType = null;
try {
expectedType = javacTypes.unboxedType(javacA).toString();
} catch (IllegalArgumentException e) {
thrown = e;
}
if (thrown != null) {
assertThrows(
String.format("expected unboxedType(`%s`) to throw", turbineA),
IllegalArgumentException.class,
() -> turbineTypes.unboxedType(turbineA).toString());
} else {
String actual = turbineTypes.unboxedType(turbineA).toString();
assertWithMessage("unboxedClass(`%s`) = unboxedClass(`%s`)", javacA, turbineA)
.that(actual)
.isEqualTo(expectedType);
}
}
@Test
public void boxedClass() {
assume().that(javacA).isInstanceOf(PrimitiveType.class);
assume().that(turbineA).isInstanceOf(PrimitiveType.class);
String expected = javacTypes.boxedClass((PrimitiveType) javacA).toString();
String actual = turbineTypes.boxedClass((PrimitiveType) turbineA).toString();
assertWithMessage("boxedClass(`%s`) = boxedClass(`%s`)", javacA, turbineA)
.that(actual)
.isEqualTo(expected);
}
@Test
public void erasure() {
String expected = javacTypes.erasure(javacA).toString();
String actual = turbineTypes.erasure(turbineA).toString();
assertWithMessage("erasure(`%s`) = erasure(`%s`)", javacA, turbineA)
.that(actual)
.isEqualTo(expected);
}
private static final ImmutableSet<TypeKind> UNSUPPORTED_BY_DIRECT_SUPERTYPES =
ImmutableSet.of(TypeKind.EXECUTABLE, TypeKind.PACKAGE);
@Test
public void directSupertypes() {
assume().that(UNSUPPORTED_BY_DIRECT_SUPERTYPES).doesNotContain(javacA.getKind());
String expected = Joiner.on(", ").join(javacTypes.directSupertypes(javacA));
String actual = Joiner.on(", ").join(turbineTypes.directSupertypes(turbineA));
assertWithMessage("directSupertypes(`%s`) = directSupertypes(`%s`)", javacA, turbineA)
.that(actual)
.isEqualTo(expected);
}
@Test
public void directSupertypesThrows() {
assume().that(UNSUPPORTED_BY_DIRECT_SUPERTYPES).contains(javacA.getKind());
assertThrows(IllegalArgumentException.class, () -> javacTypes.directSupertypes(turbineA));
assertThrows(IllegalArgumentException.class, () -> turbineTypes.directSupertypes(turbineA));
}
@Test
public void asElement() {
// TODO(cushon): this looks like a javac bug
assume().that(javacA.getKind()).isNotEqualTo(TypeKind.INTERSECTION);
String expected = String.valueOf(javacTypes.asElement(javacA));
String actual = String.valueOf(turbineTypes.asElement(turbineA));
assertWithMessage("asElement(`%s`) = asElement(`%s`)", javacA, turbineA)
.that(actual)
.isEqualTo(expected);
}
@Test
public void deannotate() {
String toString = turbineA.toString();
String deannotated =
Deannotate.deannotate(((TurbineTypeMirror) turbineA).asTurbineType()).toString();
if (toString.contains("@")) {
assertWithMessage("deannotate(`%s`) = `%s`", toString, deannotated)
.that(deannotated)
.doesNotContain("@");
}
}
}