/*
* 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;
  }
}
