#!/usr/bin/perl -w

# Copyright (C) 2007 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 COMPUTER, INC. ``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 COMPUTER, INC. OR
# 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. 

use strict;

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

open DRIVER_TEMPLATE, "<resources/driver-TEMPLATE.html";
my $driverTemplate = do { local $/; <DRIVER_TEMPLATE> };
close DRIVER_TEMPLATE;

open RESULTS_TEMPLATE, "<resources/results-TEMPLATE.html";
my $resultsTemplate = do { local $/; <RESULTS_TEMPLATE> };
close RESULTS_TEMPLATE;

my @suites = ("sunspider-0.9", "sunspider-0.9.1");

foreach my $suite (@suites) {

    my @tests = ();
    my @categories = ();
    my %uniqueCategories = ();

    mkdir "hosted/${suite}";

    open TESTLIST, "<./tests/${suite}/LIST";
    while (<TESTLIST>) {
	chomp;
	next unless $_;
	push @tests, $_;
	my $category = $_;
	$category =~ s/-.*//;
	if (!$uniqueCategories{$category}) {
	    push @categories, $category;
	    $uniqueCategories{$category} = $category;
	}
    }
    close TESTLIST;

    my @testContents = ();
    for my $test (@tests) {
	my $name = "${test}";

	open SCRIPT, "<tests/${suite}/${test}.js";
	my $script = do { local $/; <SCRIPT> };
	close SCRIPT;

	my $output = $template;
	$output =~ s/\@NAME\@/${name}/g;
	$output =~ s/\@SCRIPT\@/${script}/g;
	$output =~ s/\\/\\\\/g;
	$output =~ s/"/\\"/g;
	$output =~ s/\n/\\n\\\n/g;
	$output = $output;
	push @testContents, $output;
    }

    my $output = $driverTemplate;
    $output =~ s/\@SUITE\@/${suite}/g;

    open OUTPUT, ">hosted/${suite}/driver.html";
    print OUTPUT $output;
    close OUTPUT;

    $output = $resultsTemplate;
    $output =~ s/\@SUITE\@/${suite}/g;

    open OUTPUT, ">hosted/${suite}/results.html";
    print OUTPUT $output;
    close OUTPUT;

    my $prefix = "var tests = [ " . join(", ", map { '"' . $_ . '"' } @tests) . " ];\n";
    $prefix .= "var categories = [ " . join(", ", map { '"' . $_ . '"' } @categories) . " ];\n";

    open PREFIX, ">hosted/${suite}/sunspider-test-prefix.js";
    print PREFIX $prefix;
    close PREFIX;

    my $contents = "var testContents = [ " . join(", ", map { '"' . $_ . '"' } @testContents) . " ];\n";

    open CONTENTS, ">hosted/${suite}/sunspider-test-contents.js";
    print CONTENTS $contents;
    close CONTENTS;    
}

system("cp resources/sunspider-analyze-results.js hosted");
system("cp resources/sunspider-compare-results.js hosted");
print "hosted/sunspider.html is ready to use.\n";
