#!/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 check status of W3C DOM tests that are part of the WebKit tests.

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

chdirWebKit();

my $verbose = $ARGV[0] && $ARGV[0] eq "-v";

my $workingDir = getcwd();
my $testDirectory = "$workingDir/LayoutTests";

my @suites = ( {"name" => "DOM Level 1 Core   (html)", "directory" => "dom/html/level1/core"},
               {"name" => "DOM Level 2 Core   (html)", "directory" => "dom/html/level2/core"},
               {"name" => "DOM Level 2 Events (html)", "directory" => "dom/html/level2/events"},
               {"name" => "DOM Level 2 HTML   (html)", "directory" => "dom/html/level2/html"},
               {"name" => "DOM Level 1 Core   (xhtml)", "directory" => "dom/xhtml/level1/core"},
               {"name" => "DOM Level 2 Core   (xhtml)", "directory" => "dom/xhtml/level2/core"},
               {"name" => "DOM Level 2 Events (xhtml)", "directory" => "dom/xhtml/level2/events"},
               {"name" => "DOM Level 2 HTML   (xhtml)", "directory" => "dom/xhtml/level2/html"},
               {"name" => "DOM Level 3 Core   (xhtml)", "directory" => "dom/xhtml/level3/core"},
               {"name" => "DOM Level 3 XPath  (svg)", "directory" => "dom/svg/level3/xpath"});

my $totalCount = 0;
my $totalSuccesses = 0;
my $totalDisabled = 0;
my $totalFailed = 0;

foreach my $suite (@suites) {

    my %suite = %$suite;
    my $directory = $suite{"directory"};
    my $name = $suite{"name"};
    my @results = `find "${testDirectory}/${directory}" -name "*-expected.txt"`;
    my @disabled = `find "${testDirectory}/${directory}" -name "*-disabled"`;

    my @failures = ();
    my $count = 0;

    foreach my $result (@results) {
        $count++;
        my $success = 0;
        open RESULT, "<$result";
        while (<RESULT>) {
            if (/Success/) {
                $success = 1;
                last;
            }
        }
        close RESULT;
        if (!$success) {
            push @failures, $result;
        }
    }

    my $disabledCount = (scalar @disabled);
    my $failureCount = (scalar @failures);

    $count += $disabledCount;

    my $successCount = $count - $failureCount - $disabledCount;
    my $percentage = (sprintf "%.1f", ($successCount * 100.0 / $count));
    
    if ($percentage == 100) {
        print "${name}: all ${count} tests succeeded";
    } else {
        print "${name}: ${successCount} out of ${count} tests succeeded (${percentage}%)";
    }
    print " ($disabledCount disabled)" if $disabledCount;
    print "\n";
    if ($verbose) {
        print "\n";
        if (@disabled) {
            print "    Disabled:\n";
            
            foreach my $failure (sort @disabled) {
                $failure =~ s|.*/||;
                $failure =~ s|-disabled||;
                print "        ${directory}/${failure}";
            }
        }
        if (@failures) {
            print "    Failed:\n";
            
            foreach my $failure (sort @failures) {
                $directory =~ m|^dom/(\w+)|;
                my $extension = $1;
                $failure =~ s|.*/||;
                $failure =~ s|-expected\.txt|.${extension}|;
                print "        ${directory}/${failure}";
            }
        }

        print "\n";
    }

    $totalCount += $count;
    $totalSuccesses += $successCount;
    $totalDisabled += $disabledCount;
    $totalFailed += $failureCount;
}


my $totalPercentage = (sprintf "%.1f", ($totalSuccesses * 100.0 / $totalCount));
my $totalDisabledPercentage = (sprintf "%.1f", ($totalDisabled * 100.0 / $totalCount));
my $totalFailedPercentage = (sprintf "%.1f", ($totalFailed * 100.0 / $totalCount));

print "Total: ${totalSuccesses} out of ${totalCount} tests succeeded (${totalPercentage}%)\n";
print "       ${totalDisabled} tests disabled (${totalDisabledPercentage}%)\n";
print "       ${totalFailed} tests failed (${totalFailedPercentage}%)\n";
