
#!/usr/bin/env python

# Copyright (c) 2020 Project CHIP Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import optparse
import sys
import re

TEMPLATE_PREFIX = '''/*
 *
 *    Copyright (c) 2020 Project CHIP Authors
 *    All rights reserved.
 *
 *    Licensed under the Apache License, Version 2.0 (the \"License\");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an \"AS IS\" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 *
 *    THIS FILE WAS GENERATED AUTOMATICALLY BY THE BUILD SYSTEM.
 */

#include <nlunit-test.h>

'''

# Forward declarations will be added here

TEMPLATE_MAIN_START = '''
int main()
{
    int code = 0;

    nlTestSetOutputStyle(OUTPUT_CSV);

'''

# Test invokation will be added here

TEMPLATE_SUFFIX = '''
    return code;
}'''


def main(argv):
    parser = optparse.OptionParser()

    parser.add_option('--input_file')
    parser.add_option('--output_file')

    options, _ = parser.parse_args(argv)

    tests = []

    TEST_SUITE_RE = re.compile(r'\s*CHIP_REGISTER_TEST_SUITE\(([^)]*)\)')

    with open(options.input_file, 'r') as input_file:
        for l in input_file.readlines():
            match = TEST_SUITE_RE.match(l)
            if not match:
                continue

            tests.append(match.group(1))

    if not tests:
        print("ERROR: no tests found in '%s'" % input_file)
        print("Did you forget to CHIP_REGISTER_TEST_SUITE?")
        return 1

    with open(options.output_file, 'w') as output_file:
        output_file.write(TEMPLATE_PREFIX)

        for test in tests:
            output_file.write("int %s();\n" % test)
        output_file.write("\n")

        output_file.write(TEMPLATE_MAIN_START)

        for test in tests:
            output_file.write("    code = code | (%s());\n" % test)
        output_file.write("\n")

        output_file.write(TEMPLATE_SUFFIX)

    return 0


if __name__ == '__main__':
    sys.exit(main(sys.argv[1:]))
