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

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