#!/usr/bin/env perl

# 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 warnings;
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;
