#!/usr/bin/perl -w

# Copyright (C) 2005, 2007 Apple 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.

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

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

my $force = 0;
GetOptions('force' => \$force);

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

open ACTUAL, "actual.html" or die;
my $actual;
while (<ACTUAL>) {
    $actual .= $_;
    last if /failures reported\.$/;
}
my $failed = 0;
while (<ACTUAL>) {
    $actual .= $_;
    chomp;
    if (!$expected{$_}) {
        $failed = 1;
        print "failure not expected: $_\n";
    }
}
close ACTUAL;

die "won't update, failures introduced\n" if $failed && !$force;

open EXPECTED, ">expected.html";
print EXPECTED $actual;
close EXPECTED;
