#!/usr/bin/perl -w

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

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