blob: 6f061f39f1d95b236299f623812111cc72be96a0 [file] [log] [blame]
// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.rewrite.enums;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@RunWith(Parameterized.class)
public class EnumValueOfOptimizationTest extends TestBase {
private final TestParameters parameters;
@Parameterized.Parameters(name = "{0}")
public static TestParametersCollection data() {
return getTestParameters().withAllRuntimesAndApiLevels().build();
}
public EnumValueOfOptimizationTest(TestParameters parameters) {
this.parameters = parameters;
}
@Test
public void testValueOf() throws Exception {
testForR8(parameters.getBackend())
.addKeepMainRule(Main.class)
.addInnerClasses(EnumValueOfOptimizationTest.class)
.setMinApi(parameters.getApiLevel())
.compile()
.run(parameters.getRuntime(), Main.class)
.assertSuccessWithOutputLines("npe OK", "iae1 OK", "iae2 OK", "iae3 OK", "iae4 OK");
}
enum MyEnum {
A,
B
}
enum ComplexEnum {
A {
@Override
public String toString() {
return "a0";
}
},
B
}
@SuppressWarnings({"unchecked", "ConstantConditions"})
static class Main {
public static void main(String[] args) {
myEnumTest();
complexEnumTest();
}
private static void complexEnumTest() {
Enum<?> e = null;
try {
e = subtypeError();
System.out.println("iae4 KO");
} catch (IllegalArgumentException iae) {
System.out.println("iae4 OK");
}
if (e != null) {
throw new Error("enum set");
}
}
private static Enum<?> subtypeError() {
return Enum.valueOf((Class) ComplexEnum.A.getClass(), "A");
}
private static void myEnumTest() {
Enum<?> e = null;
try {
e = nullClassError();
System.out.println("npe KO");
} catch (NullPointerException ignored) {
System.out.println("npe OK");
}
if (e != null) {
throw new Error("enum set");
}
try {
e = invalidNameError();
System.out.println("iae1 KO");
} catch (IllegalArgumentException iae) {
System.out.println("iae1 OK");
}
if (e != null) {
throw new Error("enum set");
}
try {
e = enumClassError();
System.out.println("iae2 KO");
} catch (IllegalArgumentException iae) {
System.out.println("iae2 OK");
}
if (e != null) {
throw new Error("enum set");
}
try {
e = voidError();
System.out.println("iae3 KO");
} catch (IllegalArgumentException iae) {
System.out.println("iae3 OK");
}
if (e != null) {
throw new Error("enum set");
}
}
private static Enum<?> voidError() {
return Enum.valueOf((Class) Void.class, "TYPE");
}
private static Enum<?> enumClassError() {
return Enum.valueOf(Enum.class, "smth");
}
private static Enum<?> invalidNameError() {
return Enum.valueOf(MyEnum.class, "curly");
}
private static Enum<?> nullClassError() {
return Enum.valueOf((Class<MyEnum>) null, "a string");
}
}
}