Add Kotlin string switch test
Bug: b/390168887
Change-Id: Ibc91165e3334299468c1867264e04418cb63f9e7
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/conditionalsimpleinlining/SwitchWithSimpleCasesInliningKotlin.kt b/src/test/java/com/android/tools/r8/ir/optimize/inliner/conditionalsimpleinlining/SwitchWithSimpleCasesInliningKotlin.kt
new file mode 100644
index 0000000..f0365e7
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/conditionalsimpleinlining/SwitchWithSimpleCasesInliningKotlin.kt
@@ -0,0 +1,48 @@
+// Copyright (c) 2025, 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.ir.optimize.inliner.conditionalsimpleinlining
+
+fun main(args: Array<String>) {
+ // Known.
+ println(isEnabled("A"))
+ println(isEnabled("B"))
+ println(isEnabled("C"))
+ println(isEnabled("D"))
+ println(isEnabled("E"))
+ println(isEnabled("F"))
+ println(isEnabled("G"))
+ println(isEnabled("H"))
+ println(isEnabled("I"))
+ println(isEnabled("J"))
+ println(isEnabled("K"))
+ println(isEnabled("L"))
+ println(isEnabled("M"))
+ println(isEnabled("N"))
+ // Unknown.
+ println(isEnabled("O"))
+}
+
+fun isEnabled(feature: String?): Boolean {
+ return when (feature) {
+ "A" -> true
+ "B" -> false
+ "C" -> true
+ "D" -> true
+ "E" -> false
+ "F" -> true
+ "G" -> false
+ "H" -> false
+ "I" -> false
+ "J" -> false
+ "K" -> true
+ "L" -> true
+ "M" -> false
+ "N" -> true
+ else -> hasProperty(feature)
+ }
+}
+
+fun hasProperty(property: String?): Boolean {
+ return System.getProperty(property) != null
+}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/conditionalsimpleinlining/SwitchWithSimpleCasesInliningKotlinTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/conditionalsimpleinlining/SwitchWithSimpleCasesInliningKotlinTest.java
new file mode 100644
index 0000000..e668727
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/conditionalsimpleinlining/SwitchWithSimpleCasesInliningKotlinTest.java
@@ -0,0 +1,90 @@
+// Copyright (c) 2025, 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.ir.optimize.inliner.conditionalsimpleinlining;
+
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertFalse;
+
+import com.android.tools.r8.KotlinTestBase;
+import com.android.tools.r8.KotlinTestParameters;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.utils.DescriptorUtils;
+import com.android.tools.r8.utils.FileUtils;
+import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import java.nio.file.Paths;
+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 SwitchWithSimpleCasesInliningKotlinTest extends KotlinTestBase {
+
+ private final TestParameters parameters;
+ private static final String EXPECTED_OUTPUT =
+ StringUtils.lines(
+ "true", "false", "true", "true", "false", "true", "false", "false", "false", "false",
+ "true", "true", "false", "true", "false");
+ private static final String PKG =
+ SwitchWithSimpleCasesInliningKotlinTest.class.getPackage().getName();
+ private static final KotlinCompileMemoizer compiledJars =
+ getCompileMemoizer(
+ Paths.get(
+ ToolHelper.TESTS_DIR,
+ "java",
+ DescriptorUtils.getBinaryNameFromJavaType(PKG),
+ "SwitchWithSimpleCasesInliningKotlin" + FileUtils.KT_EXTENSION));
+
+ @Parameters(name = "{0}, {1}")
+ public static List<Object[]> data() {
+ return buildParameters(
+ getTestParameters().withAllRuntimesAndApiLevels().build(),
+ getKotlinTestParameters().withAllCompilersLambdaGenerationsAndTargetVersions().build());
+ }
+
+ public SwitchWithSimpleCasesInliningKotlinTest(
+ TestParameters parameters, KotlinTestParameters kotlinParameters) {
+ super(kotlinParameters);
+ this.parameters = parameters;
+ }
+
+ @Test
+ public void test() throws Exception {
+ String mainClass = PKG + ".SwitchWithSimpleCasesInliningKotlinKt";
+ testForR8(parameters.getBackend())
+ .addProgramFiles(compiledJars.getForConfiguration(kotlinParameters))
+ .addProgramFiles(kotlinc.getKotlinStdlibJar())
+ .addProgramFiles(kotlinc.getKotlinAnnotationJar())
+ .addKeepMainRule(mainClass)
+ .enableProguardTestOptions()
+ .addKeepRules(
+ "-neverinline class "
+ + PKG
+ + ".SwitchWithSimpleCasesInliningKotlinKt"
+ + "{ hasProperty(...); }")
+ .setMinApi(parameters)
+ .compile()
+ .inspect(
+ inspector -> {
+ ClassSubject mainClassSubject = inspector.clazz(mainClass);
+ assertThat(mainClassSubject, isPresent());
+ MethodSubject mainMethodSubject = mainClassSubject.mainMethod();
+ assertThat(mainMethodSubject, isPresent());
+ // TODO(b/390168887): Add support.
+ assertFalse(
+ mainMethodSubject
+ .streamInstructions()
+ .filter(InstructionSubject::isConstString)
+ .allMatch(i -> i.isConstString("O")));
+ })
+ .run(parameters.getRuntime(), mainClass)
+ .assertSuccessWithOutput(EXPECTED_OUTPUT);
+ }
+}