#!/usr/bin/env python
# utils/coverage/coverage-query-db - Find covering tests using coverage
# database
#
# This source file is part of the Swift.org open source project
#
# Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
# Licensed under Apache License v2.0 with Runtime Library Exception
#
# See https://swift.org/LICENSE.txt for license information
# See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors

import argparse
import subprocess
import sys


def covering_func(args):
    return subprocess.call([
        'sqlite3', args.coverage_db,
        "select distinct test_string.string "
        "from strings as function_string, strings as src_string, "
        "    coverage, strings as test_string "
        "where src_string.string = '{0}' and "
        "    function_string.string like '%{1}%' and "
        "    src_string.id = coverage.src and "
        "    test_string.id = coverage.test and "
        "    function_string.id = coverage.function;".format(
            args.src_file,
            args.function_str
        )
    ])


def covering_line(args):
    return subprocess.call([
        'sqlite3', args.coverage_db,
        "select distinct test_string.string "
        "from strings as src_string, coverage, "
        "     strings as test_string "
        "where src_string.string = '{0}' and "
        "      istart < {1} and {1} < iend and "
        "      src_string.id = coverage.src and "
        "      test_string.id = coverage.test;".format(
            args.src_file,
            args.line_number
        )
    ])


def parse_arguments():
    parser = argparse.ArgumentParser(
        'Find covering tests using coverage database')

    subparsers = parser.add_subparsers()

    covering_func_parser = subparsers.add_parser(
        'covering_func',
        help='Find tests that cover any part of a given function'
    )
    covering_func_parser.add_argument(
        '--coverage-db',
        help='coverage database to query (e.g. coverage.db)',
        required=True)
    covering_func_parser.add_argument(
        '--src-file',
        help='src file name containing the specified function '
             '(e.g. DocComment.cpp)',
        required=True)
    covering_func_parser.add_argument(
        '--function-str',
        help='find tests that cover any part of a function containing this '
             'string in its signature',
        required=True)
    covering_func_parser.set_defaults(which='covering_func')

    covering_line_parser = subparsers.add_parser(
        'covering_line',
        help='Find tests that cover a given line'
    )
    covering_line_parser.add_argument(
        '--coverage-db',
        help='coverage database to query (e.g. coverage.db)',
        required=True)
    covering_line_parser.add_argument(
        '--src-file',
        help='src file name containing the specified line number '
             '(e.g. DocComment.cpp)',
        required=True)
    covering_line_parser.add_argument(
        '--line-number',
        help='find tests that cover this line number',
        required=True)
    covering_line_parser.set_defaults(which='covering_line')

    return parser.parse_args()


def main():
    args = parse_arguments()
    return globals()[args.which](args)


if __name__ == '__main__':
    sys.exit(main())
