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