#!/usr/bin/env python3
# Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.

import os
import shutil
from string import Template

OUTPUT_DIR = os.path.join('build', 'generated', 'test', 'java', 'com',
                          'android', 'tools', 'r8', 'art')
TEST_DIR = os.path.join('tests', '2017-10-04', 'art')
TOOLCHAINS = [
    ("none", os.path.join(TEST_DIR, "dx")),
]
TOOLS = ["r8", "d8", "r8cf"]
TEMPLATE = Template(
"""// Copyright (c) 2016, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.art.$testGeneratingToolchain.$compilerUnderTest;

import static com.android.tools.r8.R8RunArtTestsTest.DexTool.$testGeneratingToolchainEnum;

import com.android.tools.r8.R8RunArtTestsTest;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.ToolHelper.DexVm;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

/**
 * Auto-generated test for the art $name test using the $testGeneratingToolchain toolchain.
 *
 * DO NOT EDIT THIS FILE. EDIT THE HERE DOCUMENT TEMPLATE IN tools/create_art_tests.py INSTEAD!
 */
@RunWith(Parameterized.class)
public class $testClassName extends R8RunArtTestsTest {

    @Parameters(name = "{0}")
    public static TestParametersCollection data() {
      return TestBase.getTestParameters().withDexRuntimes().build();
    }

    private final TestParameters parameters;

    public $testClassName(TestParameters parameters) {
      super("$name", $testGeneratingToolchainEnum);
      this.parameters = parameters;
    }

    @Test
    public void test() throws Throwable {
      runArtTest(parameters.getRuntime().asDex().getVm(), CompilerUnderTest.$compilerUnderTestEnum);
    }
}
""")


def get_test_configurations():
  for toolchain, source_dir in TOOLCHAINS:
    for tool in TOOLS:
      if tool == "d8" and toolchain == "none":
        tool_enum = 'R8_AFTER_D8'
      else:
        tool_enum = tool.upper()
      if tool == "r8cf":
        if toolchain != "none":
          continue
        tool_enum = 'D8_AFTER_R8CF'
      output_dir = os.path.join(OUTPUT_DIR, toolchain, tool)
      yield (tool_enum, tool, toolchain, source_dir, output_dir)


def create_tests():
  for tool_enum, tool, toolchain, source_dir, output_dir in get_test_configurations():
    test_cases = [d for d in os.listdir(source_dir)
                  if os.path.isdir(os.path.join(source_dir, d))]
    if os.path.exists(output_dir):
      shutil.rmtree(output_dir)
    os.makedirs(output_dir)
    for test_case in test_cases:
      class_name = "Art" + test_case.replace("-", "_") + "Test"
      contents = TEMPLATE.substitute(
          name=test_case,
          compilerUnderTestEnum=tool_enum,
          compilerUnderTest=tool,
          testGeneratingToolchain=toolchain,
          testGeneratingToolchainEnum=toolchain.upper(),
          testClassName=class_name)
      with open(os.path.join(output_dir, class_name + ".java"), "w") as fp:
        fp.write(contents)


def main():
  create_tests()


if __name__ == "__main__":
  main()
