ceedling 0.24.0 → 0.25.0

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.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/bin/ceedling +6 -1
  3. data/docs/CeedlingPacket.md +9 -0
  4. data/lib/ceedling/generator.rb +2 -2
  5. data/lib/ceedling/generator_test_runner.rb +32 -1
  6. data/lib/ceedling/rakefile.rb +1 -1
  7. data/lib/ceedling/system_wrapper.rb +13 -10
  8. data/lib/ceedling/tool_executor.rb +2 -2
  9. data/lib/ceedling/version.rb +1 -1
  10. data/plugins/command_hooks/README.md +52 -0
  11. data/plugins/command_hooks/lib/command_hooks.rb +71 -0
  12. data/plugins/module_generator/lib/module_generator.rb +10 -4
  13. data/plugins/module_generator/module_generator.rake +2 -2
  14. data/spec/spec_system_helper.rb +16 -11
  15. data/spec/system/deployment_spec.rb +2 -2
  16. data/vendor/c_exception/vendor/unity/auto/generate_module.rb +77 -34
  17. data/vendor/c_exception/vendor/unity/extras/fixture/src/unity_fixture.c +1 -1
  18. data/vendor/c_exception/vendor/unity/extras/fixture/src/unity_fixture_internals.h +2 -2
  19. data/vendor/c_exception/vendor/unity/extras/fixture/test/unity_fixture_Test.c +3 -3
  20. data/vendor/c_exception/vendor/unity/src/unity.c +105 -105
  21. data/vendor/c_exception/vendor/unity/src/unity.h +8 -8
  22. data/vendor/c_exception/vendor/unity/src/unity_internals.h +139 -139
  23. data/vendor/c_exception/vendor/unity/test/tests/testunity.c +141 -142
  24. data/vendor/cmock/lib/cmock_generator.rb +2 -1
  25. data/vendor/cmock/test/c/TestCMockC.c +1 -1
  26. data/vendor/cmock/test/system/test_interactions/unity_64bit_support.yml +13 -13
  27. data/vendor/cmock/test/unit/cmock_generator_main_test.rb +4 -2
  28. data/vendor/cmock/vendor/c_exception/vendor/unity/auto/generate_module.rb +77 -34
  29. data/vendor/cmock/vendor/c_exception/vendor/unity/extras/fixture/src/unity_fixture.c +1 -1
  30. data/vendor/cmock/vendor/c_exception/vendor/unity/extras/fixture/src/unity_fixture_internals.h +2 -2
  31. data/vendor/cmock/vendor/c_exception/vendor/unity/extras/fixture/test/unity_fixture_Test.c +3 -3
  32. data/vendor/cmock/vendor/c_exception/vendor/unity/src/unity.c +105 -105
  33. data/vendor/cmock/vendor/c_exception/vendor/unity/src/unity.h +8 -8
  34. data/vendor/cmock/vendor/c_exception/vendor/unity/src/unity_internals.h +139 -139
  35. data/vendor/cmock/vendor/c_exception/vendor/unity/test/tests/testunity.c +141 -142
  36. data/vendor/cmock/vendor/unity/auto/generate_module.rb +77 -34
  37. data/vendor/cmock/vendor/unity/extras/fixture/src/unity_fixture.c +1 -1
  38. data/vendor/cmock/vendor/unity/extras/fixture/src/unity_fixture_internals.h +2 -2
  39. data/vendor/cmock/vendor/unity/extras/fixture/test/unity_fixture_Test.c +3 -3
  40. data/vendor/cmock/vendor/unity/src/unity.c +105 -105
  41. data/vendor/cmock/vendor/unity/src/unity.h +8 -8
  42. data/vendor/cmock/vendor/unity/src/unity_internals.h +139 -139
  43. data/vendor/cmock/vendor/unity/test/tests/testunity.c +141 -142
  44. data/vendor/unity/auto/generate_module.rb +77 -34
  45. data/vendor/unity/extras/fixture/src/unity_fixture.c +1 -1
  46. data/vendor/unity/extras/fixture/src/unity_fixture_internals.h +2 -2
  47. data/vendor/unity/extras/fixture/test/unity_fixture_Test.c +3 -3
  48. data/vendor/unity/src/unity.c +105 -105
  49. data/vendor/unity/src/unity.h +8 -8
  50. data/vendor/unity/src/unity_internals.h +139 -139
  51. data/vendor/unity/test/tests/testunity.c +141 -142
  52. metadata +4 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 300e156b4f9cbd9bfbea4221b4773dbe3cf122f8
4
- data.tar.gz: 823a00ec8ef37579f01e9d444d45d01b6a9cd0f0
3
+ metadata.gz: 373d6a4981555897351460b57dc82e3d90a96d6d
4
+ data.tar.gz: ff091c1e3c1934718eb19fcab984c3bc169f5b92
5
5
  SHA512:
