#!/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 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 "JSTests/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;
