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