#!/usr/bin/env python3

import sys, os, subprocess, tempfile, shutil
from glob import glob

def run_tests(extra_env):
    num_errors = 0
    dirs = glob('test cases/common/*')
    assert(len(dirs) > 0)
    dirs.sort()

    env = os.environ.copy()
    env.update(extra_env)
    for testdir in dirs:
        with tempfile.TemporaryDirectory() as builddir:
            print('Running test:', testdir)
            if os.path.exists(os.path.join(testdir, 'test_args.txt')):
                continue
            pc = subprocess.Popen(['meson', testdir, builddir], stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env)
            (stdo, stde) = pc.communicate()
            if b'MESON_SKIP_TEST' in stdo:
                continue
            if pc.returncode != 0:
                # Error is? Message print.
                num_errors += 1
                print(stdo.decode('utf-8', errors='ignore'))
                print(stde.decode('utf-8', errors='ignore'))
                continue
            pc = subprocess.Popen(['ninja', 'test'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=builddir)
            (stdo, stde) = pc.communicate()
            if pc.returncode != 0:
                # Error is? Message print.
                num_errors += 1
                print(open(os.path.join(builddir, 'meson-logs/testlog.txt')).read())
    return num_errors

print('Running tests with system GCC.\n')
gcc_fails = run_tests({})

if shutil.which('clang'):
    print('\nRunning tests with Clang.\n')
    clang_fails = run_tests({'CC': 'clang', 'CXX': 'clang++'})

print('Failed GCC tests:', gcc_fails)
print('Failed Clang tests:', clang_fails)

sys.exit(gcc_fails + clang_fails)
