blob: 9c707e3947b277b8777d3552c51e17e132ce65b3 [file] [log] [blame]
/*
* Copyright (C) 2014 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.switchstatement;
import com.google.common.collect.Maps;
import com.android.jack.TestTools;
import com.android.jack.backend.dex.DexFileWriter;
import com.android.jack.test.category.RuntimeRegressionTest;
import com.android.jack.test.helper.RuntimeTestHelper;
import com.android.jack.test.junit.Runtime;
import com.android.jack.test.runtime.RuntimeTest;
import com.android.jack.test.runtime.RuntimeTestInfo;
import com.android.jack.test.toolchain.AbstractTestTools;
import com.android.jack.test.toolchain.IToolchain;
import com.android.jack.test.toolchain.IncrementalToolchain;
import com.android.jack.test.toolchain.JackBasedToolchain;
import com.android.jack.test.toolchain.JillApiToolchainBase;
import com.android.jack.test.toolchain.JillBasedToolchain;
import junit.framework.Assert;
import org.jf.dexlib.ClassDataItem.EncodedField;
import org.jf.dexlib.ClassDataItem.EncodedMethod;
import org.jf.dexlib.ClassDefItem;
import org.jf.dexlib.DexFile;
import org.jf.dexlib.ProtoIdItem;
import org.jf.dexlib.Code.Analysis.AnalyzedInstruction;
import org.jf.dexlib.Code.Analysis.MethodAnalyzer;
import org.jf.dexlib.Code.Format.PackedSwitchDataPseudoInstruction;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.internal.AssumptionViolatedException;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.annotation.Nonnull;
public class SwitchstatementTests extends RuntimeTest {
private RuntimeTestInfo TEST001 = new RuntimeTestInfo(
AbstractTestTools.getTestRootDir("com.android.jack.switchstatement.test001"),
"com.android.jack.switchstatement.test001.dx.Tests");
private RuntimeTestInfo TEST002 = new RuntimeTestInfo(
AbstractTestTools.getTestRootDir("com.android.jack.switchstatement.test002"),
"com.android.jack.switchstatement.test002.dx.Tests");
private RuntimeTestInfo TEST003 = new RuntimeTestInfo(
AbstractTestTools.getTestRootDir("com.android.jack.switchstatement.test003"),
"com.android.jack.switchstatement.test003.dx.Tests");
private RuntimeTestInfo TEST004 = new RuntimeTestInfo(
AbstractTestTools.getTestRootDir("com.android.jack.switchstatement.test004"),
"com.android.jack.switchstatement.test004.dx.Tests");
private RuntimeTestInfo TEST005 = new RuntimeTestInfo(
AbstractTestTools.getTestRootDir("com.android.jack.switchstatement.test005"),
"com.android.jack.switchstatement.test005.dx.Tests");
private RuntimeTestInfo TEST006 = new RuntimeTestInfo(
AbstractTestTools.getTestRootDir("com.android.jack.switchstatement.test006"),
"com.android.jack.switchstatement.test006.dx.Tests");
private RuntimeTestInfo TEST007 = new RuntimeTestInfo(
AbstractTestTools.getTestRootDir("com.android.jack.switchstatement.test007"),
"com.android.jack.switchstatement.test007.dx.Tests");
private RuntimeTestInfo TEST008 = new RuntimeTestInfo(
AbstractTestTools.getTestRootDir("com.android.jack.switchstatement.test008"),
"com.android.jack.switchstatement.test008.dx.Tests");
private RuntimeTestInfo TEST010 = new RuntimeTestInfo(
AbstractTestTools.getTestRootDir("com.android.jack.switchstatement.test010"),
"com.android.jack.switchstatement.test010.dx.Tests");
private RuntimeTestInfo TEST011 = new RuntimeTestInfo(
AbstractTestTools.getTestRootDir("com.android.jack.switchstatement.test011"),
"com.android.jack.switchstatement.test011.dx.Tests");
private RuntimeTestInfo TEST012 = new RuntimeTestInfo(
AbstractTestTools.getTestRootDir("com.android.jack.switchstatement.test012"),
"com.android.jack.switchstatement.test012.dx.Tests");
private RuntimeTestInfo TEST013 = new RuntimeTestInfo(
AbstractTestTools.getTestRootDir("com.android.jack.switchstatement.test013"),
"com.android.jack.switchstatement.test013.dx.Tests");
private RuntimeTestInfo TEST014 = new RuntimeTestInfo(
AbstractTestTools.getTestRootDir("com.android.jack.switchstatement.test014"),
"com.android.jack.switchstatement.test014.dx.Tests");
private RuntimeTestInfo TEST015 = new RuntimeTestInfo(
AbstractTestTools.getTestRootDir("com.android.jack.switchstatement.test015"),
"com.android.jack.switchstatement.test015.dx.Tests");
private RuntimeTestInfo TEST016 = new RuntimeTestInfo(
AbstractTestTools.getTestRootDir("com.android.jack.switchstatement.test016"),
"com.android.jack.switchstatement.test016.dx.Tests");
private RuntimeTestInfo TEST017 = new RuntimeTestInfo(
AbstractTestTools.getTestRootDir("com.android.jack.switchstatement.test017"),
"com.android.jack.switchstatement.test017.dx.Tests");
private RuntimeTestInfo TEST018 = new RuntimeTestInfo(
AbstractTestTools.getTestRootDir("com.android.jack.switchstatement.test018"),
"com.android.jack.switchstatement.test018.dx.Tests");
private RuntimeTestInfo TEST019 = new RuntimeTestInfo(
AbstractTestTools.getTestRootDir("com.android.jack.switchstatement.test019"),
"com.android.jack.switchstatement.test019.dx.Tests");
private RuntimeTestInfo TEST020 = new RuntimeTestInfo(
AbstractTestTools.getTestRootDir("com.android.jack.switchstatement.test020"),
"com.android.jack.switchstatement.test020.dx.Tests");
private RuntimeTestInfo TEST021 = new RuntimeTestInfo(
AbstractTestTools.getTestRootDir("com.android.jack.switchstatement.test021"),
"com.android.jack.switchstatement.test021.dx.Tests");
private RuntimeTestInfo TEST022 = new RuntimeTestInfo(
AbstractTestTools.getTestRootDir("com.android.jack.switchstatement.test022"),
"com.android.jack.switchstatement.test022.dx.Tests");
private RuntimeTestInfo TEST023 = new RuntimeTestInfo(
AbstractTestTools.getTestRootDir("com.android.jack.switchstatement.test023"),
"com.android.jack.switchstatement.test023.dx.Tests");
private RuntimeTestInfo TEST024 = new RuntimeTestInfo(
AbstractTestTools.getTestRootDir("com.android.jack.switchstatement.test024"),
"com.android.jack.switchstatement.test024.dx.Tests");
private RuntimeTestInfo TEST025 = new RuntimeTestInfo(
AbstractTestTools.getTestRootDir("com.android.jack.switchstatement.test025"),
"com.android.jack.switchstatement.test025.dx.Tests");
private RuntimeTestInfo TEST026 = new RuntimeTestInfo(
AbstractTestTools.getTestRootDir("com.android.jack.switchstatement.test026"),
"com.android.jack.switchstatement.test026.dx.Tests");
private RuntimeTestInfo TEST027 = new RuntimeTestInfo(
AbstractTestTools.getTestRootDir("com.android.jack.switchstatement.test027"),
"com.android.jack.switchstatement.test027.dx.Tests");
@Nonnull
private Map<String, String> properties = Maps.newHashMap();
@Before
public void setupTest() {
properties.clear();
properties.put("jack.optimization.enum.switch", "feedback");
}
@Test
@Runtime
@Category(RuntimeRegressionTest.class)
public void test001() throws Exception {
new RuntimeTestHelper(TEST001).compileAndRunTest();
}
@Test
@Runtime
@Category(RuntimeRegressionTest.class)
public void test002() throws Exception {
new RuntimeTestHelper(TEST002).compileAndRunTest();
}
@Test
public void testCompile002AsJackThenDex() throws Exception {
File outJackTmp = AbstractTestTools.createTempDir();
List<Class<? extends IToolchain>> exclude = new ArrayList<Class<? extends IToolchain>>();
exclude.add(JillApiToolchainBase.class);
{
// build as jack
JackBasedToolchain toolchain =
AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class, exclude);
toolchain.addToClasspath(toolchain.getDefaultBootClasspath())
.srcToLib(outJackTmp,
/* zipFiles = */false,
AbstractTestTools.getTestRootDir("com.android.jack.switchstatement.test002.jack"));
}
{
// build dex from jack
JackBasedToolchain toolchain =
AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class, exclude);
toolchain.libToExe(outJackTmp, AbstractTestTools.createTempDir(), /* zipFile = */false);
}
}
@Test
@Runtime
@Category(RuntimeRegressionTest.class)
public void test003() throws Exception {
new RuntimeTestHelper(TEST003).compileAndRunTest();
}
@Test
@Runtime
@Category(RuntimeRegressionTest.class)
public void test004() throws Exception {
new RuntimeTestHelper(TEST004).compileAndRunTest();
}
@Test
@Runtime
@Category(RuntimeRegressionTest.class)
public void test005() throws Exception {
new RuntimeTestHelper(TEST005).compileAndRunTest();
}
@Test
@Runtime
@Category(RuntimeRegressionTest.class)
public void test006() throws Exception {
new RuntimeTestHelper(TEST006).compileAndRunTest();
}
@Test
@Runtime
@Category(RuntimeRegressionTest.class)
public void test007() throws Exception {
new RuntimeTestHelper(TEST007).compileAndRunTest();
}
@Test
@Runtime
@Category(RuntimeRegressionTest.class)
public void test008() throws Exception {
new RuntimeTestHelper(TEST008).compileAndRunTest();
}
/**
* Test allowing to check that 'packed-switch-payload' into generated dex is as small as possible.
*/
@Test
public void testCompile9() throws Exception {
File outFolder = AbstractTestTools.createTempDir();
File out = new File(outFolder, DexFileWriter.DEX_FILENAME);
IToolchain toolchain = AbstractTestTools.getCandidateToolchain();
toolchain.addToClasspath(toolchain.getDefaultBootClasspath())
.srcToExe(
outFolder,
/* zipFile = */ false,
AbstractTestTools.getTestRootDir("com.android.jack.switchstatement.test009.jack"));
DexFile dexFile = new DexFile(out);
EncodedMethod em =
TestTools.getEncodedMethod(dexFile,
"Lcom/android/jack/switchstatement/test009/jack/Switch;", "switch1",
"(Lcom/android/jack/switchstatement/test009/jack/Switch$Num;)Z");
MethodAnalyzer ma = new MethodAnalyzer(em, false, null);
boolean packedSwitchDataPseudo = false;
for (AnalyzedInstruction ai : ma.getInstructions()) {
if (ai.getInstruction() instanceof PackedSwitchDataPseudoInstruction) {
packedSwitchDataPseudo = true;
Assert.assertEquals(5,
((PackedSwitchDataPseudoInstruction) ai.getInstruction()).getTargetCount());
}
}
Assert.assertTrue(packedSwitchDataPseudo);
}
@Test
@Runtime
@Category(RuntimeRegressionTest.class)
public void test010() throws Exception {
new RuntimeTestHelper(TEST010).compileAndRunTest();
}
@Test
@Runtime
@Category(RuntimeRegressionTest.class)
public void test011() throws Exception {
new RuntimeTestHelper(TEST011).compileAndRunTest();
}
@Test
public void testCompile012a() throws Exception {
String packageName = "com.android.jack.switchstatement.test012.jack";
String classPrefix = packageName.replace('.', '-') + "-";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Enum1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1", /*not contains Enum1*/ false));
input.put("Enum2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2", /*not contains Enum2*/ false));
input.put("Switch1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1", /*not contains Enum1*/ false));
input.put("Switch2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2", /*not contains Enum2*/ false));
input.put("SyntheticSwitchmapClass-*", new VerifierInfo(/*contains <init>*/ true).
specifyInfo(classPrefix + "Enum1", /*contains Enum1*/ true).
specifyInfo(classPrefix + "Enum2", /*contains Enum2*/ true));
compileCode(packageName, input);
}
@Test
public void testCompile012b() throws Exception {
String packageName = "com.android.jack.switchstatement.test012.jack";
String classPrefix = packageName.replace('.', '-') + "-";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Enum1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1", /*not contains Enum1*/ false));
input.put("Enum2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2", /*not contains Enum2*/ false));
input.put("Switch1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1", /*contains Enum1*/ true));
input.put("Switch2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2", /*contains Enum2*/ true));
compileCodeIncremental(packageName, input);
}
@Test
@Runtime
public void testRun012() throws Exception {
runTestCase(TEST012);
}
@Test
public void testCompile013a() throws Exception {
String packageName = "com.android.jack.switchstatement.test013.jack";
String classPrefix = packageName.replace('.', '-') + "-";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Enum1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1", /*not contains Enum1*/ false));
input.put("Enum2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2", /*not contains Enum2*/ false));
input.put("Switch1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1", /*not contains Enum1*/ false));
input.put("Switch2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2", /*not contains Enum2*/ false));
input.put("SyntheticSwitchmapClass-*", new VerifierInfo(/*contains <init>*/ true).
specifyInfo(classPrefix + "Enum1", /*contains Enum1*/ true).
specifyInfo(classPrefix + "Enum2", /*contains Enum2*/ true));
compileCode(packageName, input);
}
@Test
public void testCompile013b() throws Exception {
String packageName = "com.android.jack.switchstatement.test013.jack";
String classPrefix = packageName.replace('.', '-') + "-";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Enum1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1", /*not contains Enum1*/ false));
input.put("Enum2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2", /*not contains Enum2*/ false));
input.put("Switch1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1", /*contains Enum1*/ true));
input.put("Switch2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2", /*contains Enum2*/ true));
compileCodeIncremental(packageName, input);
}
@Test
@Runtime
public void testRun013() throws Exception {
runTestCase(TEST013);
}
@Test
public void testCompile014a() throws Exception {
String packageName = "com.android.jack.switchstatement.test014.jack";
String classPrefix = packageName.replace('.', '-') + "-";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Enum1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2$Enum2_", /*not contains Enum2*/ false));
input.put("Enum1$Enum1_", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum2$Enum2_", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2$Enum2_", /*not contains Enum2*/ false));
input.put("Switch1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Switch2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2$Enum2_", /*not contains Enum2*/ false));
input.put("SyntheticSwitchmapClass-*", new VerifierInfo(/*contains <init>*/ true).
specifyInfo(classPrefix + "Enum1$Enum1_", /*contains Enum1*/ true).
specifyInfo(classPrefix + "Enum2$Enum2_", /*contains Enum2*/ true));
compileCode(packageName, input);
}
@Test
public void testCompile014b() throws Exception {
String packageName = "com.android.jack.switchstatement.test014.jack";
String classPrefix = packageName.replace('.', '-') + "-";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Enum1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2$Enum2_", /*not contains Enum2*/ false));
input.put("Enum1$Enum1_", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum2$Enum2_", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2$Enum2_", /*not contains Enum2*/ false));
input.put("Switch1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*contains Enum1*/ true));
input.put("Switch2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2$Enum2_", /*contains Enum2*/ true));
compileCodeIncremental(packageName, input);
}
@Test
@Runtime
public void testRun014() throws Exception {
runTestCase(TEST014);
}
@Test
public void testCompile015a() throws Exception {
String packageName = "com.android.jack.switchstatement.test015.jack";
String classPrefix = packageName.replace('.', '-') + "-";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Enum1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2$Enum2_", /*not contains Enum2*/ false));
input.put("Enum1$Enum1_", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum2$Enum2_", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2$Enum2_", /*not contains Enum2*/ false));
input.put("Switch1", new VerifierInfo(/*contains <init>*/ true).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Switch2", new VerifierInfo(/*contains <init>*/ true).
specifyInfo(classPrefix + "Enum2$Enum2_", /*not contains Enum2*/ false));
input.put("SyntheticSwitchmapClass-*", new VerifierInfo(/*contains <init>*/ true).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ true).
specifyInfo(classPrefix + "Enum2$Enum2_", /*not contains Enum2*/ true));
compileCode(packageName, input);
}
@Test
public void testCompile015b() throws Exception {
String packageName = "com.android.jack.switchstatement.test015.jack";
String classPrefix = packageName.replace('.', '-') + "-";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Enum1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2$Enum2_", /*not contains Enum2*/ false));
input.put("Enum1$Enum1_", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum2$Enum2_", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2$Enum2_", /*not contains Enum2*/ false));
input.put("Switch1", new VerifierInfo(/*contains <init>*/ true).
specifyInfo(classPrefix + "Enum1$Enum1_", /*contains Enum1*/ true));
input.put("Switch2", new VerifierInfo(/*contains <init>*/ true).
specifyInfo(classPrefix + "Enum2$Enum2_", /*contains Enum2*/ true));
compileCodeIncremental(packageName, input);
}
@Test
@Runtime
public void testRun015() throws Exception {
runTestCase(TEST015);
}
@Test
public void testCompile016a() throws Exception {
String packageName = "com.android.jack.switchstatement.test016.jack";
String classPrefix = packageName.replace('.', '-') + "-";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Enum1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum1$Enum1_", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum1$Switch1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum1$Switch2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("SyntheticSwitchmapClass-*", new VerifierInfo(/*contains <init>*/ true).
specifyInfo(classPrefix + "Enum1$Enum1_", /*contains Enum1*/ true));
compileCode(packageName, input);
}
@Test
public void testCompile016b() throws Exception {
String packageName = "com.android.jack.switchstatement.test016.jack";
String classPrefix = packageName.replace('.', '-') + "-";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Enum1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum1$Enum1_", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum1$Switch1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*contains Enum1*/ true));
input.put("Enum1$Switch2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*contains Enum1*/ true));
compileCodeIncremental(packageName, input);
}
@Test
@Runtime
public void testRun016() throws Exception {
runTestCase(TEST016);
}
@Test
public void testCompile017a() throws Exception {
String packageName = "com.android.jack.switchstatement.test017.jack";
String classPrefix = packageName.replace('.', '-') + "-";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Enum1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum1$Enum1_", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum1$Switch1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*contains Enum1*/ true));
compileCode(packageName, input);
}
@Test
public void testCompile017b() throws Exception {
String packageName = "com.android.jack.switchstatement.test017.jack";
String classPrefix = packageName.replace('.', '-') + "-";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Enum1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum1$Enum1_", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum1$Switch1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*contains Enum1*/ true));
compileCodeIncremental(packageName, input);
}
@Test
@Runtime
public void testRun017() throws Exception {
runTestCase(TEST017);
}
@Test
public void testCompile018a() throws Exception {
String packageName = "com.android.jack.switchstatement.test018.jack";
String classPrefix = packageName.replace('.', '-') + "-";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Enum1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1", /*not contains Enum1*/ false));
input.put("Enum2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2", /*not contains Enum2*/ false));
input.put("Switch1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1", /*not contains Enum1*/ false));
input.put("Switch2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2", /*not contains Enum2*/ false));
input.put("SyntheticSwitchmapClass-*", new VerifierInfo(/*contains <init>*/ true).
specifyInfo(classPrefix + "Enum1", /*contains Enum1*/ true).
specifyInfo(classPrefix + "Enum2", /*contains Enum2*/ true));
compileCode(packageName, input);
}
@Test
public void testCompile018b() throws Exception {
String packageName = "com.android.jack.switchstatement.test018.jack";
String classPrefix = packageName.replace('.', '-') + "-";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Enum1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1", /*not contains Enum1*/ false));
input.put("Enum2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2", /*not contains Enum2*/ false));
input.put("Switch1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1", /*contains Enum1*/ true));
input.put("Switch2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2", /*contains Enum2*/ true));
compileCodeIncremental(packageName, input);
}
@Test
@Runtime
public void testRun018() throws Exception {
runTestCase(TEST018);
}
@Test
public void testCompile019a() throws Exception {
String packageName = "com.android.jack.switchstatement.test019.jack";
String classPrefix = packageName.replace('.', '-') + "-";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Enum1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1", /*not contains Enum1*/ false));
input.put("Enum2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2", /*not contains Enum2*/ false));
input.put("Switch1", new VerifierInfo(/*contains <init>*/ true).
specifyInfo(classPrefix + "Enum1", /*not contains Enum1*/ false));
input.put("Switch2", new VerifierInfo(/*contains <init>*/ true).
specifyInfo(classPrefix + "Enum2", /*not contains Enum2*/ false));
input.put("SyntheticSwitchmapClass-*", new VerifierInfo(/*contains <init>*/ true).
specifyInfo(classPrefix + "Enum1", /*not contains Enum1*/ true).
specifyInfo(classPrefix + "Enum2", /*not contains Enum2*/ true));
compileCode(packageName, input);
}
@Test
public void testCompile019b() throws Exception {
String packageName = "com.android.jack.switchstatement.test019.jack";
String classPrefix = packageName.replace('.', '-') + "-";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Enum1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1", /*not contains Enum1*/ false));
input.put("Enum2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2", /*not contains Enum2*/ false));
input.put("Switch1", new VerifierInfo(/*contains <init>*/ true).
specifyInfo(classPrefix + "Enum1", /*contains Enum1*/ true));
input.put("Switch2", new VerifierInfo(/*contains <init>*/ true).
specifyInfo(classPrefix + "Enum2", /*contains Enum2*/ true));
compileCodeIncremental(packageName, input);
}
@Test
@Runtime
public void testRun019() throws Exception {
runTestCase(TEST019);
}
@Test
public void testCompile020a() throws Exception {
String packageName = "com.android.jack.switchstatement.test020.jack";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Switch1", new VerifierInfo(/*contains <init>*/ true).
specifyInfo("java-lang-Thread$State", /*not contains State*/ false));
input.put("Switch2", new VerifierInfo(/*contains <init>*/ true).
specifyInfo("java-lang-Thread$State", /*not contains State*/ false));
input.put("SyntheticSwitchmapClass-*", new VerifierInfo(/*contains <init>*/ true).
specifyInfo("java-lang-Thread$State", /*contains State*/ true));
compileCode(packageName, input);
}
@Test
public void testCompile020b() throws Exception {
String packageName = "com.android.jack.switchstatement.test020.jack";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Switch1", new VerifierInfo(/*contains <init>*/ true).
specifyInfo("java-lang-Thread$State", /*contains State*/ true));
input.put("Switch2", new VerifierInfo(/*contains <init>*/ true).
specifyInfo("java-lang-Thread$State", /*contains State*/ true));
compileCodeIncremental(packageName, input);
}
@Test
@Runtime
public void testRun020() throws Exception {
runTestCase(TEST020);
}
@Test
public void testCompile021a() throws Exception {
String packageName = "com.android.jack.switchstatement.test021.jack";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Switch1", new VerifierInfo(/*contains <init>*/ true).
specifyInfo("java-lang-Thread$State", /*contain State*/ true));
compileCode(packageName, input);
}
@Test
public void testCompile021b() throws Exception {
String packageName = "com.android.jack.switchstatement.test021.jack";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Switch1", new VerifierInfo(/*contains <init>*/ true).
specifyInfo("java-lang-Thread$State", /*contain State*/ true));
compileCodeIncremental(packageName, input);
}
@Test
@Runtime
public void testRun021() throws Exception {
runTestCase(TEST021);
}
@Test
public void testCompile022a() throws Exception {
String packageName = "com.android.jack.switchstatement.test022.jack";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Switch1", new VerifierInfo(/*contains <init>*/ true).
specifyInfo("java-lang-Thread$State", /*contain State*/ true));
compileCode(packageName, input);
}
@Test
public void testCompile022b() throws Exception {
String packageName = "com.android.jack.switchstatement.test022.jack";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Switch1", new VerifierInfo(/*contains <init>*/ true).
specifyInfo("java-lang-Thread$State", /*contain State*/ true));
compileCodeIncremental(packageName, input);
}
@Test
@Runtime
public void testRun022() throws Exception {
runTestCase(TEST022);
}
@Test
public void testCompile023a() throws Exception {
String packageName = "com.android.jack.switchstatement.test023.jack";
String classPrefix = packageName.replace('.', '-') + "-";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Switch1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Switch2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2$Enum2_", /*not contains Enum2*/ false));
input.put("Enum1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2$Enum2_", /*not contains Enum2*/ false));
input.put("Enum1$Enum1_", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum2$Enum2_", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2$Enum2_", /*not contains Enum2*/ false));
input.put("SyntheticSwitchmapClass-*", new VerifierInfo(/*contains <init>*/ true).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ true).
specifyInfo(classPrefix + "Enum2$Enum2_", /*not contains Enum2*/ true));
compileCode(packageName, input);
}
@Test
public void testCompile023b() throws Exception {
String packageName = "com.android.jack.switchstatement.test023.jack";
String classPrefix = packageName.replace('.', '-') + "-";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Switch1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*contains Enum1*/ true));
input.put("Switch2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2$Enum2_", /*contains Enum2*/ true));
input.put("Enum1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2$Enum2_", /*not contains Enum2*/ false));
input.put("Enum1$Enum1_", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum2$Enum2_", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2$Enum2_", /*not contains Enum2*/ false));
compileCodeIncremental(packageName, input);
}
@Test
@Runtime
public void testRun023() throws Exception {
runTestCase(TEST023);
}
@Test
public void testCompile024a() throws Exception {
String packageName = "com.android.jack.switchstatement.test024.jack";
String classPrefix = packageName.replace('.', '-') + "-";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Switch1", new VerifierInfo(/*contains <init>*/ true).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Switch2", new VerifierInfo(/*contains <init>*/ true).
specifyInfo(classPrefix + "Enum2$Enum2_", /*not contains Enum2*/ false));
input.put("Enum1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2$Enum2_", /*not contains Enum2*/ false));
input.put("Enum1$Enum1_", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum2$Enum2_", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2$Enum2_", /*not contains Enum2*/ false));
input.put("SyntheticSwitchmapClass-*", new VerifierInfo(/*contains <init>*/ true).
specifyInfo(classPrefix + "Enum1$Enum1_", /*contains Enum1*/ true).
specifyInfo(classPrefix + "Enum2$Enum2_", /*contains Enum2*/ true));
compileCode(packageName, input);
}
@Test
public void testCompile024b() throws Exception {
String packageName = "com.android.jack.switchstatement.test024.jack";
String classPrefix = packageName.replace('.', '-') + "-";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Switch1", new VerifierInfo(/*contains <init>*/ true).
specifyInfo(classPrefix + "Enum1$Enum1_", /*contains Enum1*/ true));
input.put("Switch2", new VerifierInfo(/*contains <init>*/ true).
specifyInfo(classPrefix + "Enum2$Enum2_", /*contains Enum2*/ true));
input.put("Enum1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2$Enum2_", /*not contains Enum2*/ false));
input.put("Enum1$Enum1_", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum2$Enum2_", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum2$Enum2_", /*not contains Enum2*/ false));
compileCodeIncremental(packageName, input);
}
@Test
@Runtime
public void testRun024() throws Exception {
runTestCase(TEST024);
}
@Test
public void testCompile025a() throws Exception {
String packageName = "com.android.jack.switchstatement.test025.jack";
String classPrefix = packageName.replace('.', '-') + "-";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Enum1$Switch1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum1$Switch2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum1$Enum1_", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("SyntheticSwitchmapClass-*", new VerifierInfo(/*contains <init>*/ true).
specifyInfo(classPrefix + "Enum1$Enum1_", /*contains Enum1*/ true));
compileCode(packageName, input);
}
@Test
public void testCompile025b() throws Exception {
String packageName = "com.android.jack.switchstatement.test025.jack";
String classPrefix = packageName.replace('.', '-') + "-";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Enum1$Switch1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*contains Enum1*/ true));
input.put("Enum1$Switch2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*contains Enum1*/ true));
input.put("Enum1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum1$Enum1_", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
compileCodeIncremental(packageName, input);
}
@Test
@Runtime
public void testRun025() throws Exception {
runTestCase(TEST025);
}
@Test
public void testCompile026a() throws Exception {
String packageName = "com.android.jack.switchstatement.test026.jack";
String classPrefix = packageName.replace('.', '-') + "-";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Enum1$Switch1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*contains Enum1*/ true));
input.put("Enum1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum1$Enum1_", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
compileCode(packageName, input);
}
@Test
public void testCompile026b() throws Exception {
String packageName = "com.android.jack.switchstatement.test026.jack";
String classPrefix = packageName.replace('.', '-') + "-";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Enum1$Switch1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*contains Enum1*/ true));
input.put("Enum1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
input.put("Enum1$Enum1_", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Enum1$Enum1_", /*not contains Enum1*/ false));
compileCodeIncremental(packageName, input);
}
@Test
@Runtime
public void testRun026() throws Exception {
runTestCase(TEST026);
}
@Test
public void testCompile027a() throws Exception {
String packageName = "com.android.jack.switchstatement.test027.jack";
String classPrefix = packageName.replace('.', '-') + "-";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Switch1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Switch1$InnerClass1$Enum1", /*not contains Enum1*/ false).
specifyInfo(classPrefix + "Switch1$InnerClass1$InnerClass2$Enum2", /*not contains Enum1*/ false));
input.put("Switch1$InnerClass1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Switch1$InnerClass1$Enum1", /*not contains Enum1*/ false));
input.put("Switch1$InnerClass1$InnerClass2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Switch1$InnerClass1$InnerClass2$Enum2", /*not contains Enum1*/ false));
input.put("Switch1$InnerClass1$Enum1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Switch1$InnerClass1$Enum1", /*not contains Enum1*/ false));
input.put("Switch1$InnerClass1$InnerClass2$Enum2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Switch1$InnerClass1$InnerClass2$Enum2", /*not contains Enum1*/ false));
input.put("SyntheticSwitchmapClass-*", new VerifierInfo(/*contains <init>*/ true).
specifyInfo(classPrefix + "Switch1$InnerClass1$Enum1", /*contains Enum1*/ true).
specifyInfo(classPrefix + "Switch1$InnerClass1$InnerClass2$Enum2", /*contains Enum1*/ true));
compileCode(packageName, input);
}
@Test
public void testCompile027b() throws Exception {
String packageName = "com.android.jack.switchstatement.test027.jack";
String classPrefix = packageName.replace('.', '-') + "-";
Map<String, VerifierInfo> input = Maps.newHashMap();
input.put("Switch1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Switch1$InnerClass1$Enum1", /*not contains Enum1*/ false).
specifyInfo(classPrefix + "Switch1$InnerClass1$InnerClass2$Enum2", /*not contains Enum1*/ false));
input.put("Switch1$InnerClass1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Switch1$InnerClass1$Enum1", /*contains Enum1*/ true));
input.put("Switch1$InnerClass1$InnerClass2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Switch1$InnerClass1$InnerClass2$Enum2", /*contains Enum1*/ true));
input.put("Switch1$InnerClass1$Enum1", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Switch1$InnerClass1$Enum1", /*not contains Enum1*/ false));
input.put("Switch1$InnerClass1$InnerClass2$Enum2", new VerifierInfo(/*not contains <init>*/ false).
specifyInfo(classPrefix + "Switch1$InnerClass1$InnerClass2$Enum2", /*not contains Enum1*/ false));
compileCodeIncremental(packageName, input);
}
@Test
@Runtime
public void testRun027() throws Exception {
runTestCase(TEST027);
}
private void compileCode(
String packageName,
Map<String, VerifierInfo> input) throws Exception {
// match the result with enum switch optimization enabled
List<Class<? extends IToolchain>> excludedToolchains = new ArrayList<Class<? extends IToolchain>>(2);
excludedToolchains.add(JillBasedToolchain.class);
excludedToolchains.add(IncrementalToolchain.class);
JackBasedToolchain toolchain =
AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class, excludedToolchains);
checkCompiledCode(toolchain, packageName, input);
}
private void compileCodeIncremental(
String packageName,
Map<String, VerifierInfo> input) throws Exception {
// match the result when incremental compilation is enabled
JackBasedToolchain toolchain = AbstractTestTools.getCandidateToolchain(IncrementalToolchain.class);
checkCompiledCode(toolchain, packageName, input);
}
/**
* Compile the code with our analysis enabled, then check if it is successful.
* @param toolchain the used toolchain. It must be set with correct candidates
* @param packageName the package name of test case
* @param classMap the map from class signature to its method signature
*/
private void checkCompiledCode(
@Nonnull JackBasedToolchain toolchain,
@Nonnull String packageName,
@Nonnull Map<String, VerifierInfo> classMap) throws Exception {
File outFolder = AbstractTestTools.createTempDir();
File out = new File(outFolder, DexFileWriter.DEX_FILENAME);
for (Map.Entry<String, String> entry : properties.entrySet()) {
toolchain.addProperty(entry.getKey(), entry.getValue());
}
toolchain.addToClasspath(toolchain.getDefaultBootClasspath()).srcToExe(outFolder,
/* zipFile = */ false, AbstractTestTools.getTestRootDir(packageName));
DexFile dexFile = new DexFile(out);
List<ClassDefItem> classDefs = dexFile.ClassDefsSection.getItems();
Assert.assertEquals(classMap.size(), classDefs.size());
for (String classSig : classMap.keySet()) {
boolean matchClass = false;
for (ClassDefItem classDef : classDefs) {
String typeDescriptor = classDef.getClassType().getTypeDescriptor();
typeDescriptor = typeDescriptor.substring(typeDescriptor.lastIndexOf('/') + 1, typeDescriptor.length() - 1);
if (classSig.endsWith("*") && typeDescriptor.startsWith(classSig.substring(0, classSig.length() - 1))
// match the prefix only
|| classSig.equals(typeDescriptor)) {
VerifierInfo verifierInfo = classMap.get(classSig);
for (Map.Entry<String, Boolean> spec : verifierInfo.getInfo().entrySet()) {
String enumType = spec.getKey();
Assert.assertEquals(spec.getValue().booleanValue(), containsSwitchmapInitializer(classDef, enumType));
Assert.assertEquals(spec.getValue().booleanValue(), containsSwitchmapField(classDef, enumType));
}
if (verifierInfo.containsInitMethod()) {
Assert.assertTrue(checkInitMethods(classDef));
}
matchClass = true;
break;
}
}
Assert.assertTrue(matchClass);
}
}
/**
* Compile and execute the instrumented code.
* @param testInfo The runtime test information including package and class file
*/
private void runTestCase(RuntimeTestInfo testInfo) throws Exception {
RuntimeTestHelper rtHelper = new RuntimeTestHelper(testInfo);
for (Map.Entry<String, String> propEntry : properties.entrySet()) {
rtHelper.addProperty(propEntry.getKey(), propEntry.getValue());
}
rtHelper.compileAndRunTest();
}
@Override
protected void fillRtTestInfos() {
rtTestInfos.add(TEST001);
rtTestInfos.add(TEST002);
rtTestInfos.add(TEST003);
rtTestInfos.add(TEST004);
rtTestInfos.add(TEST005);
rtTestInfos.add(TEST006);
rtTestInfos.add(TEST007);
rtTestInfos.add(TEST008);
rtTestInfos.add(TEST010);
}
/**
* This method is used to check if switch map initializer exists in given
* class.
* @param classItem The input class
* @param enumString The enum signature in the format of A_B_Enum
* @return Return true if it contains switch map initializer
*/
private boolean containsSwitchmapInitializer(ClassDefItem classItem, String enumString) {
for (EncodedMethod method : classItem.getClassData().getDirectMethods()) {
String methodName = method.method.getMethodName().getStringValue();
ProtoIdItem protoItem = method.method.getPrototype();
if (methodName.equals("-get" + enumString + "SwitchesValues")
&& "()[I".equals(protoItem.getPrototypeString())) {
// not only match class signature, but also statements
return true;
}
}
return false;
}
/**
* This method is used to check if switch map field exists in given
* class.
* @param classItem The input class
* @param enumString The enum signature in the format of A_B_Enum
* @return Return true if it contains switch map field
*/
private boolean containsSwitchmapField(ClassDefItem classItem, String enumString) {
for (EncodedField field : classItem.getClassData().getStaticFields()) {
String fieldName = field.field.getFieldName().getStringValue();
if (fieldName.equals("-" + enumString + "SwitchesValues")
&& "[I".equals(field.field.getFieldType().getTypeDescriptor())) {
return true;
}
}
return false;
}
/**
* This method is used to check
* <li> if instance constructor exists in given class </li>
* <li> if class constructor doesn't exist in given class </li>
* @param classItem The input class
* @return Return true if the instance exists but class constructor doesn't
*/
private boolean checkInitMethods(ClassDefItem classItem) {
for (EncodedMethod method : classItem.getClassData().getDirectMethods()) {
String methodName = method.method.getShortMethodString();
if (methodName.equals("<init>()V")) {
return true;
} else if (methodName.equals("<clinit>()V")) {
return false;
}
}
return false;
}
private class VerifierInfo {
/**
* Constructor.
* @param
*/
VerifierInfo(boolean containsInitMethod) {
this.containsInitMethod = containsInitMethod;
}
/**
* Remember the specification.
* @param enumType The given enum type
* @param contains If the given enum type is contained inside of class
*
* @return this instance of object
*/
@Nonnull
VerifierInfo specifyInfo(@Nonnull String enumType, @Nonnull boolean contains) {
enumTypeMap.put(enumType, Boolean.valueOf(contains));
return this;
}
/**
* Get the verification specification information.
*
* @return The verification specification information
*/
@Nonnull
Map<String, Boolean> getInfo() {
return enumTypeMap;
}
/**
* Get the specification on if the init method is contained inside of class
* @return true if init method is contained
*/
@Nonnull
boolean containsInitMethod() {
return containsInitMethod;
}
// specify if the given enumType which is used as key is contained in the class
private Map<String, Boolean> enumTypeMap = Maps.newHashMap();
// if the associated class contains the object initialization method
private final boolean containsInitMethod;
}
}