6
- metadata.gz: 8ffe3c8e7a34b6f1cbfd3571a6fd47af2312b7d11a2be722a95587e6cacc4282683614d7e976e7114d442ab0f2efd4ef4fc0a7e6868a7d050c21bb73e7ef84f9
7
- data.tar.gz: c9fe93d947af1d5dea5d4f0b3af34f922ed21467364371bd6c2d83c2ec407f9d211baf71a2fe47578cbe7656147c6ed81435b0d0fd1a3ac13e003b211a93a05a
6
+ metadata.gz: 0feea9fe999980ad018ea2ec89fb0af54537d3ed1b9b029fa24148f4d7c25fabdf4392a896723046a7b0af46533b8187fa2be902cf3a7a3d6fa633863294122e
7
+ data.tar.gz: 790254af22bb0d7d28efd37ed3df4d5de2aba82589c0c52abf585ad7732ea43dbff283e861286f34d865acb21870f9aeb25456d6897253a1085a3271d9d718a6
data/bin/ceedling CHANGED
@@ -193,7 +193,12 @@ else
193
193
 
194
194
  #if neither of these libraries were available, we can just shell out to the command and collect results
195
195
  def spawn_command(cmd, &block)
196
- block.call( StringIO.new(`#{cmd}`) )
196
+ results = `#{cmd}`
197
+ if ($?.exitstatus != 0)
198
+ block.call( StringIO.new("ERROR: Aborted with Exit Code #{$?.exitstatus.to_s}") )
199
+ else
200
+ block.call( StringIO.new(results) )
201
+ end
197
202
  end
198
203
  end
199
204
 
@@ -322,6 +322,15 @@ Ceedling (more on this later).
322
322
  Sometimes you just need to assemble a single file doggonit. Example:
323
323
  ceedling release:assemble:foo.s
324
324
 
325
+ * `ceedling module:create[Filename]`:
326
+
327
+ It's often helpful to create a file automatically. What's better than
328
+ that? Creating a source file, a header file, and a corresponding test
329
+ file all in one step!
330
+
331
+ There are also patterns which can be specified to automatically generate
332
+ a bunch of files. Try `ceedling module:create[Poodles,mch]` for example!
333
+
325
334
  * `ceedling logging <tasks...>`:
326
335
 
327
336
  Enable logging to <build path>/logs. Must come before test and release
@@ -95,7 +95,7 @@ class Generator
95
95
  shell_result = @tool_executor.exec( command[:line], command[:options] )
96
96
  rescue ShellExecutionException => ex
97
97
  shell_result = ex.shell_result
98
- raise ''
98
+ raise ex
99
99
  ensure
100
100
  arg_hash[:shell_result] = shell_result
101
101
  @plugin_manager.post_compile_execute(arg_hash)
@@ -149,7 +149,7 @@ class Generator
149
149
  command = @tool_executor.build_command_line(arg_hash[:tool], [], arg_hash[:executable])
150
150
  command[:options][:boom] = false
151
151
  shell_result = @tool_executor.exec( command[:line], command[:options] )
152
-
152
+ shell_result[:exit_code] = 0 #Don't Let The Failure Count Make Us Believe Things Aren't Working
153
153
  @generator_helper.test_results_error_handler(executable, shell_result)
154
154
 
