#!/usr/bin/perl -w

# Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
# Copyright (C) 2007 Eric Seidel <eric@webkit.org>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1.  Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer. 
# 2.  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. 
# 3.  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 APPLE AND ITS 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 APPLE OR ITS 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.

# Script to run the WebKit Open Source Project JavaScriptCore tests (adapted from Mozilla).

use strict;
use FindBin;
use Getopt::Long qw(:config pass_through);
use lib $FindBin::Bin;
use webkitdirs;
use POSIX;

# determine configuration
setConfiguration();
my $configuration = configuration();

my @testsToSkip = (
    # Various ecma/Date tests sometimes fail on Windows (but not Mac) https://bugs.webkit.org/show_bug.cgi?id=25160
    "ecma/Date/15.9.2.1.js",
    "ecma/Date/15.9.2.2-1.js",
    "ecma/Date/15.9.2.2-2.js",
    "ecma/Date/15.9.2.2-3.js",
    "ecma/Date/15.9.2.2-4.js",
    "ecma/Date/15.9.2.2-5.js",
    "ecma/Date/15.9.2.2-6.js",
    # ecma_3/Date/15.9.5.7.js fails on Mac (but not Windows) https://bugs.webkit.org/show_bug.cgi?id=25161
    "ecma_3/Date/15.9.5.7.js",
);

my $jsDriverArgs = "-L " . join(" ", @testsToSkip);
my $root; # intentionally left undefined
my $skipBuild = 0;
my $showHelp = 0;

my $programName = basename($0);
my $usage = <<EOF;
Usage: $programName [options] [options to pass to build system]
  --help                        Show this help message
  --jsDriver-args=              A string of arguments to pass to jsDriver.pl
  --root=                       Path to pre-built root containing jsc
EOF

GetOptions(
    'j|jsDriver-args=s' => \$jsDriverArgs,
    'root=s' => \$root,
    'skip-build' => \$skipBuild,
    'help' => \$showHelp
);

# Assume any arguments left over from GetOptions are assumed to be build arguments
my @buildArgs = @ARGV;

# Arguments passed to --jsDriver-args (if any) are passed to jsDriver.pl
my @jsArgs = split(" ", $jsDriverArgs);

if ($showHelp) {
   print STDERR $usage;
   exit 1;
}

setConfigurationProductDir(Cwd::abs_path($root)) if (defined($root));

if (!defined($root) && !$skipBuild) {
    chdirWebKit();

    push(@buildArgs, argumentsForConfiguration());
    
    print "Running: build-jsc " . join(" ", @buildArgs) . "\n";
    my $buildResult = system "perl", "Tools/Scripts/build-jsc", @buildArgs;
    if ($buildResult) {
        print STDERR "Compiling jsc failed!\n";
        exit exitStatus($buildResult);
    }
}


my $productDir = jscProductDir();
$ENV{DYLD_FRAMEWORK_PATH} = $productDir;
setPathForRunningWebKitApp(\%ENV) if isCygwin();

sub testapiPath($)
{
    my ($productDir) = @_;
    my $jscName = "testapi";
    $jscName .= "_debug" if configurationForVisualStudio() eq "Debug_All";
    return "$productDir/$jscName";
}

#run api tests
if (isAppleMacWebKit() || isAppleWinWebKit()) {
    chdirWebKit();
    chdir($productDir) or die;
    my $path = testapiPath($productDir);
    # Use an "indirect object" so that system() won't get confused if the path
    # contains spaces (see perldoc -f exec).
    my $testapiResult = system { $path } $path;
    exit exitStatus($testapiResult)  if $testapiResult;
}

# Find JavaScriptCore directory
chdirWebKit();
chdir("Source/JavaScriptCore");
chdir "tests/mozilla" or die;
printf "Running: jsDriver.pl -e squirrelfish -s %s -f actual.html %s\n", jscPath($productDir), join(" ", @jsArgs);
my $result = system "perl", "jsDriver.pl", "-e", "squirrelfish", "-s", jscPath($productDir), "-f", "actual.html", @jsArgs;
exit exitStatus($result)  if $result;

my %failures;

open EXPECTED, "expected.html" or die;
while (<EXPECTED>) {
    last if /failures reported\.$/;
}
while (<EXPECTED>) {
    chomp;
    $failures{$_} = 1;
}
close EXPECTED;

my %newFailures;

open ACTUAL, "actual.html" or die;
while (<ACTUAL>) {
    last if /failures reported\.$/;
}
while (<ACTUAL>) {
    chomp;
    if ($failures{$_}) {
        delete $failures{$_};
    } else {
        $newFailures{$_} = 1;
    }
}
close ACTUAL;

my $numNewFailures = keys %newFailures;
if ($numNewFailures) {
    print "\n** Danger, Will Robinson! Danger! The following failures have been introduced:\n";
    foreach my $failure (sort keys %newFailures) {
        print "\t$failure\n";
    }
}

my $numOldFailures = keys %failures;
if ($numOldFailures) {
    print "\nYou fixed the following test";
    print "s" if $numOldFailures != 1;
    print ":\n";
    foreach my $failure (sort keys %failures) {
        print "\t$failure\n";
    }
}

print "\n";

print "$numNewFailures regression";
print "s" if $numNewFailures != 1;
print " found.\n";

print "$numOldFailures test";
print "s" if $numOldFailures != 1;
print " fixed.\n";

print "OK.\n" if $numNewFailures == 0;
exit(1)  if $numNewFailures;
