#! /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/{js,fast/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`

cmdName=`basename $0`

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

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

    shift 2
done

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

preScript=$testRoot/resources/standalone-pre.js
postScript=$testRoot/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 testHTMLFile in `(cd $testRoot && ls -1 js/*.html fast/regex/*.html)`
do
    testPassed=0
    testCrashed=0
    testName=`basename $testHTMLFile .html`
    dirName=`dirname $testHTMLFile`
    test=$dirName/$testName
     
    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 $jsTest ]
    then
        if [ `uname` = 'Darwin' ]; then
            echo "Testing $test ... \c"
        else
            echo -n "Testing $test ..."
        fi
        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
            numPassed=$(($numPassed+1))
        else
            echo "$test" >> $failList
            numFailed=$(($numFailed+1))
            if [ $testCrashed -eq 1 ]
            then
                echo "$test" >> $crashList
                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"
