#! /usr/bin/env sh

################################################################################
# $Id: shUnitTest,v 1.16 2005/12/31 06:35:29 bobbynations Exp $
################################################################################

#
# find the shUnit file using the command as a reference
#
inherit() {
    d=`expr ${0} : '\([a-zA-Z/._-]*\/\)'`
    test `expr "$d" : '[./]'` -eq 0 && d="./$d"
    . ${d}${1}
}

inherit shUnit

dummyTest() {
    :
}
TestShuRegTest() {
    orig="${SHU_STR_ALL_TESTS}"

    return=`expr "${SHU_STR_ALL_TESTS}" : ".* dummyTest"`
    shuDeny "dummyTest already exists" $?

    shuRegTest "dummyTest"
    return=`expr "${SHU_STR_ALL_TESTS}" : ".* dummyTest"`
    shuAssert "dummyTest didn't register" $?

    SHU_STR_ALL_TESTS=${orig}
}
TestShuRunOneTest() {
    orig_total_nr_run="${shuTestNbr}"
    orig_total_nr_succeeded="${SHU_TOTAL_NR_SUCCEEDED}"

    before="${shuTestNbr}"
    shuRunOneTest "nonExistantFunction" > /dev/null 2>&1
    after="${shuTestNbr}"
    [ $before -eq $after ]
    shuAssert "shuTestNbr increased after running non-existant test" $?

    shuTestNbr=${orig_total_nr_run}
    SHU_TOTAL_NR_SUCCEEDED=${orig_total_nr_succeeded}
}

shuSetUp() {
    touch ./test.$$
}

shuTearDown() {
    [ -f ./test.$$ ] && rm ./test.$$
}

TestSetupCalledCorrectly() {
    test -f ./test.$$
    shuAssert "test file not created: " $?
}

TestShuRegisterFailedTest() {
    orig="$SHU_STR_FAILED"

    unset SHU_STR_FAILED
    shuRegisterFailedTest "message1"
    SHU_TEST_SUCCEEDED=${SHU_TRUE}
    [ "$SHU_STR_FAILED" = "message1" ]
    shuAssert "expected 'message1' but got $SHU_STR_FAILED" $?

    shuRegisterFailedTest "message2"
    SHU_TEST_SUCCEEDED=${SHU_TRUE}
    [ "$SHU_STR_FAILED" = "message1^message2" ]
    shuAssert "expected 'message1' but got $SHU_STR_FAILED" $?

    shuRegisterFailedTest "message3"
    SHU_TEST_SUCCEEDED=${SHU_TRUE}
    [ "$SHU_STR_FAILED" = "message1^message2^message3" ]
    shuAssert "expected 'message1^message2' but got $SHU_STR_FAILED" $?

    SHU_STR_FAILED="$orig"
}

TestIntentionalFailure() {
    shuAssert "This test failed intentionally" ${SHU_FALSE}
    test ${SHU_TEST_SUCCEEDED} -eq ${SHU_FALSE}
    shuAssert "Failed test didn't set SHU_TEST_SUCCEEDED to false" $?

    shuAssert "This is another test that failed intentionally" ${SHU_FALSE}
    test ${SHU_TEST_SUCCEEDED} -eq ${SHU_FALSE}
    shuAssert "Failed test didn't set SHU_TEST_SUCCEEDED to false" $?

    SHU_TEST_SUCCEEDED=${SHU_TRUE}
}

TestShuAssert() {
    shuAssert "" "${SHU_TRUE}"
    shuAssert "Test case ${SHU_TRUE} failed" "${SHU_TRUE}"
}

TestShuDeny() {
    shuDeny "" "${SHU_FALSE}"
    shuDeny "return code ${SHU_FALSE} failed" "${SHU_FALSE}"
    shuDeny "return code -1 failed" -1
    shuDeny "return code 222 failed" 222
}

TestShuFmtNbrTests() {
    shuFmtNbrTests 0
    [ "No tests" = "${shuRetFmtNbrTests}" ]
    shuAssert "Failed test case 0 returned [$shuRetFmtNbrTests]" $?

    shuFmtNbrTests 1
    [ "1 test" = "${shuRetFmtNbrTests}" ]
    shuAssert "Failed test case 1 returned [$shuRetFmtNbrTests]" $?

    shuFmtNbrTests 2
    [ "2 tests" = "${shuRetFmtNbrTests}" ]
    shuAssert "Failed test case 2 returned [$shuRetFmtNbrTests]" $?

    shuFmtNbrTests 100
    [ "100 tests" = "${shuRetFmtNbrTests}" ]
    shuAssert "Failed test case 100 returned [$shuRetFmtNbrTests]" $?
}

InitFunction() {
  shuRegTest TestIntentionalFailure
  shuRegTest TestShuRegisterFailedTest
  shuRegTest TestShuAssert
  shuRegTest TestShuDeny
  shuRegTest TestShuRegTest
  shuRegTest TestShuRunOneTest
  shuRegTest TestSetupCalledCorrectly
  shuRegTest TestShuFmtNbrTests
} 


### Main

shuStart InitFunction

