"""
Provides definitions for various lldb test categories
"""

from __future__ import absolute_import
from __future__ import print_function

# System modules
import sys

# Third-party modules

# LLDB modules
from lldbsuite.support import gmodules


debug_info_categories = [
    'dwarf', 'dwo', 'dsym', 'gmodules'
]

all_categories = {
    'basic_process': 'Basic process execution sniff tests.',
    'cmdline': 'Tests related to the LLDB command-line interface',
    'dataformatters': 'Tests related to the type command and the data formatters subsystem',
    'debugserver': 'Debugserver tests',
    'dsym': 'Tests that can be run with DSYM debug information',
    'dwarf': 'Tests that can be run with DWARF debug information',
    'dwo': 'Tests that can be run with DWO debug information',
    'dyntype': 'Tests related to dynamic type support',
    'expression': 'Tests related to the expression parser',
    'flakey': 'Flakey test cases, i.e. tests that do not reliably pass at each execution',
    'fork': 'Tests requiring the process plugin fork/vfork event support',
    'gmodules': 'Tests that can be run with -gmodules debug information',
    'instrumentation-runtime': 'Tests for the instrumentation runtime plugins',
    'libc++': 'Test for libc++ data formatters',
    'libstdcxx': 'Test for libstdcxx data formatters',
    'lldb-server': 'Tests related to lldb-server',
    'lldb-vscode': 'Visual Studio Code debug adaptor tests',
    'llgs': 'Tests for the gdb-server functionality of lldb-server',
    'objc': 'Tests related to the Objective-C programming language support',
    'pyapi': 'Tests related to the Python API',
    'std-module': 'Tests related to importing the std module',
    'stresstest': 'Tests related to stressing lldb limits',
    'watchpoint': 'Watchpoint-related tests',
}


def unique_string_match(yourentry, list):
    candidate = None
    for item in list:
        if not item.startswith(yourentry):
            continue
        if candidate:
            return None
        candidate = item
    return candidate


def is_supported_on_platform(category, platform, compiler_path):
    if category == "dwo":
        # -gsplit-dwarf is not implemented by clang on Windows.
        return platform in ["linux", "freebsd"]
    elif category == "dsym":
        return platform in ["darwin", "macosx", "ios", "watchos", "tvos", "bridgeos"]
    elif category == "gmodules":
        # First, check to see if the platform can even support gmodules.
        if platform not in ["freebsd", "darwin", "macosx", "ios", "watchos", "tvos", "bridgeos"]:
            return False
        return gmodules.is_compiler_clang_with_gmodules(compiler_path)
    return True


def validate(categories, exact_match):
    """
    For each category in categories, ensure that it's a valid category (if exact_match is false,
    unique prefixes are also accepted). If a category is invalid, print a message and quit.
       If all categories are valid, return the list of categories. Prefixes are expanded in the
       returned list.
    """
    result = []
    for category in categories:
        origCategory = category
        if category not in all_categories and not exact_match:
            category = unique_string_match(category, all_categories)
        if (category not in all_categories) or category is None:
            print(
                "fatal error: category '" +
                origCategory +
                "' is not a valid category")
            print("if you have added a new category, please edit test_categories.py, adding your new category to all_categories")
            print("else, please specify one or more of the following: " +
                  str(list(all_categories.keys())))
            sys.exit(1)
        result.append(category)
    return result
