#!/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;
use Getopt::Long;
use File::Basename;

my $showHelp = 0;
my $jsShellPath;
my $suite = "";
my $ubench = 0;
my $v8suite = 0;
my $parseOnly = 0;

my $programName = basename($0);
my $usage = <<EOF;
Usage: $programName --shell=[path] [options] FILE FILE
  --help        Show this help message
  --shell       Path to javascript shell
  --suite           Select a specific benchmark suite. The default is sunspider-1.0
  --ubench          Use microbenchmark suite instead of regular tests. Same as --suite=ubench
  --v8-suite        Use the V8 benchmark suite. Same as --suite=v8-v4
  --parse-only  Compare the parse-only benchmark results
EOF

GetOptions('shell=s' => \$jsShellPath,
           'suite=s' => \$suite,
           'ubench' => \$ubench,
           'v8-suite' => \$v8suite,
           'parse-only' => \$parseOnly,
           'help' => \$showHelp);

$suite = "ubench" if ($ubench);
$suite = "v8-v4" if ($v8suite);
$suite = "parse-only" if ($parseOnly);
$suite = "sunspider-1.0" if (!$suite);

my $resultDirectory = "${suite}-results";

if ((scalar @ARGV != 0 && scalar @ARGV != 2) || !$jsShellPath || $showHelp) {
   print STDERR $usage;
   exit 1;
}

sub readResultsFile($)
{
    my ($filename) = @_;
    open FILE, "<", $filename or die;
    my $foundStart = 0;
    my $foundOutput = 0;
    my $foundEnd = 0;
    my $result = "";
    while (<FILE>) {
        if (!$foundStart) {
            if (/^\[\{$/) {
                $foundStart = 1;
                $result .= $_;
            } elsif (/^var \w+ = \[$/) {
                $foundOutput = 1;
            } elsif ($foundOutput && /^\{$/) {
                $foundOutput = 0;
                $foundStart = 1;
                $result = "[{\n";
            }
        } else {
            if (/\];?$/) {
                $foundEnd = 1;
                chomp;
                s/;$//;
                $result .= $_;
                last;
            } else {
                $result .= $_;
            }
        } 
    }
    close FILE;

    die "Cound not find data in ${filename} - needs to start with [{" unless $foundStart;
    die "Cound not find data in ${filename} - needs to end with }]" unless $foundEnd;

    return $result;
}

sub dumpToFile($$)
{
    my ($contents, $path) = @_;
    open FILE, ">", $path or die;
    print FILE $contents;
    close FILE;
}

sub readFile($)
{
    my ($path) = @_;
    open FILE, "<", $path or die;
    my $result = <FILE>;
    close FILE;
    return $result;
}

sub newestFile($$)
{
    my ($dir, $pattern) = @_;

    my $newestAge;
    my $newestFile = "";
    opendir DIR, $dir or die;
    for my $file (readdir DIR) {
        if ($file =~ $pattern) {
            my $age = -M "$dir/$file";
            if (!defined $newestAge || $age < $newestAge) {
                $newestFile = $file;
                $newestAge = $age;
            }
        }
    }
    closedir DIR;

    return "$dir/$newestFile";
}

my $file1;
my $file2;

if (scalar @ARGV == 2) {
    $file1 = $ARGV[0];
    $file2 = $ARGV[1];
} else {
    $file1 = readFile("$resultDirectory/baseline-filename.txt");
    $file2 = newestFile("$resultDirectory", qr/sunspider-results-.+\.js$/);
}

my $output = "var output1 = " . readResultsFile($file1) . ";\n";
$output .= "var output2 = " . readResultsFile($file2) . ";\n";

dumpToFile($output, "$resultDirectory/sunspider-comparison-data.js");

system($jsShellPath, "-f", "$resultDirectory/sunspider-test-prefix.js", "-f", "$resultDirectory/sunspider-comparison-data.js", "-f", "resources/sunspider-compare-results.js", "-f", "resources/sunspider-standalone-compare.js");
