#!/usr/bin/env python3
# Copyright (c) 2025, the Dart project authors.  Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.

import os
import os.path
import platform
import subprocess
import sys
import threading

USE_PYTHON3 = True


def is_windows():
    os_id = platform.system()
    return os_id == 'Windows'


def checked_in_sdk_path():
    tools_dir = os.path.dirname(os.path.realpath(__file__))
    return os.path.join(tools_dir, 'sdks', 'dart-sdk')


def checked_in_sdk_executable():
    name = 'dart'
    if is_windows():
        name = 'dart.exe'
    return os.path.join(checked_in_sdk_path(), 'bin', name)


def generate_test(file, tools_dir, tests_dir):
    # Create each xyz_test.dart as the output of xyz_generator.dart.
    gen_file = os.path.join(tests_dir, file)
    test_file = gen_file.replace('_generator.dart', '_test.dart')
    process = subprocess.run([
        checked_in_sdk_executable(),
        '--packages=%s' % os.path.join(tools_dir, 'empty_package_config.json'),
        gen_file,
    ],
                             capture_output=True)
    if process.returncode != 0:
        print("%s failed" % file)
        print(process.stdout)
        print(process.stderr)
        sys.exit(process.returncode)
    f = open(test_file, 'wb')
    f.write(b'// GENERATED FILE: DO NOT EDIT\n')
    f.write(('// Edit %s instead and re-run `gclient runhooks`\n' %
             file).encode('utf-8'))
    f.write(b'\n')
    f.write(process.stdout)
    f.close()

def generate_tests(tools_dir, tests_dir):
    # Remove all previously existing tests in case the corresponding generator
    # is deleted or renamed.
    for file in os.listdir(tests_dir):
        if file.endswith('_test.dart'):
            os.remove(os.path.join(tests_dir, file))

    # Run all the generators concurrently
    generator_threads = []
    for file in os.listdir(tests_dir):
        if not file.endswith('_generator.dart'):
            continue

        generator_threads.append(
            threading.Thread(target=generate_test,
                             args=(file, tools_dir, tests_dir)))

    for thread in generator_threads:
        thread.start()

    for thread in generator_threads:
        thread.join()

def Main():
    tools_dir = os.path.dirname(os.path.realpath(__file__))
    vm_tests_dir = os.path.join(tools_dir, '..', 'runtime', 'tests', 'vm',
                                'dart', 'generated')
    generate_tests(tools_dir, vm_tests_dir)


if __name__ == '__main__':
    Main()
