Add a patch for ShUnit 1.3 to use subunit if desired.
authorRobert Collins <robertc@robertcollins.net>
Fri, 14 Apr 2006 16:43:57 +0000 (02:43 +1000)
committerRobert Collins <robertc@robertcollins.net>
Fri, 14 Apr 2006 16:43:57 +0000 (02:43 +1000)
shell/README
shell/subunit-ui.patch [new file with mode: 0644]

index 41326588bba85e980baedb1a536af61555fe6be7..0f47c19ea7ff6fd6b594ba2e1d3b45c735d08f81 100644 (file)
@@ -28,8 +28,10 @@ metadata trivially. See share/subunit.sh for the functions and comments.
 
 However, this is not a full test environment, its support code for reporting to
 subunit. You can look at ShUnit (http://shunit.sourceforge.net) for 'proper' 
 
 However, this is not a full test environment, its support code for reporting to
 subunit. You can look at ShUnit (http://shunit.sourceforge.net) for 'proper' 
-shell based xUnit functionality. I am currently integrating subunit into ShUnit
-so you should be able to get both subunit an ShUnit easily.
+shell based xUnit functionality. There is a patch for ShUnit 1.3 
+(subunit-ui.patch) in the subunit source tree. I hope to have that integrated 
+upstream in the near future. I will delete the copy of the patch in the subunit
+tree a release or two later.
 
 If you are a test environment maintainer - either homegrown, or ShUnit or some
 such, you will need to see how the subunit calls should be used. Here is what
 
 If you are a test environment maintainer - either homegrown, or ShUnit or some
 such, you will need to see how the subunit calls should be used. Here is what
diff --git a/shell/subunit-ui.patch b/shell/subunit-ui.patch
new file mode 100644 (file)
index 0000000..516812d
--- /dev/null
@@ -0,0 +1,362 @@
+Index: shUnit
+===================================================================
+RCS file: /cvsroot/shunit/ShUnit/shUnit,v
+retrieving revision 1.14
+diff -u -p -r1.14 shUnit
+--- shUnit     18 Mar 2006 04:53:18 -0000      1.14
++++ shUnit     14 Apr 2006 16:18:51 -0000
+@@ -88,16 +88,59 @@ shuFmtNbrTests() {
+     fi
+ }
++function shuPrintStartRun () {
++  # print out the start of a test run.
++  printf "\n****** `basename ${0}` ******\n"
++  printf "%s to run:\n" "$shuRetFmtNbrTests"
++}
++
++function shuPrintStart () {
++  # print out the prelude to a single test
++  # $1 is the test name 
++  # $2 the test number
++  printf "    Test %i: %s    " ${2} "${1}"
++}
++
++function shuPrintAfter () {
++  # print out the result of a single test
++  # $1 is the test name
++  # SHU_STR_FAILED contains error text (if any)
++  printf "\n"
++
++  if test -n "${SHU_STR_FAILED}"
++  then 
++
++    OLD_IFS="${IFS}"
++    IFS="^"
++    set -- ${SHU_STR_FAILED}
++    IFS="${OLD_IFS}"
++    while [ ${#} -gt 0 ]
++    do
++      printf "      \"%s\" failed.\n" "${1}" 
++      shift 
++    done
++  fi
++}
++
++function shuPrintAfterRun () {
++  # print out the result of the run
++  # $1 is the number of tests run
++  # $2 the pass count
++  # $3 the failure count.
++  printf "\n%s run.\n" "${1}"
++  printf "  %s succeeded.\n" "${2}"
++  printf "  %s failed.\n\n" "${3}"
++}
++
+ shuStart() {
+   strInitFunction="${1}"
+   eval ${strInitFunction}
+-  printf "\n****** `basename ${0}` ******\n"
+-
+   SHU_TOTAL_NR_OF_TESTS=`echo ${SHU_STR_ALL_TESTS} | wc -w | sed -e 's/ *//'` 
+   shuFmtNbrTests "${SHU_TOTAL_NR_OF_TESTS}"
+-  printf "%s to run:\n" "$shuRetFmtNbrTests"
++
++  shuPrintStartRun 
+   SHU_TOTAL_NR_SUCCEEDED=0
+   shuTestNbr=0
+@@ -105,33 +148,19 @@ shuStart() {
+   do
+     SHU_STR_FAILED=""
+     shuTestNbr=`expr ${shuTestNbr} + 1`
+-    printf "    Test %i: %s    " ${shuTestNbr} "${STR_TEST}"
++    shuPrintStart "${STR_TEST}" ${shuTestNbr}
+     shuRunOneTest ${STR_TEST}
+-    printf "\n"
+-
+-    if test -n "${SHU_STR_FAILED}"
+-    then 
+-
+-      OLD_IFS="${IFS}"
+-      IFS="^"
+-      set -- ${SHU_STR_FAILED}
+-      IFS="${OLD_IFS}"
+-      while [ ${#} -gt 0 ]
+-      do
+-        printf "      \"%s\" failed.\n" "${1}" 
+-        shift 
+-      done
+-    fi
++    shuPrintAfter "${STR_TEST}"
+   done
+   shuFmtNbrTests "${shuTestNbr}"
+-  printf "\n%s run.\n" "${shuRetFmtNbrTests}"
+-
++  number_run="${shuRetFmtNbrTests}"
+   shuFmtNbrTests "${SHU_TOTAL_NR_SUCCEEDED}"
+-  printf "  %s succeeded.\n" "${shuRetFmtNbrTests}"
+-
++  number_passed="${shuRetFmtNbrTests}"
+   shuFmtNbrTests `expr ${shuTestNbr} - ${SHU_TOTAL_NR_SUCCEEDED}`
+-  printf "  %s failed.\n\n" "${shuRetFmtNbrTests}"
++  number_failed="${shuRetFmtNbrTests}"
++
++  shuPrintAfterRun "${number_run}" "${number_passed}" "${number_failed}"
+ }
+ shuRegisterFailedTest() {
+Index: shUnitTest
+===================================================================
+RCS file: /cvsroot/shunit/ShUnit/shUnitTest,v
+retrieving revision 1.16
+diff -u -p -r1.16 shUnitTest
+--- shUnitTest 31 Dec 2005 06:35:29 -0000      1.16
++++ shUnitTest 14 Apr 2006 16:18:51 -0000
+@@ -121,6 +121,53 @@ TestShuFmtNbrTests() {
+     shuAssert "Failed test case 100 returned [$shuRetFmtNbrTests]" $?
+ }
++
++TestShuPrintStartRun() {
++  # when not using subunit, print output an idea of what tests will run before starting.
++  expected=$(printf "\n****** `basename ${0}` ******\n"; printf "%s to run:\n" "$shuRetFmtNbrTests")
++  result=$(shuPrintStartRun)
++  [ "x$expected" = "x$result" ] && pass=0 || pass=1
++  shuAssert "Failed test case incorrect output [$result] wanted [$expected]" ${pass}
++}
++
++
++TestShuPrintStart() {
++  # when not using subunit, print output a human readable pre-test intro.
++  expected=$(printf "    Test 1: phwoar    ")
++  result=$(shuPrintStart phwoar 1)
++  [ "x$expected" = "x$result" ] && pass=0 || pass=1
++  shuAssert "Failed test case incorrect output [$result] wanted [$expected]" ${pass}
++}
++
++
++TestShuPrintAfter() {
++  # when not using subunit, print the error text normally.
++
++  # case one : passes
++  expected=$(printf "\n")
++  SHU_STR_FAILED=""
++  result=$(shuPrintAfter phwoar)
++  [ "x$expected" = "x$result" ] && pass=0 || pass=1
++  shuAssert "Failed test case incorrect output [$result] wanted [$expected]" ${pass}
++
++  # case two: errors
++  SHU_STR_FAILED=$(printf "some test\nmore text")
++  expected=$(printf "\n      \"some test\nmore text\" failed.")
++  result=$(shuPrintAfter phwoar)
++  SHU_STR_FAILED=""
++  [ "x$expected" = "x$result" ] && pass=0 || pass=1
++  shuAssert "Failed test case incorrect output [$result] wanted [$expected]" ${pass}
++}
++
++
++TestShuPrintAfterRun() {
++  # print out a summary of the tests run
++  expected=$(printf "\n5 run.\n  4 succeeded.\n  1 failed.\n\n")
++  result=$(shuPrintAfterRun 5 4 1)
++  [ "x$expected" = "x$result" ] && pass=0 || pass=1
++  shuAssert "Failed test case incorrect output [$result] wanted [$expected]" ${pass}
++}
++
+ InitFunction() {
+   shuRegTest TestIntentionalFailure
+   shuRegTest TestShuRegisterFailedTest
+@@ -130,6 +177,10 @@ InitFunction() {
+   shuRegTest TestShuRunOneTest
+   shuRegTest TestSetupCalledCorrectly
+   shuRegTest TestShuFmtNbrTests
++  shuRegTest TestShuPrintStartRun
++  shuRegTest TestShuPrintAfterRun
++  shuRegTest TestShuPrintStart
++  shuRegTest TestShuPrintAfter
+ } 
+--- /dev/null  2006-03-28 06:29:48.000000000 +1100
++++ shUnitSubUnit      2006-04-15 02:17:38.000000000 +1000
+@@ -0,0 +1,74 @@
++################################################################################
++# shUnit subunit integration
++# original by Robert Collins
++# $Source:  $
++# $Id: $
++################################################################################
++#
++
++. subunit.sh
++
++function shuPrintStartRun () {
++  # print out the start of a test run. This prints nothing
++  # when using subunit, because we are no longer doing the UI.
++  :
++}
++
++function shuPrintAfterRun () {
++  # print out the end of a test run. This prints nothing
++  # when using subunit, because we are no longer doing the UI.
++  :
++}
++
++function shuPrintStart () {
++  # print out the prelude to a single test
++  # $1 is the test name 
++  # $2 the test number
++  subunit_start_test "${1}"
++}
++
++function shuPrintAfter () {
++  # print out the result of a single test
++  # $1 is the test name
++  # SHU_STR_FAILED contains error text (if any)
++  test_name="${1}"
++  if test -n "${SHU_STR_FAILED}"
++  then 
++
++    OLD_IFS="${IFS}"
++    IFS="^"
++    set -- ${SHU_STR_FAILED}
++    subunit_fail_test "${test_name}" <<<${SHU_STR_FAILED}
++    IFS="${OLD_IFS}"
++  else
++    subunit_pass_test "${1}"
++  fi
++}
++
++
++shuAssert() {
++  # override assert to be quiet.
++  strMessage="${1:-}"
++  boolResult="${2:-${SHU_FALSE}}"
++
++  if [ ${boolResult} -ne ${SHU_TRUE} ]
++  then
++    shuRegisterFailedTest "${strMessage}"
++  else
++    SHU_TEST_SUCCEEDED=${SHU_TRUE}
++  fi
++}
++
++shuDeny() {
++  # override deny to be quiet.
++  strMessage="${1:-}"
++  boolResult="${2:-${SHU_TRUE}}"
++
++  if [ ${boolResult} -eq ${SHU_TRUE} ]
++  then
++    shuRegisterFailedTest "${strMessage}"
++  else
++    SHU_TEST_SUCCEEDED=${SHU_TRUE}
++  fi
++}
++
+--- /dev/null  2006-03-28 06:29:48.000000000 +1100
++++ shUnitSubUnitTest  2006-04-15 02:18:19.000000000 +1000
+@@ -0,0 +1,99 @@
++#! /usr/bin/env sh
++# Tests for the subunit client UI.
++################################################################################
++# $Id: $
++################################################################################
++
++#
++# 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
++inherit shUnitSubUnit
++
++
++shuSetUp() {
++    touch ./test.$$
++}
++
++shuTearDown() {
++    [ -f ./test.$$ ] && rm ./test.$$
++}
++
++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
++}
++
++TestShuPrintAfter() {
++  # for subunit, we delegate to subunit on pass and fail output.
++
++  # case one : passes
++  expected=$(subunit_pass_test "Test 1")
++  SHU_STR_FAILED=""
++  result=$(shuPrintAfter "Test 1")
++  [ "x$expected" = "x$result" ] && pass=0 || pass=1
++  shuAssert "Failed test case incorrect output [$result] wanted [$expected]" ${pass}
++
++  # case two: errors
++  SHU_STR_FAILED=$(printf "some test\nmore text")
++  expected=$(subunit_fail_test "phwoar" <<END
++some test
++more text
++END)
++  result=$(shuPrintAfter phwoar)
++  SHU_STR_FAILED=""
++  [ "x$expected" = "x$result" ] && pass=0 || pass=1
++  shuAssert "Failed test case incorrect output [$result] wanted [$expected]" ${pass}
++}
++
++TestShuPrintStartRun() {
++  # when using subunit, print nothing at the start of the program run
++  expected=""
++  result=$(shuPrintStartRun)
++  [ "x$expected" = "x$result" ] && pass=0 || pass=1
++  shuAssert "Failed test case incorrect output [$result] wanted [$expected]" ${pass}
++}
++
++TestShuPrintStart() {
++  # when using subunit, print the subunit header
++  expected=$(subunit_start_test phwoar)
++  result=$(shuPrintStart phwoar 1)
++  [ "x$expected" = "x$result" ] && pass=0 || pass=1
++  shuAssert "Failed test case incorrect output [$result] wanted [$expected]" ${pass}
++}
++
++TestShuPrintAfterRun() {
++  # in subunit the runner UI prints out statistics.
++  expected=""
++  result=$(shuPrintAfterRun 5 4 1)
++  [ "x$expected" = "x$result" ] && pass=0 || pass=1
++  shuAssert "Failed test case incorrect output [$result] wanted [$expected]" ${pass}
++}
++
++InitFunction() {
++  shuRegTest TestShuAssert
++  shuRegTest TestShuDeny
++  shuRegTest TestShuPrintStartRun
++  shuRegTest TestShuPrintAfterRun
++  shuRegTest TestShuPrintStart
++  shuRegTest TestShuPrintAfter
++} 
++
++
++### Main
++
++shuStart InitFunction
++