未验证 提交 774da10e 编写于 作者: M Mark VanderVoord 提交者: GitHub

Merge pull request #296 from jlindgren90/master

Allow suiteSetUp() and suiteTearDown() to be provided as normal C functions (Thanks @jlindgren90 )
...@@ -157,6 +157,9 @@ class UnityTestRunnerGenerator ...@@ -157,6 +157,9 @@ class UnityTestRunnerGenerator
output.puts('/* AUTOGENERATED FILE. DO NOT EDIT. */') output.puts('/* AUTOGENERATED FILE. DO NOT EDIT. */')
create_runtest(output, mocks) create_runtest(output, mocks)
output.puts("\n/*=======Automagically Detected Files To Include=====*/") 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 \"#{@options[:framework]}.h\"")
output.puts('#include "cmock.h"') unless mocks.empty? output.puts('#include "cmock.h"') unless mocks.empty?
output.puts('#include <setjmp.h>') output.puts('#include <setjmp.h>')
...@@ -235,22 +238,36 @@ class UnityTestRunnerGenerator ...@@ -235,22 +238,36 @@ class UnityTestRunnerGenerator
end end
def create_suite_setup(output) def create_suite_setup(output)
return if @options[:suite_setup].nil?
output.puts("\n/*=======Suite Setup=====*/") output.puts("\n/*=======Suite Setup=====*/")
output.puts('static void suite_setup(void)') output.puts('static void suite_setup(void)')
output.puts('{') 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('}') output.puts('}')
end end
def create_suite_teardown(output) def create_suite_teardown(output)
return if @options[:suite_teardown].nil?
output.puts("\n/*=======Suite Teardown=====*/") output.puts("\n/*=======Suite Teardown=====*/")
output.puts('static int suite_teardown(int num_failures)') output.puts('static int suite_teardown(int num_failures)')
output.puts('{') 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('}') output.puts('}')
end end
...@@ -342,7 +359,7 @@ class UnityTestRunnerGenerator ...@@ -342,7 +359,7 @@ class UnityTestRunnerGenerator
output.puts("int #{main_name}(void)") output.puts("int #{main_name}(void)")
output.puts('{') output.puts('{')
end end
output.puts(' suite_setup();') unless @options[:suite_setup].nil? output.puts(' suite_setup();')
output.puts(" UnityBegin(\"#{filename.gsub(/\\/, '\\\\\\')}\");") output.puts(" UnityBegin(\"#{filename.gsub(/\\/, '\\\\\\')}\");")
if @options[:use_param_tests] if @options[:use_param_tests]
tests.each do |test| tests.each do |test|
...@@ -357,7 +374,7 @@ class UnityTestRunnerGenerator ...@@ -357,7 +374,7 @@ class UnityTestRunnerGenerator
end end
output.puts output.puts
output.puts(' CMock_Guts_MemFreeFinal();') unless used_mocks.empty? 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('}') output.puts('}')
end end
......
...@@ -124,7 +124,7 @@ demonstrates using a Ruby hash. ...@@ -124,7 +124,7 @@ demonstrates using a Ruby hash.
##### `:includes` ##### `: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 your runner C file. You might use it to reference custom types or anything else
universally needed in your generated runners. universally needed in your generated runners.
...@@ -133,11 +133,23 @@ 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. 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` ##### `:suite_teardown`
Define this option with C code to be executed ?after all?test cases have Define this option with C code to be executed _after all_ test cases have
finished. 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` ##### `:enforce_strict_ordering`
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
[Released under MIT License. Please refer to license.txt for details] [Released under MIT License. Please refer to license.txt for details]
============================================================================ */ ============================================================================ */
#define UNITY_INCLUDE_SETUP_STUBS
#include "unity.h" #include "unity.h"
#include <stddef.h> #include <stddef.h>
...@@ -1325,17 +1326,6 @@ void UnityIgnore(const char* msg, const UNITY_LINE_TYPE line) ...@@ -1325,17 +1326,6 @@ void UnityIgnore(const char* msg, const UNITY_LINE_TYPE line)
UNITY_IGNORE_AND_BAIL; 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) void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum)
{ {
......
...@@ -15,9 +15,43 @@ extern "C" ...@@ -15,9 +15,43 @@ extern "C"
#include "unity_internals.h" #include "unity_internals.h"
/*-------------------------------------------------------
* Test Setup / Teardown
*-------------------------------------------------------*/
/* These functions are intended to be called before and after each test. */
void setUp(void); void setUp(void);
void tearDown(void); void tearDown(void);
/* These functions are intended to be called at the beginning and end of an
* entire test suite. suiteTearDown() is passed the number of tests that
* failed, and its return value becomes the exit code of main(). */
void suiteSetUp(void);
int suiteTearDown(int num_failures);
/* If the compiler supports it, the following block provides stub
* implementations of the above functions as weak symbols. Note that on
* some platforms (MinGW for example), weak function implementations need
* to be in the same translation unit they are called from. This can be
* achieved by defining UNITY_INCLUDE_SETUP_STUBS before including unity.h. */
#ifdef UNITY_INCLUDE_SETUP_STUBS
#ifdef UNITY_WEAK_ATTRIBUTE
UNITY_WEAK_ATTRIBUTE void setUp(void) { }
UNITY_WEAK_ATTRIBUTE void tearDown(void) { }
UNITY_WEAK_ATTRIBUTE void suiteSetUp(void) { }
UNITY_WEAK_ATTRIBUTE int suiteTearDown(int num_failures) { return num_failures; }
#elif defined(UNITY_WEAK_PRAGMA)
#pragma weak setUp
void setUp(void) { }
#pragma weak tearDown
void tearDown(void) { }
#pragma weak suiteSetUp
void suiteSetUp(void) { }
#pragma weak suiteTearDown
int suiteTearDown(int num_failures) { return num_failures; }
#endif
#endif
/*------------------------------------------------------- /*-------------------------------------------------------
* Configuration Options * Configuration Options
*------------------------------------------------------- *-------------------------------------------------------
......
...@@ -301,7 +301,7 @@ extern void UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION; ...@@ -301,7 +301,7 @@ extern void UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION;
* Language Features Available * Language Features Available
*-------------------------------------------------------*/ *-------------------------------------------------------*/
#if !defined(UNITY_WEAK_ATTRIBUTE) && !defined(UNITY_WEAK_PRAGMA) #if !defined(UNITY_WEAK_ATTRIBUTE) && !defined(UNITY_WEAK_PRAGMA)
# ifdef __GNUC__ /* includes clang */ # if defined(__GNUC__) || defined(__ghs__) /* __GNUC__ includes clang */
# if !(defined(__WIN32__) && defined(__clang__)) && !defined(__TMS470__) # if !(defined(__WIN32__) && defined(__clang__)) && !defined(__TMS470__)
# define UNITY_WEAK_ATTRIBUTE __attribute__((weak)) # define UNITY_WEAK_ATTRIBUTE __attribute__((weak))
# endif # endif
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册