#!/usr/bin/perl -w

# Copyright (C) 2011 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. 
#
# THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 create a new HTML file for a monolithic test using js-test machinery.

use strict;

use FindBin;
use lib $FindBin::Bin;

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

sub makePathToSharedSources;
sub openTestInEditor;
sub writeTestFile;

my $showHelp;

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

if (!$result || $showHelp || !scalar(@ARGV) || $ARGV[0] !~ m/\.html$/) {
    print STDERR "Usage: " . basename($0) . " [-h|--help] pathname\n";
    print STDERR "\nExamples:\n";
    print STDERR "    " . basename($0) . " new-test.html (will create the test in current directory)\n";
    print STDERR "    " . basename($0) . " fast/loader/new-test.html (a relative path is always from LayoutTests directory)\n";
    print STDERR "    " . basename($0) . " /Volumes/Data/WebKit/LayoutTests/fast/loader/new-test.html\n";
    exit 1;
}

my $providedPath = $ARGV[0];

my $testAbsolutePath;

# If only a file name is provided, create the test in current directory.
$testAbsolutePath = File::Spec->rel2abs($providedPath) if (!(File::Spec->splitpath($providedPath))[1]);

# Otherwise, it's either absolute, or relative to LayoutTests directory.
chdirWebKit();
chdir "LayoutTests";
$testAbsolutePath = File::Spec->rel2abs($providedPath) if (!$testAbsolutePath);

writeTestFile();

print "$testAbsolutePath\n";
openTestInEditor();

exit 0;

sub makePathToSharedSources
{
    my $layoutTestsPath = getcwd();
    $testAbsolutePath =~ m/^$layoutTestsPath/ or die "Path $testAbsolutePath is not in LayoutTests directory.\n";
    my $isHTTPTest = $testAbsolutePath =~ m/^$layoutTestsPath\/http/;
    if ($isHTTPTest) {
        return "/js-test-resources";
    } else {
        return File::Spec->abs2rel("resources/", dirname($testAbsolutePath));
    }
}

sub writeTestFile
{
    die "Test $testAbsolutePath already exists.\n" if (-e $testAbsolutePath);

    my $pathToSharedSources = makePathToSharedSources();

    open TEST, ">", ${testAbsolutePath} or die "Cannot create test file at $testAbsolutePath.\n";
    print TEST << "EOF";
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="$pathToSharedSources/js-test-pre.js"></script>
</head>
<body>
<script>

description("TEST DESCRIPTION HERE");

// Your test script here. Feel free to modify surrounding HTML code if necessary.

</script>
<script src="$pathToSharedSources/js-test-post.js"></script>
</body>
</html>
EOF
    close TEST;
}

sub openTestInEditor()
{
    my $editor = $ENV{EDITOR};
    exec ($editor, $testAbsolutePath) if ($editor);
}
