#!/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.

import os
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 = os.path.join('build', 'generated', 'test', 'java', 'com',
                          'android', 'tools', 'r8', 'art')
# Test that comes from Jack are generated from the legacy snapshot.
JACK_TEST = os.path.join('tests', '2016-12-19', 'art')
TEST_DIR = os.path.join('tests', '2017-10-04', 'art')
TOOLCHAINS = ["dx", "jack", "none"]
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 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(DexVm.ART_4_4_4_HOST, CompilerUnderTest.$compilerUnderTestEnum).
      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"))
  makedirs(join(toolchain_dir, "r8cf"))

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)
  # For the toolchain "jack" tests are generated from a previous snapshot.
  if (toolchain == "jack"):
    source_dir = join(JACK_TEST, 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)
      if tool == "r8cf":
        if toolchain != "none":
          continue
        tool_enum = 'D8_AFTER_R8CF'
      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())
