| // 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 desugaredlib; | |
| import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG; | |
| import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; | |
| import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; | |
| import static org.hamcrest.MatcherAssert.assertThat; | |
| import static org.junit.Assert.assertTrue; | |
| import backport.OptionalBackportJava9Test; | |
| import com.android.tools.r8.TestParameters; | |
| import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase; | |
| import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; | |
| import com.android.tools.r8.desugar.desugaredlibrary.test.DesugaredLibraryTestCompileResult; | |
| import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; | |
| import com.android.tools.r8.utils.StringUtils; | |
| import com.android.tools.r8.utils.codeinspector.ClassSubject; | |
| import com.android.tools.r8.utils.codeinspector.CodeInspector; | |
| import com.android.tools.r8.utils.codeinspector.InstructionSubject; | |
| import com.android.tools.r8.utils.codeinspector.InvokeInstructionSubject; | |
| import com.google.common.collect.ImmutableList; | |
| import java.util.Iterator; | |
| import java.util.List; | |
| import java.util.Optional; | |
| import java.util.OptionalDouble; | |
| import java.util.OptionalInt; | |
| import java.util.OptionalLong; | |
| 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 JavaUtilOptionalTest extends DesugaredLibraryTestBase { | |
| private final TestParameters parameters; | |
| private final LibraryDesugaringSpecification libraryDesugaringSpecification; | |
| private final CompilationSpecification compilationSpecification; | |
| @Parameters(name = "{0}, spec: {1}, {2}") | |
| public static List<Object[]> data() { | |
| return buildParameters( | |
| getTestParameters().withDexRuntimes().withAllApiLevels().build(), | |
| getJdk8Jdk11(), | |
| ImmutableList.of(D8_L8DEBUG)); | |
| } | |
| public JavaUtilOptionalTest( | |
| TestParameters parameters, | |
| LibraryDesugaringSpecification libraryDesugaringSpecification, | |
| CompilationSpecification compilationSpecification) { | |
| this.parameters = parameters; | |
| this.libraryDesugaringSpecification = libraryDesugaringSpecification; | |
| this.compilationSpecification = compilationSpecification; | |
| } | |
| private void checkRewrittenInvokes(CodeInspector inspector) { | |
| if (!libraryDesugaringSpecification.hasEmulatedInterfaceDesugaring(parameters)) { | |
| return; | |
| } | |
| ClassSubject classSubject = inspector.clazz(TestClass.class); | |
| assertThat(classSubject, isPresent()); | |
| Iterator<InvokeInstructionSubject> iterator = | |
| classSubject | |
| .uniqueMethodWithOriginalName("main") | |
| .iterateInstructions(InstructionSubject::isInvokeStatic); | |
| assertTrue(iterator.next().holder().is("j$.util.Optional")); | |
| assertTrue(iterator.next().holder().is("j$.util.Optional")); | |
| assertTrue(iterator.next().holder().is("j$.util.OptionalInt")); | |
| assertTrue(iterator.next().holder().is("j$.util.OptionalInt")); | |
| assertTrue(iterator.next().holder().is("j$.util.OptionalLong")); | |
| assertTrue(iterator.next().holder().is("j$.util.OptionalLong")); | |
| assertTrue(iterator.next().holder().is("j$.util.OptionalDouble")); | |
| assertTrue(iterator.next().holder().is("j$.util.OptionalDouble")); | |
| } | |
| @Test | |
| public void testJavaUtilOptional() throws Throwable { | |
| String expectedOutput = | |
| StringUtils.lines( | |
| "false", | |
| "true", | |
| "Hello, world!", | |
| "false", | |
| "true", | |
| "42", | |
| "false", | |
| "true", | |
| "4242", | |
| "false", | |
| "true", | |
| "42.42"); | |
| DesugaredLibraryTestCompileResult<?> testCompileResult = | |
| testForDesugaredLibrary( | |
| parameters, libraryDesugaringSpecification, compilationSpecification) | |
| .addInnerClasses(getClass()) | |
| .addInnerClassesAndStrippedOuter(OptionalBackportJava9Test.class) | |
| .compile() | |
| .inspect(this::checkRewrittenInvokes); | |
| testCompileResult | |
| .run(parameters.getRuntime(), TestClass.class) | |
| .assertSuccessWithOutput(expectedOutput); | |
| testCompileResult | |
| .run(parameters.getRuntime(), OptionalBackportJava9Test.OptionalBackportJava9Main.class) | |
| .assertSuccess(); | |
| } | |
| static class TestClass { | |
| public static void main(String[] args) { | |
| System.out.println(Optional.empty().isPresent()); | |
| Optional optional = Optional.of("Hello, world!"); | |
| System.out.println(optional.isPresent()); | |
| System.out.println(optional.get()); | |
| System.out.println(OptionalInt.empty().isPresent()); | |
| OptionalInt optionalInt = OptionalInt.of(42); | |
| System.out.println(optionalInt.isPresent()); | |
| System.out.println(optionalInt.getAsInt()); | |
| System.out.println(OptionalLong.empty().isPresent()); | |
| OptionalLong optionalLong = OptionalLong.of(4242L); | |
| System.out.println(optionalLong.isPresent()); | |
| System.out.println(optionalLong.getAsLong()); | |
| System.out.println(OptionalDouble.empty().isPresent()); | |
| OptionalDouble optionalDouble = OptionalDouble.of(42.42); | |
| System.out.println(optionalDouble.isPresent()); | |
| System.out.println(optionalDouble.getAsDouble()); | |
| } | |
| } | |
| } |