#!/usr/bin/python
#
# Copyright (C) 2009, 2010 Chris Jerdonek (chris.jerdonek@gmail.com)
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
#     * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
#     * Neither the name of Apple Computer, Inc. ("Apple") nor the names of
# its contributors may be used to endorse or promote products derived
# from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

"""Run unit tests of WebKit's Perl and Python scripts."""

# The docstring above is passed as the "description" to the OptionParser
# used in this script's __main__ block.
#
# For the command options supported by this script, see the code below
# that instantiates the OptionParser class, or else pass --help
# while running this script (since argument help is auto-generated).

import os
import subprocess
import sys
from optparse import OptionParser

class ScriptsTester(object):

    """Supports running unit tests of WebKit scripts."""

    def __init__(self, scripts_directory):
        self.scripts_directory = scripts_directory

    def script_path(self, script_file_name):
        """Return an absolute path to the given script."""
        return os.path.join(self.scripts_directory, script_file_name)

    def run_test_script(self, script_title, script_path, args=None):
        """Run the given test script."""
        print('Testing %s:' % script_title)
        call_args = [script_path]
        if args:
            call_args.extend(args)
        subprocess.call(call_args)
        print(70 * "*") # dividing line

    def main(self):
        parser = OptionParser(description=__doc__)
        parser.add_option('-a', '--all', dest='all', action='store_true',
                          default=False, help='run all available tests, '
                          'including those suppressed by default')
        (options, args) = parser.parse_args()

        self.run_test_script('Perl scripts', self.script_path('test-webkitperl'))
        self.run_test_script('Python scripts', self.script_path('test-webkitpy'),
                             ['--all'] if options.all else None)

        # FIXME: Display a cumulative indication of success or failure.
        #        In addition, call sys.exit() with 0 or 1 depending on that
        #        cumulative success or failure.
        print('Note: Perl and Python results appear separately above.')


if __name__ == '__main__':
    # The scripts directory is the directory containing this file.
    tester = ScriptsTester(os.path.dirname(__file__))
    tester.main()
