# -*- 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']

# 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)

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()
