#!/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;

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

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

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

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

    my $output = $template;
    $output =~ s/\@NAME\@/${name}/g;
    $output =~ s/\@SCRIPT\@/${script}/g;

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


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

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

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