"""Load and run the Pygame test suite

python -c "import pygame.tests.go" [<test options>]

or

python test/go.py [<test options>]

Command line option --help displays a command line usage message.

run_tests.py in the main distribution directory is an alternative to test.go

"""

import sys

if __name__ == '__main__':
    import os
    pkg_dir = os.path.split(os.path.abspath(__file__))[0]
    parent_dir, pkg_name = os.path.split(pkg_dir)
    is_pygame_pkg = (pkg_name == 'tests' and
                     os.path.split(parent_dir)[1] == 'pygame')
    if not is_pygame_pkg:
        sys.path.insert(0, parent_dir)
else:
    is_pygame_pkg = __name__.startswith('pygame.tests.')

if is_pygame_pkg:
    from pygame.tests.test_utils.run_tests import run
    from pygame.tests.test_utils.test_runner import opt_parser
else:
    from test.test_utils.run_tests import run
    from test.test_utils.test_runner import opt_parser

if is_pygame_pkg:
    test_pkg_name = "pygame.tests"
else:
    test_pkg_name = "test"
program_name = sys.argv[0]
if program_name == '-c':
    program_name = 'python -c "import %s.go"' % test_pkg_name

###########################################################################
# Set additional command line options
#
# Defined in test_runner.py as it shares options, added to here

opt_parser.set_usage("""

Runs all or some of the %(pkg)s.xxxx_test tests.

$ %(exec)s sprite threads -sd

Runs the sprite and threads module tests isolated in subprocesses, dumping
all failing tests info in the form of a dict.

""" % {'pkg': test_pkg_name, 'exec': program_name})

opt_parser.add_option (
     "-d",  "--dump", action = 'store_true',
     help   = "dump failures/errors as dict ready to eval" )

opt_parser.add_option (
     "-F",  "--file",
     help   = "dump failures/errors to a file" )

opt_parser.add_option (
     "-a",  "--all", action = 'store_true',
     help   = "dump all results not just errors eg. -da" )

opt_parser.add_option (
     "-m",  "--multi_thread", metavar = 'THREADS', type = 'int',
     help   = "run subprocessed tests in x THREADS" )

opt_parser.add_option (
     "-t",  "--time_out", metavar = 'SECONDS', type = 'int',
     help   = "kill stalled subprocessed tests after SECONDS" )

opt_parser.add_option (
     "-f",  "--fake", metavar = "DIR",
     help   = "run fake tests in run_tests__tests/$DIR" )

opt_parser.add_option (
     "-p",  "--python", metavar = "PYTHON",
     help   = "path to python excutable to run subproccesed tests\n"
              "default (sys.executable): %s" % sys.executable)

opt_parser.add_option (
     "-I",  "--interactive", action = 'store_true',
     help   = "include tests requiring user input")

###########################################################################
# Set run() keyword arguements according to command line arguemnts.
# args will be the test module list, passed as positional argumemts.

options, args = opt_parser.parse_args()

kwds = {}
if options.incomplete:
    kwds['incomplete'] = True
if options.nosubprocess:
    kwds['nosubprocess'] = True
if options.dump:
    kwds['dump'] = True
if options.file:
    kwds['file'] = options.file
kwds['timings'] = options.timings
if options.exclude:
    kwds['exclude'] = options.exclude
if options.show_output:
    kwds['show_output'] = True
if options.all:
    kwds['all'] = True
if options.randomize:
    kwds['randomize'] = True
if options.seed is not None:
    kwds['seed'] = options.seed
if options.multi_thread is not None:
    kwds['multi_thread'] = options.multi_thread
if options.time_out is not None:
    kwds['time_out'] = options.time_out
if options.fake:
    kwds['fake'] = options.fake
if options.python:
    kwds['python'] = options.python
if options.interactive:
    kwds['interactive'] = True

###########################################################################
# Run the test suite.
run(*args, **kwds)


