#!/usr/bin/env fuchsia-vendored-python
# Copyright 2019 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import argparse
import os
import stat
import string
import sys


def main():
    parser = argparse.ArgumentParser(
        description="Generates a grouped dart test file from individual tests"
    )
    parser.add_argument(
        "--out", help="Path to the invocation file to generate", required=True
    )
    parser.add_argument(
        "--source",
        help="Path to a dart source file. Will be ignored if the file does not end in _test.dart",
        action="append",
        required=True,
    )
    args = parser.parse_args()

    grouped_test = args.out
    grouped_test_dir = os.path.dirname(grouped_test)
    if not os.path.exists(grouped_test_dir):
        os.makedirs(grouped_test_dir)

    tests = [src for src in args.source if src.endswith("_test.dart")]
    assert (
        len(tests) > 0
    ), "a least one *_test.dart file must be passed in under |sources|"
    imports = ["import 'package:test/test.dart';"]
    invocations = []
    for test in tests:
        filename = os.path.splitext(os.path.basename(test))[0]
        imports.append("import '%s' as %s;" % (test, filename))
        invocations.append(
            "group('%s', () => _delegate(%s.main, args));"
            % (filename, filename)
        )

    contents = """// DO NOT EDIT
// This script is generated by:
//   //build/dart/group_tests.py

%s

typedef ZeroArgFunction = void Function();

/// Wraps main invocations to support both main(List<String> args) and main().
void _delegate(Function f, List<String> args) {
  if (f is ZeroArgFunction) {
    f();
  } else {
    f(args);
  }
}

void main(List<String> args) {
  %s
}""" % (
        "\n".join(imports),
        "\n  ".join(invocations),
    )

    with open(grouped_test, "w") as file:
        file.write(contents)
    permissions = (
        stat.S_IRUSR
        | stat.S_IWUSR
        | stat.S_IXUSR
        | stat.S_IRGRP
        | stat.S_IWGRP
        | stat.S_IXGRP
        | stat.S_IROTH
    )
    os.chmod(grouped_test, permissions)


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