#!/usr/bin/env vpython3

# Copyright 2021 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import os
from pyfakefs import fake_filesystem_unittest
import tempfile
import unittest

from generate_script import _parse_args
from generate_script import _generate_script


class Tests(fake_filesystem_unittest.TestCase):
    def test_parse_args(self):
        raw_args = [
            '--script-path=./bin/run_foobar', '--exe-dir=.',
            '--rust-test-executables=metadata.json'
        ]
        parsed_args = _parse_args(raw_args)
        self.assertEqual('./bin/run_foobar', parsed_args.script_path)
        self.assertEqual('.', parsed_args.exe_dir)
        self.assertEqual('metadata.json', parsed_args.rust_test_executables)

    def test_generate_script(self):
        lib_dir = os.path.dirname(__file__)
        out_dir = os.path.join(lib_dir, '../../../out/rust')
        args = type('', (), {})()
        args.make_bat = False
        args.script_path = os.path.join(out_dir, 'bin/run_foo_bar')
        args.exe_dir = out_dir

        # pylint: disable=unexpected-keyword-arg
        with tempfile.NamedTemporaryFile(delete=False,
                                         mode='w',
                                         encoding='utf-8') as f:
            filepath = f.name
            f.write("foo\n")
            f.write("bar\n")
        try:
            args.rust_test_executables = filepath
            actual = _generate_script(args,
                                      should_validate_if_exes_exist=False)
        finally:
            os.remove(filepath)

        expected = '''
#!/bin/bash
env vpython3 "$(dirname $0)/../../../testing/scripts/rust/rust_main_program.py" \\
    "--rust-test-executable=$(dirname $0)/../bar" \\
    "--rust-test-executable=$(dirname $0)/../foo" \\
    "$@"
'''.strip()

        self.assertEqual(expected, actual)

    def test_generate_bat(self):
        lib_dir = os.path.dirname(__file__)
        out_dir = os.path.join(lib_dir, '../../../out/rust')
        args = type('', (), {})()
        args.make_bat = True
        args.script_path = os.path.join(out_dir, 'bin/run_foo_bar')
        args.exe_dir = out_dir

        # pylint: disable=unexpected-keyword-arg
        with tempfile.NamedTemporaryFile(delete=False,
                                         mode='w',
                                         encoding='utf-8') as f:
            filepath = f.name
            f.write("foo\n")
            f.write("bar\n")
        try:
            args.rust_test_executables = filepath
            actual = _generate_script(args,
                                      should_validate_if_exes_exist=False)
        finally:
            os.remove(filepath)

        expected = '''
@echo off
vpython3 "%~dp0\\../../../testing/scripts/rust\\rust_main_program.py" ^
    "--rust-test-executable=%~dp0\\..\\bar.exe" ^
    "--rust-test-executable=%~dp0\\..\\foo.exe" ^
    %*
'''.strip()

        self.assertEqual(expected, actual)


if __name__ == '__main__':
    unittest.main()
