blob: 53b04617cb669e5dba8d81257c83a0cb179f4c76 [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.jack.optimizations.lambdas;
import com.google.common.io.Files;
import com.android.jack.Options;
import com.android.jack.test.dex.DexFileTypesValidator;
import com.android.jack.test.dex.DexOutputBasedTest;
import com.android.jack.test.dex.DexTypeAccessValidator;
import com.android.jack.test.helper.IncrementalTestHelper;
import com.android.jack.test.helper.RuntimeTestHelper;
import com.android.jack.test.junit.Runtime;
import com.android.jack.test.toolchain.AbstractTestTools;
import com.android.jack.transformations.lambda.LambdaGroupingScope;
import org.junit.Test;
import java.io.File;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.Collections;
import javax.annotation.Nonnegative;
import javax.annotation.Nonnull;
/** Tests for lambdas optimizations */
public class LambdaTests extends DexOutputBasedTest {
@Nonnull
private static CompilationProperties config(
@Nonnull LambdaGroupingScope scope, boolean mergeInterfaces, boolean simplifyStateless) {
return CompilationProperties
.EMPTY
.enableJava8()
.with(Options.LAMBDA_GROUPING_SCOPE.getName(), scope)
.with(Options.LAMBDA_MERGE_INTERFACES.getName(), Boolean.valueOf(mergeInterfaces))
.with(Options.LAMBDA_SIMPLIFY_STATELESS.getName(), Boolean.valueOf(simplifyStateless));
}
// ===============================================================================================
@Nonnull
private static String type(@Nonnull String pkg, @Nonnull String name) {
return ("L" + pkg + "/jack/" + name + ";").replace('.', '/');
}
@Nonnull
private static String lambda(@Nonnull String pkg, @Nonnull String sha, @Nonnegative int i) {
return type(pkg, "-$Lambda$" + i + "$" + sha);
}
@Nonnull
private static String[] types(@Nonnull String pkg, @Nonnull String... names) {
for (int i = 0; i < names.length; i++) {
names[i] = type(pkg, names[i]);
}
return names;
}
private static class Class {
@Nonnull
private final StringBuilder builder = new StringBuilder();
Class(@Nonnull String name, @Nonnull String... interfaces) {
builder.append(name).append("\n");
printImpl(interfaces, " - implements:\n", false);
}
@Nonnull
Class methods(@Nonnull String... signatures) {
return printImpl(signatures, " - methods:\n", true);
}
@Nonnull
Class fields(@Nonnull String... fields) {
return printImpl(fields, " - fields:\n", true);
}
@Nonnull
private Class printImpl(@Nonnull String[] names, @Nonnull String str, boolean ordered) {
if (names.length > 0) {
builder.append(str);
if (ordered) {
Arrays.sort(names);
}
for (String n : names) {
builder.append(" ").append(n).append("\n");
}
}
return this;
}
@Nonnull
@Override
public String toString() {
return builder.toString();
}
}
// ===============================================================================================
@Nonnull
private static final String PKG_001 = "com.android.jack.optimizations.lambdas.test001";
@Nonnull
private static final String SHA_001 = "IKUiHr1YvEGLPsKj1XVCnvkJpxY";
@Nonnull
private static final String TEST001_NONE = "" +
new Class(lambda(PKG_001, SHA_001, 0), types(PKG_001, "I0"))
.methods("<init>()V", "foo()V", "$m$0()V") +
new Class(lambda(PKG_001, SHA_001, 1), types(PKG_001, "I0"))
.methods("<init>()V", "foo()V", "$m$0()V") +
new Class(lambda(PKG_001, SHA_001, 10), types(PKG_001, "TestB"))
.fields("-$f0:Ljava/lang/Object;", "-$f1:Ljava/lang/Object;")
.methods("<init>(Ljava/lang/Object;Ljava/lang/Object;)V",
"foo(Ljava/lang/String;)Ljava/lang/String;",
"$m$0(Ljava/lang/String;)Ljava/lang/String;") +
new Class(lambda(PKG_001, SHA_001, 11), types(PKG_001, "TestB"))
.fields("-$f0:Ljava/lang/Object;", "-$f1:Ljava/lang/Object;")
.methods("<init>(Ljava/lang/Object;Ljava/lang/Object;)V",
"foo(Ljava/lang/String;)Ljava/lang/String;",
"$m$0(Ljava/lang/String;)Ljava/lang/String;") +
new Class(lambda(PKG_001, SHA_001, 12), types(PKG_001, "TestB"))
.fields("-$f0:I", "-$f1:Ljava/lang/Object;")
.methods("<init>(ILjava/lang/Object;)V",
"foo(Ljava/lang/String;)Ljava/lang/String;",
"$m$0(Ljava/lang/String;)Ljava/lang/String;") +
new Class(lambda(PKG_001, SHA_001, 13), types(PKG_001, "TestB"))
.fields("-$f0:I", "-$f1:Ljava/lang/Object;")
.methods("<init>(ILjava/lang/Object;)V",
"foo(Ljava/lang/String;)Ljava/lang/String;",
"$m$0(Ljava/lang/String;)Ljava/lang/String;") +
new Class(lambda(PKG_001, SHA_001, 14), types(PKG_001, "TestB"))
.fields("-$f0:Z", "-$f1:B", "-$f2:C", "-$f3:D", "-$f4:F", "-$f5:I", "-$f6:J", "-$f7:S",
"-$f8:Ljava/lang/Object;")
.methods("<init>(ZBCDFIJSLjava/lang/Object;)V",
"foo(Ljava/lang/String;)Ljava/lang/String;",
"$m$0(Ljava/lang/String;)Ljava/lang/String;") +
new Class(lambda(PKG_001, SHA_001, 15), types(PKG_001, "TestB"))
.fields("-$f0:Z", "-$f1:B", "-$f2:C", "-$f3:D", "-$f4:F", "-$f5:I", "-$f6:J", "-$f7:S",
"-$f8:Ljava/lang/Object;")
.methods("<init>(ZBCDFIJSLjava/lang/Object;)V",
"foo(Ljava/lang/String;)Ljava/lang/String;",
"$m$0(Ljava/lang/String;)Ljava/lang/String;") +
new Class(lambda(PKG_001, SHA_001, 16), types(PKG_001, "TestB"))
.fields("-$f0:Z", "-$f1:B", "-$f2:C", "-$f3:D", "-$f4:F", "-$f5:I", "-$f6:J", "-$f7:S",
"-$f8:Ljava/lang/Object;")
.methods("<init>(ZBCDFIJSLjava/lang/Object;)V",
"foo(Ljava/lang/String;)Ljava/lang/String;",
"$m$0(Ljava/lang/String;)Ljava/lang/String;") +
new Class(lambda(PKG_001, SHA_001, 2), types(PKG_001, "I0"))
.methods("<init>()V", "foo()V", "$m$0()V") +
new Class(lambda(PKG_001, SHA_001, 3), types(PKG_001, "I1"))
.methods("<init>()V", "bar(I)I", "$m$0(I)I") +
new Class(lambda(PKG_001, SHA_001, 4), types(PKG_001, "IA"))
.methods("<init>()V", "foo()Ljava/lang/Object;", "$m$0()Ljava/lang/Object;") +
new Class(lambda(PKG_001, SHA_001, 5), types(PKG_001, "IA"))
.methods("<init>()V", "foo()Ljava/lang/Object;", "$m$0()Ljava/lang/Object;") +
new Class(lambda(PKG_001, SHA_001, 6), types(PKG_001, "IA"))
.methods("<init>()V", "foo()Ljava/lang/Object;", "$m$0()Ljava/lang/Object;") +
new Class(lambda(PKG_001, SHA_001, 7), types(PKG_001, "IB"))
.methods("<init>()V", "foo()Ljava/lang/Object;", "foo()Ljava/lang/Integer;",
"$m$0()Ljava/lang/Integer;", "$m$1()Ljava/lang/Object;") +
new Class(lambda(PKG_001, SHA_001, 8), types(PKG_001, "TestB"))
.fields("-$f0:Ljava/lang/Object;")
.methods("<init>(Ljava/lang/Object;)V", "foo(Ljava/lang/String;)Ljava/lang/String;",
"$m$0(Ljava/lang/String;)Ljava/lang/String;") +
new Class(lambda(PKG_001, SHA_001, 9), types(PKG_001, "TestB"))
.fields("-$f0:Ljava/lang/Object;")
.methods("<init>(Ljava/lang/Object;)V", "foo(Ljava/lang/String;)Ljava/lang/String;",
"$m$0(Ljava/lang/String;)Ljava/lang/String;") +
"";
@Nonnull
private static final String TEST001_PACKAGE = "" +
new Class(lambda(PKG_001, SHA_001, 0), types(PKG_001, "I0"))
.fields("$id:B")
.methods("<init>(B)V", "$m$0()V", "$m$1()V", "$m$2()V", "foo()V") +
new Class(lambda(PKG_001, SHA_001, 1), types(PKG_001, "I1"))
.methods("<init>()V", "$m$0(I)I", "bar(I)I") +
new Class(lambda(PKG_001, SHA_001, 2), types(PKG_001, "IA"))
.fields("$id:B")
.methods("<init>(B)V",
"$m$0()Ljava/lang/Object;",
"$m$1()Ljava/lang/Object;",
"$m$2()Ljava/lang/Object;",
"foo()Ljava/lang/Object;") +
new Class(lambda(PKG_001, SHA_001, 3), types(PKG_001, "IB"))
.methods("<init>()V",
"$m$0()Ljava/lang/Integer;",
"$m$1()Ljava/lang/Object;",
"foo()Ljava/lang/Integer;",
"foo()Ljava/lang/Object;") +
new Class(lambda(PKG_001, SHA_001, 4), types(PKG_001, "TestB"))
.fields("-$f0:Ljava/lang/Object;", "$id:B")
.methods("<init>(BLjava/lang/Object;)V",
"$m$0(Ljava/lang/String;)Ljava/lang/String;",
"$m$1(Ljava/lang/String;)Ljava/lang/String;",
"foo(Ljava/lang/String;)Ljava/lang/String;") +
new Class(lambda(PKG_001, SHA_001, 5), types(PKG_001, "TestB"))
.fields("-$f0:Ljava/lang/Object;", "-$f1:Ljava/lang/Object;", "$id:B")
.methods("<init>(BLjava/lang/Object;Ljava/lang/Object;)V",
"$m$0(Ljava/lang/String;)Ljava/lang/String;",
"$m$1(Ljava/lang/String;)Ljava/lang/String;",
"foo(Ljava/lang/String;)Ljava/lang/String;") +
new Class(lambda(PKG_001, SHA_001, 6), types(PKG_001, "TestB"))
.fields("-$f0:I", "-$f1:Ljava/lang/Object;", "$id:B")
.methods("<init>(BILjava/lang/Object;)V",
"$m$0(Ljava/lang/String;)Ljava/lang/String;",
"$m$1(Ljava/lang/String;)Ljava/lang/String;",
"foo(Ljava/lang/String;)Ljava/lang/String;") +
new Class(lambda(PKG_001, SHA_001, 7), types(PKG_001, "TestB"))
.fields("-$f0:Z", "-$f1:B", "-$f2:C", "-$f3:D", "-$f4:F",
"-$f5:I", "-$f6:J", "-$f7:S", "-$f8:Ljava/lang/Object;", "$id:B")
.methods("<init>(BZBCDFIJSLjava/lang/Object;)V",
"$m$0(Ljava/lang/String;)Ljava/lang/String;",
"$m$1(Ljava/lang/String;)Ljava/lang/String;",
"$m$2(Ljava/lang/String;)Ljava/lang/String;",
"foo(Ljava/lang/String;)Ljava/lang/String;");
@Nonnull
private static final String TEST001_PACKAGE_INTERFACE = "" +
new Class(lambda(PKG_001, SHA_001, 0), types(PKG_001, "I0", "I1", "IA", "IB"))
.fields("$id:B")
.methods("<init>(B)V",
"$m$0()Ljava/lang/Object;",
"$m$1()Ljava/lang/Object;",
"$m$2()Ljava/lang/Object;",
"$m$3()Ljava/lang/Integer;",
"$m$4()Ljava/lang/Object;",
"$m$5(I)I",
"$m$6()V",
"$m$7()V",
"$m$8()V",
"bar(I)I",
"foo()Ljava/lang/Integer;",
"foo()Ljava/lang/Object;",
"foo()V") +
new Class(lambda(PKG_001, SHA_001, 1), types(PKG_001, "TestB"))
.fields("$id:B", "-$f0:Ljava/lang/Object;")
.methods("<init>(BLjava/lang/Object;)V",
"$m$0(Ljava/lang/String;)Ljava/lang/String;",
"$m$1(Ljava/lang/String;)Ljava/lang/String;",
"foo(Ljava/lang/String;)Ljava/lang/String;") +
new Class(lambda(PKG_001, SHA_001, 2), types(PKG_001, "TestB"))
.fields("$id:B", "-$f0:Ljava/lang/Object;", "-$f1:Ljava/lang/Object;")
.methods("<init>(BLjava/lang/Object;Ljava/lang/Object;)V",
"$m$0(Ljava/lang/String;)Ljava/lang/String;",
"$m$1(Ljava/lang/String;)Ljava/lang/String;",
"foo(Ljava/lang/String;)Ljava/lang/String;") +
new Class(lambda(PKG_001, SHA_001, 3), types(PKG_001, "TestB"))
.fields("$id:B", "-$f0:I", "-$f1:Ljava/lang/Object;")
.methods("<init>(BILjava/lang/Object;)V",
"$m$0(Ljava/lang/String;)Ljava/lang/String;",
"$m$1(Ljava/lang/String;)Ljava/lang/String;",
"foo(Ljava/lang/String;)Ljava/lang/String;") +
new Class(lambda(PKG_001, SHA_001, 4), types(PKG_001, "TestB"))
.fields("$id:B", "-$f0:Z", "-$f1:B", "-$f2:C", "-$f3:D",
"-$f4:F", "-$f5:I", "-$f6:J", "-$f7:S", "-$f8:Ljava/lang/Object;")
.methods("<init>(BZBCDFIJSLjava/lang/Object;)V",
"$m$0(Ljava/lang/String;)Ljava/lang/String;",
"$m$1(Ljava/lang/String;)Ljava/lang/String;",
"$m$2(Ljava/lang/String;)Ljava/lang/String;",
"foo(Ljava/lang/String;)Ljava/lang/String;");
@Test
@Runtime
public void test001() throws Exception {
compileAndValidate(PKG_001,
config(LambdaGroupingScope.NONE, /* interfaces: */false, /* stateless: */false),
new LambdaClassesValidator(TEST001_NONE));
compileAndValidate(PKG_001,
config(LambdaGroupingScope.PACKAGE, /* interfaces: */false, /* stateless: */false),
new LambdaClassesValidator(TEST001_PACKAGE));
compileAndValidate(PKG_001,
config(LambdaGroupingScope.PACKAGE, /* interfaces: */true, /* stateless: */false),
new LambdaClassesValidator(TEST001_PACKAGE_INTERFACE));
}
// ===============================================================================================
@Nonnull
private static final String PKG_002 = "com.android.jack.optimizations.lambdas.test002";
@Nonnull
private static final String SHA_002 = "rK0qQUOvfPrsTJWpyc2f5mlYYJ8";
@Nonnull
private static final String TEST002_NONE = "" +
new Class(lambda(PKG_002, SHA_002, 0), types(PKG_002, "I0"))
.methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;") +
new Class(lambda(PKG_002, SHA_002, 1), types(PKG_002, "I1"))
.methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;") +
new Class(lambda(PKG_002, SHA_002, 2), types(PKG_002, "I2"))
.methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;") +
new Class(lambda(PKG_002, SHA_002, 3), types(PKG_002, "I3"))
.methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;") +
new Class(lambda(PKG_002, SHA_002, 4), types(PKG_002, "I4"))
.methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;") +
new Class(lambda(PKG_002, SHA_002, 5), types(PKG_002, "I5"))
.methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;") +
new Class(lambda(PKG_002, SHA_002, 6), types(PKG_002, "I6"))
.methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;") +
"";
@Nonnull
private static final String TEST002_PACKAGE_INTERFACE = "" +
new Class(lambda(PKG_002, SHA_002, 0),
types(PKG_002, "I0", "I1", "I2", "I3", "I4", "I5", "I6"))
.fields("$id:B")
.methods("<init>(B)V",
"$m$0()Ljava/lang/String;",
"$m$1()Ljava/lang/String;",
"$m$2()Ljava/lang/String;",
"$m$3()Ljava/lang/String;",
"$m$4()Ljava/lang/String;",
"$m$5()Ljava/lang/String;",
"$m$6()Ljava/lang/String;",
"foo()Ljava/lang/String;");
@Test
@Runtime
public void test002() throws Exception {
compileAndValidate(PKG_002,
config(LambdaGroupingScope.NONE, /* interfaces: */false, /* stateless: */false),
new LambdaClassesValidator(TEST002_NONE).
andAlso(new DexFileTypesValidator()
.insert(lambda(PKG_002, SHA_002, 0), new DexTypeAccessValidator(false))
.insert(lambda(PKG_002, SHA_002, 1), new DexTypeAccessValidator(false))
.insert(lambda(PKG_002, SHA_002, 2), new DexTypeAccessValidator(false))
.insert(lambda(PKG_002, SHA_002, 3), new DexTypeAccessValidator(false))
.insert(lambda(PKG_002, SHA_002, 4), new DexTypeAccessValidator(false))
.insert(lambda(PKG_002, SHA_002, 5), new DexTypeAccessValidator(false))
.insert(lambda(PKG_002, SHA_002, 6), new DexTypeAccessValidator(false))));
compileAndValidate(PKG_002,
config(LambdaGroupingScope.PACKAGE, /* interfaces: */true, /* stateless: */false),
new LambdaClassesValidator(TEST002_PACKAGE_INTERFACE).
andAlso(new DexFileTypesValidator()
.insert(lambda(PKG_002, SHA_002, 0), new DexTypeAccessValidator(false))));
}
// ===============================================================================================
@Nonnull
private static final String PKG_003 = "com.android.jack.optimizations.lambdas.test003";
@Nonnull
private static final String SHA_003 = "ONjwHPCPJTN6WB4tZ9kgaFMFflk";
@Nonnull
private static final String TEST003_NONE = "" +
new Class(lambda(PKG_003, SHA_003, 0), types(PKG_003, "I0"))
.methods("<init>()V", "$m$0()Ljava/lang/Object;", "foo()Ljava/lang/Object;") +
new Class(lambda(PKG_003, SHA_003, 1), types(PKG_003, "I1"))
.methods("<init>()V", "$m$0()Ljava/lang/Object;", "foo()Ljava/lang/Object;") +
new Class(lambda(PKG_003, SHA_003, 2), types(PKG_003, "I3"))
.methods("<init>()V", "$m$0()Ljava/lang/Object;", "foo()Ljava/lang/Object;") +
"";
@Nonnull
private static final String TEST003_PACKAGE = TEST003_NONE;
@Nonnull
private static final String TEST003_PACKAGE_INTERFACE = "" +
new Class(lambda(PKG_003, SHA_003, 0), types(PKG_003, "I0", "I1", "I3"))
.fields("$id:B")
.methods("<init>(B)V", "$m$0()Ljava/lang/Object;",
"$m$1()Ljava/lang/Object;", "$m$2()Ljava/lang/Object;", "foo()Ljava/lang/Object;");
@Test
@Runtime
public void test003() throws Exception {
compileAndValidate(PKG_003,
config(LambdaGroupingScope.NONE, /* interfaces: */false, /* stateless: */false),
new LambdaClassesValidator(TEST003_NONE));
compileAndValidate(PKG_003,
config(LambdaGroupingScope.PACKAGE, /* interfaces: */false, /* stateless: */false),
new LambdaClassesValidator(TEST003_PACKAGE));
compileAndValidate(PKG_003,
config(LambdaGroupingScope.PACKAGE, /* interfaces: */true, /* stateless: */false),
new LambdaClassesValidator(TEST003_PACKAGE_INTERFACE));
}
// ===============================================================================================
@Nonnull
private static final String PKG_004 = "com.android.jack.optimizations.lambdas.test004";
@Nonnull
private static final String SHA_004 = "kE8tIAUzNtiGWJ6ulIU0a1IEtL4";
@Nonnull
private static final String TEST004_PACKAGE = "" +
new Class(lambda(PKG_004, SHA_004, 0), types(PKG_004, "I0"))
.methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;") +
new Class(lambda(PKG_004, SHA_004, 1), types(PKG_004, "I0", "MarkerA"))
.methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;") +
new Class(lambda(PKG_004, SHA_004, 2), types(PKG_004, "I0", "MarkerA", "MarkerB"))
.methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;") +
new Class(lambda(PKG_004, SHA_004, 3), types(PKG_004, "I0", "MarkerB"))
.methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;") +
new Class(lambda(PKG_004, SHA_004, 4), types(PKG_004, "I1", "MarkerA", "MarkerB"))
.methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;");
@Nonnull
private static final String TEST004_LAMBDA_MERGE = "" +
new Class(lambda(PKG_004, SHA_004, 0), types(PKG_004, "I0", "I1", "MarkerA", "MarkerB"))
.fields("$id:B")
.methods("<init>(B)V",
"$m$0()Ljava/lang/String;",
"$m$1()Ljava/lang/String;",
"$m$2()Ljava/lang/String;",
"$m$3()Ljava/lang/String;",
"$m$4()Ljava/lang/String;",
"foo()Ljava/lang/String;");
@Nonnull
private static final String TEST004_PACKAGE_INTERFACE_STATELESS = "" +
new Class(lambda(PKG_004, SHA_004, 0), types(PKG_004, "I0", "I1", "MarkerA", "MarkerB"))
.fields("$id:B",
"$INST$0:" + lambda(PKG_004, SHA_004, 0),
"$INST$1:" + lambda(PKG_004, SHA_004, 0),
"$INST$2:" + lambda(PKG_004, SHA_004, 0),
"$INST$3:" + lambda(PKG_004, SHA_004, 0),
"$INST$4:" + lambda(PKG_004, SHA_004, 0))
.methods("<clinit>()V", "<init>(B)V",
"$m$0()Ljava/lang/String;",
"$m$1()Ljava/lang/String;",
"$m$2()Ljava/lang/String;",
"$m$3()Ljava/lang/String;",
"$m$4()Ljava/lang/String;",
"foo()Ljava/lang/String;");
@Nonnull
private static final String TEST004_PACKAGE_STATELESS = "" +
new Class(lambda(PKG_004, SHA_004, 0), types(PKG_004, "I0"))
.fields("$INST$0:" + lambda(PKG_004, SHA_004, 0))
.methods("<clinit>()V", "<init>()V",
"$m$0()Ljava/lang/String;",
"foo()Ljava/lang/String;") +
new Class(lambda(PKG_004, SHA_004, 1), types(PKG_004, "I0", "MarkerA"))
.fields("$INST$0:" + lambda(PKG_004, SHA_004, 1))
.methods("<clinit>()V", "<init>()V",
"$m$0()Ljava/lang/String;",
"foo()Ljava/lang/String;") +
new Class(lambda(PKG_004, SHA_004, 2), types(PKG_004, "I0", "MarkerA", "MarkerB"))
.fields("$INST$0:" + lambda(PKG_004, SHA_004, 2))
.methods("<clinit>()V", "<init>()V",
"$m$0()Ljava/lang/String;",
"foo()Ljava/lang/String;") +
new Class(lambda(PKG_004, SHA_004, 3), types(PKG_004, "I0", "MarkerB"))
.fields("$INST$0:" + lambda(PKG_004, SHA_004, 3))
.methods("<clinit>()V", "<init>()V",
"$m$0()Ljava/lang/String;",
"foo()Ljava/lang/String;") +
new Class(lambda(PKG_004, SHA_004, 4), types(PKG_004, "I1", "MarkerA", "MarkerB"))
.fields("$INST$0:" + lambda(PKG_004, SHA_004, 4))
.methods("<clinit>()V", "<init>()V",
"$m$0()Ljava/lang/String;",
"foo()Ljava/lang/String;");
@Test
@Runtime
public void test004() throws Exception {
compileAndValidate(PKG_004,
config(LambdaGroupingScope.PACKAGE, /* interfaces: */false, /* stateless: */false),
new LambdaClassesValidator(TEST004_PACKAGE));
compileAndValidate(PKG_004,
config(LambdaGroupingScope.PACKAGE, /* interfaces: */true, /* stateless: */false),
new LambdaClassesValidator(TEST004_LAMBDA_MERGE));
compileAndValidate(PKG_004,
config(LambdaGroupingScope.PACKAGE, /* interfaces: */true, /* stateless: */true),
new LambdaClassesValidator(TEST004_PACKAGE_INTERFACE_STATELESS));
compileAndValidate(PKG_004,
config(LambdaGroupingScope.PACKAGE, /* interfaces: */false, /* stateless: */true),
new LambdaClassesValidator(TEST004_PACKAGE_STATELESS));
}
// ===============================================================================================
@Nonnull
private static final String PKG_005 = "com.android.jack.optimizations.lambdas.test005";
@Nonnull
private static final String SHA_005 = "mEUip-rZCi8VUKLKTaQF6NNk0aM";
@Nonnull
private static final String TEST005_PACKAGE = "" +
new Class(lambda(PKG_005, SHA_005, 0), types(PKG_005, "I0"))
.fields("$id:B")
.methods("<init>(B)V",
"$m$0()Ljava/lang/String;",
"$m$1()Ljava/lang/String;",
"foo()Ljava/lang/String;") +
new Class(lambda(PKG_005, SHA_005, 1), types(PKG_005, "I1"))
.methods("<init>()V",
"$m$0()Ljava/lang/String;",
"bar()Ljava/lang/String;") +
new Class(lambda(PKG_005, SHA_005, 2), types(PKG_005, "I0"))
.fields("$id:B", "-$f0:Ljava/lang/Object;")
.methods("<init>(BLjava/lang/Object;)V",
"$m$0()Ljava/lang/String;",
"$m$1()Ljava/lang/String;",
"$m$2()Ljava/lang/String;",
"$m$3()Ljava/lang/String;",
"$m$4()Ljava/lang/String;",
"foo()Ljava/lang/String;") +
new Class(lambda(PKG_005, SHA_005, 3), types(PKG_005, "I1"))
.fields("$id:B", "-$f0:Ljava/lang/Object;")
.methods("<init>(BLjava/lang/Object;)V",
"$m$0()Ljava/lang/String;",
"$m$1()Ljava/lang/String;",
"bar()Ljava/lang/String;");
@Nonnull
private static final String TEST005_PACKAGE_INTERFACE = "" +
new Class(lambda(PKG_005, SHA_005, 0), types(PKG_005, "I0", "I1"))
.fields("$id:B")
.methods("<init>(B)V",
"$m$0()Ljava/lang/String;",
"$m$1()Ljava/lang/String;",
"$m$2()Ljava/lang/String;",
"bar()Ljava/lang/String;",
"foo()Ljava/lang/String;") +
new Class(lambda(PKG_005, SHA_005, 1), types(PKG_005, "I0", "I1"))
.fields("$id:B", "-$f0:Ljava/lang/Object;")
.methods("<init>(BLjava/lang/Object;)V",
"$m$0()Ljava/lang/String;",
"$m$1()Ljava/lang/String;",
"$m$2()Ljava/lang/String;",
"$m$3()Ljava/lang/String;",
"$m$4()Ljava/lang/String;",
"$m$5()Ljava/lang/String;",
"$m$6()Ljava/lang/String;",
"bar()Ljava/lang/String;",
"foo()Ljava/lang/String;");
@Nonnull
private static final String TEST005_PACKAGE_INTERFACE_STATELESS = "" +
new Class(lambda(PKG_005, SHA_005, 0), types(PKG_005, "I0", "I1"))
.fields("$id:B",
"$INST$0:" + lambda(PKG_005, SHA_005, 0),
"$INST$1:" + lambda(PKG_005, SHA_005, 0),
"$INST$2:" + lambda(PKG_005, SHA_005, 0))
.methods("<clinit>()V", "<init>(B)V",
"$m$0()Ljava/lang/String;",
"$m$1()Ljava/lang/String;",
"$m$2()Ljava/lang/String;",
"bar()Ljava/lang/String;",
"foo()Ljava/lang/String;") +
new Class(lambda(PKG_005, SHA_005, 1), types(PKG_005, "I0", "I1"))
.fields("$id:B", "-$f0:Ljava/lang/Object;")
.methods("<init>(BLjava/lang/Object;)V",
"$m$0()Ljava/lang/String;",
"$m$1()Ljava/lang/String;",
"$m$2()Ljava/lang/String;",
"$m$3()Ljava/lang/String;",
"$m$4()Ljava/lang/String;",
"$m$5()Ljava/lang/String;",
"$m$6()Ljava/lang/String;",
"bar()Ljava/lang/String;",
"foo()Ljava/lang/String;");
@Test
@Runtime
public void test005() throws Exception {
compileAndValidate(PKG_005,
config(LambdaGroupingScope.PACKAGE, /* interfaces: */false, /* stateless: */false),
new LambdaClassesValidator(TEST005_PACKAGE));
compileAndValidate(PKG_005,
config(LambdaGroupingScope.PACKAGE, /* interfaces: */true, /* stateless: */false),
new LambdaClassesValidator(TEST005_PACKAGE_INTERFACE));
compileAndValidate(PKG_005,
config(LambdaGroupingScope.PACKAGE, /* interfaces: */true, /* stateless: */true),
new LambdaClassesValidator(TEST005_PACKAGE_INTERFACE_STATELESS));
}
// ===============================================================================================
@Nonnull
private static final String PKG_006 = "com.android.jack.optimizations.lambdas.test006";
@Nonnull
private static final String SHA_006_A = "wxKW61Ib1whleO_n58u3HsvIMUM";
@Nonnull
private static final String SHA_006_B = "N-kUn0qIgGhcb5JJeaFqgDggm3E";
@Nonnull
private static final String TEST006_NONE = "" +
new Class(lambda(PKG_006, SHA_006_A, 0), types(PKG_006, "Producer"))
.methods("<init>()V", "$m$0()Ljava/lang/String;", "run()Ljava/lang/String;") +
new Class(lambda(PKG_006, SHA_006_A, 1), types(PKG_006, "Producer"))
.methods("<init>()V", "$m$0()Ljava/lang/String;", "run()Ljava/lang/String;") +
new Class(lambda(PKG_006, SHA_006_A, 2), types(PKG_006, "Producer"))
.methods("<init>()V", "$m$0()Ljava/lang/String;", "run()Ljava/lang/String;") +
new Class(lambda(PKG_006, SHA_006_A, 3), types(PKG_006, "Producer"))
.methods("<init>()V", "$m$0()Ljava/lang/String;", "run()Ljava/lang/String;") +
new Class(lambda(PKG_006, SHA_006_B, 4), types(PKG_006, "Producer"))
.methods("<init>()V", "$m$0()Ljava/lang/String;", "run()Ljava/lang/String;") +
new Class(lambda(PKG_006, SHA_006_B, 5), types(PKG_006, "Producer"))
.methods("<init>()V", "$m$0()Ljava/lang/String;", "run()Ljava/lang/String;") +
new Class(lambda(PKG_006, SHA_006_B, 6), types(PKG_006, "Producer"))
.methods("<init>()V", "$m$0()Ljava/lang/String;", "run()Ljava/lang/String;") +
"";
@Nonnull
private static final String TEST006_TYPE = "" +
new Class(lambda(PKG_006, SHA_006_A, 0), types(PKG_006, "Producer"))
.fields("$id:B")
.methods("<init>(B)V", "$m$0()Ljava/lang/String;", "$m$1()Ljava/lang/String;",
"$m$2()Ljava/lang/String;", "$m$3()Ljava/lang/String;", "run()Ljava/lang/String;") +
new Class(lambda(PKG_006, SHA_006_B, 1), types(PKG_006, "Producer"))
.fields("$id:B")
.methods("<init>(B)V", "$m$0()Ljava/lang/String;", "$m$1()Ljava/lang/String;",
"$m$2()Ljava/lang/String;", "run()Ljava/lang/String;") +
"";
@Nonnull
private static final String SHA_006_ALL = "aRztprv3kbtT1k5EHkFo2yXbFfg";
@Nonnull
private static final String TEST006_PACKAGE = "" +
new Class(lambda(PKG_006, SHA_006_ALL, 0), types(PKG_006, "Producer"))
.fields("$id:B")
.methods("<init>(B)V", "$m$0()Ljava/lang/String;", "$m$1()Ljava/lang/String;",
"$m$2()Ljava/lang/String;", "$m$3()Ljava/lang/String;",
"$m$4()Ljava/lang/String;", "$m$5()Ljava/lang/String;",
"$m$6()Ljava/lang/String;", "run()Ljava/lang/String;") +
"";
@Test
@Runtime
public void test006() throws Exception {
compileAndValidate(PKG_006,
config(LambdaGroupingScope.NONE, /* interfaces: */false, /* stateless: */false),
new LambdaClassesValidator(TEST006_NONE));
compileAndValidate(PKG_006,
config(LambdaGroupingScope.TYPE, /* interfaces: */false, /* stateless: */false),
new LambdaClassesValidator(TEST006_TYPE));
compileAndValidate(PKG_006,
config(LambdaGroupingScope.PACKAGE, /* interfaces: */false, /* stateless: */false),
new LambdaClassesValidator(TEST006_PACKAGE));
}
// ===============================================================================================
@Nonnull
private static final String PKG_007 = "com.android.jack.optimizations.lambdas.test007";
@Nonnull
private static final String SHA_007 = "VIf7bh4a9R2eWK07TARcQzoADH4";
@Nonnull
private static final String TEST007_DEFAULT = "" +
new Class(lambda(PKG_007, SHA_007, 0), types(PKG_007, "Ic", "Ia", "Ib"))
.methods("<init>()V", "$m$0()Ljava/lang/String;", "m()Ljava/lang/String;") +
new Class(lambda(PKG_007, SHA_007, 1), types(PKG_007, "Ic", "Iaa"))
.methods("<init>()V", "$m$0()Ljava/lang/String;", "m()Ljava/lang/String;") +
new Class(lambda(PKG_007, SHA_007, 2), types(PKG_007, "Ic", "Ib"))
.methods("<init>()V", "$m$0()Ljava/lang/String;", "m()Ljava/lang/String;") +
new Class(lambda(PKG_007, SHA_007, 3), types(PKG_007, "Ic", "Ib", "Ia"))
.methods("<init>()V", "$m$0()Ljava/lang/String;", "m()Ljava/lang/String;") +
"";
@Nonnull
private static final String TEST007_MERGE_INTERFACES = "" +
new Class(lambda(PKG_007, SHA_007, 0), types(PKG_007, "Ia", "Iaa", "Ib", "Ic"))
.fields("$id:B")
.methods("<init>(B)V", "m()Ljava/lang/String;",
"$m$0()Ljava/lang/String;", "$m$1()Ljava/lang/String;",
"$m$2()Ljava/lang/String;", "$m$3()Ljava/lang/String;") +
"";
@Test
@Runtime
public void test007() throws Exception {
compileAndValidate(PKG_007,
config(LambdaGroupingScope.TYPE, /* interfaces: */false, /* stateless: */false)
.excludeJillToolchain(),
new LambdaClassesValidator(TEST007_DEFAULT));
compileAndValidate(PKG_007,
config(LambdaGroupingScope.TYPE, /* interfaces: */true, /* stateless: */false)
.excludeJillToolchain(),
new LambdaClassesValidator(TEST007_MERGE_INTERFACES));
}
// ===============================================================================================
@Nonnull
private static final String PKG_008 = "com.android.jack.optimizations.lambdas.test008";
@Test
@Runtime
public void test008() throws Exception {
String pkgDx = PKG_008 + "dx";
String pkgJack = PKG_008 + "jack";
IncrementalTestHelper ite =
new IncrementalTestHelper(AbstractTestTools.createTempDir());
// Enable Java8
ite.addProperty("jack.java.source.version", "1.8");
ite.addJavaFile(pkgDx, "Tests.java", Files.toString(
new File(new File(AbstractTestTools.getTestRootDir(PKG_008), "dx"), "Tests.java"),
Charset.defaultCharset()));
ite.addJavaFile(pkgJack, "B.java", Files.toString(
new File(new File(AbstractTestTools.getTestRootDir(PKG_008), "jack"), "B.java"),
Charset.defaultCharset()));
ite.incrementalBuildFromFolder();
// Run runtime tests
RuntimeTestHelper.runOnRuntimeEnvironments(
Collections.singletonList(PKG_008 + ".dx.Tests"),
RuntimeTestHelper.getJunitDex(), ite.getDexFile());
ite.addJavaFile(pkgJack, "A.java", Files.toString(
new File(new File(AbstractTestTools.getTestRootDir(PKG_008), "jack"), "A.java"),
Charset.defaultCharset()));
ite.incrementalBuildFromFolder();
// Run runtime tests
RuntimeTestHelper.runOnRuntimeEnvironments(
Collections.singletonList(PKG_008 + ".dx.Tests"),
RuntimeTestHelper.getJunitDex(), ite.getDexFile());
}
}