#!/usr/bin/perl -w

# Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
#
# 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 Web Kit Open Source Project JavaScriptCore tests (adapted from Mozilla).

use strict;
use FindBin;
use lib $FindBin::Bin;
use webkitdirs;

setConfiguration();
my $productDir = productDir();

chdirWebKit();
chdir "JavaScriptCore/tests/mozilla" or die;

$ENV{DYLD_FRAMEWORK_PATH} = $productDir;
my $result = system "perl", "jsDriver.pl", "-e", "kjs", "-s", "$productDir/testkjs", "-f", "actual.html", @ARGV;

exit $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;
