#! /bin/sh

# Copyright (C) 2012 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. 

# Script to run selected LayoutTests/fast/{js,regex} tests using jsc

jscCmd="/System/Library/Frameworks/JavaScriptCore.framework/Resources/jsc"
testRoot=/tmp/LayoutTests
resultsRoot=`date \+/tmp/results-%Y-%m-%d-%H-%M-%S`
testList="unset"

cmdName=`basename $0`

function usage()
{
    echo "usage: $cmdName [[--jsc | -j] <path-to-jsc>] [[--results-dir | -r] <results-path>]"
    echo "                    [[--test-root | -t] <test-root-path>] [[--test-list | -l] <test-list-file>]"
    exit 1
}

while [ $# -gt 1 ]
do
    case $1 in
    --jsc|-j)
        jscCmd=$2
        ;;
    --results-dir|-r)
        resultsRoot=$2
        ;;
    --test-root|-t)
        testRoot=$2
        ;;
    --test-list|-l)
        testList=$2
        ;;
    *)
        echo "Unrecognized option \"$1\""
        usage
        ;;
    esac

    shift 2
done

if [ $# -gt 0 ]
then
    echo "Extra argument \"$1\""
    usage
fi

if [ $testList = "unset" ]
then
    testList=$testRoot/fast/js/jsc-test-list
fi

preScript=$testRoot/fast/js/resources/standalone-pre.js
postScript=$testRoot/fast/js/resources/standalone-post.js
passList=$resultsRoot/passed
failList=$resultsRoot/failed
crashList=$resultsRoot/crashed

numTestsRun=0
numPassed=0
numFailed=0
numCrashed=0

rm -rf $resultsRoot
rm -f jsc-tests-passed jsc-tests-failed

for test in `cat $testList`
do
    testPassed=0
    testCrashed=0
    testName=`basename $test`
    dirName=`dirname $test`
     
    expectedOut="$testRoot/$dirName/${testName}-expected.txt"
    actualOut="$resultsRoot/$dirName/${testName}-out.txt"
    actualErr="$resultsRoot/$dirName/${testName}-err.txt"
    diffOut="$resultsRoot/$dirName/${testName}-diff.txt"
    jsTest="$testRoot/$dirName/script-tests/${testName}.js"

    if [ ! -d "$resultsRoot/$dirName" ]
    then
        mkdir -p "$resultsRoot/$dirName"
    fi

    if [ -f $expectedOut -a -f $jsTest ]
    then
        echo "Testing $test ... \c"
        let numTestsRun=$numTestsRun+1
        $jscCmd $preScript $jsTest $postScript 2>$actualErr > $actualOut
        JSC_RES=$?
        
        if [ $JSC_RES -eq 0 ]
        then
            diff $actualOut $expectedOut > $diffOut
            if [ $? -eq 0 ]
            then
                testPassed=1
                echo "PASSED"
            else
                testPassed=0
                echo "FAILED"
            fi
        else
            testPassed=0
            if [ $JSC_RES -gt 128 ]
            then
                testCrashed=1
                echo "CRASHED"
            else
                echo "ERROR: $JSC_RES"
            fi
        fi

        if [ $testPassed -eq 1 ]
        then
            echo "$test" >> $passList
            let numPassed=$numPassed+1
        else
            echo "$test" >> $failList
            let numFailed=$numFailed+1
            if [ $testCrashed -eq 1 ]
            then
                echo "$test" >> $crashList
                let numCrashed=$numCrashed+1
            fi
        fi
    fi
done

if [ $numPassed -eq $numTestsRun ]
then
    echo "All $numTestsRun tests passed!" | tee $resultsRoot/summary
else
    echo "$numPassed tests passed, $numFailed tests failed, $numCrashed tests crashed." | tee $resultsRoot/summary
fi

echo "Test results in $resultsRoot"
