#!/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", "sunspider-1.0");

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