# -*- Python -*-

# Configuration file for the 'lit' test runner.

# name: The name of this test suite.
config.name = 'slang_lit_tests'

# suffixes: A list of file extensions to treat as test files.
config.suffixes = ['.rs', '.ll']

# testFormat: The test format to use to interpret tests.
import lit.formats
config.test_format = lit.formats.ShTest()

# Get the base build directory for the android source tree from environment.
config.base_path = os.getenv('ANDROID_BUILD_TOP')

# test_source_root: The path where tests are located (default is the test suite
# root).
config.test_source_root = None

# test_exec_root: The path where tests are located (default is the test suite
# root).
config.test_exec_root = os.path.join(config.base_path, 'out', 'tests', 'slang', 'lit-tests')

# target_triple: Used by ShTest and TclTest formats for XFAIL checks.
config.target_triple = 'slang'

def inferTool(binary_name, env_var, PATH):
    # Determine which tool to use.
    tool = os.getenv(env_var)

    # If the user set the overriding environment variable, use it
    if tool and os.path.isfile(tool):
        return tool

    # Otherwise look in the path.
    import lit.util
    tool = lit.util.which(binary_name, PATH)

    if not tool:
        lit_config.fatal("couldn't find " + binary_name + " program in " + PATH + " , try setting "
                         + env_var + " in your environment")

    return os.path.abspath(tool)

config.slang = inferTool('llvm-rs-cc', 'SLANG', os.path.join(os.getenv('ANDROID_HOST_OUT'), 'bin')).replace('\\', '/')
config.llvm_rs_as = inferTool('llvm-rs-as', 'LLVM_RS_AS', os.path.join(os.getenv('ANDROID_HOST_OUT'), 'bin')).replace('\\', '/')

config.filecheck = inferTool('FileCheck', 'FILECHECK', config.environment['PATH'])
config.rs_filecheck_wrapper = inferTool('rs-filecheck-wrapper.sh', 'RS_FILECHECK_WRAPPER', os.path.join(config.base_path, 'frameworks', 'compile', 'slang', 'lit-tests'))
config.scriptc_filecheck_wrapper = inferTool('scriptc-filecheck-wrapper.sh', 'SCRIPTC_FILECHECK_WRAPPER', os.path.join(config.base_path, 'frameworks', 'compile', 'slang', 'lit-tests'))

# Use most up-to-date headers for includes.
config.slang_includes = "-I " + os.path.join(config.base_path, 'frameworks', 'rs', 'scriptc') + " " \
                      + "-I " + os.path.join(config.base_path, 'external', 'clang', 'lib', 'Headers')

config.slang_options = "-emit-llvm -o " + config.test_exec_root \
                     + " -output-dep-dir " + config.test_exec_root \
                     + " -java-reflection-path-base " + config.test_exec_root

if not lit_config.quiet:
    lit_config.note('using slang: %r' % config.slang)
    lit_config.note('using llvm-rs-as: %r' % config.llvm_rs_as)
    lit_config.note('using FileCheck: %r' % config.filecheck)
    lit_config.note('using rs-filecheck-wrapper.sh: %r' % config.rs_filecheck_wrapper)
    lit_config.note('using output directory: %r' % config.test_exec_root)

# Tools configuration substitutions
config.substitutions.append( ('%Slang', ' ' + config.slang + ' ' + config.slang_includes + ' ' + config.slang_options ) )
config.substitutions.append( ('%llvm-rs-as', config.llvm_rs_as) )
config.substitutions.append( ('%rs-filecheck-wrapper', ' ' + config.rs_filecheck_wrapper + ' ' + config.test_exec_root + ' ' + config.filecheck + ' ') )
config.substitutions.append( ('%scriptc-filecheck-wrapper', ' ' + config.scriptc_filecheck_wrapper + ' --output=' + config.test_exec_root + ' --filecheck=' + config.filecheck + ' ') )
lit_config.note(config.substitutions)
