Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Unity
提交
f0e4571c
T
Third Party Unity
项目概览
OpenHarmony
/
Third Party Unity
接近 2 年 前同步成功
通知
38
Star
144
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
Third Party Unity
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
f0e4571c
编写于
7月 28, 2018
作者:
E
elliot
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' into unit-test-execution-time
上级
cc909efe
ccb7faf3
变更
20
展开全部
隐藏空白更改
内联
并排
Showing
20 changed file
with
712 addition
and
325 deletion
+712
-325
.travis.yml
.travis.yml
+4
-2
auto/generate_test_runner.rb
auto/generate_test_runner.rb
+30
-10
auto/parse_output.rb
auto/parse_output.rb
+212
-109
docs/UnityAssertionsReference.md
docs/UnityAssertionsReference.md
+9
-0
docs/UnityConfigurationGuide.md
docs/UnityConfigurationGuide.md
+86
-51
docs/UnityGettingStartedGuide.md
docs/UnityGettingStartedGuide.md
+4
-3
docs/UnityHelperScriptsGuide.md
docs/UnityHelperScriptsGuide.md
+21
-3
extras/fixture/src/unity_fixture.h
extras/fixture/src/unity_fixture.h
+1
-1
extras/fixture/src/unity_fixture_internals.h
extras/fixture/src/unity_fixture_internals.h
+2
-2
release/build.info
release/build.info
+1
-1
release/version.info
release/version.info
+1
-1
src/unity.c
src/unity.c
+61
-56
src/unity.h
src/unity.h
+111
-7
src/unity_internals.h
src/unity_internals.h
+121
-73
test/Makefile
test/Makefile
+5
-1
test/testdata/testRunnerGenerator.c
test/testdata/testRunnerGenerator.c
+4
-1
test/testdata/testRunnerGeneratorSmall.c
test/testdata/testRunnerGeneratorSmall.c
+4
-1
test/testdata/testRunnerGeneratorWithMocks.c
test/testdata/testRunnerGeneratorWithMocks.c
+4
-1
test/tests/testparameterized.c
test/tests/testparameterized.c
+5
-2
test/tests/testunity.c
test/tests/testunity.c
+26
-0
未找到文件。
.travis.yml
浏览文件 @
f0e4571c
...
...
@@ -14,11 +14,13 @@ before_install:
-
if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install --assume-yes --quiet gcc-multilib; fi
install
:
-
gem install rspec
-
gem install rubocop
-
gem install rubocop
-v 0.57.2
script
:
-
cd test && rake ci
-
make -s
-
make -s DEBUG=-m32
-
make -s DEBUG=-m32
#32-bit architecture with 64-bit support
-
make -s DEBUG=-m32 UNITY_SUPPORT_64=
#32-bit build without 64-bit types
-
make -s UNITY_INCLUDE_DOUBLE=
# without double
-
cd ../extras/fixture/test && rake ci
-
make -s default noStdlibMalloc
-
make -s C89
...
...
auto/generate_test_runner.rb
浏览文件 @
f0e4571c
...
...
@@ -26,6 +26,7 @@ class UnityTestRunnerGenerator
framework: :unity
,
test_prefix:
'test|spec|should'
,
mock_prefix:
'Mock'
,
mock_suffix:
''
,
setup_name:
'setUp'
,
teardown_name:
'tearDown'
,
main_name:
'main'
,
# set to :auto to automatically generate each time
...
...
@@ -119,7 +120,7 @@ class UnityTestRunnerGenerator
source_index
=
0
tests_and_line_numbers
.
size
.
times
do
|
i
|
source_lines
[
source_index
..-
1
].
each_with_index
do
|
line
,
index
|
next
unless
line
=~
/
#{
tests_and_line_numbers
[
i
][
:test
]
}
/
next
unless
line
=~
/
\s+
#{
tests_and_line_numbers
[
i
][
:test
]
}
(?:\s|\()
/
source_index
+=
index
tests_and_line_numbers
[
i
][
:line_number
]
=
source_index
+
1
break
...
...
@@ -148,7 +149,7 @@ class UnityTestRunnerGenerator
mock_headers
=
[]
includes
.
each
do
|
include_path
|
include_file
=
File
.
basename
(
include_path
)
mock_headers
<<
include_path
if
include_file
=~
/^
#{
@options
[
:mock_prefix
]
}
/i
mock_headers
<<
include_path
if
include_file
=~
/^
#{
@options
[
:mock_prefix
]
}
.*
#{
@options
[
:mock_suffix
]
}
$
/i
end
mock_headers
end
...
...
@@ -157,9 +158,14 @@ class UnityTestRunnerGenerator
output
.
puts
(
'/* AUTOGENERATED FILE. DO NOT EDIT. */'
)
create_runtest
(
output
,
mocks
)
output
.
puts
(
"
\n
/*=======Automagically Detected Files To Include=====*/"
)
output
.
puts
(
'#ifdef __WIN32__'
)
output
.
puts
(
'#define UNITY_INCLUDE_SETUP_STUBS'
)
output
.
puts
(
'#endif'
)
output
.
puts
(
"#include
\"
#{
@options
[
:framework
]
}
.h
\"
"
)
output
.
puts
(
'#include "cmock.h"'
)
unless
mocks
.
empty?
output
.
puts
(
'#ifndef UNITY_EXCLUDE_SETJMP_H'
)
output
.
puts
(
'#include <setjmp.h>'
)
output
.
puts
(
"#endif"
)
output
.
puts
(
'#include <stdio.h>'
)
if
@options
[
:defines
]
&&
!
@options
[
:defines
].
empty?
@options
[
:defines
].
each
{
|
d
|
output
.
puts
(
"#define
#{
d
}
"
)
}
...
...
@@ -235,22 +241,36 @@ class UnityTestRunnerGenerator
end
def
create_suite_setup
(
output
)
return
if
@options
[
:suite_setup
].
nil?
output
.
puts
(
"
\n
/*=======Suite Setup=====*/"
)
output
.
puts
(
'static void suite_setup(void)'
)
output
.
puts
(
'{'
)
output
.
puts
(
@options
[
:suite_setup
])
if
@options
[
:suite_setup
].
nil?
# New style, call suiteSetUp() if we can use weak symbols
output
.
puts
(
'#if defined(UNITY_WEAK_ATTRIBUTE) || defined(UNITY_WEAK_PRAGMA)'
)
output
.
puts
(
' suiteSetUp();'
)
output
.
puts
(
'#endif'
)
else
# Old style, C code embedded in the :suite_setup option
output
.
puts
(
@options
[
:suite_setup
])
end
output
.
puts
(
'}'
)
end
def
create_suite_teardown
(
output
)
return
if
@options
[
:suite_teardown
].
nil?
output
.
puts
(
"
\n
/*=======Suite Teardown=====*/"
)
output
.
puts
(
'static int suite_teardown(int num_failures)'
)
output
.
puts
(
'{'
)
output
.
puts
(
@options
[
:suite_teardown
])
if
@options
[
:suite_teardown
].
nil?
# New style, call suiteTearDown() if we can use weak symbols
output
.
puts
(
'#if defined(UNITY_WEAK_ATTRIBUTE) || defined(UNITY_WEAK_PRAGMA)'
)
output
.
puts
(
' return suiteTearDown(num_failures);'
)
output
.
puts
(
'#else'
)
output
.
puts
(
' return num_failures;'
)
output
.
puts
(
'#endif'
)
else
# Old style, C code embedded in the :suite_teardown option
output
.
puts
(
@options
[
:suite_teardown
])
end
output
.
puts
(
'}'
)
end
...
...
@@ -342,7 +362,7 @@ class UnityTestRunnerGenerator
output
.
puts
(
"int
#{
main_name
}
(void)"
)
output
.
puts
(
'{'
)
end
output
.
puts
(
' suite_setup();'
)
unless
@options
[
:suite_setup
].
nil?
output
.
puts
(
' suite_setup();'
)
output
.
puts
(
" UnityBegin(
\"
#{
filename
.
gsub
(
/\\/
,
'\\\\\\'
)
}
\"
);"
)
if
@options
[
:use_param_tests
]
tests
.
each
do
|
test
|
...
...
@@ -357,7 +377,7 @@ class UnityTestRunnerGenerator
end
output
.
puts
output
.
puts
(
' CMock_Guts_MemFreeFinal();'
)
unless
used_mocks
.
empty?
output
.
puts
(
" return
#{
@options
[
:suite_teardown
].
nil?
?
''
:
'suite_teardown'
}
(UnityEnd());"
)
output
.
puts
(
" return
suite_teardown
(UnityEnd());"
)
output
.
puts
(
'}'
)
end
...
...
auto/parse_output.rb
浏览文件 @
f0e4571c
#============================================================
# Author:
John Theofanopoulos
# A simple parser.
Takes the output files generated during the build process and
# extracts information relating to the tests.
# Author: John Theofanopoulos
# A simple parser.
Takes the output files generated during the
#
build process and
extracts information relating to the tests.
#
# Notes:
# To capture an output file under VS builds use the following:
# devenv [build instructions]
> Output.txt & type Output.txt
# devenv [build instructions] > Output.txt & type Output.txt
#
# To capture an output file under
GCC/
Linux builds use the following:
# To capture an output file under Linux builds use the following:
# make | tee Output.txt
#
# This script can handle the following output formats:
# - normal output (raw unity)
# - fixture output (unity_fixture.h/.c)
# - fixture output with verbose flag set ("-v")
#
# To use this parser use the following command
# ruby parseOutput.rb [options] [file]
# options:
-xml : produce a JUnit compatible XML file
#
file :
file to scan for results
# options: -xml : produce a JUnit compatible XML file
#
file:
file to scan for results
#============================================================
# Parser class for handling the input file
class
ParseOutput
def
initialize
@test_flag
=
false
# internal data
@class_name_idx
=
0
@path_delim
=
nil
# xml output related
@xml_out
=
false
@array_list
=
false
@total_tests
=
false
@class_index
=
false
# current suite name and statistics
@test_suite
=
nil
@total_tests
=
0
@test_passed
=
0
@test_failed
=
0
@test_ignored
=
0
end
#
Set the flag to indicate if there will be an XML output file or not
# Set the flag to indicate if there will be an XML output file or not
def
set_xml_output
@xml_out
=
true
end
#
i
f write our output to XML
#
I
f write our output to XML
def
write_xml_output
output
=
File
.
open
(
'report.xml'
,
'w'
)
output
<<
"<?xml version=
\"
1.0
\"
encoding=
\"
UTF-8
\"
?>
\n
"
@array_list
.
each
do
|
item
|
output
<<
item
<<
"
\n
"
end
output
<<
"</testsuite>
\n
"
end
# This function will try and determine when the suite is changed. This is
# Pushes the suite info as xml to the array list, which will be written later
def
push_xml_output_suite_info
# Insert opening tag at front
heading
=
'<testsuite name="Unity" tests="'
+
@total_tests
.
to_s
+
'" failures="'
+
@test_failed
.
to_s
+
'"'
+
' skips="'
+
@test_ignored
.
to_s
+
'">'
@array_list
.
insert
(
0
,
heading
)
# Push back the closing tag
@array_list
.
push
'</testsuite>'
end
# Pushes xml output data to the array list, which will be written later
def
push_xml_output_passed
(
test_name
)
@array_list
.
push
' <testcase classname="'
+
@test_suite
+
'" name="'
+
test_name
+
'"/>'
end
# Pushes xml output data to the array list, which will be written later
def
push_xml_output_failed
(
test_name
,
reason
)
@array_list
.
push
' <testcase classname="'
+
@test_suite
+
'" name="'
+
test_name
+
'">'
@array_list
.
push
' <failure type="ASSERT FAILED">'
+
reason
+
'</failure>'
@array_list
.
push
' </testcase>'
end
# Pushes xml output data to the array list, which will be written later
def
push_xml_output_ignored
(
test_name
,
reason
)
@array_list
.
push
' <testcase classname="'
+
@test_suite
+
'" name="'
+
test_name
+
'">'
@array_list
.
push
' <skipped type="TEST IGNORED">'
+
reason
+
'</skipped>'
@array_list
.
push
' </testcase>'
end
# This function will try and determine when the suite is changed. This is
# is the name that gets added to the classname parameter.
def
test_suite_verify
(
test_suite_name
)
return
if
@test_flag
@test_flag
=
true
# Split the path name
test_name
=
test_suite_name
.
split
(
'/'
)
# Remove the extension
base_name
=
test_name
[
test_name
.
size
-
1
].
split
(
'.'
)
@test_suite
=
'test.'
+
base_name
[
0
]
test_name
=
test_suite_name
.
split
(
@path_delim
)
# Remove the extension and extract the base_name
base_name
=
test_name
[
test_name
.
size
-
1
].
split
(
'.'
)[
0
]
# Return if the test suite hasn't changed
return
unless
base_name
.
to_s
!=
@test_suite
.
to_s
@test_suite
=
base_name
printf
"New Test: %s
\n
"
,
@test_suite
end
# Test was flagged as having passed so format the output
def
test_passed
(
array
)
last_item
=
array
.
length
-
1
test_name
=
array
[
last_item
-
1
]
test_suite_verify
(
array
[
@class_name
])
# Prepares the line for verbose fixture output ("-v")
def
prepare_fixture_line
(
line
)
line
=
line
.
sub
(
'IGNORE_TEST('
,
''
)
line
=
line
.
sub
(
'TEST('
,
''
)
line
=
line
.
sub
(
')'
,
','
)
line
=
line
.
chomp
array
=
line
.
split
(
','
)
array
.
map
{
|
x
|
x
.
to_s
.
lstrip
.
chomp
}
end
# Test was flagged as having passed so format the output.
# This is using the Unity fixture output and not the original Unity output.
def
test_passed_unity_fixture
(
array
)
class_name
=
array
[
0
]
test_name
=
array
[
1
]
test_suite_verify
(
class_name
)
printf
"%-40s PASS
\n
"
,
test_name
return
unless
@xml_out
push_xml_output_passed
(
test_name
)
if
@xml_out
end
@array_list
.
push
' <testcase classname="'
+
@test_suite
+
'" name="'
+
test_name
+
'"/>'
# Test was flagged as having failed so format the output.
# This is using the Unity fixture output and not the original Unity output.
def
test_failed_unity_fixture
(
array
)
class_name
=
array
[
0
]
test_name
=
array
[
1
]
test_suite_verify
(
class_name
)
reason_array
=
array
[
2
].
split
(
':'
)
reason
=
reason_array
[
-
1
].
lstrip
.
chomp
+
' at line: '
+
reason_array
[
-
4
]
printf
"%-40s FAILED
\n
"
,
test_name
push_xml_output_failed
(
test_name
,
reason
)
if
@xml_out
end
# Test was flagged as
having pass
ed so format the output.
# Test was flagged as
being ignor
ed so format the output.
# This is using the Unity fixture output and not the original Unity output.
def
test_passed_unity_fixture
(
array
)
test_suite
=
array
[
0
].
sub
(
'TEST('
,
''
)
test_suite
=
test_suite
.
sub
(
','
,
''
)
test_name
=
array
[
1
].
sub
(
')'
,
''
)
def
test_ignored_unity_fixture
(
array
)
class_name
=
array
[
0
]
test_name
=
array
[
1
]
reason
=
'No reason given'
if
array
.
size
>
2
reason_array
=
array
[
2
].
split
(
':'
)
tmp_reason
=
reason_array
[
-
1
].
lstrip
.
chomp
reason
=
tmp_reason
==
'IGNORE'
?
'No reason given'
:
tmp_reason
end
test_suite_verify
(
class_name
)
printf
"%-40s IGNORED
\n
"
,
test_name
push_xml_output_ignored
(
test_name
,
reason
)
if
@xml_out
end
# Test was flagged as having passed so format the output
def
test_passed
(
array
)
last_item
=
array
.
length
-
1
test_name
=
array
[
last_item
-
1
]
test_suite_verify
(
array
[
@class_name_idx
])
printf
"%-40s PASS
\n
"
,
test_name
return
unless
@xml_out
@array_list
.
push
' <testcase classname="'
+
test_suite
+
'" name="'
+
test_name
+
'"/>'
push_xml_output_passed
(
test_name
)
if
@xml_out
end
# Test was flagged as
being ingored so format the output
def
test_
ignor
ed
(
array
)
# Test was flagged as
having failed so format the line
def
test_
fail
ed
(
array
)
last_item
=
array
.
length
-
1
test_name
=
array
[
last_item
-
2
]
reason
=
array
[
last_item
].
chomp
test_suite_verify
(
array
[
@class_name
])
printf
"%-40s IGNORED
\n
"
,
test_name
reason
=
array
[
last_item
].
chomp
.
lstrip
+
' at line: '
+
array
[
last_item
-
3
]
class_name
=
array
[
@class_name_idx
]
if
test_name
.
start_with?
'TEST('
array2
=
test_name
.
split
(
' '
)
@test_suite
=
array2
[
0
].
sub
(
'TEST('
,
''
)
@test_suite
=
@test_suite
.
sub
(
','
,
''
)
test_suite
=
array2
[
0
].
sub
(
'TEST('
,
''
)
test_suite
=
test_suite
.
sub
(
','
,
''
)
class_name
=
test_suite
test_name
=
array2
[
1
].
sub
(
')'
,
''
)
end
return
unless
@xml_out
test_suite_verify
(
class_name
)
printf
"%-40s FAILED
\n
"
,
test_name
@array_list
.
push
' <testcase classname="'
+
@test_suite
+
'" name="'
+
test_name
+
'">'
@array_list
.
push
' <skipped type="TEST IGNORED"> '
+
reason
+
' </skipped>'
@array_list
.
push
' </testcase>'
push_xml_output_failed
(
test_name
,
reason
)
if
@xml_out
end
# Test was flagged as
having failed so format the line
def
test_
fail
ed
(
array
)
# Test was flagged as
being ignored so format the output
def
test_
ignor
ed
(
array
)
last_item
=
array
.
length
-
1
test_name
=
array
[
last_item
-
2
]
reason
=
array
[
last_item
].
chomp
+
' at line: '
+
array
[
last_item
-
3
]
test_suite_verify
(
array
[
@class_name
])
printf
"%-40s FAILED
\n
"
,
test_name
reason
=
array
[
last_item
].
chomp
.
lstrip
class_name
=
array
[
@class_name_idx
]
if
test_name
.
start_with?
'TEST('
array2
=
test_name
.
split
(
' '
)
@test_suite
=
array2
[
0
].
sub
(
'TEST('
,
''
)
@test_suite
=
@test_suite
.
sub
(
','
,
''
)
test_suite
=
array2
[
0
].
sub
(
'TEST('
,
''
)
test_suite
=
test_suite
.
sub
(
','
,
''
)
class_name
=
test_suite
test_name
=
array2
[
1
].
sub
(
')'
,
''
)
end
return
unless
@xml_out
test_suite_verify
(
class_name
)
printf
"%-40s IGNORED
\n
"
,
test_name
@array_list
.
push
' <testcase classname="'
+
@test_suite
+
'" name="'
+
test_name
+
'">'
@array_list
.
push
' <failure type="ASSERT FAILED"> '
+
reason
+
' </failure>'
@array_list
.
push
' </testcase>'
push_xml_output_ignored
(
test_name
,
reason
)
if
@xml_out
end
# Figure out what OS we are running on. For now we are assuming if it's not Windows it must
# be Unix based.
def
detect_os
os
=
RUBY_PLATFORM
.
split
(
'-'
)
@class_name
=
if
os
.
size
==
2
if
os
[
1
]
==
'mingw32'
1
else
0
end
else
0
end
# Adjusts the os specific members according to the current path style
# (Windows or Unix based)
def
set_os_specifics
(
line
)
if
line
.
include?
'\\'
# Windows X:\Y\Z
@class_name_idx
=
1
@path_delim
=
'\\'
else
# Unix Based /X/Y/Z
@class_name_idx
=
0
@path_delim
=
'/'
end
end
# Main function used to parse the file that was captured.
def
process
(
name
)
@test_flag
=
false
def
process
(
file_name
)
@array_list
=
[]
detect_os
puts
'Parsing file: '
+
file_name
puts
'Parsing file: '
+
name
test_pass
=
0
test_fail
=
0
test_ignore
=
0
@test_passed
=
0
@test_failed
=
0
@test_ignored
=
0
puts
''
puts
'=================== RESULTS ====================='
puts
''
File
.
open
(
name
).
each
do
|
line
|
# Typical test lines look like this:
File
.
open
(
file_name
).
each
do
|
line
|
# Typical test lines look like these:
# ----------------------------------------------------
# 1. normal output:
# <path>/<test_file>.c:36:test_tc1000_opsys:FAIL: Expected 1 Was 0
# <path>/<test_file>.c:112:test_tc5004_initCanChannel:IGNORE: Not Yet Implemented
# <path>/<test_file>.c:115:test_tc5100_initCanVoidPtrs:PASS
#
# where path is different on Unix vs Windows devices (Windows leads with a drive letter)
# 2. fixture output
# <path>/<test_file>.c:63:TEST(<test_group>, <test_function>):FAIL: Expected 0x00001234 Was 0x00005A5A
# <path>/<test_file>.c:36:TEST(<test_group>, <test_function>):IGNORE
# Note: "PASS" information won't be generated in this mode
#
# 3. fixture output with verbose information ("-v")
# TEST(<test_group, <test_file>)<path>/<test_file>:168::FAIL: Expected 0x8D Was 0x8C
# TEST(<test_group>, <test_file>)<path>/<test_file>:22::IGNORE: This Test Was Ignored On Purpose
# IGNORE_TEST(<test_group, <test_file>)
# TEST(<test_group, <test_file>) PASS
#
# Note: Where path is different on Unix vs Windows devices (Windows leads with a drive letter)!
set_os_specifics
(
line
)
line_array
=
line
.
split
(
':'
)
# If we were able to split the line then we can look to see if any of our target words
# were found. Case is important.
if
(
line_array
.
size
>=
4
)
||
(
line
.
start_with?
'TEST('
)
# Determine if this test passed
if
line
.
include?
':PASS'
# were found. Case is important.
if
(
line_array
.
size
>=
4
)
||
(
line
.
start_with?
'TEST('
)
||
(
line
.
start_with?
'IGNORE_TEST('
)
# check if the output is fixture output (with verbose flag "-v")
if
(
line
.
start_with?
'TEST('
)
||
(
line
.
start_with?
'IGNORE_TEST('
)
line_array
=
prepare_fixture_line
(
line
)
if
line
.
include?
' PASS'
test_passed_unity_fixture
(
line_array
)
@test_passed
+=
1
elsif
line
.
include?
'FAIL'
test_failed_unity_fixture
(
line_array
)
@test_failed
+=
1
elsif
line
.
include?
'IGNORE'
test_ignored_unity_fixture
(
line_array
)
@test_ignored
+=
1
end
# normal output / fixture output (without verbose "-v")
elsif
line
.
include?
':PASS'
test_passed
(
line_array
)
test_pass
+=
1
elsif
line
.
include?
':FAIL
:
'
@test_passed
+=
1
elsif
line
.
include?
':FAIL'
test_failed
(
line_array
)
test_fail
+=
1
@test_failed
+=
1
elsif
line
.
include?
':IGNORE:'
test_ignored
(
line_array
)
test_ignore
+=
1
elsif
line
.
start_with?
'TEST('
if
line
.
include?
' PASS'
line_array
=
line
.
split
(
' '
)
test_passed_unity_fixture
(
line_array
)
test_pass
+=
1
end
# If none of the keywords are found there are no more tests for this suite so clear
# the test flag
else
@test_flag
=
false
@test_ignored
+=
1
elsif
line
.
include?
':IGNORE'
line_array
.
push
(
'No reason given'
)
test_ignored
(
line_array
)
@test_ignored
+=
1
end
else
@test_flag
=
false
@total_tests
=
@test_passed
+
@test_failed
+
@test_ignored
end
end
puts
''
puts
'=================== SUMMARY ====================='
puts
''
puts
'Tests Passed : '
+
test_pass
.
to_s
puts
'Tests Failed : '
+
test_fail
.
to_s
puts
'Tests Ignored : '
+
test_ignore
.
to_s
@total_tests
=
test_pass
+
test_fail
+
test_ignore
puts
'Tests Passed : '
+
@test_passed
.
to_s
puts
'Tests Failed : '
+
@test_failed
.
to_s
puts
'Tests Ignored : '
+
@test_ignored
.
to_s
return
unless
@xml_out
heading
=
'<testsuite tests="'
+
@total_tests
.
to_s
+
'" failures="'
+
test_fail
.
to_s
+
'"'
+
' skips="'
+
test_ignore
.
to_s
+
'">'
@array_list
.
insert
(
0
,
heading
)
# push information about the suite
push_xml_output_suite_info
# write xml output file
write_xml_output
end
end
...
...
@@ -209,11 +312,11 @@ end
parse_my_file
=
ParseOutput
.
new
if
ARGV
.
size
>=
1
ARGV
.
each
do
|
a
|
if
a
==
'-xml'
ARGV
.
each
do
|
a
rg
|
if
a
rg
==
'-xml'
parse_my_file
.
set_xml_output
else
parse_my_file
.
process
(
a
)
parse_my_file
.
process
(
a
rg
)
break
end
end
...
...
docs/UnityAssertionsReference.md
浏览文件 @
f0e4571c
...
...
@@ -104,6 +104,15 @@ becomes messageified like thus...
TEST_ASSERT_X_MESSAGE( {modifiers}, {expected}, actual, {size/count}, message )
Notes:
-
The
`_MESSAGE`
variants intentionally do not support
`printf`
style formatting
since many embedded projects don't support or avoid
`printf`
for various reasons.
It is possible to use
`sprintf`
before the assertion to assemble a complex fail
message, if necessary.
-
If you want to output a counter value within an assertion fail message (e.g. from
a loop) , building up an array of results and then using one of the
`_ARRAY`
assertions (see below) might be a handy alternative to
`sprintf`
.
#### TEST_ASSERT_X_ARRAY Variants
...
...
docs/UnityConfigurationGuide.md
浏览文件 @
f0e4571c
...
...
@@ -79,18 +79,7 @@ _Example:_
#define UNITY_EXCLUDE_LIMITS_H
##### `UNITY_EXCLUDE_SIZEOF`
The third and final attempt to guess your types is to use the
`sizeof()`
operator. Even if the first two options don't work, this one covers most cases.
There _is_ a rare compiler or two out there that doesn't support sizeof() in the
preprocessing stage, though. For these, you have the ability to disable this
feature as well.
_Example:_
#define UNITY_EXCLUDE_SIZEOF
If you've disabled all of the automatic options above, you're going to have to
If you've disabled both of the automatic options above, you're going to have to
do the configuration yourself. Don't worry. Even this isn't too bad... there are
just a handful of defines that you are going to specify if you don't like the
defaults.
...
...
@@ -127,7 +116,7 @@ _Example:_
#define UNITY_POINTER_WIDTH 64
##### `UNITY_
INCLUDE
_64`
##### `UNITY_
SUPPORT
_64`
Unity will automatically include 64-bit support if it auto-detects it, or if
your
`int`
,
`long`
, or pointer widths are greater than 32-bits. Define this to
...
...
@@ -136,7 +125,7 @@ can be a significant size and speed impact to enabling 64-bit support on small
targets, so don't define it if you don't need it.
_Example:_
#define UNITY_
INCLUDE
_64
#define UNITY_
SUPPORT
_64
### Floating Point Types
...
...
@@ -170,24 +159,20 @@ _Example:_
#define UNITY_INCLUDE_DOUBLE
##### `UNITY_FLOAT_VERBOSE`
##### `UNITY_DOUBLE_VERBOSE`
##### `UNITY_EXCLUDE_FLOAT_PRINT`
Unity aims for as small of a footprint as possible and avoids most standard
library calls (some embedded platforms don
'
t have a standard library!). Because
library calls (some embedded platforms don
’
t have a standard library!). Because
of this, its routines for printing integer values are minimalist and hand-coded.
To keep Unity universal, though, we chose to _not_ develop our own floating
point print routines. Instead, the display of floating point values during a
failure are optional. By default, Unity will not print the actual results of
floating point assertion failure. So a failed assertion will produce a message
like
`"Values Not Within Delta"`
. If you would like verbose failure messages for
floating point assertions, use these options to give more explicit failure
messages (e.g.
`"Expected 4.56 Was 4.68"`
). Note that this feature requires the
use of
`sprintf`
so might not be desirable in all cases.
Therefore, the display of floating point values during a failure are optional.
By default, Unity will print the actual results of floating point assertion
failure (e.g. ”Expected 4.56 Was 4.68”). To not include this extra support, you
can use this define to instead respond to a failed assertion with a message like
”Values Not Within Delta”. If you would like verbose failure messages for floating
point assertions, use these options to give more explicit failure messages.
_Example:_
#define UNITY_
DOUBLE_VERBOSE
#define UNITY_
EXCLUDE_FLOAT_PRINT
##### `UNITY_FLOAT_TYPE`
...
...
@@ -263,7 +248,8 @@ _Example:_
Say you are forced to run your test suite on an embedded processor with no
`stdout`
option. You decide to route your test result output to a custom serial
`RS232_putc()`
function you wrote like thus:
#include "RS232_header.h"
...
#define UNITY_OUTPUT_CHAR(a) RS232_putc(a)
#define UNITY_OUTPUT_START() RS232_config(115200,1,8,0)
#define UNITY_OUTPUT_FLUSH() RS232_flush()
...
...
@@ -271,31 +257,35 @@ Say you are forced to run your test suite on an embedded processor with no
_Note:_
`UNITY_OUTPUT_FLUSH()`
can be set to the standard out flush function simply by
specifying
`UNITY_USE_FLUSH_STDOUT`
. No other defines are required. If you
specify a custom flush function instead with
`UNITY_OUTPUT_FLUSH`
directly, it
will declare an instance of your function by default. If you want to disable
this behavior, add
`UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION`
.
##### `UNITY_SUPPORT_WEAK`
For some targets, Unity can make the otherwise required
`setUp()`
and
`tearDown()`
functions optional. This is a nice convenience for test writers
since
`setUp`
and
`tearDown`
don't often actually _do_ anything. If you're using
gcc or clang, this option is automatically defined for you. Other compilers can
also support this behavior, if they support a C feature called weak functions. A
weak function is a function that is compiled into your executable _unless_ a
non-weak version of the same function is defined elsewhere. If a non-weak
version is found, the weak version is ignored as if it never existed. If your
compiler supports this feature, you can let Unity know by defining
`UNITY_SUPPORT_WEAK`
as the function attributes that would need to be applied to
identify a function as weak. If your compiler lacks support for weak functions,
you will always need to define
`setUp`
and
`tearDown`
functions (though they can
be and often will be just empty). The most common options for this feature are:
specifying
`UNITY_USE_FLUSH_STDOUT`
. No other defines are required.
##### `UNITY_WEAK_ATTRIBUTE`
##### `UNITY_WEAK_PRAGMA`
##### `UNITY_NO_WEAK`
For some targets, Unity can make the otherwise required setUp() and tearDown()
functions optional. This is a nice convenience for test writers since setUp and
tearDown don’t often actually do anything. If you’re using gcc or clang, this
option is automatically defined for you. Other compilers can also support this
behavior, if they support a C feature called weak functions. A weak function is
a function that is compiled into your executable unless a non-weak version of
the same function is defined elsewhere. If a non-weak version is found, the weak
version is ignored as if it never existed. If your compiler supports this feature,
you can let Unity know by defining UNITY_WEAK_ATTRIBUTE or UNITY_WEAK_PRAGMA as
the function attributes that would need to be applied to identify a function as
weak. If your compiler lacks support for weak functions, you will always need to
define setUp and tearDown functions (though they can be and often will be just
empty). You can also force Unity to NOT use weak functions by defining
UNITY_NO_WEAK. The most common options for this feature are:
_Example:_
#define UNITY_SUPPORT_WEAK weak
#define UNITY_SUPPORT_WEAK __attribute__((weak))
#define UNITY_WEAK_ATTRIBUTE weak
#define UNITY_WEAK_ATTRIBUTE __attribute__((weak))
#define UNITY_WEAK_PRAGMA
#define UNITY_NO_WEAK
##### `UNITY_PTR_ATTRIBUTE`
...
...
@@ -309,6 +299,51 @@ _Example:_
#define UNITY_PTR_ATTRIBUTE near
##### `UNITY_PRINT_EOL`
By default, Unity outputs
\n
at the end of each line of output. This is easy
to parse by the scripts, by Ceedling, etc, but it might not be ideal for YOUR
system. Feel free to override this and to make it whatever you wish.
_Example:_
#define UNITY_PRINT_EOL { UNITY_OUTPUT_CHAR('
\r
'); UNITY_OUTPUT_CHAR('
\n
') }
##### `UNITY_EXCLUDE_DETAILS`
This is an option for if you absolutely must squeeze every byte of memory out of
your system. Unity stores a set of internal scratchpads which are used to pass
extra detail information around. It's used by systems like CMock in order to
report which function or argument flagged an error. If you're not using CMock and
you're not using these details for other things, then you can exclude them.
_Example:_
#define UNITY_EXCLUDE_DETAILS
##### `UNITY_EXCLUDE_SETJMP`
If your embedded system doesn't support the standard library setjmp, you can
exclude Unity's reliance on this by using this define. This dropped dependence
comes at a price, though. You will be unable to use custom helper functions for
your tests, and you will be unable to use tools like CMock. Very likely, if your
compiler doesn't support setjmp, you wouldn't have had the memory space for those
things anyway, though... so this option exists for those situations.
_Example:_
#define UNITY_EXCLUDE_SETJMP
##### `UNITY_OUTPUT_COLOR`
If you want to add color using ANSI escape codes you can use this define.
t
_Example:_
#define UNITY_OUTPUT_COLOR
## Getting Into The Guts
There will be cases where the options above aren't quite going to get everything
...
...
docs/UnityGettingStartedGuide.md
浏览文件 @
f0e4571c
...
...
@@ -100,10 +100,11 @@ find setUp or tearDown when it links, you'll know you need to at least include
an empty function for these.
The majority of the file will be a series of test functions. Test functions
follow the convention of starting with the word "test
" or "spec
". You don't HAVE
follow the convention of starting with the word "test
_" or "spec_
". You don't HAVE
to name them this way, but it makes it clear what functions are tests for other
developers. Test functions take no arguments and return nothing. All test
accounting is handled internally in Unity.
developers. Also, the automated scripts that come with Unity or Ceedling will default
to looking for test functions to be prefixed this way. Test functions take no arguments
and return nothing. All test accounting is handled internally in Unity.
Finally, at the bottom of your test file, you will write a
`main()`
function.
This function will call
`UNITY_BEGIN()`
, then
`RUN_TEST`
for each test, and
...
...
docs/UnityHelperScriptsGuide.md
浏览文件 @
f0e4571c
...
...
@@ -124,7 +124,7 @@ demonstrates using a Ruby hash.
##### `:includes`
This option specifies an array of file names to be
?#include?
'd at the top of
This option specifies an array of file names to be
`#include`
'd at the top of
your runner C file. You might use it to reference custom types or anything else
universally needed in your generated runners.
...
...
@@ -133,11 +133,23 @@ universally needed in your generated runners.
Define this option with C code to be executed _before any_ test cases are run.
Alternatively, if your C compiler supports weak symbols, you can leave this
option unset and instead provide a
`void suiteSetUp(void)`
function in your test
suite. The linker will look for this symbol and fall back to a Unity-provided
stub if it is not found.
##### `:suite_teardown`
Define this option with C code to be executed ?after all?test cases have
finished.
Define this option with C code to be executed _after all_ test cases have
finished. An integer variable
`num_failures`
is available for diagnostics.
The code should end with a
`return`
statement; the value returned will become
the exit code of
`main`
. You can normally just return
`num_failures`
.
Alternatively, if your C compiler supports weak symbols, you can leave this
option unset and instead provide a
`int suiteTearDown(int num_failures)`
function in your test suite. The linker will look for this symbol and fall
back to a Unity-provided stub if it is not found.
##### `:enforce_strict_ordering`
...
...
@@ -147,6 +159,12 @@ CMock (see CMock documentation). This generates extra variables required for
everything to run smoothly. If you provide the same YAML to the generator as
used in CMock's configuration, you've already configured the generator properly.
##### `:mock_prefix` and `:mock_suffix`
Unity automatically generates calls to Init, Verify and Destroy for every file
included in the main test file that starts with the given mock prefix and ends
with the given mock suffix, file extension not included. By default, Unity
assumes a
`Mock`
prefix and no suffix.
##### `:plugins`
...
...
extras/fixture/src/unity_fixture.h
浏览文件 @
f0e4571c
...
...
@@ -78,6 +78,6 @@ int UnityMain(int argc, const char* argv[], void (*runAllTests)(void));
#endif
/* You must compile with malloc replacement, as defined in unity_fixture_malloc_overrides.h */
void
UnityMalloc_MakeMallocFailAfterCount
(
int
count
);
void
UnityMalloc_MakeMallocFailAfterCount
(
int
count
down
);
#endif
/* UNITY_FIXTURE_H_ */
extras/fixture/src/unity_fixture_internals.h
浏览文件 @
f0e4571c
...
...
@@ -24,7 +24,7 @@ extern struct UNITY_FIXTURE_T UnityFixture;
typedef
void
unityfunction
(
void
);
void
UnityTestRunner
(
unityfunction
*
setup
,
unityfunction
*
b
ody
,
unityfunction
*
testB
ody
,
unityfunction
*
teardown
,
const
char
*
printableName
,
const
char
*
group
,
...
...
@@ -37,7 +37,7 @@ void UnityMalloc_EndTest(void);
int
UnityGetCommandLineOptions
(
int
argc
,
const
char
*
argv
[]);
void
UnityConcludeFixtureTest
(
void
);
void
UnityPointer_Set
(
void
**
p
t
r
,
void
*
newValue
,
UNITY_LINE_TYPE
line
);
void
UnityPointer_Set
(
void
**
p
ointe
r
,
void
*
newValue
,
UNITY_LINE_TYPE
line
);
void
UnityPointer_UndoAllSets
(
void
);
void
UnityPointer_Init
(
void
);
#ifndef UNITY_MAX_POINTERS
...
...
release/build.info
浏览文件 @
f0e4571c
12
0
12
2
release/version.info
浏览文件 @
f0e4571c
2.4.
1
2.4.
3
src/unity.c
浏览文件 @
f0e4571c
...
...
@@ -4,6 +4,7 @@
[Released under MIT License. Please refer to license.txt for details]
============================================================================ */
#define UNITY_INCLUDE_SETUP_STUBS
#include "unity.h"
#include <stddef.h>
...
...
@@ -13,22 +14,30 @@ void UNITY_OUTPUT_CHAR(int);
#endif
/* Helpful macros for us to use here in Assert functions */
#define UNITY_FAIL_AND_BAIL { Unity.CurrentTestFailed = 1; TEST_ABORT(); }
#define UNITY_IGNORE_AND_BAIL { Unity.CurrentTestIgnored = 1; TEST_ABORT(); }
#define UNITY_FAIL_AND_BAIL { Unity.CurrentTestFailed = 1;
UNITY_OUTPUT_FLUSH();
TEST_ABORT(); }
#define UNITY_IGNORE_AND_BAIL { Unity.CurrentTestIgnored = 1;
UNITY_OUTPUT_FLUSH();
TEST_ABORT(); }
#define RETURN_IF_FAIL_OR_IGNORE if (Unity.CurrentTestFailed || Unity.CurrentTestIgnored) return
struct
UNITY_STORAGE_T
Unity
;
#ifdef UNITY_OUTPUT_COLOR
static
const
char
UnityStrOk
[]
=
"
\033
[42mOK
\033
[00m"
;
static
const
char
UnityStrPass
[]
=
"
\033
[42mPASS
\033
[00m"
;
static
const
char
UnityStrFail
[]
=
"
\033
[41mFAIL
\033
[00m"
;
static
const
char
UnityStrIgnore
[]
=
"
\033
[43mIGNORE
\033
[00m"
;
#else
static
const
char
UnityStrOk
[]
=
"OK"
;
static
const
char
UnityStrPass
[]
=
"PASS"
;
static
const
char
UnityStrFail
[]
=
"FAIL"
;
static
const
char
UnityStrIgnore
[]
=
"IGNORE"
;
#endif
static
const
char
UnityStrNull
[]
=
"NULL"
;
static
const
char
UnityStrSpacer
[]
=
". "
;
static
const
char
UnityStrExpected
[]
=
" Expected "
;
static
const
char
UnityStrWas
[]
=
" Was "
;
static
const
char
UnityStrGt
[]
=
" to be greater than "
;
static
const
char
UnityStrLt
[]
=
" to be less than "
;
static
const
char
UnityStrOrEqual
[]
=
"or equal to "
;
static
const
char
UnityStrElement
[]
=
" Element "
;
static
const
char
UnityStrByte
[]
=
" Byte "
;
static
const
char
UnityStrMemory
[]
=
" Memory Mismatch."
;
...
...
@@ -83,6 +92,18 @@ void UnityPrint(const char* string)
UNITY_OUTPUT_CHAR
(
'\\'
);
UNITY_OUTPUT_CHAR
(
'n'
);
}
#ifdef UNITY_OUTPUT_COLOR
/* print ANSI escape code */
else
if
(
*
pch
==
27
&&
*
(
pch
+
1
)
==
'['
)
{
while
(
*
pch
&&
*
pch
!=
'm'
)
{
UNITY_OUTPUT_CHAR
(
*
pch
);
pch
++
;
}
UNITY_OUTPUT_CHAR
(
'm'
);
}
#endif
/* unprintable characters are shown as codes */
else
{
...
...
@@ -532,49 +553,44 @@ void UnityAssertEqualNumber(const UNITY_INT expected,
}
/*-----------------------------------------------*/
void
UnityAssertGreaterNumber
(
const
UNITY_INT
threshold
,
const
UNITY_INT
actual
,
const
char
*
msg
,
const
UNITY_LINE_TYPE
lineNumber
,
const
UNITY_DISPLAY_STYLE_T
style
)
void
UnityAssertGreaterOrLessOrEqualNumber
(
const
UNITY_INT
threshold
,
const
UNITY_INT
actual
,
const
UNITY_COMPARISON_T
compare
,
const
char
*
msg
,
const
UNITY_LINE_TYPE
lineNumber
,
const
UNITY_DISPLAY_STYLE_T
style
)
{
int
failed
=
0
;
RETURN_IF_FAIL_OR_IGNORE
;
if
(
!
(
actual
>
threshold
))
if
(
threshold
==
actual
&&
compare
&
UNITY_EQUAL_TO
)
return
;
if
(
threshold
==
actual
)
failed
=
1
;
if
((
style
&
UNITY_DISPLAY_RANGE_INT
)
==
UNITY_DISPLAY_RANGE_INT
)
{
UnityTestResultsFailBegin
(
lineNumber
)
;
UnityPrint
(
UnityStrExpected
)
;
UnityPrintNumberByStyle
(
actual
,
style
);
UnityPrint
(
UnityStrGt
);
UnityPrintNumberByStyle
(
threshold
,
style
);
UnityAddMsgIfSpecified
(
msg
)
;
UNITY_FAIL_AND_BAIL
;
if
(
actual
>
threshold
&&
compare
&
UNITY_SMALLER_THAN
)
failed
=
1
;
if
(
actual
<
threshold
&&
compare
&
UNITY_GREATER_THAN
)
failed
=
1
;
}
else
/* UINT or HEX */
{
if
((
UNITY_UINT
)
actual
>
(
UNITY_UINT
)
threshold
&&
compare
&
UNITY_SMALLER_THAN
)
failed
=
1
;
if
((
UNITY_UINT
)
actual
<
(
UNITY_UINT
)
threshold
&&
compare
&
UNITY_GREATER_THAN
)
failed
=
1
;
}
}
/*-----------------------------------------------*/
void
UnityAssertSmallerNumber
(
const
UNITY_INT
threshold
,
const
UNITY_INT
actual
,
const
char
*
msg
,
const
UNITY_LINE_TYPE
lineNumber
,
const
UNITY_DISPLAY_STYLE_T
style
)
{
RETURN_IF_FAIL_OR_IGNORE
;
if
(
!
(
actual
<
threshold
)
)
if
(
failed
)
{
UnityTestResultsFailBegin
(
lineNumber
);
UnityPrint
(
UnityStrExpected
);
UnityPrintNumberByStyle
(
actual
,
style
);
UnityPrint
(
UnityStrLt
);
if
(
compare
&
UNITY_GREATER_THAN
)
UnityPrint
(
UnityStrGt
);
if
(
compare
&
UNITY_SMALLER_THAN
)
UnityPrint
(
UnityStrLt
);
if
(
compare
&
UNITY_EQUAL_TO
)
UnityPrint
(
UnityStrOrEqual
);
UnityPrintNumberByStyle
(
threshold
,
style
);
UnityAddMsgIfSpecified
(
msg
);
UNITY_FAIL_AND_BAIL
;
}
}
#define UnityPrintPointlessAndBail() \
{ \
UnityTestResultsFailBegin(lineNumber); \
...
...
@@ -605,7 +621,7 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected,
if
(
UnityIsOneArrayNull
(
expected
,
actual
,
lineNumber
,
msg
))
UNITY_FAIL_AND_BAIL
;
while
(
elements
--
)
while
(
(
elements
>
0
)
&&
elements
--
)
{
UNITY_INT
expect_val
;
UNITY_INT
actual_val
;
...
...
@@ -662,13 +678,13 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected,
/*-----------------------------------------------*/
#ifndef UNITY_EXCLUDE_FLOAT
/* Wrap this define in a function with variable types as float or double */
#define UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff) \
if (isinf(expected) && isinf(actual) && ((
expected < 0) == (actual
< 0))) return 1; \
if (UNITY_NAN_CHECK) return 1; \
diff = actual - expected;
\
if (
diff < 0) diff = -diff;
\
if (
delta < 0) delta = -delta;
\
return !(isnan(diff) || isinf(diff) || (
diff > delta
))
#define UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff)
\
if (isinf(expected) && isinf(actual) && ((
(expected) < 0) == ((actual)
< 0))) return 1; \
if (UNITY_NAN_CHECK) return 1;
\
(diff) = (actual) - (expected);
\
if (
(diff) < 0) (diff) = -(diff);
\
if (
(delta) < 0) (delta) = -(delta);
\
return !(isnan(diff) || isinf(diff) || (
(diff) > (delta)
))
/* This first part of this condition will catch any NaN or Infinite values */
#ifndef UNITY_NAN_NOT_EQUAL_NAN
#define UNITY_NAN_CHECK isnan(expected) && isnan(actual)
...
...
@@ -1074,7 +1090,7 @@ void UnityAssertEqualStringArray(UNITY_INTERNAL_PTR expected,
{
UNITY_UINT32
i
=
0
;
UNITY_UINT32
j
=
0
;
const
char
*
exp
=
NULL
;
const
char
*
exp
d
=
NULL
;
const
char
*
act
=
NULL
;
RETURN_IF_FAIL_OR_IGNORE
;
...
...
@@ -1097,7 +1113,7 @@ void UnityAssertEqualStringArray(UNITY_INTERNAL_PTR expected,
if
(
flags
!=
UNITY_ARRAY_TO_ARRAY
)
{
exp
=
(
const
char
*
)
expected
;
exp
d
=
(
const
char
*
)
expected
;
}
do
...
...
@@ -1105,15 +1121,15 @@ void UnityAssertEqualStringArray(UNITY_INTERNAL_PTR expected,
act
=
actual
[
j
];
if
(
flags
==
UNITY_ARRAY_TO_ARRAY
)
{
exp
=
((
const
char
*
const
*
)
expected
)[
j
];
exp
d
=
((
const
char
*
const
*
)
expected
)[
j
];
}
/* if both pointers not null compare the strings */
if
(
exp
&&
act
)
if
(
exp
d
&&
act
)
{
for
(
i
=
0
;
exp
[
i
]
||
act
[
i
];
i
++
)
for
(
i
=
0
;
exp
d
[
i
]
||
act
[
i
];
i
++
)
{
if
(
exp
[
i
]
!=
act
[
i
])
if
(
exp
d
[
i
]
!=
act
[
i
])
{
Unity
.
CurrentTestFailed
=
1
;
break
;
...
...
@@ -1122,7 +1138,7 @@ void UnityAssertEqualStringArray(UNITY_INTERNAL_PTR expected,
}
else
{
/* handle case of one pointers being null (if both null, test should pass) */
if
(
exp
!=
act
)
if
(
exp
d
!=
act
)
{
Unity
.
CurrentTestFailed
=
1
;
}
...
...
@@ -1136,7 +1152,7 @@ void UnityAssertEqualStringArray(UNITY_INTERNAL_PTR expected,
UnityPrint
(
UnityStrElement
);
UnityPrintNumberUnsigned
(
j
);
}
UnityPrintExpectedAndActualStrings
(
exp
,
act
);
UnityPrintExpectedAndActualStrings
(
exp
d
,
act
);
UnityAddMsgIfSpecified
(
msg
);
UNITY_FAIL_AND_BAIL
;
}
...
...
@@ -1311,17 +1327,6 @@ void UnityIgnore(const char* msg, const UNITY_LINE_TYPE line)
UNITY_IGNORE_AND_BAIL
;
}
/*-----------------------------------------------*/
#if defined(UNITY_WEAK_ATTRIBUTE)
UNITY_WEAK_ATTRIBUTE
void
setUp
(
void
)
{
}
UNITY_WEAK_ATTRIBUTE
void
tearDown
(
void
)
{
}
#elif defined(UNITY_WEAK_PRAGMA)
#pragma weak setUp
void
setUp
(
void
)
{
}
#pragma weak tearDown
void
tearDown
(
void
)
{
}
#endif
/*-----------------------------------------------*/
void
UnityDefaultTestRun
(
UnityTestFunction
Func
,
const
char
*
FuncName
,
const
int
FuncLineNum
)
{
...
...
src/unity.h
浏览文件 @
f0e4571c
此差异已折叠。
点击以展开。
src/unity_internals.h
浏览文件 @
f0e4571c
此差异已折叠。
点击以展开。
test/Makefile
浏览文件 @
f0e4571c
...
...
@@ -15,7 +15,11 @@ CFLAGS += -Wbad-function-cast -Wcast-qual -Wold-style-definition -Wshadow -Wstri
CFLAGS
+=
$(DEBUG)
DEFINES
=
-D
UNITY_OUTPUT_CHAR
=
putcharSpy
DEFINES
+=
-D
UNITY_OUTPUT_CHAR_HEADER_DECLARATION
=
putcharSpy
\(
int
\)
DEFINES
+=
-D
UNITY_SUPPORT_64
-D
UNITY_INCLUDE_DOUBLE
DEFINES
+=
-D
UNITY_OUTPUT_FLUSH
=
flushSpy
DEFINES
+=
-D
UNITY_OUTPUT_FLUSH_HEADER_DECLARATION
=
flushSpy
\(
void
\)
DEFINES
+=
$(UNITY_SUPPORT_64)
$(UNITY_INCLUDE_DOUBLE)
UNITY_SUPPORT_64
=
-D
UNITY_SUPPORT_64
UNITY_INCLUDE_DOUBLE
=
-D
UNITY_INCLUDE_DOUBLE
SRC
=
../src/unity.c tests/testunity.c build/testunityRunner.c
INC_DIR
=
-I
../src
COV_FLAGS
=
-fprofile-arcs
-ftest-coverage
-I
../../src
...
...
test/testdata/testRunnerGenerator.c
浏览文件 @
f0e4571c
...
...
@@ -21,7 +21,10 @@
/* Support for Meta Test Rig */
#define TEST_CASE(a)
void
putcharSpy
(
int
c
)
{
(
void
)
putchar
(
c
);}
// include passthrough for linking tests
/* Include Passthroughs for Linking Tests */
void
putcharSpy
(
int
c
)
{
(
void
)
putchar
(
c
);}
void
flushSpy
(
void
)
{}
/* Global Variables Used During These Tests */
int
CounterSetup
=
0
;
...
...
test/testdata/testRunnerGeneratorSmall.c
浏览文件 @
f0e4571c
...
...
@@ -13,7 +13,10 @@ TEST_FILE("some_file.c")
/* Support for Meta Test Rig */
#define TEST_CASE(a)
void
putcharSpy
(
int
c
)
{
(
void
)
putchar
(
c
);}
// include passthrough for linking tests
/* Include Passthroughs for Linking Tests */
void
putcharSpy
(
int
c
)
{
(
void
)
putchar
(
c
);}
void
flushSpy
(
void
)
{}
/* Global Variables Used During These Tests */
int
CounterSetup
=
0
;
...
...
test/testdata/testRunnerGeneratorWithMocks.c
浏览文件 @
f0e4571c
...
...
@@ -22,7 +22,10 @@
/* Support for Meta Test Rig */
#define TEST_CASE(a)
void
putcharSpy
(
int
c
)
{
(
void
)
putchar
(
c
);}
// include passthrough for linking tests
/* Include Passthroughs for Linking Tests */
void
putcharSpy
(
int
c
)
{
(
void
)
putchar
(
c
);}
void
flushSpy
(
void
)
{}
/* Global Variables Used During These Tests */
int
CounterSetup
=
0
;
...
...
test/tests/testparameterized.c
浏览文件 @
f0e4571c
...
...
@@ -8,10 +8,13 @@
#include <stdio.h>
#include "unity.h"
void
putcharSpy
(
int
c
)
{
(
void
)
putchar
(
c
);}
// include passthrough for linking tests
/* Support for Meta Test Rig */
#define TEST_CASE(...)
/* Include Passthroughs for Linking Tests */
void
putcharSpy
(
int
c
)
{
(
void
)
putchar
(
c
);}
void
flushSpy
(
void
)
{}
#define EXPECT_ABORT_BEGIN \
if (TEST_PROTECT()) \
{
...
...
test/tests/testunity.c
浏览文件 @
f0e4571c
...
...
@@ -54,6 +54,10 @@ void startPutcharSpy(void);
void
endPutcharSpy
(
void
);
char
*
getBufferPutcharSpy
(
void
);
void
startFlushSpy
(
void
);
void
endFlushSpy
(
void
);
int
getFlushSpyCalls
(
void
);
static
int
SetToOneToFailInTearDown
;
static
int
SetToOneMeanWeAlreadyCheckedThisGuy
;
...
...
@@ -3343,14 +3347,35 @@ void putcharSpy(int c)
#endif
}
/* This is for counting the calls to the flushSpy */
static
int
flushSpyEnabled
;
static
int
flushSpyCalls
=
0
;
void
startFlushSpy
(
void
)
{
flushSpyCalls
=
0
;
flushSpyEnabled
=
1
;
}
void
endFlushSpy
(
void
)
{
flushSpyCalls
=
0
;
flushSpyEnabled
=
0
;
}
int
getFlushSpyCalls
(
void
)
{
return
flushSpyCalls
;
}
void
flushSpy
(
void
)
{
if
(
flushSpyEnabled
){
flushSpyCalls
++
;
}
}
void
testFailureCountIncrementsAndIsReturnedAtEnd
(
void
)
{
UNITY_UINT
savedFailures
=
Unity
.
TestFailures
;
Unity
.
CurrentTestFailed
=
1
;
startPutcharSpy
();
// Suppress output
startFlushSpy
();
TEST_ASSERT_EQUAL
(
0
,
getFlushSpyCalls
());
UnityConcludeTest
();
endPutcharSpy
();
TEST_ASSERT_EQUAL
(
savedFailures
+
1
,
Unity
.
TestFailures
);
#if defined(UNITY_OUTPUT_FLUSH) && defined(UNITY_OUTPUT_FLUSH_HEADER_DECLARATION)
TEST_ASSERT_EQUAL
(
1
,
getFlushSpyCalls
());
#else
TEST_ASSERT_EQUAL
(
0
,
getFlushSpyCalls
());
#endif
endFlushSpy
();
startPutcharSpy
();
// Suppress output
int
failures
=
UnityEnd
();
...
...
@@ -3420,6 +3445,7 @@ void testPrintNumbersUnsigned32(void)
#endif
}
// ===================== THESE TEST WILL RUN IF YOUR CONFIG INCLUDES 64 BIT SUPPORT ==================
void
testPrintNumbersInt64
(
void
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录