ceedling 0.0.5 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +1 -0
- data/bin/ceedling +1 -1
- data/lib/ceedling/version.rb +2 -2
- data/lib/ceedling/version.rb.erb +1 -1
- data/new_project_template/vendor/ceedling/lib/configurator.rb +16 -23
- data/new_project_template/vendor/ceedling/lib/configurator_builder.rb +3 -3
- data/new_project_template/vendor/ceedling/lib/constants.rb +1 -0
- data/new_project_template/vendor/ceedling/lib/defaults.rb +5 -2
- data/new_project_template/vendor/ceedling/lib/file_finder.rb +5 -5
- data/new_project_template/vendor/ceedling/lib/file_path_utils.rb +8 -0
- data/new_project_template/vendor/ceedling/lib/generator.rb +7 -21
- data/new_project_template/vendor/ceedling/lib/generator_helper.rb +40 -0
- data/new_project_template/vendor/ceedling/lib/generator_test_results.rb +4 -5
- data/new_project_template/vendor/ceedling/lib/generator_test_runner.rb +8 -150
- data/new_project_template/vendor/ceedling/lib/objects.yml +5 -0
- data/new_project_template/vendor/ceedling/lib/rakefile.rb +1 -0
- data/new_project_template/vendor/ceedling/lib/rules_release.rake +11 -2
- data/new_project_template/vendor/ceedling/lib/rules_tests.rake +7 -2
- data/new_project_template/vendor/ceedling/lib/setupinator.rb +0 -1
- data/new_project_template/vendor/ceedling/lib/system_wrapper.rb +4 -4
- data/new_project_template/vendor/ceedling/lib/tasks_release.rake +1 -1
- data/new_project_template/vendor/ceedling/lib/test_invoker_helper.rb +1 -1
- data/new_project_template/vendor/ceedling/lib/tool_executor_helper.rb +2 -2
- data/new_project_template/vendor/ceedling/plugins/bullseye/bullseye.rake +6 -1
- data/new_project_template/vendor/ceedling/plugins/bullseye/bullseye.rb +7 -2
- data/new_project_template/vendor/ceedling/plugins/bullseye/readme.txt +0 -0
- data/new_project_template/vendor/ceedling/plugins/gcov/gcov.rake +6 -1
- data/new_project_template/vendor/ceedling/plugins/gcov/gcov.rb +7 -2
- data/new_project_template/vendor/ceedling/plugins/gcov/readme.txt +0 -0
- data/new_project_template/vendor/ceedling/plugins/xml_tests_report/xml_tests_report.rb +1 -1
- data/new_project_template/vendor/ceedling/release/build.info +2 -1
- data/new_project_template/vendor/ceedling/vendor/unity/auto/generate_test_runner.rb +308 -0
- data/new_project_template/vendor/ceedling/vendor/unity/src/unity_internals.h +13 -13
- metadata +9 -5
data/Rakefile
CHANGED
@@ -31,6 +31,7 @@ task :update_tools do
|
|
31
31
|
{:src => 'vendor/constructor/lib/', :dest => 'vendor/constructor/'},
|
32
32
|
{:src => 'vendor/deep_merge/lib/', :dest => 'vendor/deep_merge/'},
|
33
33
|
{:src => 'vendor/diy/lib', :dest => 'vendor/diy/'},
|
34
|
+
{:src => 'vendor/unity/auto/', :dest => 'vendor/unity/'},
|
34
35
|
{:src => 'vendor/unity/release/', :dest => 'vendor/unity/'},
|
35
36
|
{:src => 'vendor/unity/src/', :dest => 'vendor/unity/'},
|
36
37
|
{:src => 'vendor/c_exception/docs/CExceptionSummary.pdf', :dest => 'docs/', :is_file => true},
|
data/bin/ceedling
CHANGED
@@ -37,7 +37,7 @@ class CeedlingTasks < Thor
|
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
-
desc "example
|
40
|
+
desc "example PROJ_NAME [DEST]", "create specified example project (in DEST, if specified)"
|
41
41
|
def example(proj_name, dest=".")
|
42
42
|
dest = "." if dest.nil?
|
43
43
|
directory Ceedling::NEW_PROJECT_DIR, dest
|
data/lib/ceedling/version.rb
CHANGED
data/lib/ceedling/version.rb.erb
CHANGED
@@ -78,22 +78,6 @@ class Configurator
|
|
78
78
|
@configurator_builder.populate_defaults( config, DEFAULT_TOOLS_RELEASE_DEPENDENCIES ) if (config[:project][:release_build] and config[:project][:use_auxiliary_dependencies])
|
79
79
|
end
|
80
80
|
|
81
|
-
|
82
|
-
def populate_unity_defines(config)
|
83
|
-
run_test = true
|
84
|
-
|
85
|
-
config[:unity][:defines].each do |define|
|
86
|
-
if (define =~ /RUN_TEST\s*\(.+\)\s*=/)
|
87
|
-
run_test = false
|
88
|
-
break
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
if (run_test)
|
93
|
-
config[:unity][:defines] << "\"RUN_TEST(func, line_num)=TestRun(func, #func, line_num)\""
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
81
|
|
98
82
|
def populate_cmock_defaults(config)
|
99
83
|
# cmock has its own internal defaults handling, but we need to set these specific values
|
@@ -122,9 +106,13 @@ class Configurator
|
|
122
106
|
cmock[:includes].uniq!
|
123
107
|
end
|
124
108
|
|
109
|
+
@runner_config = cmock
|
125
110
|
@cmock_builder.manufacture(cmock)
|
126
111
|
end
|
127
|
-
|
112
|
+
|
113
|
+
def get_runner_config
|
114
|
+
@runner_config
|
115
|
+
end
|
128
116
|
|
129
117
|
# grab tool names from yaml and insert into tool structures so available for error messages
|
130
118
|
# set up default values
|
@@ -192,12 +180,17 @@ class Configurator
|
|
192
180
|
|
193
181
|
def eval_environment_variables(config)
|
194
182
|
config[:environment].each do |hash|
|
195
|
-
key
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
183
|
+
key = hash.keys[0]
|
184
|
+
value = hash[key]
|
185
|
+
items = []
|
186
|
+
|
187
|
+
interstitial = ((key == :path) ? File::PATH_SEPARATOR : '')
|
188
|
+
items = ((value.class == Array) ? hash[key] : [value])
|
189
|
+
|
190
|
+
items.map { |item| item.replace( @system_wrapper.module_eval( item ) ) if (item =~ RUBY_STRING_REPLACEMENT_PATTERN) }
|
191
|
+
hash[key] = items.join( interstitial )
|
192
|
+
|
193
|
+
@system_wrapper.env_set( key.to_s.upcase, hash[key] )
|
201
194
|
end
|
202
195
|
end
|
203
196
|
|
@@ -261,8 +261,8 @@ class ConfiguratorBuilder
|
|
261
261
|
extra_paths = []
|
262
262
|
extra_paths << FilePathUtils::form_ceedling_vendor_path(UNITY_LIB_PATH)
|
263
263
|
extra_paths << FilePathUtils::form_ceedling_vendor_path(CEXCEPTION_LIB_PATH) if (in_hash[:project_use_exceptions])
|
264
|
-
extra_paths << FilePathUtils::form_ceedling_vendor_path(CMOCK_LIB_PATH)
|
265
|
-
extra_paths << in_hash[:cmock_mock_path]
|
264
|
+
extra_paths << FilePathUtils::form_ceedling_vendor_path(CMOCK_LIB_PATH) if (in_hash[:project_use_mocks])
|
265
|
+
extra_paths << in_hash[:cmock_mock_path] if (in_hash[:project_use_mocks])
|
266
266
|
|
267
267
|
return {
|
268
268
|
:collection_paths_test_support_source_include_vendor =>
|
@@ -371,7 +371,7 @@ class ConfiguratorBuilder
|
|
371
371
|
|
372
372
|
# no build paths here so plugins can remap if necessary (i.e. path mapping happens at runtime)
|
373
373
|
objects << CEXCEPTION_C_FILE.ext( in_hash[:extension_object] ) if (in_hash[:project_use_exceptions])
|
374
|
-
|
374
|
+
|
375
375
|
return {:collection_release_artifact_extra_link_objects => objects}
|
376
376
|
end
|
377
377
|
|
@@ -76,6 +76,7 @@ UTILS_SYM = UTILS_ROOT_NAME.to_sym
|
|
76
76
|
RUBY_STRING_REPLACEMENT_PATTERN = /#\{.+\}/
|
77
77
|
RUBY_EVAL_REPLACEMENT_PATTERN = /^\{(.+)\}$/
|
78
78
|
TOOL_EXECUTOR_ARGUMENT_REPLACEMENT_PATTERN = /(\$\{(\d+)\})/
|
79
|
+
TEST_STDOUT_STATISTICS_PATTERN = /-+\s+(\d+)\s+Tests\s+(\d+)\s+Failures\s+(\d+)\s+Ignored\s+(OK|FAIL)\s*/i
|
79
80
|
|
80
81
|
NULL_FILE_PATH = '/dev/null'
|
81
82
|
|
@@ -16,6 +16,7 @@ DEFAULT_TEST_COMPILER_TOOL = {
|
|
16
16
|
"-DGNU_COMPILER".freeze,
|
17
17
|
"-c \"${1}\"".freeze,
|
18
18
|
"-o \"${2}\"".freeze,
|
19
|
+
# gcc's list file output options are complex; no use of ${3} parameter in default config
|
19
20
|
].freeze
|
20
21
|
}
|
21
22
|
|
@@ -72,7 +73,7 @@ DEFAULT_TEST_FILE_PREPROCESSOR_TOOL = {
|
|
72
73
|
:arguments => [
|
73
74
|
'-E'.freeze,
|
74
75
|
{"-I\"$\"" => 'COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR'}.freeze,
|
75
|
-
{"-I\"$\"" => '
|
76
|
+
{"-I\"$\"" => 'COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE'}.freeze,
|
76
77
|
{"-D$" => 'COLLECTION_DEFINES_TEST_AND_VENDOR'}.freeze,
|
77
78
|
{"-D$" => 'DEFINES_TEST_PREPROCESS'}.freeze,
|
78
79
|
"-DGNU_PREPROCESSOR".freeze,
|
@@ -109,7 +110,7 @@ DEFAULT_RELEASE_DEPENDENCIES_GENERATOR_TOOL = {
|
|
109
110
|
:background_exec => BackgroundExec::NONE.freeze,
|
110
111
|
:optional => false.freeze,
|
111
112
|
:arguments => [
|
112
|
-
{"-I\"$\"" => '
|
113
|
+
{"-I\"$\"" => 'COLLECTION_PATHS_SOURCE_INCLUDE_VENDOR'}.freeze,
|
113
114
|
{"-I\"$\"" => 'COLLECTION_PATHS_RELEASE_TOOLCHAIN_INCLUDE'}.freeze,
|
114
115
|
{"-D$" => 'COLLECTION_DEFINES_RELEASE_AND_VENDOR'}.freeze,
|
115
116
|
{"-D$" => 'DEFINES_RELEASE_PREPROCESS'}.freeze,
|
@@ -137,6 +138,7 @@ DEFAULT_RELEASE_COMPILER_TOOL = {
|
|
137
138
|
"-DGNU_COMPILER".freeze,
|
138
139
|
"-c \"${1}\"".freeze,
|
139
140
|
"-o \"${2}\"".freeze,
|
141
|
+
# gcc's list file output options are complex; no use of ${3} parameter in default config
|
140
142
|
].freeze
|
141
143
|
}
|
142
144
|
|
@@ -256,6 +258,7 @@ DEFAULT_CEEDLING_CONFIG = {
|
|
256
258
|
:object => '.o',
|
257
259
|
:executable => ( SystemWrapper.windows? ? EXTENSION_WIN_EXE : EXTENSION_NONWIN_EXE ),
|
258
260
|
:map => '.map',
|
261
|
+
:list => '.lst',
|
259
262
|
:testpass => '.pass',
|
260
263
|
:testfail => '.fail',
|
261
264
|
:dependencies => '.d',
|
@@ -83,8 +83,8 @@ class FileFinder
|
|
83
83
|
end
|
84
84
|
|
85
85
|
|
86
|
-
def find_compilation_input_file(file_path)
|
87
|
-
found_file =
|
86
|
+
def find_compilation_input_file(file_path, complain=:error)
|
87
|
+
found_file = nil
|
88
88
|
|
89
89
|
source_file = File.basename(file_path).ext(@configurator.extension_source)
|
90
90
|
|
@@ -96,21 +96,21 @@ class FileFinder
|
|
96
96
|
@file_finder_helper.find_file_in_collection(
|
97
97
|
source_file,
|
98
98
|
@file_wrapper.directory_listing( File.join(@configurator.project_test_runners_path, '*') ),
|
99
|
-
|
99
|
+
complain)
|
100
100
|
|
101
101
|
elsif (@configurator.project_use_mocks and (source_file =~ /#{@configurator.cmock_mock_prefix}/))
|
102
102
|
found_file =
|
103
103
|
@file_finder_helper.find_file_in_collection(
|
104
104
|
source_file,
|
105
105
|
@file_wrapper.directory_listing( File.join(@configurator.cmock_mock_path, '*') ),
|
106
|
-
|
106
|
+
complain)
|
107
107
|
|
108
108
|
else
|
109
109
|
found_file =
|
110
110
|
@file_finder_helper.find_file_in_collection(
|
111
111
|
source_file,
|
112
112
|
@configurator.collection_all_existing_compilation_input,
|
113
|
-
|
113
|
+
complain)
|
114
114
|
end
|
115
115
|
|
116
116
|
return found_file
|
@@ -107,6 +107,10 @@ class FilePathUtils
|
|
107
107
|
def form_release_build_asm_objects_filelist(files)
|
108
108
|
return (@file_wrapper.instantiate_file_list(files)).pathmap("#{@configurator.project_release_build_output_asm_path}/%n#{@configurator.extension_object}")
|
109
109
|
end
|
110
|
+
|
111
|
+
def form_release_build_c_list_filepath(filepath)
|
112
|
+
return File.join( @configurator.project_release_build_output_c_path, File.basename(filepath).ext(@configurator.extension_list) )
|
113
|
+
end
|
110
114
|
|
111
115
|
def form_release_dependencies_filelist(files)
|
112
116
|
return (@file_wrapper.instantiate_file_list(files)).pathmap("#{@configurator.project_release_dependencies_path}/%n#{@configurator.extension_dependencies}")
|
@@ -149,6 +153,10 @@ class FilePathUtils
|
|
149
153
|
return File.join( @configurator.project_test_build_output_path, File.basename(filepath).ext(@configurator.extension_map) )
|
150
154
|
end
|
151
155
|
|
156
|
+
def form_test_build_list_filepath(filepath)
|
157
|
+
return File.join( @configurator.project_test_build_output_path, File.basename(filepath).ext(@configurator.extension_list) )
|
158
|
+
end
|
159
|
+
|
152
160
|
def form_preprocessed_file_filepath(filepath)
|
153
161
|
return File.join( @configurator.project_test_preprocess_files_path, File.basename(filepath) )
|
154
162
|
end
|
@@ -1,9 +1,9 @@
|
|
1
|
-
require 'constants'
|
1
|
+
require 'constants'
|
2
2
|
|
3
3
|
|
4
4
|
class Generator
|
5
5
|
|
6
|
-
constructor :configurator, :preprocessinator, :cmock_builder, :generator_test_runner, :generator_test_results, :test_includes_extractor, :tool_executor, :file_finder, :file_path_utils, :streaminator, :plugin_manager, :file_wrapper
|
6
|
+
constructor :configurator, :generator_helper, :preprocessinator, :cmock_builder, :generator_test_runner, :generator_test_results, :test_includes_extractor, :tool_executor, :file_finder, :file_path_utils, :streaminator, :plugin_manager, :file_wrapper
|
7
7
|
|
8
8
|
|
9
9
|
def generate_shallow_includes_list(context, file)
|
@@ -40,7 +40,6 @@ class Generator
|
|
40
40
|
# test_filepath may be either preprocessed test file or original test file
|
41
41
|
def generate_test_runner(context, test_filepath, runner_filepath)
|
42
42
|
arg_hash = {:context => context, :test_file => test_filepath, :runner_file => runner_filepath}
|
43
|
-
|
44
43
|
@plugin_manager.pre_runner_execute(arg_hash)
|
45
44
|
|
46
45
|
# collect info we need
|
@@ -51,23 +50,17 @@ class Generator
|
|
51
50
|
@streaminator.stdout_puts("Generating runner for #{module_name}...", Verbosity::NORMAL)
|
52
51
|
|
53
52
|
# build runner file
|
54
|
-
@
|
55
|
-
@generator_test_runner.create_header(output, mock_list)
|
56
|
-
@generator_test_runner.create_externs(output, test_cases)
|
57
|
-
@generator_test_runner.create_mock_management(output, mock_list)
|
58
|
-
@generator_test_runner.create_runtest(output, mock_list, test_cases)
|
59
|
-
@generator_test_runner.create_main(output, module_name, test_cases)
|
60
|
-
end
|
53
|
+
@generator_test_runner.generate(module_name, runner_filepath, test_cases, mock_list)
|
61
54
|
|
62
55
|
@plugin_manager.post_runner_execute(arg_hash)
|
63
56
|
end
|
64
57
|
|
65
|
-
def generate_object_file(tool, context, source, object)
|
66
|
-
arg_hash = {:tool => tool, :context => context, :source => source, :object => object}
|
58
|
+
def generate_object_file(tool, context, source, object, list='')
|
59
|
+
arg_hash = {:tool => tool, :context => context, :source => source, :object => object, :list => list}
|
67
60
|
@plugin_manager.pre_compile_execute(arg_hash)
|
68
61
|
|
69
62
|
@streaminator.stdout_puts("Compiling #{File.basename(arg_hash[:source])}...", Verbosity::NORMAL)
|
70
|
-
command = @tool_executor.build_command_line(arg_hash[:tool], arg_hash[:source], arg_hash[:object])
|
63
|
+
command = @tool_executor.build_command_line(arg_hash[:tool], arg_hash[:source], arg_hash[:object], arg_hash[:list])
|
71
64
|
shell_result = @tool_executor.exec( command[:line], command[:options] )
|
72
65
|
|
73
66
|
arg_hash[:shell_result] = shell_result
|
@@ -116,14 +109,7 @@ class Generator
|
|
116
109
|
command[:options][:boom] = false
|
117
110
|
shell_result = @tool_executor.exec( command[:line], command[:options] )
|
118
111
|
|
119
|
-
|
120
|
-
notice = "\n" +
|
121
|
-
"ERROR: Test executable \"#{File.basename(executable)}\" did not produce any results.\n" +
|
122
|
-
"This is most often a symptom of bad memory accesses in source or test code.\n\n"
|
123
|
-
|
124
|
-
@streaminator.stderr_puts(notice, Verbosity::COMPLAIN)
|
125
|
-
raise
|
126
|
-
end
|
112
|
+
@generator_helper.test_results_error_handler(executable, shell_result)
|
127
113
|
|
128
114
|
processed = @generator_test_results.process_and_write_results( shell_result,
|
129
115
|
arg_hash[:result_file],
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'constants'
|
2
|
+
|
3
|
+
|
4
|
+
class GeneratorHelper
|
5
|
+
|
6
|
+
constructor :streaminator
|
7
|
+
|
8
|
+
|
9
|
+
def test_results_error_handler(executable, shell_result)
|
10
|
+
notice = ''
|
11
|
+
error = false
|
12
|
+
|
13
|
+
if (shell_result[:output].nil? or shell_result[:output].strip.empty?)
|
14
|
+
error = true
|
15
|
+
# mirror style of generic tool_executor failure output
|
16
|
+
notice = "\n" +
|
17
|
+
"ERROR: Test executable \"#{File.basename(executable)}\" failed.\n" +
|
18
|
+
"> Produced no output to $stdout.\n"
|
19
|
+
elsif ((shell_result[:output] =~ TEST_STDOUT_STATISTICS_PATTERN).nil?)
|
20
|
+
error = true
|
21
|
+
# mirror style of generic tool_executor failure output
|
22
|
+
notice = "\n" +
|
23
|
+
"ERROR: Test executable \"#{File.basename(executable)}\" failed.\n" +
|
24
|
+
"> Produced no test results in $stdout:\n" +
|
25
|
+
"#{shell_result[:output].strip}\n"
|
26
|
+
end
|
27
|
+
|
28
|
+
if (error)
|
29
|
+
# since we told the tool executor to ignore the exit code, handle it explicitly here
|
30
|
+
notice += "> And exited with status: [#{shell_result[:exit_code]}] (count of failed tests).\n" if (shell_result[:exit_code] != nil)
|
31
|
+
notice += "> And then likely crashed.\n" if (shell_result[:exit_code] == nil)
|
32
|
+
|
33
|
+
notice += "> This is often a symptom of a bad memory access in source or test code.\n\n"
|
34
|
+
|
35
|
+
@streaminator.stderr_puts(notice, Verbosity::COMPLAIN)
|
36
|
+
raise
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -4,12 +4,11 @@ require 'constants'
|
|
4
4
|
|
5
5
|
|
6
6
|
class GeneratorTestResults
|
7
|
-
TEST_STATISTICS_REGEX = /-+\s+(\d+)\s+Tests\s+(\d+)\s+Failures\s+(\d+)\s+Ignored\s+(OK|FAIL)\s*/i
|
8
7
|
|
9
8
|
constructor :configurator, :generator_test_results_sanity_checker, :yaml_wrapper
|
10
9
|
|
11
10
|
def process_and_write_results(unity_shell_result, results_file, test_file)
|
12
|
-
output_file
|
11
|
+
output_file = results_file
|
13
12
|
|
14
13
|
results = get_results_structure
|
15
14
|
|
@@ -17,7 +16,7 @@ class GeneratorTestResults
|
|
17
16
|
results[:source][:file] = File.basename(test_file)
|
18
17
|
|
19
18
|
# process test statistics
|
20
|
-
if (unity_shell_result[:output] =~
|
19
|
+
if (unity_shell_result[:output] =~ TEST_STDOUT_STATISTICS_PATTERN)
|
21
20
|
results[:counts][:total] = $1.to_i
|
22
21
|
results[:counts][:failed] = $2.to_i
|
23
22
|
results[:counts][:ignored] = $3.to_i
|
@@ -25,10 +24,10 @@ class GeneratorTestResults
|
|
25
24
|
end
|
26
25
|
|
27
26
|
# remove test statistics lines
|
28
|
-
unity_shell_result[:output].sub
|
27
|
+
output_string = unity_shell_result[:output].sub(TEST_STDOUT_STATISTICS_PATTERN, '')
|
29
28
|
|
30
29
|
# bust up the output into individual lines
|
31
|
-
raw_unity_lines =
|
30
|
+
raw_unity_lines = output_string.split(/\n|\r\n/)
|
32
31
|
|
33
32
|
raw_unity_lines.each do |line|
|
34
33
|
# process unity output
|
@@ -3,7 +3,6 @@ class GeneratorTestRunner
|
|
3
3
|
|
4
4
|
constructor :configurator, :file_path_utils, :file_wrapper
|
5
5
|
|
6
|
-
|
7
6
|
def find_test_cases(test_file)
|
8
7
|
tests = []
|
9
8
|
tests_and_line_numbers = []
|
@@ -53,154 +52,13 @@ class GeneratorTestRunner
|
|
53
52
|
return tests_and_line_numbers
|
54
53
|
end
|
55
54
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
output << "#include <setjmp.h>\n"
|
66
|
-
output << "#include <stdio.h>\n"
|
67
|
-
|
68
|
-
if (@configurator.project_use_exceptions == true)
|
69
|
-
output << "#include \"CException.h\"\n"
|
70
|
-
end
|
71
|
-
|
72
|
-
unless (mock_list.empty?)
|
73
|
-
header_extension = @configurator.extension_header
|
74
|
-
mock_list.each do |mock|
|
75
|
-
output << "#include \"#{mock}#{header_extension}\"\n"
|
76
|
-
end
|
77
|
-
if (@configurator.cmock_enforce_strict_ordering == true)
|
78
|
-
output << "\n"
|
79
|
-
output << "int GlobalExpectCount;\n"
|
80
|
-
output << "int GlobalVerifyOrder;\n"
|
81
|
-
output << "char* GlobalOrderError;\n"
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
output << "\n"
|
86
|
-
output << "char MessageBuffer[50];\n"
|
87
|
-
end
|
88
|
-
|
89
|
-
|
90
|
-
def create_externs(output, test_cases)
|
91
|
-
output << "\n"
|
92
|
-
output << "extern void setUp(void);\n"
|
93
|
-
output << "extern void tearDown(void);\n"
|
94
|
-
output << "\n" if not test_cases.empty?
|
95
|
-
|
96
|
-
test_cases.each do |item|
|
97
|
-
output << "extern void #{item[:test]}(void);\n"
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
|
102
|
-
def create_mock_management(output, mock_list)
|
103
|
-
|
104
|
-
unless (mock_list.empty?)
|
105
|
-
header_extension = @configurator.extension_header
|
106
|
-
|
107
|
-
output << "\n"
|
108
|
-
output << "static void CMock_Init(void)\n"
|
109
|
-
output << "{\n"
|
110
|
-
|
111
|
-
if (@configurator.cmock_enforce_strict_ordering == true)
|
112
|
-
output << " GlobalExpectCount = 0;\n"
|
113
|
-
output << " GlobalVerifyOrder = 0;\n"
|
114
|
-
output << " GlobalOrderError = NULL;\n"
|
115
|
-
end
|
116
|
-
|
117
|
-
mock_list.each do |mock|
|
118
|
-
output << " #{mock.sub(/#{'\\'+header_extension}/, '')}_Init();\n"
|
119
|
-
end
|
120
|
-
output << "}\n"
|
121
|
-
output << "\n"
|
122
|
-
|
123
|
-
output << "static void CMock_Verify(void)\n"
|
124
|
-
output << "{\n"
|
125
|
-
mock_list.each do |mock|
|
126
|
-
output << " #{mock.sub(/#{'\\'+header_extension}/, '')}_Verify();\n"
|
127
|
-
end
|
128
|
-
output << "}\n"
|
129
|
-
output << "\n"
|
130
|
-
|
131
|
-
output << "static void CMock_Destroy(void)\n"
|
132
|
-
output << "{\n"
|
133
|
-
mock_list.each do |mock|
|
134
|
-
output << " #{mock.sub(/#{'\\'+header_extension}/, '')}_Destroy();\n"
|
135
|
-
end
|
136
|
-
output << "}\n"
|
137
|
-
output << "\n"
|
138
|
-
|
139
|
-
output << "void CMock_VerifyAndReset(void)\n"
|
140
|
-
output << "{\n"
|
141
|
-
output << " CMock_Verify();\n"
|
142
|
-
output << " CMock_Destroy();\n"
|
143
|
-
output << " CMock_Init();\n"
|
144
|
-
output << "}\n"
|
145
|
-
output << "\n"
|
146
|
-
end
|
147
|
-
|
148
|
-
end
|
149
|
-
|
150
|
-
|
151
|
-
def create_runtest(output, mock_list, test_cases)
|
152
|
-
|
153
|
-
unless(test_cases.empty?)
|
154
|
-
use_exceptions = @configurator.project_use_exceptions
|
155
|
-
|
156
|
-
tab = ' ' # default spacing
|
157
|
-
tab = ' ' if (use_exceptions)
|
158
|
-
|
159
|
-
output << "\n"
|
160
|
-
output << "static void TestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum)\n"
|
161
|
-
output << "{\n"
|
162
|
-
output << " Unity.CurrentTestName = FuncName;\n"
|
163
|
-
output << " Unity.CurrentTestLineNumber = FuncLineNum;\n"
|
164
|
-
output << " Unity.NumberOfTests++;\n"
|
165
|
-
output << " if (TEST_PROTECT())\n"
|
166
|
-
output << " {\n"
|
167
|
-
output << " CEXCEPTION_T e;\n" if use_exceptions
|
168
|
-
output << " Try {\n" if use_exceptions
|
169
|
-
output << "#{tab}CMock_Init();\n" unless (mock_list.empty?)
|
170
|
-
output << "#{tab}setUp();\n"
|
171
|
-
output << "#{tab}Func();\n"
|
172
|
-
output << "#{tab}CMock_Verify();\n" unless (mock_list.empty?)
|
173
|
-
output << " } Catch(e) { TEST_FAIL_MESSAGE(\"Unhandled Exception!\"); }\n" if use_exceptions
|
174
|
-
output << " }\n"
|
175
|
-
output << " CMock_Destroy();\n" unless (mock_list.empty?)
|
176
|
-
output << " if (TEST_PROTECT() && !(Unity.CurrentTestIgnored))\n"
|
177
|
-
output << " {\n"
|
178
|
-
output << " tearDown();\n"
|
179
|
-
output << " }\n"
|
180
|
-
output << " UnityConcludeTest();\n"
|
181
|
-
output << "}\n"
|
182
|
-
end
|
183
|
-
|
184
|
-
end
|
185
|
-
|
186
|
-
|
187
|
-
def create_main(output, module_name, test_cases)
|
188
|
-
output << "\n"
|
189
|
-
output << "int main(void)\n"
|
190
|
-
output << "{\n"
|
191
|
-
output << " UnityBegin();\n"
|
192
|
-
output << " Unity.TestFile = \"#{module_name}\";\n"
|
193
|
-
output << "\n"
|
194
|
-
|
195
|
-
output << " // RUN_TEST calls runTest\n" unless (test_cases.empty?)
|
196
|
-
test_cases.each do |item|
|
197
|
-
output << " RUN_TEST(#{item[:test]}, #{item[:line_number]});\n"
|
198
|
-
end
|
199
|
-
|
200
|
-
output << "\n"
|
201
|
-
output << " return UnityEnd();\n"
|
202
|
-
output << "}\n"
|
203
|
-
output << "\n"
|
55
|
+
def generate(module_name, runner_filepath, test_cases, mock_list)
|
56
|
+
require 'generate_test_runner.rb'
|
57
|
+
@test_runner_generator ||= UnityTestRunnerGenerator.new( @configurator.get_runner_config )
|
58
|
+
@test_runner_generator.generate( module_name,
|
59
|
+
runner_filepath,
|
60
|
+
test_cases,
|
61
|
+
@configurator.test_runner_includes,
|
62
|
+
mock_list)
|
204
63
|
end
|
205
|
-
|
206
64
|
end
|
@@ -170,6 +170,7 @@ task_invoker:
|
|
170
170
|
generator:
|
171
171
|
compose:
|
172
172
|
- configurator
|
173
|
+
- generator_helper
|
173
174
|
- preprocessinator
|
174
175
|
- cmock_builder
|
175
176
|
- generator_test_runner
|
@@ -182,6 +183,10 @@ generator:
|
|
182
183
|
- plugin_manager
|
183
184
|
- file_wrapper
|
184
185
|
|
186
|
+
generator_helper:
|
187
|
+
compose:
|
188
|
+
- streaminator
|
189
|
+
|
185
190
|
generator_test_results:
|
186
191
|
compose:
|
187
192
|
- configurator
|
@@ -7,6 +7,7 @@ CEEDLING_VENDOR = File.join(CEEDLING_ROOT, 'vendor')
|
|
7
7
|
CEEDLING_RELEASE = File.join(CEEDLING_ROOT, 'release')
|
8
8
|
|
9
9
|
$LOAD_PATH.unshift( CEEDLING_LIB )
|
10
|
+
$LOAD_PATH.unshift( File.join(CEEDLING_VENDOR, 'unity/auto') )
|
10
11
|
$LOAD_PATH.unshift( File.join(CEEDLING_VENDOR, 'diy/lib') )
|
11
12
|
$LOAD_PATH.unshift( File.join(CEEDLING_VENDOR, 'constructor/lib') )
|
12
13
|
$LOAD_PATH.unshift( File.join(CEEDLING_VENDOR, 'cmock/lib') )
|
@@ -9,7 +9,11 @@ rule(/#{PROJECT_RELEASE_BUILD_OUTPUT_ASM_PATH}\/#{'.+\\'+EXTENSION_OBJECT}$/ =>
|
|
9
9
|
@ceedling[:file_finder].find_assembly_file(task_name)
|
10
10
|
end
|
11
11
|
]) do |object|
|
12
|
-
@ceedling[:generator].generate_object_file(
|
12
|
+
@ceedling[:generator].generate_object_file(
|
13
|
+
TOOLS_RELEASE_ASSEMBLER,
|
14
|
+
RELEASE_SYM,
|
15
|
+
object.source,
|
16
|
+
object.name )
|
13
17
|
end
|
14
18
|
end
|
15
19
|
|
@@ -19,7 +23,12 @@ rule(/#{PROJECT_RELEASE_BUILD_OUTPUT_C_PATH}\/#{'.+\\'+EXTENSION_OBJECT}$/ => [
|
|
19
23
|
@ceedling[:file_finder].find_compilation_input_file(task_name)
|
20
24
|
end
|
21
25
|
]) do |object|
|
22
|
-
@ceedling[:generator].generate_object_file(
|
26
|
+
@ceedling[:generator].generate_object_file(
|
27
|
+
TOOLS_RELEASE_COMPILER,
|
28
|
+
RELEASE_SYM,
|
29
|
+
object.source,
|
30
|
+
object.name,
|
31
|
+
@ceedling[:file_path_utils].form_release_build_c_list_filepath( object.name ) )
|
23
32
|
end
|
24
33
|
|
25
34
|
|
@@ -14,7 +14,12 @@ rule(/#{PROJECT_TEST_BUILD_OUTPUT_PATH}\/#{'.+\\'+EXTENSION_OBJECT}$/ => [
|
|
14
14
|
@ceedling[:file_finder].find_compilation_input_file(task_name)
|
15
15
|
end
|
16
16
|
]) do |object|
|
17
|
-
@ceedling[:generator].generate_object_file(
|
17
|
+
@ceedling[:generator].generate_object_file(
|
18
|
+
TOOLS_TEST_COMPILER,
|
19
|
+
TEST_SYM,
|
20
|
+
object.source,
|
21
|
+
object.name,
|
22
|
+
@ceedling[:file_path_utils].form_test_build_list_filepath( object.name ) )
|
18
23
|
end
|
19
24
|
|
20
25
|
|
@@ -24,7 +29,7 @@ rule(/#{PROJECT_TEST_BUILD_OUTPUT_PATH}\/#{'.+\\'+EXTENSION_EXECUTABLE}$/) do |b
|
|
24
29
|
TEST_SYM,
|
25
30
|
bin_file.prerequisites,
|
26
31
|
bin_file.name,
|
27
|
-
@ceedling[:file_path_utils].form_test_build_map_filepath(bin_file.name))
|
32
|
+
@ceedling[:file_path_utils].form_test_build_map_filepath( bin_file.name ) )
|
28
33
|
end
|
29
34
|
|
30
35
|
|
@@ -21,7 +21,6 @@ class Setupinator
|
|
21
21
|
# note: configurator modifies the cmock section of the hash with a couple defaults to tie
|
22
22
|
# project together - the modified hash is used to build cmock object
|
23
23
|
@ceedling[:configurator].populate_defaults( config_hash )
|
24
|
-
@ceedling[:configurator].populate_unity_defines( config_hash )
|
25
24
|
@ceedling[:configurator].populate_cmock_defaults( config_hash )
|
26
25
|
@ceedling[:configurator].find_and_merge_plugins( config_hash )
|
27
26
|
@ceedling[:configurator].tools_setup( config_hash )
|
@@ -42,16 +42,16 @@ class SystemWrapper
|
|
42
42
|
|
43
43
|
def shell_backticks(command)
|
44
44
|
return {
|
45
|
-
:output => `#{command}
|
46
|
-
:exit_code => ($?.exitstatus)
|
45
|
+
:output => `#{command}`.freeze,
|
46
|
+
:exit_code => ($?.exitstatus).freeze
|
47
47
|
}
|
48
48
|
end
|
49
49
|
|
50
50
|
def shell_system(command)
|
51
51
|
system( command )
|
52
52
|
return {
|
53
|
-
:output => '',
|
54
|
-
:exit_code => ($?.exitstatus)
|
53
|
+
:output => ''.freeze,
|
54
|
+
:exit_code => ($?.exitstatus).freeze
|
55
55
|
}
|
56
56
|
end
|
57
57
|
|
@@ -9,7 +9,7 @@ task RELEASE_SYM => [:directories] do
|
|
9
9
|
|
10
10
|
core_objects = []
|
11
11
|
extra_objects = @ceedling[:file_path_utils].form_release_build_c_objects_filelist( COLLECTION_RELEASE_ARTIFACT_EXTRA_LINK_OBJECTS )
|
12
|
-
|
12
|
+
|
13
13
|
@ceedling[:project_config_manager].process_release_config_change
|
14
14
|
core_objects.concat( @ceedling[:release_invoker].setup_and_invoke_c_objects( COLLECTION_ALL_SOURCE ) )
|
15
15
|
|
@@ -23,7 +23,7 @@ class TestInvokerHelper
|
|
23
23
|
sources = []
|
24
24
|
includes = @test_includes_extractor.lookup_includes_list(test)
|
25
25
|
|
26
|
-
includes.each { |include| sources << @file_finder.
|
26
|
+
includes.each { |include| sources << @file_finder.find_compilation_input_file(include, :ignore) }
|
27
27
|
|
28
28
|
return sources.compact
|
29
29
|
end
|
@@ -87,7 +87,7 @@ class ToolExecutorHelper
|
|
87
87
|
if ((shell_result[:exit_code] == 0) or ((shell_result[:exit_code] != 0) and not boom))
|
88
88
|
output = "> Shell executed command:\n"
|
89
89
|
output += "#{command_str}\n"
|
90
|
-
output += "> Produced
|
90
|
+
output += "> Produced output:\n" if (not shell_result[:output].empty?)
|
91
91
|
output += "#{shell_result[:output].strip}\n" if (not shell_result[:output].empty?)
|
92
92
|
output += "> And exited with status: [#{shell_result[:exit_code]}].\n" if (shell_result[:exit_code] != 0)
|
93
93
|
output += "\n"
|
@@ -102,7 +102,7 @@ class ToolExecutorHelper
|
|
102
102
|
output = "ERROR: Shell command failed.\n"
|
103
103
|
output += "> Shell executed command:\n"
|
104
104
|
output += "'#{command_str}'\n"
|
105
|
-
output += "> Produced
|
105
|
+
output += "> Produced output:\n" if (not shell_result[:output].empty?)
|
106
106
|
output += "#{shell_result[:output].strip}\n" if (not shell_result[:output].empty?)
|
107
107
|
output += "> And exited with status: [#{shell_result[:exit_code]}].\n" if (shell_result[:exit_code] != nil)
|
108
108
|
output += "> And then likely crashed.\n" if (shell_result[:exit_code] == nil)
|
@@ -18,7 +18,12 @@ rule(/#{BULLSEYE_BUILD_OUTPUT_PATH}\/#{'.+\\'+EXTENSION_OBJECT}$/ => [
|
|
18
18
|
]) do |object|
|
19
19
|
|
20
20
|
if (File.basename(object.source) =~ /^(#{PROJECT_TEST_FILE_PREFIX}|#{CMOCK_MOCK_PREFIX}|unity|cmock|cexception)/i)
|
21
|
-
@ceedling[:generator].generate_object_file(
|
21
|
+
@ceedling[:generator].generate_object_file(
|
22
|
+
TOOLS_BULLSEYE_COMPILER,
|
23
|
+
BULLSEYE_CONTEXT,
|
24
|
+
object.source,
|
25
|
+
object.name,
|
26
|
+
@ceedling[:file_path_utils].form_test_build_list_filepath( object.name ) )
|
22
27
|
else
|
23
28
|
@ceedling[BULLSEYE_CONTEXT].generate_coverage_object_file(object.source, object.name)
|
24
29
|
end
|
@@ -35,7 +35,12 @@ class Bullseye < Plugin
|
|
35
35
|
@ceedling[:plugin_manager].pre_compile_execute(arg_hash)
|
36
36
|
|
37
37
|
@ceedling[:streaminator].stdout_puts("Compiling #{File.basename(source)} with coverage...")
|
38
|
-
compile_command =
|
38
|
+
compile_command =
|
39
|
+
@ceedling[:tool_executor].build_command_line(
|
40
|
+
TOOLS_BULLSEYE_COMPILER,
|
41
|
+
source,
|
42
|
+
object,
|
43
|
+
@ceedling[:file_path_utils].form_test_build_list_filepath( object ) )
|
39
44
|
coverage_command = @ceedling[:tool_executor].build_command_line(TOOLS_BULLSEYE_INSTRUMENTATION, compile_command[:line] )
|
40
45
|
|
41
46
|
shell_result = @ceedling[:tool_executor].exec( coverage_command[:line], coverage_command[:options] )
|
@@ -124,7 +129,7 @@ class Bullseye < Plugin
|
|
124
129
|
sources.each do |source|
|
125
130
|
command = @ceedling[:tool_executor].build_command_line(TOOLS_BULLSEYE_REPORT_COVFN, source)
|
126
131
|
shell_results = @ceedling[:tool_executor].exec(command[:line], command[:options])
|
127
|
-
coverage_results = shell_results[:output]
|
132
|
+
coverage_results = shell_results[:output].deep_clone
|
128
133
|
coverage_results.sub!(/.*\n.*\n/,'') # Remove the Bullseye tool banner
|
129
134
|
if (coverage_results =~ /warning cov814: report is empty/)
|
130
135
|
coverage_results = "WARNING: #{source} contains no coverage data!\n\n"
|
File without changes
|
@@ -18,7 +18,12 @@ rule(/#{GCOV_BUILD_OUTPUT_PATH}\/#{'.+\\'+EXTENSION_OBJECT}$/ => [
|
|
18
18
|
]) do |object|
|
19
19
|
|
20
20
|
if (File.basename(object.source) =~ /^(#{PROJECT_TEST_FILE_PREFIX}|#{CMOCK_MOCK_PREFIX}|unity|cmock|cexception)/i)
|
21
|
-
@ceedling[:generator].generate_object_file(
|
21
|
+
@ceedling[:generator].generate_object_file(
|
22
|
+
TOOLS_GCOV_COMPILER,
|
23
|
+
GCOV_CONTEXT,
|
24
|
+
object.source,
|
25
|
+
object.name,
|
26
|
+
@ceedling[:file_path_utils].form_test_build_list_filepath( object.name ) )
|
22
27
|
else
|
23
28
|
@ceedling[GCOV_CONTEXT].generate_coverage_object_file(object.source, object.name)
|
24
29
|
end
|
@@ -29,7 +29,12 @@ class Gcov < Plugin
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def generate_coverage_object_file(source, object)
|
32
|
-
compile_command
|
32
|
+
compile_command =
|
33
|
+
@ceedling[:tool_executor].build_command_line(
|
34
|
+
TOOLS_GCOV_COMPILER,
|
35
|
+
source,
|
36
|
+
object,
|
37
|
+
@ceedling[:file_path_utils].form_test_build_list_filepath( object ) )
|
33
38
|
@ceedling[:streaminator].stdout_puts("Compiling #{File.basename(source)} with coverage...")
|
34
39
|
@ceedling[:tool_executor].exec( compile_command[:line], compile_command[:options] )
|
35
40
|
end
|
@@ -101,7 +106,7 @@ class Gcov < Plugin
|
|
101
106
|
|
102
107
|
if (coverage_results.strip =~ /(File\s+'#{Regexp.escape(source)}'.+$)/m)
|
103
108
|
report = ((($1.lines.to_a)[1..-1])).map{|line| basename + ' ' + line}.join('')
|
104
|
-
@ceedling[:streaminator].stdout_puts
|
109
|
+
@ceedling[:streaminator].stdout_puts(report + "\n\n")
|
105
110
|
end
|
106
111
|
end
|
107
112
|
end
|
File without changes
|
@@ -1 +1,2 @@
|
|
1
|
-
|
1
|
+
185
|
2
|
+
|
@@ -0,0 +1,308 @@
|
|
1
|
+
# ==========================================
|
2
|
+
# Unity Project - A Test Framework for C
|
3
|
+
# Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
|
4
|
+
# [Released under MIT License. Please refer to license.txt for details]
|
5
|
+
# ==========================================
|
6
|
+
|
7
|
+
File.expand_path(File.join(File.dirname(__FILE__),'colour_prompt'))
|
8
|
+
|
9
|
+
class UnityTestRunnerGenerator
|
10
|
+
|
11
|
+
def initialize(options = nil)
|
12
|
+
@options = { :includes => [], :plugins => [], :framework => :unity }
|
13
|
+
case(options)
|
14
|
+
when NilClass then @options
|
15
|
+
when String then @options.merge!(UnityTestRunnerGenerator.grab_config(options))
|
16
|
+
when Hash then @options.merge!(options)
|
17
|
+
else raise "If you specify arguments, it should be a filename or a hash of options"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.grab_config(config_file)
|
22
|
+
options = { :includes => [], :plugins => [], :framework => :unity }
|
23
|
+
unless (config_file.nil? or config_file.empty?)
|
24
|
+
require 'yaml'
|
25
|
+
yaml_guts = YAML.load_file(config_file)
|
26
|
+
options.merge!(yaml_guts[:unity] ? yaml_guts[:unity] : yaml_guts[:cmock])
|
27
|
+
raise "No :unity or :cmock section found in #{config_file}" unless options
|
28
|
+
end
|
29
|
+
return(options)
|
30
|
+
end
|
31
|
+
|
32
|
+
def run(input_file, output_file, options=nil)
|
33
|
+
tests = []
|
34
|
+
includes = []
|
35
|
+
used_mocks = []
|
36
|
+
|
37
|
+
@options.merge!(options) unless options.nil?
|
38
|
+
module_name = File.basename(input_file)
|
39
|
+
|
40
|
+
#pull required data from source file
|
41
|
+
File.open(input_file, 'r') do |input|
|
42
|
+
tests = find_tests(input)
|
43
|
+
includes = find_includes(input)
|
44
|
+
used_mocks = find_mocks(includes)
|
45
|
+
end
|
46
|
+
|
47
|
+
#build runner file
|
48
|
+
generate(input_file, output_file, tests, includes, used_mocks)
|
49
|
+
|
50
|
+
#determine which files were used to return them
|
51
|
+
all_files_used = [input_file, output_file]
|
52
|
+
all_files_used += includes.map {|filename| filename + '.c'} unless includes.empty?
|
53
|
+
all_files_used += @options[:includes] unless @options[:includes].empty?
|
54
|
+
return all_files_used.uniq
|
55
|
+
end
|
56
|
+
|
57
|
+
def generate(input_file, output_file, tests, includes, used_mocks)
|
58
|
+
File.open(output_file, 'w') do |output|
|
59
|
+
create_header(output, used_mocks)
|
60
|
+
create_externs(output, tests, used_mocks)
|
61
|
+
create_mock_management(output, used_mocks)
|
62
|
+
create_suite_setup_and_teardown(output)
|
63
|
+
create_reset(output, used_mocks)
|
64
|
+
create_main(output, input_file, tests)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def find_tests(input_file)
|
69
|
+
tests_raw = []
|
70
|
+
tests_args = []
|
71
|
+
tests_and_line_numbers = []
|
72
|
+
|
73
|
+
input_file.rewind
|
74
|
+
source_raw = input_file.read
|
75
|
+
source_scrubbed = source_raw.gsub(/\/\/.*$/, '') # remove line comments
|
76
|
+
source_scrubbed = source_scrubbed.gsub(/\/\*.*?\*\//m, '') # remove block comments
|
77
|
+
lines = source_scrubbed.split(/(^\s*\#.*$) # Treat preprocessor directives as a logical line
|
78
|
+
| (;|\{|\}) /x) # Match ;, {, and } as end of lines
|
79
|
+
|
80
|
+
lines.each_with_index do |line, index|
|
81
|
+
#find tests
|
82
|
+
if line =~ /^((?:\s*TEST_CASE\s*\(.*?\)\s*)*)\s*void\s+(test.*?)\s*\(\s*(.*)\s*\)/
|
83
|
+
arguments = $1
|
84
|
+
name = $2
|
85
|
+
call = $3
|
86
|
+
args = nil
|
87
|
+
if (@options[:use_param_tests] and !arguments.empty?)
|
88
|
+
args = []
|
89
|
+
arguments.scan(/\s*TEST_CASE\s*\((.*)\)\s*$/) {|a| args << a[0]}
|
90
|
+
end
|
91
|
+
tests_and_line_numbers << { :test => name, :args => args, :call => call, :line_number => 0 }
|
92
|
+
tests_args = []
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
#determine line numbers and create tests to run
|
97
|
+
source_lines = source_raw.split("\n")
|
98
|
+
source_index = 0;
|
99
|
+
tests_and_line_numbers.size.times do |i|
|
100
|
+
source_lines[source_index..-1].each_with_index do |line, index|
|
101
|
+
if (line =~ /#{tests_and_line_numbers[i][:test]}/)
|
102
|
+
source_index += index
|
103
|
+
tests_and_line_numbers[i][:line_number] = source_index + 1
|
104
|
+
break
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
return tests_and_line_numbers
|
110
|
+
end
|
111
|
+
|
112
|
+
def find_includes(input_file)
|
113
|
+
input_file.rewind
|
114
|
+
includes = []
|
115
|
+
input_file.readlines.each do |line|
|
116
|
+
scan_results = line.scan(/^\s*#include\s+\"\s*(.+)\.[hH]\s*\"/)
|
117
|
+
includes << scan_results[0][0] if (scan_results.size > 0)
|
118
|
+
end
|
119
|
+
return includes
|
120
|
+
end
|
121
|
+
|
122
|
+
def find_mocks(includes)
|
123
|
+
mock_headers = []
|
124
|
+
includes.each do |include_file|
|
125
|
+
mock_headers << File.basename(include_file) if (include_file =~ /^mock/i)
|
126
|
+
end
|
127
|
+
return mock_headers
|
128
|
+
end
|
129
|
+
|
130
|
+
def create_header(output, mocks)
|
131
|
+
output.puts('/* AUTOGENERATED FILE. DO NOT EDIT. */')
|
132
|
+
create_runtest(output, mocks)
|
133
|
+
output.puts("\n//=======Automagically Detected Files To Include=====")
|
134
|
+
output.puts("#include \"#{@options[:framework].to_s}.h\"")
|
135
|
+
output.puts('#include "cmock.h"') unless (mocks.empty?)
|
136
|
+
@options[:includes].flatten.uniq.compact.each do |inc|
|
137
|
+
output.puts("#include #{inc.include?('<') ? inc : "\"#{inc.gsub('.h','')}.h\""}")
|
138
|
+
end
|
139
|
+
output.puts('#include <setjmp.h>')
|
140
|
+
output.puts('#include <stdio.h>')
|
141
|
+
output.puts('#include "CException.h"') if @options[:plugins].include?(:cexception)
|
142
|
+
mocks.each do |mock|
|
143
|
+
output.puts("#include \"#{mock.gsub('.h','')}.h\"")
|
144
|
+
end
|
145
|
+
if @options[:enforce_strict_ordering]
|
146
|
+
output.puts('')
|
147
|
+
output.puts('int GlobalExpectCount;')
|
148
|
+
output.puts('int GlobalVerifyOrder;')
|
149
|
+
output.puts('char* GlobalOrderError;')
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
def create_externs(output, tests, mocks)
|
154
|
+
output.puts("\n//=======External Functions This Runner Calls=====")
|
155
|
+
output.puts("extern void setUp(void);")
|
156
|
+
output.puts("extern void tearDown(void);")
|
157
|
+
tests.each do |test|
|
158
|
+
output.puts("extern void #{test[:test]}(#{test[:call]});")
|
159
|
+
end
|
160
|
+
output.puts('')
|
161
|
+
end
|
162
|
+
|
163
|
+
def create_mock_management(output, mocks)
|
164
|
+
unless (mocks.empty?)
|
165
|
+
output.puts("\n//=======Mock Management=====")
|
166
|
+
output.puts("static void CMock_Init(void)")
|
167
|
+
output.puts("{")
|
168
|
+
if @options[:enforce_strict_ordering]
|
169
|
+
output.puts(" GlobalExpectCount = 0;")
|
170
|
+
output.puts(" GlobalVerifyOrder = 0;")
|
171
|
+
output.puts(" GlobalOrderError = NULL;")
|
172
|
+
end
|
173
|
+
mocks.each do |mock|
|
174
|
+
output.puts(" #{mock}_Init();")
|
175
|
+
end
|
176
|
+
output.puts("}\n")
|
177
|
+
|
178
|
+
output.puts("static void CMock_Verify(void)")
|
179
|
+
output.puts("{")
|
180
|
+
mocks.each do |mock|
|
181
|
+
output.puts(" #{mock}_Verify();")
|
182
|
+
end
|
183
|
+
output.puts("}\n")
|
184
|
+
|
185
|
+
output.puts("static void CMock_Destroy(void)")
|
186
|
+
output.puts("{")
|
187
|
+
mocks.each do |mock|
|
188
|
+
output.puts(" #{mock}_Destroy();")
|
189
|
+
end
|
190
|
+
output.puts("}\n")
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
def create_suite_setup_and_teardown(output)
|
195
|
+
unless (@options[:suite_setup].nil?)
|
196
|
+
output.puts("\n//=======Suite Setup=====")
|
197
|
+
output.puts("static int suite_setup(void)")
|
198
|
+
output.puts("{")
|
199
|
+
output.puts(@options[:suite_setup])
|
200
|
+
output.puts("}")
|
201
|
+
end
|
202
|
+
unless (@options[:suite_teardown].nil?)
|
203
|
+
output.puts("\n//=======Suite Teardown=====")
|
204
|
+
output.puts("static int suite_teardown(int num_failures)")
|
205
|
+
output.puts("{")
|
206
|
+
output.puts(@options[:suite_teardown])
|
207
|
+
output.puts("}")
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
def create_runtest(output, used_mocks)
|
212
|
+
cexception = @options[:plugins].include? :cexception
|
213
|
+
va_args1 = @options[:use_param_tests] ? ', ...' : ''
|
214
|
+
va_args2 = @options[:use_param_tests] ? '__VA_ARGS__' : ''
|
215
|
+
output.puts("\n//=======Test Runner Used To Run Each Test Below=====")
|
216
|
+
output.puts("#define RUN_TEST_NO_ARGS") if @options[:use_param_tests]
|
217
|
+
output.puts("#define RUN_TEST(TestFunc, TestLineNum#{va_args1}) \\")
|
218
|
+
output.puts("{ \\")
|
219
|
+
output.puts(" Unity.CurrentTestName = #TestFunc#{va_args2.empty? ? '' : " \"(\" ##{va_args2} \")\""}; \\")
|
220
|
+
output.puts(" Unity.CurrentTestLineNumber = TestLineNum; \\")
|
221
|
+
output.puts(" Unity.NumberOfTests++; \\")
|
222
|
+
output.puts(" if (TEST_PROTECT()) \\")
|
223
|
+
output.puts(" { \\")
|
224
|
+
output.puts(" CEXCEPTION_T e; \\") if cexception
|
225
|
+
output.puts(" Try { \\") if cexception
|
226
|
+
output.puts(" CMock_Init(); \\") unless (used_mocks.empty?)
|
227
|
+
output.puts(" setUp(); \\")
|
228
|
+
output.puts(" TestFunc(#{va_args2}); \\")
|
229
|
+
output.puts(" CMock_Verify(); \\") unless (used_mocks.empty?)
|
230
|
+
output.puts(" } Catch(e) { TEST_ASSERT_EQUAL_HEX32_MESSAGE(CEXCEPTION_NONE, e, \"Unhandled Exception!\"); } \\") if cexception
|
231
|
+
output.puts(" } \\")
|
232
|
+
output.puts(" CMock_Destroy(); \\") unless (used_mocks.empty?)
|
233
|
+
output.puts(" if (TEST_PROTECT() && !TEST_IS_IGNORED) \\")
|
234
|
+
output.puts(" { \\")
|
235
|
+
output.puts(" tearDown(); \\")
|
236
|
+
output.puts(" } \\")
|
237
|
+
output.puts(" UnityConcludeTest(); \\")
|
238
|
+
output.puts("}\n")
|
239
|
+
end
|
240
|
+
|
241
|
+
def create_reset(output, used_mocks)
|
242
|
+
output.puts("\n//=======Test Reset Option=====")
|
243
|
+
output.puts("void resetTest()")
|
244
|
+
output.puts("{")
|
245
|
+
output.puts(" CMock_Verify();") unless (used_mocks.empty?)
|
246
|
+
output.puts(" CMock_Destroy();") unless (used_mocks.empty?)
|
247
|
+
output.puts(" tearDown();")
|
248
|
+
output.puts(" CMock_Init();") unless (used_mocks.empty?)
|
249
|
+
output.puts(" setUp();")
|
250
|
+
output.puts("}")
|
251
|
+
end
|
252
|
+
|
253
|
+
def create_main(output, filename, tests)
|
254
|
+
output.puts("\n\n//=======MAIN=====")
|
255
|
+
output.puts("int main(void)")
|
256
|
+
output.puts("{")
|
257
|
+
output.puts(" suite_setup();") unless @options[:suite_setup].nil?
|
258
|
+
output.puts(" Unity.TestFile = \"#{filename}\";")
|
259
|
+
output.puts(" UnityBegin();")
|
260
|
+
if (@options[:use_param_tests])
|
261
|
+
tests.each do |test|
|
262
|
+
if ((test[:args].nil?) or (test[:args].empty?))
|
263
|
+
output.puts(" RUN_TEST(#{test[:test]}, #{test[:line_number]}, RUN_TEST_NO_ARGS);")
|
264
|
+
else
|
265
|
+
test[:args].each {|args| output.puts(" RUN_TEST(#{test[:test]}, #{test[:line_number]}, #{args});")}
|
266
|
+
end
|
267
|
+
end
|
268
|
+
else
|
269
|
+
tests.each { |test| output.puts(" RUN_TEST(#{test[:test]}, #{test[:line_number]});") }
|
270
|
+
end
|
271
|
+
output.puts()
|
272
|
+
output.puts(" return #{@options[:suite_teardown].nil? ? "" : "suite_teardown"}(UnityEnd());")
|
273
|
+
output.puts("}")
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
|
278
|
+
if ($0 == __FILE__)
|
279
|
+
options = { :includes => [] }
|
280
|
+
yaml_file = nil
|
281
|
+
|
282
|
+
#parse out all the options first
|
283
|
+
ARGV.reject! do |arg|
|
284
|
+
case(arg)
|
285
|
+
when '-cexception'
|
286
|
+
options[:plugins] = [:cexception]; true
|
287
|
+
when /\.*\.yml/
|
288
|
+
options = UnityTestRunnerGenerator.grab_config(arg); true
|
289
|
+
else false
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
#make sure there is at least one parameter left (the input file)
|
294
|
+
if !ARGV[0]
|
295
|
+
puts ["usage: ruby #{__FILE__} (yaml) (options) input_test_file output_test_runner (includes)",
|
296
|
+
" blah.yml - will use config options in the yml file (see docs)",
|
297
|
+
" -cexception - include cexception support"].join("\n")
|
298
|
+
exit 1
|
299
|
+
end
|
300
|
+
|
301
|
+
#create the default test runner name if not specified
|
302
|
+
ARGV[1] = ARGV[0].gsub(".c","_Runner.c") if (!ARGV[1])
|
303
|
+
|
304
|
+
#everything else is an include file
|
305
|
+
options[:includes] ||= (ARGV.slice(2..-1).flatten.compact) if (ARGV.size > 2)
|
306
|
+
|
307
|
+
UnityTestRunnerGenerator.new(options).run(ARGV[0], ARGV[1])
|
308
|
+
end
|
@@ -296,24 +296,23 @@ void UnityAssertEqualFloatArray(const _UF* expected,
|
|
296
296
|
#define UNITY_TEST_ASSERT_NOT_NULL(pointer, line, message) UNITY_TEST_ASSERT(((pointer) != NULL), (UNITY_LINE_TYPE)line, message)
|
297
297
|
|
298
298
|
#define UNITY_TEST_ASSERT_EQUAL_INT(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_INT)
|
299
|
-
#define UNITY_TEST_ASSERT_EQUAL_INT8(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_INT)
|
300
|
-
#define UNITY_TEST_ASSERT_EQUAL_INT16(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_INT)
|
301
|
-
#define UNITY_TEST_ASSERT_EQUAL_INT32(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_INT)
|
299
|
+
#define UNITY_TEST_ASSERT_EQUAL_INT8(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US8 )(expected), (_U_SINT)(_US8 )(actual), (message), (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_INT)
|
300
|
+
#define UNITY_TEST_ASSERT_EQUAL_INT16(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US16)(expected), (_U_SINT)(_US16)(actual), (message), (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_INT)
|
301
|
+
#define UNITY_TEST_ASSERT_EQUAL_INT32(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US32)(expected), (_U_SINT)(_US32)(actual), (message), (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_INT)
|
302
302
|
#define UNITY_TEST_ASSERT_EQUAL_UINT(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_UINT)
|
303
|
-
#define UNITY_TEST_ASSERT_EQUAL_UINT8(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_UINT)
|
304
|
-
#define UNITY_TEST_ASSERT_EQUAL_UINT16(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_UINT)
|
305
|
-
#define UNITY_TEST_ASSERT_EQUAL_UINT32(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_UINT)
|
306
|
-
#define UNITY_TEST_ASSERT_EQUAL_HEX8(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_HEX8)
|
307
|
-
#define UNITY_TEST_ASSERT_EQUAL_HEX16(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_HEX16)
|
308
|
-
#define UNITY_TEST_ASSERT_EQUAL_HEX32(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_HEX32)
|
303
|
+
#define UNITY_TEST_ASSERT_EQUAL_UINT8(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US8 )(expected), (_U_SINT)(_US8 )(actual), (message), (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_UINT)
|
304
|
+
#define UNITY_TEST_ASSERT_EQUAL_UINT16(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US16)(expected), (_U_SINT)(_US16)(actual), (message), (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_UINT)
|
305
|
+
#define UNITY_TEST_ASSERT_EQUAL_UINT32(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US32)(expected), (_U_SINT)(_US32)(actual), (message), (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_UINT)
|
306
|
+
#define UNITY_TEST_ASSERT_EQUAL_HEX8(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US8 )(expected), (_U_SINT)(_US8 )(actual), (message), (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_HEX8)
|
307
|
+
#define UNITY_TEST_ASSERT_EQUAL_HEX16(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US16)(expected), (_U_SINT)(_US16)(actual), (message), (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_HEX16)
|
308
|
+
#define UNITY_TEST_ASSERT_EQUAL_HEX32(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US32)(expected), (_U_SINT)(_US32)(actual), (message), (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_HEX32)
|
309
309
|
#define UNITY_TEST_ASSERT_BITS(mask, expected, actual, line, message) UnityAssertBits((_U_SINT)(mask), (_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)line)
|
310
310
|
|
311
311
|
#define UNITY_TEST_ASSERT_INT_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_U_SINT)(delta), (_U_SINT)(expected), (_U_SINT)(actual), NULL, (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_INT)
|
312
312
|
#define UNITY_TEST_ASSERT_UINT_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_U_SINT)(delta), (_U_SINT)(expected), (_U_SINT)(actual), NULL, (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_UINT)
|
313
|
-
#define UNITY_TEST_ASSERT_HEX8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_U_SINT)(delta), (_U_SINT)(expected), (_U_SINT)(actual), NULL, (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_HEX8)
|
314
|
-
#define UNITY_TEST_ASSERT_HEX16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_U_SINT)(delta), (_U_SINT)(expected), (_U_SINT)(actual), NULL, (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_HEX16)
|
315
|
-
#define UNITY_TEST_ASSERT_HEX32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_U_SINT)(delta), (_U_SINT)(expected), (_U_SINT)(actual), NULL, (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_HEX32)
|
316
|
-
#define UNITY_TEST_ASSERT_HEX64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_U_SINT)(delta), (_U_SINT)(expected), (_U_SINT)(actual), NULL, (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_HEX64)
|
313
|
+
#define UNITY_TEST_ASSERT_HEX8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_U_SINT)(_U_UINT)(_UU8 )(delta), (_U_SINT)(_U_UINT)(_UU8 )(expected), (_U_SINT)(_U_UINT)(_UU8 )(actual), NULL, (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_HEX8)
|
314
|
+
#define UNITY_TEST_ASSERT_HEX16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_U_SINT)(_U_UINT)(_UU16)(delta), (_U_SINT)(_U_UINT)(_UU16)(expected), (_U_SINT)(_U_UINT)(_UU16)(actual), NULL, (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_HEX16)
|
315
|
+
#define UNITY_TEST_ASSERT_HEX32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_U_SINT)(_U_UINT)(_UU32)(delta), (_U_SINT)(_U_UINT)(_UU32)(expected), (_U_SINT)(_U_UINT)(_UU32)(actual), NULL, (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_HEX32)
|
317
316
|
|
318
317
|
#define UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_UP)(expected), (_U_SINT)(_UP)(actual), (message), (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_POINTER)
|
319
318
|
#define UNITY_TEST_ASSERT_EQUAL_STRING(expected, actual, line, message) UnityAssertEqualString((const char*)(expected), (const char*)(actual), (message), (UNITY_LINE_TYPE)line)
|
@@ -340,6 +339,7 @@ void UnityAssertEqualFloatArray(const _UF* expected,
|
|
340
339
|
#define UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((const _U_SINT*)(expected), (const _U_SINT*)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_INT64)
|
341
340
|
#define UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((const _U_SINT*)(expected), (const _U_SINT*)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_UINT64)
|
342
341
|
#define UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((const _U_SINT*)(expected), (const _U_SINT*)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_HEX64)
|
342
|
+
#define UNITY_TEST_ASSERT_HEX64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_U_SINT)(delta), (_U_SINT)(expected), (_U_SINT)(actual), NULL, (UNITY_LINE_TYPE)line, UNITY_DISPLAY_STYLE_HEX64)
|
343
343
|
#endif
|
344
344
|
|
345
345
|
#ifdef UNITY_EXCLUDE_FLOAT
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ceedling
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 7
|
10
|
+
version: 0.0.7
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Mike Karlesky, Mark VanderVoord
|
@@ -17,7 +17,7 @@ autorequire:
|
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
19
|
|
20
|
-
date: 2011-04-
|
20
|
+
date: 2011-04-21 00:00:00 -04:00
|
21
21
|
default_executable:
|
22
22
|
dependencies:
|
23
23
|
- !ruby/object:Gem::Dependency
|
@@ -186,6 +186,7 @@ files:
|
|
186
186
|
- new_project_template/vendor/ceedling/lib/file_system_utils.rb
|
187
187
|
- new_project_template/vendor/ceedling/lib/file_wrapper.rb
|
188
188
|
- new_project_template/vendor/ceedling/lib/generator.rb
|
189
|
+
- new_project_template/vendor/ceedling/lib/generator_helper.rb
|
189
190
|
- new_project_template/vendor/ceedling/lib/generator_test_results.rb
|
190
191
|
- new_project_template/vendor/ceedling/lib/generator_test_results_sanity_checker.rb
|
191
192
|
- new_project_template/vendor/ceedling/lib/generator_test_runner.rb
|
@@ -238,10 +239,12 @@ files:
|
|
238
239
|
- new_project_template/vendor/ceedling/plugins/bullseye/bullseye.rake
|
239
240
|
- new_project_template/vendor/ceedling/plugins/bullseye/bullseye.rb
|
240
241
|
- new_project_template/vendor/ceedling/plugins/bullseye/defaults.yml
|
242
|
+
- new_project_template/vendor/ceedling/plugins/bullseye/readme.txt
|
241
243
|
- new_project_template/vendor/ceedling/plugins/bullseye/template.erb
|
242
244
|
- new_project_template/vendor/ceedling/plugins/gcov/defaults.yml
|
243
245
|
- new_project_template/vendor/ceedling/plugins/gcov/gcov.rake
|
244
246
|
- new_project_template/vendor/ceedling/plugins/gcov/gcov.rb
|
247
|
+
- new_project_template/vendor/ceedling/plugins/gcov/readme.txt
|
245
248
|
- new_project_template/vendor/ceedling/plugins/gcov/template.erb
|
246
249
|
- new_project_template/vendor/ceedling/plugins/stdout_ide_tests_report/stdout_ide_tests_report.rb
|
247
250
|
- new_project_template/vendor/ceedling/plugins/stdout_ide_tests_report/stdout_ide_tests_report.yml
|
@@ -280,6 +283,7 @@ files:
|
|
280
283
|
- new_project_template/vendor/ceedling/vendor/deep_merge/lib/deep_merge.rb
|
281
284
|
- new_project_template/vendor/ceedling/vendor/diy/lib/diy.rb
|
282
285
|
- new_project_template/vendor/ceedling/vendor/diy/lib/diy/factory.rb
|
286
|
+
- new_project_template/vendor/ceedling/vendor/unity/auto/generate_test_runner.rb
|
283
287
|
- new_project_template/vendor/ceedling/vendor/unity/release/build.info
|
284
288
|
- new_project_template/vendor/ceedling/vendor/unity/release/version.info
|
285
289
|
- new_project_template/vendor/ceedling/vendor/unity/src/unity.c
|
@@ -315,7 +319,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
315
319
|
requirements: []
|
316
320
|
|
317
321
|
rubyforge_project: ceedling
|
318
|
-
rubygems_version: 1.
|
322
|
+
rubygems_version: 1.6.2
|
319
323
|
signing_key:
|
320
324
|
specification_version: 3
|
321
325
|
summary: Gemified version of the Ceedling C testing / build environment
|