#!/usr/bin/perl -w

# Copyright (C) 2006, 2007, 2008 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 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 generate HTML wrappers for JavaScript tests from templates

use strict;

use FindBin;
use lib $FindBin::Bin;

use File::Basename;
use File::Find;
use Getopt::Long;
use webkitdirs;

sub directoryFilter;
sub findTemplateFiles(@);

my $showHelp;

my $result = GetOptions(
    "help"       => \$showHelp,
);

if (!$result || $showHelp) {
    print STDERR basename($0) . " [-h|--help]\n";
    exit 1;
}

setConfiguration();
my $productDir = productDir();

chdirWebKit();

my @templates = findTemplateFiles(@ARGV);

for my $tfile (@templates) {

    my $tpath = $tfile;
    my $templateDirectory;
    my $templateRelativePath;
    if ($tpath =~ s:/(script-tests)/TEMPLATE.html$::) {
        $templateDirectory = $1;
        $templateRelativePath = $1 . "/TEMPLATE.html";
    } else {
        print "Inappropriate position of a template: ${tpath}\n";
        next;
    }

    print "${tpath}\n";

    chdirWebKit();
    chdir($tpath);

    my @files;
    my $fileFilter = sub {
        push @files, $File::Find::name if substr($_, -3) eq ".js";
    };
    find({ preprocess => \&directoryFilter, wanted => $fileFilter }, $templateDirectory);

    open TEMPLATE, "<${templateRelativePath}";
    my $template = do { local $/; <TEMPLATE> };
    close TEMPLATE;

    my $templateNegative = $template;
    if (-e "${templateDirectory}/TEMPLATE-n.html") {
        open TEMPLATE, "<${templateDirectory}/TEMPLATE-n.html";
        $templateNegative = do { local $/; <TEMPLATE> };
        close TEMPLATE;
    }

    for my $file (@files) {
        my $html = $file;
        $html =~ s:${templateDirectory}/(.*)\.js:$1.html:;
        next if -f "$html-disabled";

        system("cat ${file} | tr '\\0' ' ' | grep -q 'successfullyParsed ='");
        if ($? != 0) {
            `echo "" >> "${file}"`;
            `echo "var successfullyParsed = true;" >> "${file}"`;
        }
        
        print "    ${html}\n";
        open HTML, ">$html";
        my $output = ($file =~ /-n\.js/) ? $templateNegative : $template;
        $output =~ s:YOUR_JS_FILE_HERE:$file:;
        print HTML $output;
        
        close HTML;
    }
}

exit 0;

sub directoryFilter
{
    return () if basename($File::Find::dir) eq ".svn";
    return @_;
}

sub findTemplateFiles(@) {
    my @templateFiles;

    my $fileFilter = sub {
        push @templateFiles, $File::Find::name if $_ eq "TEMPLATE.html";
    };

    find({ preprocess => \&directoryFilter, wanted => $fileFilter }, "LayoutTests/fast/js");

    return @templateFiles;
}
