# -*- Python -*- vim: set ft=python ts=4 sw=4 expandtab tw=79:

# Configuration file for the 'lit' test runner.


import os
import site

site.addsitedir(os.path.dirname(__file__))


# Tell pylint that we know config and lit_config exist somewhere.
if 'PYLINT_IMPORT' in os.environ:
    config = object()
    lit_config = object()

# name: The name of this test suite.
config.name = 'libc++abi'

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

# Allow expanding substitutions that are based on other substitutions
config.recursiveExpansionLimit = 10

# test_source_root: The root path where tests are located.
config.test_source_root = os.path.dirname(__file__)

# Allow expanding substitutions that are based on other substitutions
config.recursiveExpansionLimit = 10

# Infer the libcxx_test_source_root for configuration import.
# If libcxx_source_root isn't specified in the config, assume that the libcxx
# and libcxxabi source directories are sibling directories.
libcxx_src_root = getattr(config, 'libcxx_src_root', None)
if not libcxx_src_root:
    libcxx_src_root = os.path.join(config.test_source_root, '../../libcxx')
libcxx_test_src_root = os.path.join(libcxx_src_root, 'utils')
if os.path.isfile(os.path.join(libcxx_test_src_root, 'libcxx', '__init__.py')):
    site.addsitedir(libcxx_test_src_root)
else:
    lit_config.fatal('Could not find libcxx test directory for test imports'
                     ' in: %s' % libcxx_test_src_root)

# Infer the test_exec_root from the libcxx_object root.
obj_root = getattr(config, 'libcxxabi_obj_root', None)

# Check that the test exec root is known.
if obj_root is None:
    import libcxx.test.config
    libcxx.test.config.loadSiteConfig(
        lit_config, config, 'libcxxabi_site_config', 'LIBCXXABI_SITE_CONFIG')
    obj_root = getattr(config, 'libcxxabi_obj_root', None)
    if obj_root is None:
        import tempfile
        obj_root = tempfile.mkdtemp(prefix='libcxxabi-testsuite-')
        lit_config.warning('Creating temporary directory for object root: %s' %
                           obj_root)

config.test_exec_root = os.path.join(obj_root, 'test')

cfg_variant = getattr(config, 'configuration_variant', 'libcxxabi')
if cfg_variant:
    lit_config.note('Using configuration variant: %s' % cfg_variant)

# Load the Configuration class from the module name <cfg_variant>.test.config.
config_module_name = '.'.join([cfg_variant, 'test', 'config'])
config_module = __import__(config_module_name, fromlist=['Configuration'])

configuration = config_module.Configuration(lit_config, config)
configuration.configure()
configuration.print_config_info()
if lit_config.params.get('use_old_format', False):
    lit_config.note("Using the old libc++ testing format")
    config.test_format = configuration.get_test_format()
else:
    lit_config.note("Using the new libc++ testing format")
    import libcxx.test.newformat
    config.test_format = libcxx.test.newformat.CxxStandardLibraryTest()
