#!/usr/bin/env perl

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