| // 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.enumunboxing; |
| |
| import com.android.tools.r8.NeverClassInline; |
| import com.android.tools.r8.TestParameters; |
| import com.android.tools.r8.utils.StringUtils; |
| import java.util.List; |
| 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 LargeEnumUnboxingTest extends EnumUnboxingTestBase { |
| |
| private static final String EXPECTED_RESULT = |
| StringUtils.lines( |
| "B1falsetruefalse1", |
| "B2falsetruefalse2", |
| "B3falsetruefalse3", |
| "B4falsetruefalse4", |
| "B5falsetruefalse5", |
| "B6falsetruefalse6", |
| "B7falsetruefalse7", |
| "B8falsetruefalse8", |
| "B9falsetruefalse9", |
| "B10falsetruefalse10", |
| "B11falsetruefalse11", |
| "B12falsetruefalse12", |
| "B13falsetruefalse13", |
| "E1falsefalsetrue14", |
| "E2falsefalsetrue15", |
| "E3falsefalsetrue16", |
| "E4falsefalsetrue17", |
| "E5falsefalsetrue18", |
| "E6falsefalsetrue19", |
| "E7falsefalsetrue20", |
| "E8falsefalsetrue21", |
| "E9falsefalsetrue22", |
| "E10falsefalsetrue23", |
| "E11falsefalsetrue24", |
| "E12falsefalsetrue25", |
| "E13falsefalsetrue26", |
| "E14falsefalsetrue27", |
| "E15falsefalsetrue28", |
| "G1falsefalsefalse29", |
| "G2falsefalsefalse30", |
| "G3falsefalsefalse31", |
| "G4falsefalsefalse32", |
| "G5falsefalsefalse33", |
| "G6falsefalsefalse34", |
| "G7falsefalsefalse35", |
| "G8falsefalsefalse36", |
| "G9falsefalsefalse37", |
| "I1truefalsefalse38", |
| "I2truefalsefalse39", |
| "I3truefalsefalse40", |
| "I4truefalsefalse41", |
| "I5truefalsefalse42", |
| "I6truefalsefalse43", |
| "I7truefalsefalse44", |
| "I8truefalsefalse45", |
| "I9truefalsefalse46", |
| "I10truefalsefalse47", |
| "I11truefalsefalse48", |
| "I12truefalsefalse49", |
| "I13truefalsefalse50", |
| "I14truefalsefalse51", |
| "I15truefalsefalse52", |
| "I16truefalsefalse53", |
| "J1falsefalsefalse54", |
| "J2falsefalsefalse55"); |
| |
| private final TestParameters parameters; |
| private final boolean enumValueOptimization; |
| private final EnumKeepRules enumKeepRules; |
| |
| @Parameters(name = "{0} valueOpt: {1} keep: {2}") |
| public static List<Object[]> data() { |
| return enumUnboxingTestParameters(); |
| } |
| |
| public LargeEnumUnboxingTest( |
| TestParameters parameters, boolean enumValueOptimization, EnumKeepRules enumKeepRules) { |
| this.parameters = parameters; |
| this.enumValueOptimization = enumValueOptimization; |
| this.enumKeepRules = enumKeepRules; |
| } |
| |
| @Test |
| public void testEnumUnboxing() throws Exception { |
| Class<?> mainClass = Main.class; |
| testForR8(parameters.getBackend()) |
| .addProgramClasses(mainClass, LargeEnum.class) |
| .addKeepMainRule(mainClass) |
| .addKeepRules(enumKeepRules.getKeepRules()) |
| .addEnumUnboxingInspector(inspector -> inspector.assertUnboxed(LargeEnum.class)) |
| .enableNeverClassInliningAnnotations() |
| .addOptionsModification(opt -> enableEnumOptions(opt, enumValueOptimization)) |
| .setMinApi(parameters.getApiLevel()) |
| .compile() |
| .run(parameters.getRuntime(), mainClass) |
| .assertSuccessWithOutput(EXPECTED_RESULT); |
| } |
| |
| @NeverClassInline |
| enum LargeEnum { |
| B1("1"), |
| B2("2"), |
| B3("3"), |
| B4("4"), |
| B5("5"), |
| B6("6"), |
| B7("7"), |
| B8("8"), |
| B9("9"), |
| B10("10"), |
| B11("11"), |
| B12("12"), |
| B13("13"), |
| |
| E1("14"), |
| E2("15"), |
| E3("16"), |
| E4("17"), |
| E5("18"), |
| E6("19"), |
| E7("20"), |
| E8("21"), |
| E9("22"), |
| E10("23"), |
| E11("24"), |
| E12("25"), |
| E13("26"), |
| E14("27"), |
| E15("28"), |
| |
| G1("29"), |
| G2("30"), |
| G3("31"), |
| G4("32"), |
| G5("33"), |
| G6("34"), |
| G7("35"), |
| G8("36"), |
| G9("37"), |
| |
| I1("38"), |
| I2("39"), |
| I3("40"), |
| I4("41"), |
| I5("42"), |
| I6("43"), |
| I7("44"), |
| I8("45"), |
| I9("46"), |
| I10("47"), |
| I11("48"), |
| I12("49"), |
| I13("50"), |
| I14("51"), |
| I15("52"), |
| I16("53"), |
| |
| J1("54"), |
| J2("55"); |
| |
| private final String num; |
| |
| LargeEnum(String num) { |
| this.num = num; |
| } |
| |
| public String getNum() { |
| return num; |
| } |
| |
| public boolean isI() { |
| return this == I1 |
| || this == I2 |
| || this == I3 |
| || this == I4 |
| || this == I5 |
| || this == I6 |
| || this == I7 |
| || this == I8 |
| || this == I9 |
| || this == I10 |
| || this == I11 |
| || this == I12 |
| || this == I13 |
| || this == I14 |
| || this == I15 |
| || this == I16; |
| } |
| |
| public boolean isB() { |
| return this == B1 |
| || this == B2 |
| || this == B3 |
| || this == B4 |
| || this == B5 |
| || this == B6 |
| || this == B7 |
| || this == B8 |
| || this == B9 |
| || this == B10 |
| || this == B11 |
| || this == B12 |
| || this == B13; |
| } |
| |
| public boolean isE() { |
| return this == E1 |
| || this == E2 |
| || this == E3 |
| || this == E4 |
| || this == E5 |
| || this == E6 |
| || this == E7 |
| || this == E8 |
| || this == E9 |
| || this == E10 |
| || this == E11 |
| || this == E12 |
| || this == E13 |
| || this == E14 |
| || this == E15; |
| } |
| } |
| |
| static class Main { |
| |
| public static void main(String[] args) { |
| for (LargeEnum value : LargeEnum.values()) { |
| System.out.println( |
| value.toString() + value.isI() + value.isB() + value.isE() + value.getNum()); |
| } |
| } |
| } |
| } |