#!/usr/bin/env perl

# 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 using js-test machinery.

use strict;
use warnings;

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.js"></script>
</head>
<body>
<script>

description("TEST DESCRIPTION HERE");

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

</script>
</body>
</html>
EOF
    close TEST;
}

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