summaryrefslogtreecommitdiff
path: root/FreeRTOS-Plus/Test/CMock/test/system/systest_generator.rb
diff options
context:
space:
mode:
Diffstat (limited to 'FreeRTOS-Plus/Test/CMock/test/system/systest_generator.rb')
-rw-r--r--FreeRTOS-Plus/Test/CMock/test/system/systest_generator.rb205
1 files changed, 205 insertions, 0 deletions
diff --git a/FreeRTOS-Plus/Test/CMock/test/system/systest_generator.rb b/FreeRTOS-Plus/Test/CMock/test/system/systest_generator.rb
new file mode 100644
index 000000000..490a56eb1
--- /dev/null
+++ b/FreeRTOS-Plus/Test/CMock/test/system/systest_generator.rb
@@ -0,0 +1,205 @@
+# ==========================================
+# 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]
+# ==========================================
+
+require 'yaml'
+
+SYS_TEST_GEN_ROOT = File.expand_path( File.dirname( __FILE__ ) ) + '/'
+GENERATED_PATH = SYS_TEST_GEN_ROOT + 'generated/'
+BUILD_PATH = SYS_TEST_GEN_ROOT + 'build/'
+CASES_PATH = SYS_TEST_GEN_ROOT + 'cases/'
+
+TYPES_H = 'types.h'
+UNITY_H = 'unity.h'
+CMOCK_H = 'cmock.h'
+UNITY_HELPER_H = 'unity_helper.h'
+UNITY_HELPER_C = 'unity_helper.c'
+MOCKABLE_H = 'mockable.h'
+
+YAML_EXTENSION = '.yml'
+TEST_PREFIX = 'test_'
+MOCK_PREFIX = 'mock_'
+H_EXTENSION = '.h'
+C_EXTENSION = '.c'
+
+
+class SystemTestGenerator
+
+ def generate_files(test_cases)
+ test_cases.each do |filename|
+ yaml_hash = YAML.load_file(filename)
+
+ name = File.basename(filename, YAML_EXTENSION)
+ namix = "#{name}_"
+
+ generate_cmock_config(yaml_hash, namix)
+ generate_code(yaml_hash, namix, name)
+ end
+ end
+
+ private
+
+ def generate_cmock_config(yaml_hash, namix)
+ cmock_yaml = yaml_hash.clone
+ cmock_yaml.delete(:systest)
+ cmock = cmock_yaml[:cmock]
+
+ cmock[:mock_path] = GENERATED_PATH
+ cmock[:includes] = (cmock[:includes] || []) + [namix + TYPES_H]
+ cmock[:mock_prefix] = MOCK_PREFIX
+ if not yaml_hash[:systest][:unity_helper].nil?
+ cmock[:includes] << namix + UNITY_HELPER_H
+ cmock[:unity_helper_path] = GENERATED_PATH + namix + UNITY_HELPER_H
+ end
+
+ File.open(GENERATED_PATH + namix + 'cmock' + YAML_EXTENSION, 'w') do |out|
+ YAML.dump(cmock_yaml, out)
+ end
+ end
+
+ def generate_code(yaml_hash, namix, name)
+ generate_types_file(yaml_hash, namix)
+ generate_mockable_file(yaml_hash, namix)
+ generate_unity_helper_files(yaml_hash, namix)
+
+ generate_test_file(yaml_hash, namix, name)
+ generate_source_file(yaml_hash, namix, name)
+ generate_skeleton_file(yaml_hash, namix, name)
+ end
+
+ def generate_types_file(yaml_hash, namix)
+ types = yaml_hash[:systest][:types]
+ return if types.nil?
+
+ write_header_file(GENERATED_PATH + namix + TYPES_H, namix.upcase + 'TYPES_H') do |out|
+ out.puts(types)
+ end
+ end
+
+ def generate_mockable_file(yaml_hash, namix)
+ mockable = yaml_hash[:systest][:mockable]
+ return if mockable.nil?
+
+ write_header_file(GENERATED_PATH + namix + MOCKABLE_H, namix.upcase + 'MOCKABLE_H', [namix + TYPES_H]) do |out|
+ out.puts(mockable)
+ end
+ end
+
+ def generate_unity_helper_files(yaml_hash, namix)
+ unity_helper = yaml_hash[:systest][:unity_helper]
+ return if unity_helper.nil?
+
+ write_header_file(GENERATED_PATH + namix + UNITY_HELPER_H, namix.upcase + 'UNITY_HELPER_H', [namix + TYPES_H]) do |out|
+ out.puts(unity_helper[:header])
+ end
+
+ write_source_file(GENERATED_PATH + namix + UNITY_HELPER_C, ["unity.h", namix + UNITY_HELPER_H]) do |out|
+ out.puts(unity_helper[:code])
+ end
+ end
+
+ def generate_test_file(yaml_hash, namix, name)
+ tests = yaml_hash[:systest][:tests]
+ return if tests.nil?
+
+ includes = [UNITY_H, CMOCK_H]
+ includes << [MOCK_PREFIX + namix + MOCKABLE_H]
+ includes << [name + H_EXTENSION]
+
+ write_source_file(GENERATED_PATH + TEST_PREFIX + name + C_EXTENSION, includes.flatten) do |out|
+ out.puts(tests[:common])
+ out.puts('')
+
+ tests[:units].each_with_index do |test, index|
+ out.puts('// should ' + test[:should])
+ out.puts(test[:code].gsub!(/test\(\)/, "void test#{index+1}(void)"))
+ out.puts('')
+ end
+ end
+ end
+
+ def generate_source_file(yaml_hash, namix, name)
+ source = yaml_hash[:systest][:source]
+ return if source.nil?
+
+ header_file = name + H_EXTENSION
+
+ includes = yaml_hash[:systest][:types].nil? ? [] : [(namix + TYPES_H)]
+
+ write_header_file(GENERATED_PATH + header_file, name.upcase, includes) do |out|
+ out.puts(source[:header])
+ end
+
+ includes = []
+ includes << (namix + TYPES_H) if not yaml_hash[:systest][:types].nil?
+ includes << (namix + MOCKABLE_H) if not yaml_hash[:systest][:mockable].nil?
+ includes << header_file
+
+ unless (source[:code].nil?)
+ write_source_file(GENERATED_PATH + name + C_EXTENSION, includes.flatten) do |out|
+ out.puts(source[:code])
+ end
+ end
+ end
+
+ def generate_skeleton_file(yaml_hash, namix, name)
+ source = yaml_hash[:systest][:skeleton]
+ return if source.nil?
+
+ require 'cmock.rb'
+ cmock = CMock.new(GENERATED_PATH + namix + 'cmock' + YAML_EXTENSION)
+ cmock.setup_skeletons("#{$cfg['compiler']['source_path']}#{name}.h")
+ end
+
+ def write_header_file(filename, upcase_name, include_list=[])
+ File.open(filename, 'w') do |out|
+ out.puts("#ifndef _#{upcase_name}")
+ out.puts("#define _#{upcase_name}")
+ out.puts('')
+ include_list.each do |include|
+ out.puts("#include \"#{include}\"")
+ end
+ out.puts('')
+ out.puts("#if defined(__GNUC__) && !defined(__ICC)")
+ out.puts("#if !defined(__clang__)")
+ out.puts("#pragma GCC diagnostic ignored \"-Wpragmas\"")
+ out.puts("#endif")
+ out.puts('#pragma GCC diagnostic ignored "-Wunknown-pragmas"')
+ out.puts('#pragma GCC diagnostic ignored "-Wduplicate-decl-specifier"')
+ out.puts("#endif")
+ out.puts('')
+ yield(out)
+ out.puts('')
+ out.puts("#endif // _#{upcase_name}")
+ out.puts('')
+ end
+ end
+
+ def write_source_file(filename, include_list=[])
+ File.open(filename, 'w') do |out|
+ include_list.each do |include|
+ out.puts("#include \"#{include}\"")
+ end
+ out.puts('')
+ out.puts("#if defined(__GNUC__) && !defined(__ICC)")
+ out.puts("#if !defined(__clang__)")
+ out.puts("#pragma GCC diagnostic ignored \"-Wpragmas\"")
+ out.puts("#endif")
+ out.puts('#pragma GCC diagnostic ignored "-Wunknown-pragmas"')
+ out.puts('#pragma GCC diagnostic ignored "-Wduplicate-decl-specifier"')
+ out.puts("#endif")
+ out.puts('')
+ yield(out)
+ out.puts('')
+ end
+ end
+
+end
+
+
+if ($0 == __FILE__)
+ SystemTestGenerator.new.generate_files(Dir[CASES_PATH + "*#{YAML_EXTENSION}"])
+end
+