Switch from the inconsistent use of weak symbols to handling setup, etc in script generators

This commit is contained in:
Mark VanderVoord
2019-10-21 14:21:52 -04:00
parent 0793de9ef1
commit d9b0edf282
3 changed files with 48 additions and 76 deletions

View File

@ -58,6 +58,7 @@ class UnityTestRunnerGenerator
used_mocks = find_mocks(testfile_includes)
testfile_includes = (testfile_includes - used_mocks)
testfile_includes.delete_if { |inc| inc =~ /(unity|cmock)/ }
find_setup_and_teardown()
# build runner file
generate(input_file, output_file, tests, used_mocks, testfile_includes)
@ -165,11 +166,17 @@ class UnityTestRunnerGenerator
mock_headers
end
def find_setup_and_teardown(source)
@has_setup = source =~ /void\s+#{@options[setup_name]}\s*\(/
@has_teardown = source =~ /void\s+#{@options[teardown_name]}\s*\(/
@has_suite_setup = (!@options[:suite_setup].nil?) || (source =~ /void\s+suiteSetUp\s*\(/)
@has_suite_teardown = (!@options[:suite_teardown].nil?) || (source =~ /void\s+suiteTearDown\s*\(/)
end
def create_header(output, mocks, testfile_includes = [])
output.puts('/* AUTOGENERATED FILE. DO NOT EDIT. */')
create_runtest(output, mocks)
output.puts("\n/*=======Automagically Detected Files To Include=====*/")
output.puts('#define UNITY_INCLUDE_SETUP_STUBS') if @options[:suite_setup].nil?
output.puts("#include \"#{@options[:framework]}.h\"")
output.puts('#include "cmock.h"') unless mocks.empty?
output.puts('#ifndef UNITY_EXCLUDE_SETJMP_H')
@ -204,8 +211,8 @@ class UnityTestRunnerGenerator
def create_externs(output, tests, _mocks)
output.puts("\n/*=======External Functions This Runner Calls=====*/")
output.puts("extern void #{@options[:setup_name]}(void);")
output.puts("extern void #{@options[:teardown_name]}(void);")
output.puts("extern void #{@options[:setup_name]}(void);") if @has_setup
output.puts("extern void #{@options[:teardown_name]}(void);") if @has_teardown
output.puts("\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif") if @options[:externc]
tests.each do |test|
output.puts("extern void #{test[:test]}(#{test[:call] || 'void'});")
@ -252,37 +259,31 @@ class UnityTestRunnerGenerator
end
def create_suite_setup(output)
output.puts("\n/*=======Suite Setup=====*/")
output.puts('static void suite_setup(void)')
output.puts('{')
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])
if @has_suite_setup
if @options[:suite_setup].nil?
output.puts("\n/*=======Suite Setup=====*/")
output.puts('static void suiteSetUp(void)')
output.puts('{')
output.puts(@options[:suite_setup])
output.puts('}')
else
output.puts('extern void suiteSetUp(void);')
end
end
output.puts('}')
end
def create_suite_teardown(output)
output.puts("\n/*=======Suite Teardown=====*/")
output.puts('static int suite_teardown(int num_failures)')
output.puts('{')
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])
if (@has_suite_teardown)
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])
output.puts('}')
else
output.puts('extern int suite_teardown(int num_failures);')
end
end
output.puts('}')
end
def create_runtest(output, used_mocks)
@ -304,13 +305,13 @@ class UnityTestRunnerGenerator
output.puts(' { \\')
output.puts(' CEXCEPTION_T e; \\') if cexception
output.puts(' Try { \\') if cexception
output.puts(" #{@options[:setup_name]}(); \\")
output.puts(" #{@options[:setup_name]}(); \\") if @has_setup
output.puts(" TestFunc(#{va_args2}); \\")
output.puts(' } Catch(e) { TEST_ASSERT_EQUAL_HEX32_MESSAGE(CEXCEPTION_NONE, e, "Unhandled Exception!"); } \\') if cexception
output.puts(' } \\')
output.puts(' if (TEST_PROTECT()) \\')
output.puts(' { \\')
output.puts(" #{@options[:teardown_name]}(); \\")
output.puts(" #{@options[:teardown_name]}(); \\") if @has_teardown
output.puts(' CMock_Verify(); \\') unless used_mocks.empty?
output.puts(' } \\')
output.puts(' CMock_Destroy(); \\') unless used_mocks.empty?
@ -327,9 +328,9 @@ class UnityTestRunnerGenerator
output.puts('{')
output.puts(' CMock_Verify();') unless used_mocks.empty?
output.puts(' CMock_Destroy();') unless used_mocks.empty?
output.puts(" #{@options[:teardown_name]}();")
output.puts(" #{@options[:teardown_name]}();") if @has_teardown
output.puts(' CMock_Init();') unless used_mocks.empty?
output.puts(" #{@options[:setup_name]}();")
output.puts(" #{@options[:setup_name]}();") if @has_setup
output.puts('}')
end
@ -375,7 +376,7 @@ class UnityTestRunnerGenerator
output.puts("int #{main_name}(void)")
output.puts('{')
end
output.puts(' suite_setup();')
output.puts(' suiteSetUp();') if @has_suite_setup
output.puts(" UnityBegin(\"#{filename.gsub(/\\/, '\\\\\\')}\");")
if @options[:use_param_tests]
tests.each do |test|
@ -390,7 +391,11 @@ class UnityTestRunnerGenerator
end
output.puts
output.puts(' CMock_Guts_MemFreeFinal();') unless used_mocks.empty?
output.puts(' return suite_teardown(UnityEnd());')
if (@has_suite_teardown)
output.puts(' return suiteTearDown(UnityEnd());')
else
output.puts(' return UnityEnd();')
end
output.puts('}')
end