#!/bin/bash

function info()  { echo -e "\033[00;32m[INFO] $1\033[00m";    }

function error() { echo -e "\033[00;31m[ERROR] $1\033[00m";   }

function do_test() {
        TEST_NAME=`basename $1 .test`
        TEST_SRC=${TEST_NAME}.aml
        COMPILE_ONLY=false
        GUITEST=false

        . ${TEST_NAME}.test

        if [ ! -f "$TEST_SRC" ]; then
            error "Source file '$TEST_SRC' not found."
            return 1
        fi

        compile $TEST_NAME

        if $COMPILE_ONLY; then
            checkoutput $TEST_NAME
            return $?
        fi

        if [ ! -f "./bin/$TEST_NAME.class" ]; then
            error "Binary file 'bin/$TEST_NAME.class' not found."
            return 1
        fi

        run $TEST_NAME
        checkoutput $TEST_NAME
        return $?
}

function run_all() {
    for test in *.test
    do
        do_test $test
    done
}

function compile() {
	echo "Compiling '$1'..."
    if [ ! -d "bin" ]; then
        mkdir bin
    fi
    cd bin
    copydependencies
	../$AML_BINARY -c ../$1.aml >log_stdout 2>log_stderr
    if [ -f "$1.java" ]; then
        javac -classpath ../../ ./$1.java
    fi
    cd ..
}

function run() {
	echo "Running '$1'..."
    cd bin
    if $GUITEST; then
        java $1 >log_stdout 2>log_stderr
    else
        java $1 >log_stdout 2>log_stderr &
        sleep 3
        kill $!
    fi
    cd ..
}

function checkoutput() {
    . $1.test

    if [ -f bin/log_stdout ]; then
        ACTUAL_OUT=`cat bin/log_stdout`
    else
        ACTUAL_OUT=""
    fi

    if [ -f bin/log_stderr ]; then
        ACTUAL_ERR=`cat bin/log_stderr`
    else
        ACTUAL_ERR=""
    fi

    rm log_stdout &> /dev/null
    rm log_stderr &> /dev/null


    if [ "$OUT" = "$ACTUAL_OUT" ] && [ "$ERR" = "$ACTUAL_ERR" ]; then
        info "$1 PASSED"
        return 0
    else
        echo expected err: "$ERR"
        echo actual err: "$ACTUAL_ERR"
        echo expected out: "$OUT"
        echo actual out: "$ACTUAL_OUT"
        error "$1 FAILED"
        return 1
    fi
}

function clean() {
    rm -rf bin
}

function copydependencies() {
    if [ ! -f AMLJava.class ] || [ ! -f Cell.class ] || [ ! -f List.class ]; then
        cp ../../AMLJava.java .
        cp ../../Cell.java .
        cp ../../List.java .
        javac AMLJava.java
    fi
    if [ ! -f maze.txt ]; then
        cp ../maze.txt .
    fi
}
