#!/usr/bin/env python
# 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.

from os import makedirs, listdir
from os.path import join, exists, isdir
from string import Template, upper
from sys import exit
from shutil import rmtree

OUTPUT_DIR = "build/generated/test/java/com/android/tools/r8/art"
TEST_DIR = "tests/2017-07-27/art"
TOOLCHAINS = ["dx", "jack", "none"]
TOOLS = ["r8", "d8"]
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 org.junit.Test;

/**
 * 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!
 */
public class $testClassName extends R8RunArtTestsTest {

    public $testClassName() {
      super("$name", $testGeneratingToolchainEnum);
    }

    @Test
    public void run$testClassName() throws Throwable {
      // For testing with other Art VMs than the default pass the VM version as a argument to
      // runArtTest, e.g. runArtTest(ToolHelper.ART_4_4_4).
      runArtTest(CompilerUnderTest.$compilerUnderTestEnum);
    }
}
""")

def create_toolchain_dirs(toolchain):
  toolchain_dir = join(OUTPUT_DIR, toolchain)
  if exists(toolchain_dir):
    rmtree(toolchain_dir)
  makedirs(join(toolchain_dir, "d8"))
  makedirs(join(toolchain_dir, "r8"))

def write_file(toolchain, tool, class_name, contents):
  file_name = join(OUTPUT_DIR, toolchain, tool, class_name + ".java")
  with open(file_name, "w") as file:
    file.write(contents)

def create_tests(toolchain):
  source_dir = join(TEST_DIR, "dx" if toolchain == "none" else toolchain)
  dirs = [d for d in listdir(source_dir)
          if isdir(join(source_dir, d))]
  for dir in dirs:
    class_name = "Art" + dir.replace("-", "_") + "Test"
    for tool in TOOLS:
      if tool == "d8" and toolchain == "none":
        tool_enum = 'R8_AFTER_D8'
      else:
        tool_enum = upper(tool)
      contents = TEMPLATE.substitute(
          name=dir,
          compilerUnderTestEnum=tool_enum,
          compilerUnderTest=tool,
          testGeneratingToolchain=toolchain,
          testGeneratingToolchainEnum=upper(toolchain),
          testClassName=class_name)
      write_file(toolchain, tool, class_name, contents)


def main():
  for toolchain in TOOLCHAINS:
    create_toolchain_dirs(toolchain)
    create_tests(toolchain)

if __name__ == "__main__":
  exit(main())
