#! /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/Helpers/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"