155
155
  processed = @generator_test_results.process_and_write_results( shell_result,
@@ -4,13 +4,44 @@ class GeneratorTestRunner
4
4
  constructor :configurator, :file_path_utils, :file_wrapper
5
5
 
6
6
  def find_test_cases(test_file)
7
+
8
+ #Pull in Unity's Test Runner Generator
7
9
  require 'generate_test_runner.rb'
8
10
  @test_runner_generator ||= UnityTestRunnerGenerator.new( @configurator.get_runner_config )
9
- return @test_runner_generator.find_tests(@file_wrapper.read(test_file))
11
+
12
+ if (@configurator.project_use_test_preprocessor)
13
+
14
+ #redirect to use the preprocessor file if we're doing that sort of thing
15
+ pre_test_file = @file_path_utils.form_preprocessed_file_filepath(test_file)
16
+
17
+ #actually look for the tests using Unity's test runner generator
18
+ tests_and_line_numbers = @test_runner_generator.find_tests(@file_wrapper.read(pre_test_file))
19
+
20
+ #look up the line numbers in the original file
21
+ source_lines = @file_wrapper.read(test_file).split("\n")
22
+ source_index = 0;
23
+ tests_and_line_numbers.size.times do |i|
24
+ source_lines[source_index..-1].each_with_index do |line, index|
25
+ if (line =~ /#{tests_and_line_numbers[i][:test]}/)
26
+ source_index += index
27
+ tests_and_line_numbers[i][:line_number] = source_index + 1
28
+ break
29
+ end
30
+ end
31
+ end
32
+ else
33
+ #Just look for the tests using Unity's test runner generator
34
+ tests_and_line_numbers = @test_runner_generator.find_tests(@file_wrapper.read(test_file))
35
+ end
36
+
37
+ return tests_and_line_numbers
10
38
  end
11
39
 
12
40
  def generate(module_name, runner_filepath, test_cases, mock_list, test_file_includes=[])
13
41
  require 'generate_test_runner.rb'
42
+
43
+ #actually build the test runner using Unity's test runner generator
44
+ #(there is no need to use preprocessor here because we've already looked up test cases and are passing them in here)
14
45
  @test_runner_generator ||= UnityTestRunnerGenerator.new( @configurator.get_runner_config )
15
46
  @test_runner_generator.generate( module_name,
16
47
  runner_filepath,
@@ -73,6 +73,6 @@ END {
73
73
  # tell all our plugins the build is done and process results
74
74
  @ceedling[:plugin_manager].post_build
75
75
  @ceedling[:plugin_manager].print_plugin_failures
76
- exit(1) if (@ceedling[:plugin_manager].plugins_failed?)
76
+ #exit(1) if (@ceedling[:plugin_manager].plugins_failed?) #do NOT call this. It will keep caller from reporting failures
77
77
  end
78
78
  }
@@ -12,7 +12,7 @@ class SystemWrapper
12
12
  def windows?
13
13
  return SystemWrapper.windows?
14
14
  end
15
-
15
+
16
16
  def module_eval(string)
17
17
  return Object.module_eval("\"" + string + "\"")
18
18
  end
@@ -32,7 +32,7 @@ class SystemWrapper
32
32
  def env_set(name, value)
33
33
  ENV[name] = value
34
34
  end
35
-
35
+
36
36
  def env_get(name)
37
37
  return ENV[name]
38
38
  end
@@ -41,36 +41,39 @@ class SystemWrapper
41
41
  return Time.now.asctime
42
42
  end
43
43
 
44
- def shell_backticks(command)
44
+ def shell_backticks(command, boom = true)
45
+ retval = `#{command}`.freeze
46
+ $exit_code = ($?.exitstatus).freeze if boom
45
47
  return {
46
- :output => `#{command}`.freeze,
48
+ :output => retval.freeze,
47
49
  :exit_code => ($?.exitstatus).freeze
48
50
  }
49
51
  end
50
52
 
51
- def shell_system(command)
53
+ def shell_system(command, boom = true)
52
54
  system( command )
55
+ $exit_code = ($?.exitstatus).freeze if boom
53
56
  return {
54
- :output => ''.freeze,
57
+ :output => "".freeze,
55
58
  :exit_code => ($?.exitstatus).freeze
56
59
  }
57
60
  end
58
-
61
+
59
62
  def add_load_path(path)
60
63
  $LOAD_PATH.unshift(path)
61
64
  end
62
-
65
+
63
66
  def require_file(path)
64
67
  require(path)
65
68
  end
66
69
 
67
70
  def ruby_success
68
- return ($!.nil? || $!.is_a?(SystemExit) && $!.success?)
71
+ return ($exit_code == 0) && ($!.nil? || $!.is_a?(SystemExit) && $!.success?)
69
72
  end
70
73
 
71
74
  def constants_include?(item)
72
75
  # forcing to strings provides consistency across Ruby versions
73
76
  return Object.constants.map{|constant| constant.to_s}.include?(item.to_s)
74
77
  end
75
-
78
+
76
79
  end
@@ -63,9 +63,9 @@ class ToolExecutor
63
63
 
64
64
  # depending on background exec option, we shell out differently
65
65
  if (options[:background_exec] != BackgroundExec::NONE)
66
- shell_result = @system_wrapper.shell_system( command_line )
66
+ shell_result = @system_wrapper.shell_system( command_line, options[:boom] )
67
67
  else
68
- shell_result = @system_wrapper.shell_backticks( command_line )
68
+ shell_result = @system_wrapper.shell_backticks( command_line, options[:boom] )
69
69
  end
70
70
 
71
71
  #scrub the string for illegal output
@@ -2,7 +2,7 @@
2
2
  module Ceedling
3
3
  module Version
4
4
  # @private
5
- GEM = "0.24.0"
5
+ GEM = "0.25.0"
6
6
  # @private
7
7
  CEEDLING = GEM
8
8
  # @private
@@ -0,0 +1,52 @@
1
+ ceedling-command-hooks
2
+ ======================
3
+
4
+ Plugin for easily calling command line tools at various points in the build process
5
+
6
+ Define any of these sections in :tools: to provide additional hooks to be called on demand:
7
+
8
+ ```
9
+ :pre_mock_generate
10
+ :post_mock_generate
11
+ :pre_runner_generate
12
+ :post_runner_generate
13
+ :pre_compile_execute
14
+ :post_compile_execute
15
+ :pre_link_execute
16
+ :post_link_execute
17
+ :pre_test_fixture_execute
18
+ :pre_test_fixture_execute
19
+ :pre_test
20
+ :post_test
21
+ :pre_release
22
+ :post_release
23
+ :pre_build
24
+ :post_build
25
+ ```
26
+
27
+ Each of these tools can support an :executable string and an :args list, like so:
28
+
29
+ ```
30
+ :tools:
31
+ :post_link_execute:
32
+ :executable: objcopy.exe
33
+ :args:
34
+ - ${1} #This is replaced with the executable name
35
+ - output.srec
36
+ - --strip-all
37
+ ```
38
+
39
+ You may also specify an array of executables to be called in a particular place, like so:
40
+
41
+ ```
42
+ :tools:
43
+ :post_test:
44
+ - :executable: echo
45
+ :args: "${1} was glorious!"
46
+ - :executable: echo
47
+ :args:
48
+ - it kinda made me cry a little.
49
+ - you?
50
+ ```
51
+
52
+ Happy Tweaking!
@@ -0,0 +1,71 @@
1
+ require 'ceedling/plugin'
2
+ require 'ceedling/constants'
3
+
4
+ class CommandHooks < Plugin
5
+
6
+ attr_reader :config
7
+
8
+ def setup
9
+ @config = {
10
+ :pre_mock_generate => ((defined? TOOLS_PRE_MOCK_GENERATE) ? TOOLS_PRE_MOCK_GENERATE : nil ),
11
+ :post_mock_generate => ((defined? TOOLS_POST_MOCK_GENERATE) ? TOOLS_POST_MOCK_GENERATE : nil ),
12
+ :pre_runner_generate => ((defined? TOOLS_PRE_RUNNER_GENERATE) ? TOOLS_PRE_RUNNER_GENERATE : nil ),
13
+ :post_runner_generate => ((defined? TOOLS_POST_RUNNER_GENERATE) ? TOOLS_POST_RUNNER_GENERATE : nil ),
14
+ :pre_compile_execute => ((defined? TOOLS_PRE_COMPILE_EXECUTE) ? TOOLS_PRE_COMPILE_EXECUTE : nil ),
15
+ :post_compile_execute => ((defined? TOOLS_POST_COMPILE_EXECUTE) ? TOOLS_POST_COMPILE_EXECUTE : nil ),
16
+ :pre_link_execute => ((defined? TOOLS_PRE_LINK_EXECUTE) ? TOOLS_PRE_LINK_EXECUTE : nil ),
17
+ :post_link_execute => ((defined? TOOLS_POST_LINK_EXECUTE) ? TOOLS_POST_LINK_EXECUTE : nil ),
18
+ :pre_test_fixture_execute => ((defined? TOOLS_PRE_TEST_FIXTURE_EXECUTE) ? TOOLS_PRE_TEST_FIXTURE_EXECUTE : nil ),
19
+ :post_test_fixture_execute => ((defined? TOOLS_POST_TEST_FIXTURE_EXECUTE) ? TOOLS_POST_TEST_FIXTURE_EXECUTE : nil ),
20
+ :pre_test => ((defined? TOOLS_PRE_TEST) ? TOOLS_PRE_TEST : nil ),
21
+ :post_test => ((defined? TOOLS_POST_TEST) ? TOOLS_POST_TEST : nil ),
22
+ :pre_release => ((defined? TOOLS_PRE_RELEASE) ? TOOLS_PRE_RELEASE : nil ),
23
+ :post_release => ((defined? TOOLS_POST_RELEASE) ? TOOLS_POST_RELEASE : nil ),
24
+ :pre_build => ((defined? TOOLS_PRE_BUILD) ? TOOLS_PRE_BUILD : nil ),
25
+ :post_build => ((defined? TOOLS_POST_BUILD) ? TOOLS_POST_BUILD : nil ),
26
+ }
27
+ @plugin_root = File.expand_path(File.join(File.dirname(__FILE__), '..'))
28
+ end
29
+
30
+ def pre_mock_generate(arg_hash); run_hook(:pre_mock_generate, arg_hash[:header_file] ); end
31
+ def post_mock_generate(arg_hash); run_hook(:post_mock_generate, arg_hash[:header_file] ); end
32
+ def pre_runner_generate(arg_hash); run_hook(:pre_runner_generate, arg_hash[:source ] ); end
33
+ def post_runner_generate(arg_hash); run_hook(:post_runner_generate, arg_hash[:runner_file] ); end
34
+ def pre_compile_execute(arg_hash); run_hook(:pre_compile_execute, arg_hash[:source_file] ); end
35
+ def post_compile_execute(arg_hash); run_hook(:post_compile_execute, arg_hash[:object_file] ); end
36
+ def pre_link_execute(arg_hash); run_hook(:pre_link_execute, arg_hash[:executable] ); end
37
+ def post_link_execute(arg_hash); run_hook(:post_link_execute, arg_hash[:executable] ); end
38
+ def pre_test_fixture_execute(arg_hash); run_hook(:pre_test_fixture_execute, arg_hash[:executable] ); end
39
+ def post_test_fixture_execute(arg_hash); run_hook(:post_test_fixture_execute, arg_hash[:executable] ); end
40
+ def pre_test(test); run_hook(:pre_test, test ); end
41
+ def post_test(test); run_hook(:post_test, test ); end
42
+ def pre_release; run_hook(:pre_release ); end
43
+ def post_release; run_hook(:post_release ); end
44
+ def pre_build; run_hook(:pre_build ); end
45
+ def post_build; run_hook(:post_build ); end
46
+
47
+ private
48
+
49
+ def run_hook_step(hook, name)
50
+ if (hook[:executable])
51
+ cmd = @ceedling[:tool_executor].build_command_line( hook, [], name )
52
+ shell_result = @ceedling[:tool_executor].exec( cmd[:line], cmd[:options] )
53
+ end
54
+ end
55
+
56
+ def run_hook(which_hook, name="")
57
+ if (@config[which_hook])
58
+ @ceedling[:streaminator].stdout_puts("Running Hook #{which_hook}...", Verbosity::NORMAL)
59
+ if (@config[which_hook].is_a? Array)
60
+ @config[which_hook].each do |hook|
61
+ run_hook_step(hook, name)
62
+ end
63
+ elsif (@config[which_hook].is_a? Hash)
64
+ run_hook_step( @config[which_hook], name )
65
+ else
66
+ @ceedling[:streaminator].stdout_puts("Hook #{which_hook} was poorly formed", Verbosity::COMPLAINT)
67
+ end
68
+ end
69
+ end
70
+ end
71
+
@@ -22,10 +22,16 @@ class ModuleGenerator < Plugin
22
22
 
23
23
  def divine_options(optz={})
24
24
  {
25
- :path_src => MODULE_GENERATOR_SOURCE_ROOT.gsub('\\', '/').sub(/^\//, '').sub(/\/$/, ''),
26
- :path_inc => MODULE_GENERATOR_SOURCE_ROOT.gsub('\\', '/').sub(/^\//, '').sub(/\/$/, ''),
27
- :path_tst => MODULE_GENERATOR_TEST_ROOT.gsub('\\', '/').sub(/^\//, '').sub(/\/$/, ''),
28
- :pattern => optz[:pattern],
25
+ :path_src => ((defined? MODULE_GENERATOR_SOURCE_ROOT ) ? MODULE_GENERATOR_SOURCE_ROOT.gsub('\\', '/').sub(/^\//, '').sub(/\/$/, '') : "src" ),
26
+ :path_inc => ((defined? MODULE_GENERATOR_SOURCE_ROOT ) ? MODULE_GENERATOR_SOURCE_ROOT.gsub('\\', '/').sub(/^\//, '').sub(/\/$/, '') : "src" ),
27
+ :path_tst => ((defined? MODULE_GENERATOR_TEST_ROOT ) ? MODULE_GENERATOR_TEST_ROOT.gsub( '\\', '/').sub(/^\//, '').sub(/\/$/, '') : "test" ),
28
+ :pattern => optz[:pattern],
29
+ :test_prefix => ((defined? PROJECT_TEST_FILE_PREFIX ) ? PROJECT_TEST_FILE_PREFIX : "Test" ),
30
+ :mock_prefix => ((defined? CMOCK_MOCK_PREFIX ) ? CMOCK_MOCK_PREFIX : "Mock" ),
31
+ :includes => ((defined? MODULE_GENERATOR_INCLUDES ) ? MODULE_GENERATOR_INCLUDES : {} ),
32
+ :boilerplates => ((defined? MODULE_GENERATOR_BOILERPLATES) ? MODULE_GENERATOR_BOILERPLATES : {} ),
33
+ :naming => ((defined? MODULE_GENERATOR_NAMING ) ? MODULE_GENERATOR_NAMING : "snake" ),
34
+ :update_svn => ((defined? MODULE_GENERATOR_UPDATE_SVN ) ? MODULE_GENERATOR_UPDATE_SVN : false ),
29
35
  }
30
36
  end
31
37
 
@@ -5,7 +5,7 @@ namespace :module do
5
5
  task :create, :module_path do |t, args|
6
6
  files = [args[:module_path]] + (args.extras || [])
7
7
  optz = {}
8
- ["dh", "dih", "mch", "mvp"].each do |pat|
8
+ ["dh", "dih", "mch", "mvp", "src", "test"].each do |pat|
9
9
  p = files.delete(pat)
10
10
  optz[:pattern] = p unless p.nil?
11
11
  end
@@ -16,7 +16,7 @@ namespace :module do
16
16
  task :destroy, :module_path do |t, args|
17
17
  files = [args[:module_path]] + (args.extras || [])
18
18
  optz = { :destroy => true }
19
- ["dh", "dih", "mch", "mvp"].each do |pat|
19
+ ["dh", "dih", "mch", "mvp", "src", "test"].each do |pat|
20
20
  p = files.delete(pat)
21
21
  optz[:pattern] = p unless p.nil?
22
22
  end
@@ -168,14 +168,16 @@ module CeedlingTestCases
168
168
  def can_test_projects
169
169
  @c.with_context do
170
170
  Dir.chdir @proj_name do
171
- FileUtils.cp test_asset_path("example_file.h"), 'src'
172
- FileUtils.cp test_asset_path("example_file.c"), 'src'
173
- FileUtils.cp test_asset_path("test_example_file.c"), 'test'
174
-
175
- output = `bundle exec ruby -S rake test:all 2>&1`
176
- expect(output).to match(/TESTED:\s+2/)
177
- expect(output).to match(/PASSED:\s+1/)
178
- expect(output).to match(/IGNORED:\s+0/)
171
+ FileUtils.cp test_asset_path("example_file.h"), 'src/'
172
+ FileUtils.cp test_asset_path("example_file.c"), 'src/'
173
+ FileUtils.cp test_asset_path("test_example_file.c"), 'test/'
174
+
175
+ output = `bundle exec ruby -S ceedling test:all`
176
+ expect($?.exitstatus).to match(0)
177
+ expect(output).to match(/TESTED:\s+\d/)
178
+ expect(output).to match(/PASSED:\s+\d/)
179
+ expect(output).to match(/FAILED:\s+\d/)
180
+ expect(output).to match(/IGNORED:\s+\d/)
179
181
  end
180
182
  end
181
183
  end
@@ -183,9 +185,12 @@ module CeedlingTestCases
183
185
  def can_use_the_module_plugin
184
186
  @c.with_context do
185
187
  Dir.chdir @proj_name do
186
- `bundle exec ruby -S rake module:create[ponies] 2>&1`
187
- output = `bundle exec ruby -S rake test:all 2>&1`
188
- expect(output).to match(/No tests executed/i)
188
+ output = `bundle exec ruby -S ceedling module:create[ponies]`
189
+ expect($?.exitstatus).to match(0)
190
+ expect(output).to match(/Generate Complete/i)
191
+ output = `bundle exec ruby -S ceedling test:all`
192
+ expect($?.exitstatus).to match(0)
193
+ expect(output).to match(/Need to Implement ponies/)
189
194
  end
190
195
  end
191
196
  end
@@ -81,7 +81,7 @@ describe "Ceedling" do
81
81
  it "should be testable" do
82
82
  @c.with_context do
83
83
  Dir.chdir "temp_sensor" do
84
- @output = `bundle exec ruby -S rake test:all`
84
+ @output = `bundle exec ruby -S ceedling test:all`
85
85
  expect(@output).to match(/TESTED:\s+47/)
86
86
  expect(@output).to match(/PASSED:\s+47/)
87
87
  end
@@ -104,7 +104,7 @@ describe "Ceedling" do
104
104
  # it "should be testable" do
105
105
  # @c.with_context do
106
106
  # Dir.chdir "blinky" do
107
- # @output = `bundle exec ruby -S rake test:all`
107
+ # @output = `bundle exec ruby -S ceedling test:all`
108
108
  # expect(@output).to match(/TESTED:\s+7/)
109
109
  # expect(@output).to match(/PASSED:\s+7/)
110
110
  # end
@@ -10,6 +10,7 @@
10
10
 
11
11
  require 'rubygems'
12
12
  require 'fileutils'
13
+ require 'pathname'
13
14
 
14
15
  #TEMPLATE_TST
15
16
  TEMPLATE_TST ||= %q[#include "unity.h"
@@ -35,7 +36,8 @@ TEMPLATE_SRC ||= %q[%2$s#include "%1$s.h"
35
36
 
36
37
  #TEMPLATE_INC
37
38
  TEMPLATE_INC ||= %q[#ifndef _%3$s_H
38
- #define _%3$s_H%2$s
39
+ #define _%3$s_H
40
+ %2$s
39
41
 
40
42
  #endif // _%3$s_H
41
43
  ]
@@ -65,19 +67,20 @@ class UnityModuleGenerator
65
67
 
66
68
  #Built in patterns
67
69
  @patterns = { 'src' => {'' => { :inc => [] } },
68
- 'dh' => {'Driver' => { :inc => ['%1$sHardware.h'] },
70
+ 'test'=> {'' => { :inc => [] } },
71
+ 'dh' => {'Driver' => { :inc => [create_filename('%1$s','Hardware.h')] },
69
72
  'Hardware' => { :inc => [] }
70
73
  },
71
- 'dih' => {'Driver' => { :inc => ['%1$sHardware.h', '%1$sInterrupt.h'] },
72
- 'Interrupt'=> { :inc => ['%1$sHardware.h'] },
74
+ 'dih' => {'Driver' => { :inc => [create_filename('%1$s','Hardware.h'), create_filename('%1$s','Interrupt.h')] },
75
+ 'Interrupt'=> { :inc => [create_filename('%1$s','Hardware.h')] },
73
76
  'Hardware' => { :inc => [] }
74
77
  },
75
78
  'mch' => {'Model' => { :inc => [] },
76
- 'Conductor'=> { :inc => ['%1$sModel.h', '%1$sHardware.h'] },
79
+ 'Conductor'=> { :inc => [create_filename('%1$s','Model.h'), create_filename('%1$s','Hardware.h')] },
77
80
  'Hardware' => { :inc => [] }
78
81
  },
79
82
  'mvp' => {'Model' => { :inc => [] },
80
- 'Presenter'=> { :inc => ['%1$sModel.h', '%1$sView.h'] },
83
+ 'Presenter'=> { :inc => [create_filename('%1$s','Model.h'), create_filename('%1$s','View.h')] },
81
84
  'View' => { :inc => [] }
82
85
  }
83
86
  }
@@ -96,6 +99,7 @@ class UnityModuleGenerator
96
99
  :update_svn => false,
97
100
  :boilerplates => {},
98
101
  :test_prefix => 'Test',
102
+ :mock_prefix => 'Mock',
99
103
  }
100
104
  end
101
105
 
@@ -113,30 +117,42 @@ class UnityModuleGenerator
113
117
 
114
118
  ############################
115
119
  def files_to_operate_on(module_name, pattern=nil)
120
+ #strip any leading path information from the module name and save for later
121
+ subfolder = File.dirname(module_name)
122
+ module_name = File.basename(module_name)
123
+
116
124
  #create triad definition
117
125
  prefix = @options[:test_prefix] || 'Test'
118
- triad = [ { :ext => '.c', :path => @options[:path_src], :template => TEMPLATE_SRC, :inc => :src, :boilerplate => @options[:boilerplates][:src] },
119
- { :ext => '.h', :path => @options[:path_inc], :template => TEMPLATE_INC, :inc => :inc, :boilerplate => @options[:boilerplates][:inc] },
120
- { :ext => '.c', :path => @options[:path_tst]+prefix, :template => TEMPLATE_TST, :inc => :tst, :boilerplate => @options[:boilerplates][:tst] },
126
+ triad = [ { :ext => '.c', :path => @options[:path_src], :prefix => "", :template => TEMPLATE_SRC, :inc => :src, :boilerplate => @options[:boilerplates][:src] },
127
+ { :ext => '.h', :path => @options[:path_inc], :prefix => "", :template => TEMPLATE_INC, :inc => :inc, :boilerplate => @options[:boilerplates][:inc] },
128
+ { :ext => '.c', :path => @options[:path_tst], :prefix => prefix, :template => TEMPLATE_TST, :inc => :tst, :boilerplate => @options[:boilerplates][:tst] },
121
129
  ]
122
130
 
123
131
  #prepare the pattern for use
124
- patterns = @patterns[(pattern || @options[:pattern] || 'src').downcase]
132
+ pattern = (pattern || @options[:pattern] || 'src').downcase
133
+ patterns = @patterns[pattern]
125
134
  raise "ERROR: The design pattern '#{pattern}' specified isn't one that I recognize!" if patterns.nil?
126
135
 
136
+ #single file patterns (currently just 'test') can reject the other parts of the triad
137
+ if (pattern == 'test')
138
+ triad.reject!{|v| v[:inc] != :tst }
139
+ end
140
+
127
141
  # Assemble the path/names of the files we need to work with.
128
142
  files = []
129
- triad.each do |triad|
143
+ triad.each do |cfg|
130
144
  patterns.each_pair do |pattern_file, pattern_traits|
145
+ submodule_name = create_filename(module_name, pattern_file)
146
+ filename = cfg[:prefix] + submodule_name + cfg[:ext]
131
147
  files << {
132
- :path => "#{triad[:path]}#{module_name}#{pattern_file}#{triad[:ext]}",
133
- :name => "#{module_name}#{pattern_file}",
134
- :template => triad[:template],
135
- :boilerplate => triad[:boilerplate],
136
- :includes => case(triad[:inc])
137
- when :src then @options[:includes][:src] | pattern_traits[:inc].map{|f| f % [module_name]}
138
- when :inc then @options[:includes][:inc]
139
- when :tst then @options[:includes][:tst] | pattern_traits[:inc].map{|f| "Mock#{f}"% [module_name]}
148
+ :path => (Pathname.new("#{cfg[:path]}#{subfolder}") + filename).cleanpath,
149
+ :name => submodule_name,
150
+ :template => cfg[:template],
151
+ :boilerplate => cfg[:boilerplate],
152
+ :includes => case(cfg[:inc])
153
+ when :src then (@options[:includes][:src] || []) | pattern_traits[:inc].map{|f| f % [module_name]}
154
+ when :inc then (@options[:includes][:inc] || [])
155
+ when :tst then (@options[:includes][:tst] || []) | pattern_traits[:inc].map{|f| "#{@options[:mock_prefix]}#{f}" % [module_name]}
140
156
  end
141
157
  }
142
158
  end
@@ -145,6 +161,27 @@ class UnityModuleGenerator
145
161
  return files
146
162
  end
147
163
 
164
+ ############################
165
+ def create_filename(part1, part2="")
166
+ if part2.empty?
167
+ case(@options[:naming])
168
+ when 'bumpy' then part1
169
+ when 'camel' then part1
170
+ when 'snake' then part1.downcase
171
+ when 'caps' then part1.upcase
172
+ else part1.downcase
173
+ end
174
+ else
175
+ case(@options[:naming])
176
+ when 'bumpy' then part1 + part2
177
+ when 'camel' then part1 + part2
178
+ when 'snake' then part1.downcase + "_" + part2.downcase
179
+ when 'caps' then part1.upcase + "_" + part2.upcase
180
+ else part1.downcase + "_" + part2.downcase
181
+ end
182
+ end
183
+ end
184
+
148
185
  ############################
149
186
  def generate(module_name, pattern=nil)
150
187
 
@@ -157,8 +194,9 @@ class UnityModuleGenerator
157
194
 
158
195
  # Create Source Modules
159
196
  files.each_with_index do |file, i|
197
+ FileUtils.mkdir_p(File.dirname(file[:path]), :verbose => false) # Create the path first if necessary.
160
198
  File.open(file[:path], 'w') do |f|
161
- f.write(file[:boilerplate] % [file[:name]]) unless file[:boilerplate].nil?
199
+ f.write("#{file[:boilerplate]}\n" % [file[:name]]) unless file[:boilerplate].nil?
162
200
  f.write(file[:template] % [ file[:name],
163
201
  file[:includes].map{|f| "#include \"#{f}\"\n"}.join,
164
202
  file[:name].upcase ]
@@ -210,13 +248,14 @@ if ($0 == __FILE__)
210
248
  # Parse the command line parameters.
211
249
  ARGV.each do |arg|
212
250
  case(arg)
213
- when /^-d/ then destroy = true
214
- when /^-u/ then options[:update_svn] = true
215
- when /^-p(\w+)/ then options[:pattern] = $1
216
- when /^-s(.+)/ then options[:path_src] = $1
217
- when /^-i(.+)/ then options[:path_inc] = $1
218
- when /^-t(.+)/ then options[:path_tst] = $1
219
- when /^-y(.+)/ then options = UnityModuleGenerator.grab_config($1)
251
+ when /^-d/ then destroy = true
252
+ when /^-u/ then options[:update_svn] = true
253
+ when /^-p\"?(\w+)\"?/ then options[:pattern] = $1
254
+ when /^-s\"?(.+)\"?/ then options[:path_src] = $1
255
+ when /^-i\"?(.+)\"?/ then options[:path_inc] = $1
256
+ when /^-t\"?(.+)\"?/ then options[:path_tst] = $1
257
+ when /^-n\"?(.+)\"?/ then options[:naming] = $1
258
+ when /^-y\"?(.+)\"?/ then options = UnityModuleGenerator.grab_config($1)
220
259
  when /^(\w+)/
221
260
  raise "ERROR: You can't have more than one Module name specified!" unless module_name.nil?
222
261
  module_name = arg
@@ -234,12 +273,18 @@ if ($0 == __FILE__)
234
273
  " -s\"../src\" sets the path to output source to '../src' (DEFAULT ../src)",
235
274
  " -t\"C:/test\" sets the path to output source to 'C:/test' (DEFAULT ../test)",
236
275
  " -p\"MCH\" sets the output pattern to MCH.",
237
- " dh - driver hardware.",
238
- " dih - driver interrupt hardware.",
239
- " mch - model conductor hardware.",
240
- " mvp - model view presenter.",
241
- " src - just a single source module. (DEFAULT)",
276
+ " dh - driver hardware.",
277
+ " dih - driver interrupt hardware.",
278
+ " mch - model conductor hardware.",
279
+ " mvp - model view presenter.",
280
+ " src - just a source module, header and test. (DEFAULT)",
281
+ " test - just a test file.",
242
282
  " -d destroy module instead of creating it.",
283
+ " -n\"camel\" sets the file naming convention.",
284
+ " bumpy - BumpyCaseFilenames.",
285
+ " camel - camelCaseFilenames.",
286
+ " snake - snake_case_filenames. (DEFAULT)",
287
+ " caps - CAPS_CASE_FILENAMES.",
243
288
  " -u update subversion too (requires subversion command line)",
244
289
  " -y\"my.yml\" selects a different yaml config file for module generation",
245
290
  "" ].join("\n")
@@ -254,5 +299,3 @@ if ($0 == __FILE__)
254
299
  end
255
300
 
256
301
  end
257
-
258
-
@@ -9,7 +9,7 @@
9
9
  #include "unity_fixture.h"
10
10
  #include "unity_internals.h"
11
11
 
12
- struct _UnityFixture UnityFixture;
12
+ struct UNITY_FIXTURE_T UnityFixture;
13
13
 
14
14
  /* If you decide to use the function pointer approach.
15
15
  * Build with -D UNITY_OUTPUT_CHAR=outputChar and include <stdio.h>