from __future__ import print_function

# minimal test runner

import glob
import os
import os.path
import re
import sys
import tempfile

try:
    root = os.path.dirname(__file__)
except NameError:
    root = os.path.dirname(sys.argv[0])

if not os.path.isfile("PIL/Image.py"):
    print("***", "please run this script from the PIL development directory as")
    print("***", "$ python Tests/run.py")
    sys.exit(1)

print("-"*68)

python_options = []
tester_options = []

if "--installed" not in sys.argv:
    os.environ["PYTHONPATH"] = "."

if "--coverage" in sys.argv:
    tester_options.append("--coverage")

if "--log" in sys.argv:
    tester_options.append("--log")

files = glob.glob(os.path.join(root, "test_*.py"))
files.sort()

success = failure = 0
include = [x for x in sys.argv[1:] if x[:2] != "--"]
skipped = []
failed = []

python_options = " ".join(python_options)
tester_options = " ".join(tester_options)

ignore_re = re.compile('^ignore: (.*)$', re.MULTILINE)

for file in files:
    test, ext = os.path.splitext(os.path.basename(file))
    if include and test not in include:
        continue
    print("running", test, "...")
    # 2>&1 works on unix and on modern windowses.  we might care about
    # very old Python versions, but not ancient microsoft products :-)
    out = os.popen("%s %s -u %s %s 2>&1" % (
        sys.executable, python_options, file, tester_options
        ))
    result = out.read()

    result_lines = result.splitlines()
    if len(result_lines):
        if result_lines[0] == "ignore_all_except_last_line":
            result = result_lines[-1]

    # Extract any ignore patterns
    ignore_pats = ignore_re.findall(result)
    result = ignore_re.sub('', result)

    try:
        def fix_re(p):
            if not p.startswith('^'):
                p = '^' + p
            if not p.endswith('$'):
                p = p + '$'
            return p

        ignore_res = [re.compile(fix_re(p), re.MULTILINE) for p in ignore_pats]
    except:
        print('(bad ignore patterns %r)' % ignore_pats)
        ignore_res = []

    for r in ignore_res:
        result = r.sub('', result)

    result = result.strip()

    if result == "ok":
        result = None
    elif result == "skip":
        print("---", "skipped")  # FIXME: driver should include a reason
        skipped.append(test)
        continue
    elif not result:
        result = "(no output)"
    status = out.close()
    if status or result:
        if status:
            print("=== error", status)
        if result:
            if result[-3:] == "\nok":
                # if there's an ok at the end, it's not really ok
                result = result[:-3]
            print(result)
        failed.append(test)
    else:
        success = success + 1

print("-"*68)

temp_root = os.path.join(tempfile.gettempdir(), 'pillow-tests')
tempfiles = glob.glob(os.path.join(temp_root, "temp_*"))
if tempfiles:
    print("===", "remaining temporary files")
    for file in tempfiles:
        print(file)
    print("-"*68)


def tests(n):
    if n == 1:
        return "1 test"
    else:
        return "%d tests" % n

if skipped:
    print("---", tests(len(skipped)), "skipped:")
    print(", ".join(skipped))
if failed:
    failure = len(failed)
    print("***", tests(failure), "of", (success + failure), "failed:")
    print(", ".join(failed))
    sys.exit(1)
else:
    print(tests(success), "passed.")