# -*- 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.join(os.path.dirname(os.path.dirname(__file__)), 'utils'))


# 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++'

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

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

loaded_site_cfg = getattr(config, 'loaded_site_config', False)
if not loaded_site_cfg:
    import libcxx.test.config
    libcxx.test.config.loadSiteConfig(lit_config, config, 'libcxx_site_config',
                                      'LIBCXX_SITE_CONFIG')

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

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

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

cfg_variant = getattr(config, 'configuration_variant', 'libcxx')
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()
config.test_format = configuration.get_test_format()
