📄 shunit2
字号:
if [ $# -eq 3 ]; then shunit_message_="${shunit_message_}$1" shift fi shunit_unexpected_=$1 shunit_actual_=$2 _shunit_testFailed "${shunit_message_:+${shunit_message_} }expected:<${shunit_unexpected_}> but was:<${shunit_actual_}>" unset shunit_message_ shunit_unexpected_ shunit_actual_ return ${SHUNIT_FALSE}}_FAIL_NOT_EQUALS_='eval failNotEquals --lineno "${LINENO:-}"'#/**# <s:function group="failures"># <entry align="right"># <emphasis>void</emphasis># </entry># <entry># <funcsynopsis># <funcprototype># <funcdef><function>failSame</function></funcdef># <paramdef>string <parameter>[message]</parameter></paramdef># </funcprototype># </funcsynopsis># <para>Indicate test failure because arguments were not the same. The# message is optional.</para># </entry># </s:function>#*/failSame(){ ${_SHUNIT_LINENO_} if [ $# -lt 2 -o $# -gt 3 ]; then _shunit_error 'failSame() requires two or three arguments' return ${SHUNIT_ERROR} fi _shunit_shouldSkip && return ${SHUNIT_TRUE} [ -z "${shunit_message_:-}" ] && shunit_message_='' if [ $# -eq 3 ]; then shunit_message_="${shunit_message_}$1" shift fi _shunit_testFailed "${shunit_message_:+${shunit_message_} }expected not same" unset shunit_message_ return ${SHUNIT_FALSE}}_FAIL_SAME_='eval failSame --lineno "${LINENO:-}"'#/**# <s:function group="failures"># <entry align="right"># <emphasis>void</emphasis># </entry># <entry># <funcsynopsis># <funcprototype># <funcdef><function>failNotSame</function></funcdef># <paramdef>string <parameter>[message]</parameter></paramdef># <paramdef>string <parameter>expected</parameter></paramdef># <paramdef>string <parameter>actual</parameter></paramdef># </funcprototype># </funcsynopsis># <para>Fails the test if <emphasis>expected</emphasis> and# <emphasis>actual</emphasis> are equal to one another. The message is# optional.</para># </entry># </s:function>#*/failNotSame(){ ${_SHUNIT_LINENO_} if [ $# -lt 2 -o $# -gt 3 ]; then _shunit_error 'failNotEquals() requires one or two arguments' return ${SHUNIT_ERROR} fi _shunit_shouldSkip && return ${SHUNIT_TRUE} if [ $# -eq 2 ]; then failNotEquals "$1" "$2" else failNotEquals "$1" "$2" "$3" fi}_FAIL_NOT_SAME_='eval failNotSame --lineno "${LINENO:-}"'#-----------------------------------------------------------------------------# skipping functions##/**# <s:function group="skipping"># <entry align="right"># <emphasis>void</emphasis># </entry># <entry># <funcsynopsis># <funcprototype># <funcdef><function>startSkipping</function></funcdef># <paramdef /># </funcprototype># </funcsynopsis># <para>This function forces the remaining assert and fail functions to be# "skipped", i.e. they will have no effect. Each function skipped will be# recorded so that the total of asserts and fails will not be altered.</para># </entry># </s:function>#*/startSkipping(){ __shunit_skip=${SHUNIT_TRUE}}#/**# <s:function group="skipping"># <entry align="right"># <emphasis>void</emphasis># </entry># <entry># <funcsynopsis># <funcprototype># <funcdef><function>endSkipping</function></funcdef># <paramdef /># </funcprototype># </funcsynopsis># <para>This function returns calls to the assert and fail functions to their# default behavior, i.e. they will be called.</para># </entry># </s:function>#*/endSkipping(){ __shunit_skip=${SHUNIT_FALSE}}#/**# <s:function group="skipping"># <entry align="right"># <emphasis>boolean</emphasis># </entry># <entry># <funcsynopsis># <funcprototype># <funcdef><function>isSkipping</function></funcdef># <paramdef /># </funcprototype># </funcsynopsis># <para>This function returns the state of skipping.</para># </entry># </s:function>#*/isSkipping(){ return ${__shunit_skip}}#-----------------------------------------------------------------------------# suite functions##/**# <s:function group="suites"># <entry align="right"># <emphasis>void</emphasis># </entry># <entry># <funcsynopsis># <funcprototype># <funcdef><function>suite</function></funcdef># <paramdef /># </funcprototype># </funcsynopsis># <para>This function can be optionally overridden by the user in their test# suite.</para># <para>If this function exists, it will be called when# <command>shunit2</command> is sourced. If it does not exist, shUnit2 will# search the parent script for all functions beginning with the word# <literal>test</literal>, and they will be added dynamically to the test# suite.</para># </entry># </s:function>#*/# Note: see _shunit_mktempFunc() for actual implementation# suite() { :; }#/**# <s:function group="suites"># <entry align="right"># <emphasis>void</emphasis># </entry># <entry># <funcsynopsis># <funcprototype># <funcdef><function>suite_addTest</function></funcdef># <paramdef>string <parameter>function</parameter></paramdef># </funcprototype># </funcsynopsis># <para>This function adds a function name to the list of tests scheduled for# execution as part of this test suite. This function should only be called# from within the <function>suite()</function> function.</para># </entry># </s:function>#*/suite_addTest(){ _su_func=${1:-} __shunit_suite="${__shunit_suite:+${__shunit_suite} }${_su_func}" unset _su_func}#/**# <s:function group="suites"># <entry align="right"># <emphasis>void</emphasis># </entry># <entry># <funcsynopsis># <funcprototype># <funcdef><function>oneTimeSetUp</function></funcdef># <paramdef /># </funcprototype># </funcsynopsis># <para>This function can be be optionally overridden by the user in their# test suite.</para># <para>If this function exists, it will be called once before any tests are# run. It is useful to prepare a common environment for all tests.</para># </entry># </s:function>#*/# Note: see _shunit_mktempFunc() for actual implementation# oneTimeSetUp() { :; }#/**# <s:function group="suites"># <entry align="right"># <emphasis>void</emphasis># </entry># <entry># <funcsynopsis># <funcprototype># <funcdef><function>oneTimeTearDown</function></funcdef># <paramdef /># </funcprototype># </funcsynopsis># <para>This function can be be optionally overridden by the user in their# test suite.</para># <para>If this function exists, it will be called once after all tests are# completed. It is useful to clean up the environment after all tests.</para># </entry># </s:function>#*/# Note: see _shunit_mktempFunc() for actual implementation# oneTimeTearDown() { :; }#/**# <s:function group="suites"># <entry align="right"># <emphasis>void</emphasis># </entry># <entry># <funcsynopsis># <funcprototype># <funcdef><function>setUp</function></funcdef># <paramdef /># </funcprototype># </funcsynopsis># <para>This function can be be optionally overridden by the user in their# test suite.</para># <para>If this function exists, it will be called before each test is run.# It is useful to reset the environment before each test.</para># </entry># </s:function>#*/# Note: see _shunit_mktempFunc() for actual implementation# setUp() { :; }#/**# <s:function group="suites"># <entry align="right"># <emphasis>void</emphasis># </entry># <entry># <funcsynopsis># <funcprototype># <funcdef><function>tearDown</function></funcdef># <paramdef /># </funcprototype># </funcsynopsis># <para>This function can be be optionally overridden by the user in their# test suite.</para># <para>If this function exists, it will be called after each test completes.# It is useful to clean up the environment after each test.</para># </entry># </s:function>#*/# Note: see _shunit_mktempFunc() for actual implementation# tearDown() { :; }#------------------------------------------------------------------------------# internal shUnit2 functions#_shunit_cleanup(){ name=$1 case ${name} in EXIT) signal=0 ;; INT) signal=2 ;; TERM) signal=15 ;; *) _shunit_warn "unrecognized trap value (${name})" signal=0 ;; esac # do our work rm -fr "${__shunit_tmpDir}" # exit for all non-EXIT signals if [ ${name} != 'EXIT' ]; then _shunit_warn "trapped and now handling the (${name}) signal" _shunit_generateReport # disable EXIT trap trap 0 # add 128 to signal and exit exit `expr ${signal} + 128` fi}_shunit_execSuite(){ echo '#' echo '# Performing tests' echo '#' for _su_func in ${__shunit_suite}; do # disable skipping endSkipping # execute the per-test setup function setUp # execute the test echo "${_su_func}" eval ${_su_func} # execute the per-test tear-down function tearDown done unset _su_func}_shunit_generateReport(){ _su__awkPercent='{printf("%4d %3.0f%%", $1, $1*100/$2)}' if [ ${__shunit_testsTotal:-0} -gt 0 ]; then _su__passed=`echo ${__shunit_testsPassed} ${__shunit_testsTotal} |\ awk "${_su__awkPercent}"` _su__failed=`echo ${__shunit_testsFailed} ${__shunit_testsTotal} |\ awk "${_su__awkPercent}"` _su__skipped=`echo ${__shunit_testsSkipped} ${__shunit_testsTotal} |\ awk "${_su__awkPercent}"` _su__total=`echo ${__shunit_testsTotal} 100 |\ awk '{printf("%4d %3d%%", $1, $2)}'` else _su__passed=`echo 0 0 |awk '{printf("%4d %3d%%", $1, $2)}'` _su__failed=${_su__passed} _su__skipped=${_su__passed} _su__total=${_su__passed} fi cat <<EOF## Test report#tests passed: ${_su__passed}tests failed: ${_su__failed}tests skipped: ${_su__skipped}tests total: ${_su__total}EOF unset _su__awkPercent _su__passed _su__failed _su__skipped _su__total}# this function is a cross-platform temporary directory creation tool. not all# OSes have the mktemp function, so one is included here._shunit_mktempDir(){ # try the standard mktemp function ( exec mktemp -dqt shunit.XXXXXX 2>/dev/null ) && return # the standard mktemp didn't work. doing our own. if [ -r '/dev/urandom' ]; then _su__random=`od -vAn -N4 -tx4 </dev/urandom |sed 's/^[^0-9a-f]*//'` elif [ -n "${RANDOM:-}" ]; then # $RANDOM works _su__random=${RANDOM}${RANDOM}${RANDOM}$$ else # $RANDOM doesn't work _su__date=`date '+%Y%m%d%H%M%S'` _su__random=`expr ${_su__date} / $$` fi _su__tmpDir="${TMPDIR:-/tmp}/shunit.${_su__random}" ( umask 077 && mkdir "${_su__tmpDir}" ) || { echo 'shUnit:FATAL could not create temporary directory! exiting' >&2 exit 1 } echo ${_su__tmpDir} unset _su__date _su__random _su__tmpDir}# this function is here to work around issues in Cygwin_shunit_mktempFunc(){ for _su__func in oneTimeSetUp oneTimeTearDown setUp tearDown suite; do _su__file="${__shunit_tmpDir}/${_su__func}" cat <<EOF >"${_su__file}"#! /bin/shexit 0EOF chmod +x "${_su__file}" done unset _su__file}_shunit_shouldSkip(){ [ ${__shunit_skip} -eq ${SHUNIT_FALSE} ] && return ${SHUNIT_FALSE} _shunit_testSkipped}_shunit_testPassed(){ __shunit_testsPassed=`expr ${__shunit_testsPassed} + 1` __shunit_testsTotal=`expr ${__shunit_testsTotal} + 1`}_shunit_testFailed(){ _su__msg=$1 __shunit_testsFailed=`expr ${__shunit_testsFailed} + 1` __shunit_testsTotal=`expr ${__shunit_testsTotal} + 1` echo "${__SHUNIT_ASSERT_MSG_PREFIX}${_su__msg}" >&2 unset _su__msg}_shunit_testSkipped(){ __shunit_testsSkipped=`expr ${__shunit_testsSkipped} + 1` __shunit_testsTotal=`expr ${__shunit_testsTotal} + 1`}#------------------------------------------------------------------------------# main## create a temporary storage location__shunit_tmpDir=`_shunit_mktempDir`# setup traps to clean up after ourselvestrap '_shunit_cleanup EXIT' 0trap '_shunit_cleanup INT' 2trap '_shunit_cleanup TERM' 15# create phantom functions to work around issues with Cygwin_shunit_mktempFuncPATH="${__shunit_tmpDir}:${PATH}"# execute the oneTimeSetUp function (if it exists)oneTimeSetUp# execute the suite function defined in the parent test script# deprecated as of 2.1.0suite# if no suite function was defined, dynamically build a list of functionsif [ -z "${__shunit_suite}" ]; then shunit_funcs_=`grep "^[ \t]*test[A-Za-z0-9_]* *()" ${__SHUNIT_PARENT} \ |sed 's/[^A-Za-z0-9_]//g'` for shunit_func_ in ${shunit_funcs_}; do suite_addTest ${shunit_func_} donefiunset shunit_func_ shunit_funcs_# execute the tests_shunit_execSuite# execute the oneTimeTearDown function (if it exists)oneTimeTearDown# generate report_shunit_generateReport# restore the previous set of shell flagsfor shunit_shellFlag_ in ${__SHUNIT_SHELL_FLAGS}; do echo ${shunit_shellFlags_} |grep ${shunit_shellFlag_} >/dev/null \ || set +${shunit_shellFlag_}doneunset shunit_shellFlag_ shunit_shellFlags_[ ${__shunit_testsFailed} -eq 0 ] || exit 1#/**# </s:shelldoc>#*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -