summaryrefslogtreecommitdiffstats
path: root/tinyusb/test/vendor/ceedling/plugins/fake_function_framework/lib/fake_function_framework.rb
diff options
context:
space:
mode:
Diffstat (limited to 'tinyusb/test/vendor/ceedling/plugins/fake_function_framework/lib/fake_function_framework.rb')
-rwxr-xr-xtinyusb/test/vendor/ceedling/plugins/fake_function_framework/lib/fake_function_framework.rb87
1 files changed, 87 insertions, 0 deletions
diff --git a/tinyusb/test/vendor/ceedling/plugins/fake_function_framework/lib/fake_function_framework.rb b/tinyusb/test/vendor/ceedling/plugins/fake_function_framework/lib/fake_function_framework.rb
new file mode 100755
index 00000000..51a90b3a
--- /dev/null
+++ b/tinyusb/test/vendor/ceedling/plugins/fake_function_framework/lib/fake_function_framework.rb
@@ -0,0 +1,87 @@
+require 'ceedling/plugin'
+require 'fff_mock_generator'
+
+class FakeFunctionFramework < Plugin
+
+ # Set up Ceedling to use this plugin.
+ def setup
+ # Get the location of this plugin.
+ @plugin_root = File.expand_path(File.join(File.dirname(__FILE__), '..'))
+ puts "Using fake function framework (fff)..."
+
+ # Switch out the cmock_builder with our own.
+ @ceedling[:cmock_builder].cmock = FffMockGeneratorForCMock.new(@ceedling[:setupinator].config_hash[:cmock])
+
+ # Add the path to fff.h to the include paths.
+ COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR << "#{@plugin_root}/vendor/fff"
+ COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR << "#{@plugin_root}/src"
+ end
+
+ def post_runner_generate(arg_hash)
+ # After the test runner file has been created, append the FFF globals
+ # definition to the end of the test runner. These globals will be shared by
+ # all mocks linked into the test.
+ File.open(arg_hash[:runner_file], 'a') do |f|
+ f.puts
+ f.puts "//=======Defintions of FFF variables====="
+ f.puts %{#include "fff.h"}
+ f.puts "DEFINE_FFF_GLOBALS;"
+ end
+ end
+
+end # class FakeFunctionFramework
+
+class FffMockGeneratorForCMock
+
+ def initialize(options=nil)
+ @cm_config = CMockConfig.new(options)
+ @cm_parser = CMockHeaderParser.new(@cm_config)
+ @silent = (@cm_config.verbosity < 2)
+
+ # These are the additional files to include in the mock files.
+ @includes_h_pre_orig_header = (@cm_config.includes || @cm_config.includes_h_pre_orig_header || []).map{|h| h =~ /</ ? h : "\"#{h}\""}
+ @includes_h_post_orig_header = (@cm_config.includes_h_post_orig_header || []).map{|h| h =~ /</ ? h : "\"#{h}\""}
+ @includes_c_pre_header = (@cm_config.includes_c_pre_header || []).map{|h| h =~ /</ ? h : "\"#{h}\""}
+ @includes_c_post_header = (@cm_config.includes_c_post_header || []).map{|h| h =~ /</ ? h : "\"#{h}\""}
+ end
+
+ def setup_mocks(files)
+ [files].flatten.each do |src|
+ generate_mock (src)
+ end
+ end
+
+ def generate_mock (header_file_to_mock)
+ module_name = File.basename(header_file_to_mock, '.h')
+ puts "Creating mock for #{module_name}..." unless @silent
+ mock_name = @cm_config.mock_prefix + module_name + @cm_config.mock_suffix
+ mock_path = @cm_config.mock_path
+ if @cm_config.subdir
+ # If a subdirectory has been configured, append it to the mock path.
+ mock_path = "#{mock_path}/#{@cm_config.subdir}"
+ end
+ full_path_for_mock = "#{mock_path}/#{mock_name}"
+
+ # Parse the header file so we know what to mock.
+ parsed_header = @cm_parser.parse(module_name, File.read(header_file_to_mock))
+
+ # Create the directory if it doesn't exist.
+ mkdir_p full_path_for_mock.pathmap("%d")
+
+ # Generate the mock header file.
+ puts "Creating mock: #{full_path_for_mock}.h"
+
+ # Create the mock header.
+ File.open("#{full_path_for_mock}.h", 'w') do |f|
+ f.write(FffMockGenerator.create_mock_header(module_name, mock_name, parsed_header,
+ @includes_h_pre_orig_header, @includes_h_post_orig_header))
+ end
+
+ # Create the mock source file.
+ File.open("#{full_path_for_mock}.c", 'w') do |f|
+ f.write(FffMockGenerator.create_mock_source(mock_name, parsed_header,
+ @includes_c_pre_orig_header, @includes_c_post_orig_header))
+ end
+ end
+
+end