blob: cb1b96e4285114e66c39331ba561296d98632701 [file] [log] [blame]
// Copyright (c) 2019, 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.desugar;
import static org.junit.Assert.assertEquals;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.utils.StringUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
// Test if the static method of the lambda implementation (SINGLE_CALLER) is inlined into the
// interface method of the lambda class.
@RunWith(Parameterized.class)
public class DesugaredLambdaImplementationInliningTest extends TestBase {
static final String EXPECTED =
StringUtils.lines(
"Running desugared stateless lambda.",
"Running desugared stateful lambda: lambda-state.");
@Parameters(name = "{0}")
public static TestParametersCollection data() {
return getTestParameters().withAllRuntimesAndApiLevels().build();
}
final TestParameters parameters;
public DesugaredLambdaImplementationInliningTest(TestParameters parameters) {
this.parameters = parameters;
}
@Test
public void test() throws Exception {
class Counter {
private int i = 0;
}
Counter counter = new Counter();
testForR8Compat(parameters.getBackend())
.addProgramClasses(TestClass.class)
.addKeepMainRule(TestClass.class)
.noMinification()
.setMinApi(parameters.getApiLevel())
.run(parameters.getRuntime(), TestClass.class)
.assertSuccessWithOutput(EXPECTED)
.inspector()
.clazz(TestClass.class)
.forAllMethods(
fms -> {
if (fms.isStatic() && !fms.getOriginalName().equals("main")) {
++counter.i;
}
});
// On CF the lambdas remain.
assertEquals(parameters.isDexRuntime() ? 0 : 2, counter.i);
}
static class TestClass {
public static void main(String[] args) {
Runnable runnable = () -> System.out.println("Running desugared stateless lambda.");
runnable.run();
String s = "lambda-state";
runnable = () -> System.out.println("Running desugared stateful lambda: " + s + ".");
runnable.run();
}
}
}