blob: 4baa7a85c4fbb89ffdc781b2d19af7e601107eae [file] [log] [blame]
#!/usr/bin/env python3.8
# 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())