blob: 7422eb824fe0f697ee14b72f412fc3f467b44596 [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.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import com.android.tools.r8.D8TestBuilder;
import com.android.tools.r8.D8TestCompileResult;
import com.android.tools.r8.Diagnostic;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestDiagnosticMessages;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.errors.DesugarDiagnostic;
import com.android.tools.r8.errors.InterfaceDesugarMissingTypeDiagnostic;
import com.android.tools.r8.references.Reference;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.StringUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@RunWith(Parameterized.class)
public class DesugarMissingTypeStaticInvokeTest extends TestBase {
static final String EXPECTED = StringUtils.lines("Hello, world");
private final TestParameters parameters;
@Parameterized.Parameters(name = "{0}")
public static TestParametersCollection data() {
return getTestParameters().withAllRuntimes().withAllApiLevels().build();
}
public DesugarMissingTypeStaticInvokeTest(TestParameters parameters) {
this.parameters = parameters;
}
boolean supportsDefaultInterfaceMethods() {
return parameters.getRuntime().isCf()
|| AndroidApiLevel.N.getLevel() <= parameters.getApiLevel().getLevel();
}
@Test
public void test() throws Exception {
if (parameters.isCfRuntime()) {
testForJvm()
.addProgramClasses(TestClass.class, MissingInterface.class)
.run(parameters.getRuntime(), TestClass.class)
.assertSuccessWithOutput(EXPECTED);
} else {
D8TestBuilder builder =
testForD8().addProgramClasses(TestClass.class).setMinApi(parameters.getApiLevel());
TestDiagnosticMessages messages = builder.getState().getDiagnosticsMessages();
D8TestCompileResult compileResult = builder.compile();
if (supportsDefaultInterfaceMethods()) {
messages.assertNoMessages();
compileResult
.addRunClasspathFiles(
testForD8()
.setMinApi(parameters.getApiLevel())
.addProgramClasses(MissingInterface.class)
.compile()
.writeToZip())
.run(parameters.getRuntime(), TestClass.class)
.assertSuccessWithOutput(EXPECTED);
} else {
messages.assertOnlyWarnings();
assertEquals(1, messages.getWarnings().size());
Diagnostic diagnostic = messages.getWarnings().get(0);
assertTrue(diagnostic instanceof DesugarDiagnostic);
assertTrue(diagnostic instanceof InterfaceDesugarMissingTypeDiagnostic);
InterfaceDesugarMissingTypeDiagnostic desugarWarning = (InterfaceDesugarMissingTypeDiagnostic) diagnostic;
assertEquals(
Reference.classFromClass(MissingInterface.class), desugarWarning.getMissingType());
assertEquals(Reference.classFromClass(TestClass.class), desugarWarning.getContextType());
assertThat(
desugarWarning.getPosition().getDescription(),
containsString(TestClass.class.getTypeName() + ".main"));
}
}
}
public interface MissingInterface {
static void foo() {
System.out.println("Hello, world");
}
}
static class TestClass {
public static void main(String[] args) {
MissingInterface.foo();
}
}
}