You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
5.7 KiB
149 lines
5.7 KiB
# ==========================================
|
|
# CMock Project - Automatic Mock Generation for C
|
|
# Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
|
|
# [Released under MIT License. Please refer to license.txt for details]
|
|
# ==========================================
|
|
|
|
class CMockConfig
|
|
|
|
CMockDefaultOptions =
|
|
{
|
|
:framework => :unity,
|
|
:mock_path => 'mocks',
|
|
:mock_prefix => 'Mock',
|
|
:mock_suffix => '',
|
|
:weak => '',
|
|
:subdir => nil,
|
|
:plugins => [],
|
|
:strippables => ['(?:__attribute__\s*\(+.*?\)+)'],
|
|
:attributes => ['__ramfunc', '__irq', '__fiq', 'register', 'extern'],
|
|
:c_calling_conventions => ['__stdcall', '__cdecl', '__fastcall'],
|
|
:enforce_strict_ordering => false,
|
|
:fail_on_unexpected_calls => true,
|
|
:unity_helper_path => false,
|
|
:treat_as => {},
|
|
:treat_as_array => {},
|
|
:treat_as_void => [],
|
|
:memcmp_if_unknown => true,
|
|
:when_no_prototypes => :warn, #the options being :ignore, :warn, or :error
|
|
:when_ptr => :compare_data, #the options being :compare_ptr, :compare_data, or :smart
|
|
:verbosity => 2, #the options being 0 errors only, 1 warnings and errors, 2 normal info, 3 verbose
|
|
:treat_externs => :exclude, #the options being :include or :exclude
|
|
:callback_include_count => true,
|
|
:callback_after_arg_check => false,
|
|
:includes => nil,
|
|
:includes_h_pre_orig_header => nil,
|
|
:includes_h_post_orig_header => nil,
|
|
:includes_c_pre_header => nil,
|
|
:includes_c_post_header => nil,
|
|
:orig_header_include_fmt => "#include \"%s\"",
|
|
:array_size_type => [],
|
|
:array_size_name => 'size|len',
|
|
}
|
|
|
|
def initialize(options=nil)
|
|
case(options)
|
|
when NilClass then options = CMockDefaultOptions.clone
|
|
when String then options = CMockDefaultOptions.clone.merge(load_config_file_from_yaml(options))
|
|
when Hash then options = CMockDefaultOptions.clone.merge(options)
|
|
else raise "If you specify arguments, it should be a filename or a hash of options"
|
|
end
|
|
|
|
#do some quick type verification
|
|
[:plugins, :attributes, :treat_as_void].each do |opt|
|
|
unless (options[opt].class == Array)
|
|
options[opt] = []
|
|
puts "WARNING: :#{opt.to_s} should be an array." unless (options[:verbosity] < 1)
|
|
end
|
|
end
|
|
[:includes, :includes_h_pre_orig_header, :includes_h_post_orig_header, :includes_c_pre_header, :includes_c_post_header].each do |opt|
|
|
unless (options[opt].nil? or (options[opt].class == Array))
|
|
options[opt] = []
|
|
puts "WARNING: :#{opt.to_s} should be an array." unless (options[:verbosity] < 1)
|
|
end
|
|
end
|
|
options[:unity_helper_path] ||= options[:unity_helper]
|
|
options[:unity_helper_path] = [options[:unity_helper_path]] if options[:unity_helper_path].is_a? String
|
|
options[:includes_c_post_header] = ((options[:includes_c_post_header] || []) + (options[:unity_gelper_path] || [])).uniq
|
|
options[:plugins].compact!
|
|
options[:plugins].map! {|p| p.to_sym}
|
|
@options = options
|
|
|
|
treat_as_map = standard_treat_as_map()#.clone
|
|
treat_as_map.merge!(@options[:treat_as])
|
|
@options[:treat_as] = treat_as_map
|
|
|
|
@options.each_key { |key| eval("def #{key.to_s}() return @options[:#{key.to_s}] end") }
|
|
end
|
|
|
|
def load_config_file_from_yaml yaml_filename
|
|
self.class.load_config_file_from_yaml yaml_filename
|
|
end
|
|
|
|
def self.load_config_file_from_yaml yaml_filename
|
|
require 'yaml'
|
|
require 'fileutils'
|
|
YAML.load_file(yaml_filename)[:cmock]
|
|
end
|
|
|
|
def set_path(path)
|
|
@src_path = path
|
|
end
|
|
|
|
def load_unity_helper
|
|
return nil unless (@options[:unity_helper_path])
|
|
|
|
return @options[:unity_helper_path].inject("") do |unity_helper, filename|
|
|
unity_helper + "\n" + File.new(filename).read
|
|
end
|
|
end
|
|
|
|
def standard_treat_as_map
|
|
{
|
|
'int' => 'INT',
|
|
'char' => 'INT8',
|
|
'short' => 'INT16',
|
|
'long' => 'INT',
|
|
'int8' => 'INT8',
|
|
'int16' => 'INT16',
|
|
'int32' => 'INT',
|
|
'int8_t' => 'INT8',
|
|
'int16_t' => 'INT16',
|
|
'int32_t' => 'INT',
|
|
'INT8_T' => 'INT8',
|
|
'INT16_T' => 'INT16',
|
|
'INT32_T' => 'INT',
|
|
'bool' => 'INT',
|
|
'bool_t' => 'INT',
|
|
'BOOL' => 'INT',
|
|
'BOOL_T' => 'INT',
|
|
'unsigned int' => 'HEX32',
|
|
'unsigned long' => 'HEX32',
|
|
'uint32' => 'HEX32',
|
|
'uint32_t' => 'HEX32',
|
|
'UINT32' => 'HEX32',
|
|
'UINT32_T' => 'HEX32',
|
|
'void*' => 'HEX8_ARRAY',
|
|
'void const*' => 'HEX8_ARRAY',
|
|
'const void*' => 'HEX8_ARRAY',
|
|
'unsigned short' => 'HEX16',
|
|
'uint16' => 'HEX16',
|
|
'uint16_t' => 'HEX16',
|
|
'UINT16' => 'HEX16',
|
|
'UINT16_T' => 'HEX16',
|
|
'unsigned char' => 'HEX8',
|
|
'uint8' => 'HEX8',
|
|
'uint8_t' => 'HEX8',
|
|
'UINT8' => 'HEX8',
|
|
'UINT8_T' => 'HEX8',
|
|
'char*' => 'STRING',
|
|
'char const*' => 'STRING',
|
|
'const char*' => 'STRING',
|
|
'pCHAR' => 'STRING',
|
|
'cstring' => 'STRING',
|
|
'CSTRING' => 'STRING',
|
|
'float' => 'FLOAT',
|
|
'double' => 'FLOAT'
|
|
}
|
|
end
|
|
end
|
|
|