mirror of
https://github.com/ThrowTheSwitch/CMock.git
synced 2026-08-11 21:57:51 +00:00
* Modified to support new version of Unity
* Increased configurability via YAML project files * Added support for IAR EWARM v4 git-svn-id: http://cmock.svn.sourceforge.net/svnroot/cmock/trunk@40 bf332499-1b4d-0410-844d-d2d48d5cc64c
This commit is contained in:
@@ -132,7 +132,7 @@ class UnityTestRunnerGenerator
|
||||
output.puts("#{@tab}#{@tab}setUp();")
|
||||
output.puts("#{@tab}#{@tab}test();")
|
||||
output.puts("#{@tab}}")
|
||||
output.puts("#{@tab}TEST_WRAP(CMock_Verify());") unless (used_mocks.empty?)
|
||||
output.puts("#{@tab}CMock_Verify();") unless (used_mocks.empty?)
|
||||
output.puts("#{@tab}CMock_Destroy();") unless (used_mocks.empty?)
|
||||
output.puts("#{@tab}tearDown();")
|
||||
output.puts("}")
|
||||
|
||||
@@ -5,6 +5,7 @@ ROOT_PATH = File.expand_path(File.dirname(__FILE__) + "/../")
|
||||
'lib',
|
||||
'vendor/behaviors/lib',
|
||||
'vendor/hardmock/lib',
|
||||
'vendor/unity/auto/'
|
||||
].each do |dir|
|
||||
$LOAD_PATH.unshift(File.join(ROOT_PATH, dir))
|
||||
end
|
||||
|
||||
@@ -1,4 +1,34 @@
|
||||
compiler: 'gcc'
|
||||
linker: 'gcc'
|
||||
compile_flags: '-c'
|
||||
link_flags: ''
|
||||
compiler:
|
||||
path: gcc
|
||||
source_path: 'test/system/src/'
|
||||
unit_tests_path: &unit_tests_path 'test/system/test/'
|
||||
mocks_path: 'test/system/mocks/'
|
||||
build_path: &build_path 'test/system/build/'
|
||||
options:
|
||||
- -c
|
||||
includes:
|
||||
prefix: '-I'
|
||||
items:
|
||||
- 'test/system/src/'
|
||||
- *unit_tests_path
|
||||
- 'test/system/mocks/'
|
||||
- 'vendor/unity/src/'
|
||||
defines:
|
||||
prefix: '-D'
|
||||
items:
|
||||
object_files:
|
||||
prefix: '-o'
|
||||
extension: '.o'
|
||||
destination: *build_path
|
||||
linker:
|
||||
path: gcc
|
||||
options:
|
||||
includes:
|
||||
prefix: '-I'
|
||||
object_files:
|
||||
path: *build_path
|
||||
extension: '.o'
|
||||
bin_files:
|
||||
prefix: '-o'
|
||||
extension: '.exe'
|
||||
destination: *build_path
|
||||
@@ -0,0 +1,86 @@
|
||||
tools_root: &tools_root 'C:\Program Files\IAR Systems\Embedded Workbench 4.0\'
|
||||
compiler:
|
||||
path: [*tools_root, 'arm\bin\iccarm.exe']
|
||||
source_path: 'test\system\src\'
|
||||
unit_tests_path: &unit_tests_path 'test\system\test\'
|
||||
mocks_path: 'test\system\mocks\'
|
||||
build_path: &build_path 'test\system\build\'
|
||||
options:
|
||||
- --dlib_config
|
||||
- [*tools_root, 'arm\lib\dl4tptinl8n.h']
|
||||
- -z3
|
||||
- --no_cse
|
||||
- --no_unroll
|
||||
- --no_inline
|
||||
- --no_code_motion
|
||||
- --no_tbaa
|
||||
- --no_clustering
|
||||
- --no_scheduling
|
||||
- --debug
|
||||
- --cpu_mode thumb
|
||||
- --endian little
|
||||
- --cpu ARM7TDMI
|
||||
- --stack_align 4
|
||||
- --interwork
|
||||
- -e
|
||||
- --silent
|
||||
- --warnings_are_errors
|
||||
- --fpu None
|
||||
- --diag_suppress Pa050
|
||||
includes:
|
||||
prefix: '-I'
|
||||
items:
|
||||
- [*tools_root, 'arm\inc\']
|
||||
- 'test\system\src\'
|
||||
- *unit_tests_path
|
||||
- 'test\system\mocks\'
|
||||
- 'vendor\unity\src\'
|
||||
defines:
|
||||
prefix: '-D'
|
||||
items:
|
||||
object_files:
|
||||
prefix: '-o'
|
||||
extension: '.r79'
|
||||
destination: *build_path
|
||||
linker:
|
||||
path: [*tools_root, 'common\bin\xlink.exe']
|
||||
options:
|
||||
- -rt
|
||||
- [*tools_root, 'arm\lib\dl4tptinl8n.r79']
|
||||
- -D_L_EXTMEM_START=0
|
||||
- -D_L_EXTMEM_SIZE=0
|
||||
- -D_L_HEAP_SIZE=120
|
||||
- -D_L_STACK_SIZE=32
|
||||
- -e_small_write=_formatted_write
|
||||
- -s
|
||||
- __program_start
|
||||
- '-f iar\at91SAM7X256_FLASH.xcl'
|
||||
includes:
|
||||
prefix: '-I'
|
||||
items:
|
||||
- [*tools_root, 'arm\config\']
|
||||
- [*tools_root, 'arm\lib\']
|
||||
object_files:
|
||||
path: *build_path
|
||||
extension: '.r79'
|
||||
bin_files:
|
||||
prefix: '-o'
|
||||
extension: '.d79'
|
||||
destination: *build_path
|
||||
simulator:
|
||||
path: [*tools_root, 'common\bin\CSpyBat.exe']
|
||||
pre_support:
|
||||
- --silent
|
||||
- [*tools_root, 'arm\bin\armproc.dll']
|
||||
- [*tools_root, 'arm\bin\armsim.dll']
|
||||
post_support:
|
||||
- --plugin
|
||||
- [*tools_root, 'arm\bin\armbat.dll']
|
||||
- --macro
|
||||
- 'iar\SAM7_SIM.mac'
|
||||
- --backend
|
||||
- -B
|
||||
- -p
|
||||
- [*tools_root, 'arm\config\ioat91sam7X256.ddf']
|
||||
- -d
|
||||
- sim
|
||||
@@ -0,0 +1,67 @@
|
||||
//=========================================================
|
||||
// Simulation setup file for esc07_demo project
|
||||
//=========================================================
|
||||
|
||||
__var _timer0_interrupt_ID;
|
||||
|
||||
irqBreak()
|
||||
{
|
||||
__var __AIC_SMR;
|
||||
__var __AIC_IECR;
|
||||
__var __AIC_IVR;
|
||||
|
||||
// read AIC_IECR instead, since not fully supported by simulator
|
||||
__AIC_IECR = __readMemory32(0xFFFFF120, "Memory");
|
||||
if(__AIC_IECR & 0x1000)
|
||||
{
|
||||
__AIC_SMR = __readMemory32(0xFFFFF060, "Memory");
|
||||
__AIC_IVR = __readMemory32(0xFFFFF0B0, "Memory"); //AIC_IVR = AIC_SVR[x]
|
||||
__writeMemory32(__AIC_IVR, 0xFFFFF100, "Memory"); //AIC_IVR
|
||||
__writeMemory32(0x1000, 0xFFFFF10C, "Memory"); //AIC_IPR
|
||||
__writeMemory32(0x2, 0xFFFFF114, "Memory"); //AIC_CISR
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
setupProcessorRegisters()
|
||||
{
|
||||
// Write TC0_SR.CPCS with correct status for ISR (Clock enabled; RC Compare Flag = TRUE)
|
||||
__writeMemory32(0x00010010, 0xfffa0020, "Memory");
|
||||
|
||||
// Set TX ready flag in USART0 status register
|
||||
// USART0_BASE->US_CSR = AT91C_US_TXRDY
|
||||
__writeMemory32(0x00000002, 0xfffc0014, "Memory");
|
||||
}
|
||||
|
||||
configureTimer0Interrupt()
|
||||
{
|
||||
__var _master_clock_frequency;
|
||||
__var _timer0_period_cycles;
|
||||
|
||||
// Calculate timer0 frequency in master clock cycles
|
||||
_master_clock_frequency = 48054857;
|
||||
_timer0_period_cycles = _master_clock_frequency / 100;
|
||||
if((_master_clock_frequency % 100) >= 50)
|
||||
{
|
||||
_timer0_period_cycles++;
|
||||
}
|
||||
|
||||
__cancelAllInterrupts();
|
||||
__enableInterrupts();
|
||||
|
||||
_timer0_interrupt_ID = __orderInterrupt("IRQ", _timer0_period_cycles, _timer0_period_cycles, 0, 0, 0, 100);
|
||||
|
||||
if(-1 == _timer0_interrupt_ID)
|
||||
{
|
||||
__message "ERROR: failed to order timer 0 interrupt";
|
||||
}
|
||||
|
||||
__setCodeBreak("0x18", 0, "irqBreak()", "TRUE", "");
|
||||
}
|
||||
|
||||
execUserReset()
|
||||
{
|
||||
setupProcessorRegisters();
|
||||
configureTimer0Interrupt();
|
||||
}
|
||||
@@ -0,0 +1,185 @@
|
||||
// ----------------------------------------------------------------------------
|
||||
// ATMEL Microcontroller Software Support - ROUSSET -
|
||||
// ----------------------------------------------------------------------------
|
||||
// DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
|
||||
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||
// DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
||||
// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
// ----------------------------------------------------------------------------
|
||||
// File Name : at91SAM7X256_FLASH.xcl
|
||||
// Object : Generic Linker Command File for IAR
|
||||
// 1.0 30/Aug/05 FBr : Creation for 4.30A
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
//*************************************************************************
|
||||
// XLINK command file template for EWARM/ICCARM
|
||||
//
|
||||
// Usage: xlink -f lnkarm <your_object_file(s)>
|
||||
// -s <program start label> <C/C++ runtime library>
|
||||
//*************************************************************************
|
||||
//
|
||||
// -------------
|
||||
// Code segments - may be placed anywhere in memory.
|
||||
// -------------
|
||||
//
|
||||
// INTVEC -- Exception vector table.
|
||||
// SWITAB -- Software interrupt vector table.
|
||||
// ICODE -- Startup (cstartup) and exception code.
|
||||
// DIFUNCT -- Dynamic initialization vectors used by C++.
|
||||
// CODE -- Compiler generated code.
|
||||
// CODE_I -- Compiler generated code declared __ramfunc (executes in RAM)
|
||||
// CODE_ID -- Initializer for CODE_I (ROM).
|
||||
//
|
||||
// -------------
|
||||
// Data segments - may be placed anywhere in memory.
|
||||
// -------------
|
||||
//
|
||||
// CSTACK -- The stack used by C/C++ programs (system and user mode).
|
||||
// IRQ_STACK -- The stack used by IRQ service routines.
|
||||
// SVC_STACK -- The stack used in supervisor mode
|
||||
// (Define other exception stacks as needed for
|
||||
// FIQ, ABT, UND).
|
||||
// HEAP -- The heap used by malloc and free in C and new and
|
||||
// delete in C++.
|
||||
// INITTAB -- Table containing addresses and sizes of segments that
|
||||
// need to be initialized at startup (by cstartup).
|
||||
// CHECKSUM -- The linker places checksum byte(s) in this segment,
|
||||
// when the -J linker command line option is used.
|
||||
// DATA_y -- Data objects.
|
||||
//
|
||||
// Where _y can be one of:
|
||||
//
|
||||
// _AN -- Holds uninitialized located objects, i.e. objects with
|
||||
// an absolute location given by the @ operator or the
|
||||
// #pragma location directive. Since these segments
|
||||
// contain objects which already have a fixed address,
|
||||
// they should not be mentioned in this linker command
|
||||
// file.
|
||||
// _C -- Constants (ROM).
|
||||
// _I -- Initialized data (RAM).
|
||||
// _ID -- The original content of _I (copied to _I by cstartup) (ROM).
|
||||
// _N -- Uninitialized data (RAM).
|
||||
// _Z -- Zero initialized data (RAM).
|
||||
//
|
||||
// Note: Be sure to use end values for the defined address ranges.
|
||||
// Otherwise, the linker may allocate space outside the
|
||||
// intended memory range.
|
||||
//*************************************************************************
|
||||
|
||||
//*************************************************************************
|
||||
// Inform the linker about the CPU family used.
|
||||
// AT91SAM7X256 Memory mapping
|
||||
// No remap
|
||||
// ROMSTART
|
||||
// Start address 0x0000 0000
|
||||
// Size 256 Kbo 0x0004 0000
|
||||
// RAMSTART
|
||||
// Start address 0x0020 0000
|
||||
// Size 64 Kbo 0x0001 0000
|
||||
// Remap done
|
||||
// RAMSTART
|
||||
// Start address 0x0000 0000
|
||||
// Size 64 Kbo 0x0001 0000
|
||||
// ROMSTART
|
||||
// Start address 0x0010 0000
|
||||
// Size 256 Kbo 0x0004 0000
|
||||
|
||||
//*************************************************************************
|
||||
-carm
|
||||
|
||||
//*************************************************************************
|
||||
// Internal Ram segments mapped AFTER REMAP 64 K.
|
||||
//*************************************************************************
|
||||
-Z(CONST)INTRAMSTART_REMAP=00200000
|
||||
-Z(CONST)INTRAMEND_REMAP=0020FFFF
|
||||
|
||||
//*************************************************************************
|
||||
// Read-only segments mapped to Flash 256 K.
|
||||
//*************************************************************************
|
||||
-DROMSTART=00000000
|
||||
-DROMEND=0003FFFF
|
||||
//*************************************************************************
|
||||
// Read/write segments mapped to 64 K RAM.
|
||||
//*************************************************************************
|
||||
-DRAMSTART=00200000
|
||||
-DRAMEND=0020FFFF
|
||||
|
||||
//*************************************************************************
|
||||
// Address range for reset and exception
|
||||
// vectors (INTVEC).
|
||||
// The vector area is 32 bytes,
|
||||
// an additional 32 bytes is allocated for the
|
||||
// constant table used by ldr PC in cstartup.s79.
|
||||
//*************************************************************************
|
||||
-Z(CODE)INTVEC=00-3F
|
||||
|
||||
//*************************************************************************
|
||||
// Startup code and exception routines (ICODE).
|
||||
//*************************************************************************
|
||||
-Z(CODE)ICODE,DIFUNCT=ROMSTART-ROMEND
|
||||
-Z(CODE)SWITAB=ROMSTART-ROMEND
|
||||
|
||||
//*************************************************************************
|
||||
// Code segments may be placed anywhere.
|
||||
//*************************************************************************
|
||||
-Z(CODE)CODE=ROMSTART-ROMEND
|
||||
|
||||
//*************************************************************************
|
||||
// Various constants and initializers.
|
||||
//*************************************************************************
|
||||
-Z(CONST)INITTAB,DATA_ID,DATA_C=ROMSTART-ROMEND
|
||||
-Z(CONST)CHECKSUM=ROMSTART-ROMEND
|
||||
|
||||
//*************************************************************************
|
||||
// Data segments.
|
||||
//*************************************************************************
|
||||
-Z(DATA)DATA_I,DATA_Z,DATA_N=RAMSTART-RAMEND
|
||||
|
||||
//*************************************************************************
|
||||
// __ramfunc code copied to and executed from RAM.
|
||||
//*************************************************************************
|
||||
-Z(DATA)CODE_I=RAMSTART-RAMEND
|
||||
-Z(CONST)CODE_ID=ROMSTART-ROMEND // Initializer for
|
||||
-QCODE_I=CODE_ID
|
||||
|
||||
//*************************************************************************
|
||||
// ICCARM produces code for __ramfunc functions in
|
||||
// CODE_I segments. The -Q XLINK command line
|
||||
// option redirects XLINK to emit the code in the
|
||||
// debug information associated with the CODE_I
|
||||
// segment, where the code will execute.
|
||||
//*************************************************************************
|
||||
|
||||
//*************************************************************************
|
||||
// Stack and heap segments.
|
||||
//*************************************************************************
|
||||
-D_CSTACK_SIZE=(100*4)
|
||||
-D_IRQ_STACK_SIZE=(3*8*4)
|
||||
-D_HEAP_SIZE=(1024*1)
|
||||
|
||||
-Z(DATA)CSTACK+_CSTACK_SIZE=RAMSTART-RAMEND
|
||||
-Z(DATA)IRQ_STACK+_IRQ_STACK_SIZE=RAMSTART-RAMEND
|
||||
-Z(DATA)HEAP+_HEAP_SIZE=RAMSTART-RAMEND
|
||||
|
||||
//*************************************************************************
|
||||
// ELF/DWARF support.
|
||||
//
|
||||
// Uncomment the line "-Felf" below to generate ELF/DWARF output.
|
||||
// Available format specifiers are:
|
||||
//
|
||||
// "-yn": Suppress DWARF debug output
|
||||
// "-yp": Multiple ELF program sections
|
||||
// "-yas": Format suitable for debuggers from ARM Ltd (also sets -p flag)
|
||||
//
|
||||
// "-Felf" and the format specifiers can also be supplied directly as
|
||||
// command line options, or selected from the Xlink Output tab in the
|
||||
// IAR Embedded Workbench.
|
||||
//*************************************************************************
|
||||
|
||||
// -Felf
|
||||
@@ -59,7 +59,7 @@ class CMockGeneratorPluginExpect
|
||||
lines << "#{@tab}Mock.#{function_name}_CallCount++;\n"
|
||||
lines << "#{@tab}if (Mock.#{function_name}_CallCount > Mock.#{function_name}_CallsExpected)\n"
|
||||
lines << "#{@tab}{\n"
|
||||
lines << "#{@tab}#{@tab}TEST_THROW(\"#{function_name} Called More Times Than Expected\");\n"
|
||||
lines << "#{@tab}#{@tab}TEST_FAIL(\"#{function_name} Called More Times Than Expected\");\n"
|
||||
lines << "#{@tab}}\n"
|
||||
function_args_as_array.each do |arg|
|
||||
arg_return_type = arg[:type].sub(/const/, '').strip
|
||||
|
||||
+9
-12
@@ -1,23 +1,18 @@
|
||||
$here = File.expand_path(File.dirname(__FILE__))
|
||||
|
||||
require $here + '/config/environment'
|
||||
require 'rake'
|
||||
require 'rake/clean'
|
||||
require 'rake/testtask'
|
||||
require 'rakefile_helper'
|
||||
|
||||
include RakefileConstants
|
||||
include RakefileHelpers
|
||||
|
||||
SYSTEST_TEST_FILES = FileList.new(SYSTEST_TEST_DIR + 'Test*' + C_EXTENSION)
|
||||
|
||||
COMPILER_CONFIGS = FileList.new('*.yml')
|
||||
|
||||
CLEAN.include(SYSTEST_BUILD_DIR + '*.*')
|
||||
CLEAN.include(SYSTEST_MOCKS_DIR + '*.*')
|
||||
configure_clean
|
||||
|
||||
task :default => [ :clobber, 'tests:all', :app ]
|
||||
|
||||
desc "Build and run application"
|
||||
desc "Build application"
|
||||
task :app do
|
||||
COMPILER_CONFIGS.each do |cfg_file|
|
||||
build_application(yaml_read(cfg_file), 'Main')
|
||||
@@ -27,18 +22,20 @@ end
|
||||
namespace :tests do
|
||||
|
||||
desc "Run unit and system tests"
|
||||
task :all => [:clean, 'units', 'system', 'app']
|
||||
task :all => [:clean, :units, :system, :app]
|
||||
|
||||
Rake::TestTask.new('units') do |t|
|
||||
t.pattern = 'test//unit/*_test.rb'
|
||||
t.pattern = 'test/unit/*_test.rb'
|
||||
t.verbose = true
|
||||
end
|
||||
|
||||
desc "Run system tests"
|
||||
task :system => [:clean] do
|
||||
COMPILER_CONFIGS.each do |cfg_file|
|
||||
run_systests(yaml_read(cfg_file), SYSTEST_TEST_FILES)
|
||||
report_summary
|
||||
config = yaml_read(cfg_file)
|
||||
systest_test_files = get_unit_test_files(config)
|
||||
run_systests(config, systest_test_files)
|
||||
report_summary(config)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
+141
-73
@@ -1,39 +1,50 @@
|
||||
require 'yaml'
|
||||
require 'lib/cmock'
|
||||
require 'vendor/unity/auto/generate_test_runner'
|
||||
require 'vendor/unity/auto/unity_test_summary'
|
||||
require 'fileutils'
|
||||
require 'cmock'
|
||||
require 'generate_test_runner'
|
||||
require 'unity_test_summary'
|
||||
|
||||
def Kernel.is_windows?
|
||||
processor, platform, *rest = RUBY_PLATFORM.split("-")
|
||||
platform == 'mswin32'
|
||||
end
|
||||
|
||||
module RakefileConstants
|
||||
|
||||
C_EXTENSION = '.c'
|
||||
OBJ_EXTENSION = '.o'
|
||||
module RakefileHelpers
|
||||
|
||||
if (Kernel.is_windows?)
|
||||
# Configure constants appropriately
|
||||
C_EXTENSION = '.c'
|
||||
processor, platform, *rest = RUBY_PLATFORM.split("-")
|
||||
if (platform == 'mswin32')
|
||||
EXE_EXTENSION = '.exe'
|
||||
else
|
||||
EXE_EXTENSION = '.out'
|
||||
end
|
||||
COMPILER_CONFIGS = FileList.new('*.yml')
|
||||
|
||||
UNITY_DIR = 'vendor/unity/src/'
|
||||
def yaml_read(filename)
|
||||
return YAML.load(File.read(filename))
|
||||
end
|
||||
|
||||
SYSTEST_BASE = 'test/system/'
|
||||
SYSTEST_SOURCE_DIR = SYSTEST_BASE + 'src/'
|
||||
SYSTEST_TEST_DIR = SYSTEST_BASE + 'test/'
|
||||
SYSTEST_MOCKS_DIR = SYSTEST_BASE + 'mocks/'
|
||||
SYSTEST_BUILD_DIR = SYSTEST_BASE + 'build/'
|
||||
|
||||
SYSTEST_INCLUDE_DIRS = [SYSTEST_SOURCE_DIR, SYSTEST_TEST_DIR, SYSTEST_MOCKS_DIR, UNITY_DIR]
|
||||
|
||||
end
|
||||
|
||||
module RakefileHelpers
|
||||
|
||||
require 'fileutils'
|
||||
def report(message)
|
||||
puts message
|
||||
$stdout.flush
|
||||
$stderr.flush
|
||||
end
|
||||
|
||||
def configure_clean
|
||||
COMPILER_CONFIGS.each do |f|
|
||||
config = yaml_read(f)
|
||||
CLEAN.include(config['compiler']['mocks_path'] + '*.*') unless config['compiler']['mocks_path'].nil?
|
||||
CLEAN.include(config['compiler']['build_path'] + '*.*') unless config['compiler']['mocks_path'].nil?
|
||||
end
|
||||
end
|
||||
|
||||
def get_unit_test_files(config)
|
||||
path = config['compiler']['unit_tests_path'] + 'Test*' + C_EXTENSION
|
||||
path.gsub!(/\\/, '/')
|
||||
FileList.new(path)
|
||||
end
|
||||
|
||||
def get_local_include_dirs(config)
|
||||
include_dirs = config['compiler']['includes']['items'].dup
|
||||
include_dirs.delete_if {|dir| dir.is_a?(Array)}
|
||||
return include_dirs
|
||||
end
|
||||
|
||||
def extract_headers(filename)
|
||||
includes = []
|
||||
@@ -47,9 +58,8 @@ module RakefileHelpers
|
||||
return includes
|
||||
end
|
||||
|
||||
def find_source_file(header)
|
||||
src_file = ''
|
||||
SYSTEST_INCLUDE_DIRS.each do |dir|
|
||||
def find_source_file(header, paths)
|
||||
paths.each do |dir|
|
||||
src_file = dir + header.ext(C_EXTENSION)
|
||||
if (File.exists?(src_file))
|
||||
return src_file
|
||||
@@ -58,38 +68,78 @@ module RakefileHelpers
|
||||
return nil
|
||||
end
|
||||
|
||||
def tackit(strings)
|
||||
if strings.is_a?(Array)
|
||||
result = "\"#{strings.join}\""
|
||||
else
|
||||
result = strings
|
||||
end
|
||||
return result
|
||||
end
|
||||
|
||||
def squash(prefix, items)
|
||||
result = ''
|
||||
items.each { |item| result += " #{prefix}#{tackit(item)}" }
|
||||
return result
|
||||
end
|
||||
|
||||
def build_compiler_fields(config)
|
||||
command = tackit(config['compiler']['path'])
|
||||
defines = ''
|
||||
defines = squash(config['compiler']['defines']['prefix'],
|
||||
config['compiler']['defines']['items']) unless config['compiler']['defines']['items'].nil?
|
||||
options = squash('', config['compiler']['options'])
|
||||
includes = squash(config['compiler']['includes']['prefix'], config['compiler']['includes']['items'])
|
||||
includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR)
|
||||
return {:command => command, :defines => defines, :options => options, :includes => includes}
|
||||
end
|
||||
|
||||
def compile(config, file, defines=[])
|
||||
cmd_str = "#{config["path"]}#{config["compiler"]} #{config["compile_flags"]} "
|
||||
if !defines.nil? and defines.length > 0
|
||||
defines.each { |define| cmd_str += "-D#{define} " }
|
||||
end
|
||||
if !config["path"].nil?
|
||||
cmd_str += "-B#{config["path"]} "
|
||||
end
|
||||
cmd_str += (SYSTEST_INCLUDE_DIRS.map{|dir|"-I#{dir} "}).join +
|
||||
"#{file} " +
|
||||
"-o #{SYSTEST_BUILD_DIR}#{File.basename(file, C_EXTENSION)}#{OBJ_EXTENSION}"
|
||||
|
||||
compiler = build_compiler_fields(config)
|
||||
|
||||
##################################################
|
||||
# NEED TO FIGURE OUT WHAT TO DO WITH THIS!!!
|
||||
# if !config["path"].nil?
|
||||
# cmd_str += "-B#{config["path"]} "
|
||||
# end
|
||||
##################################################
|
||||
|
||||
cmd_str = "#{compiler[:command]}#{compiler[:defines]}#{compiler[:options]}#{compiler[:includes]} #{file} " +
|
||||
"#{config['compiler']['object_files']['prefix']}#{config['compiler']['object_files']['destination']}" +
|
||||
"#{File.basename(file, C_EXTENSION)}#{config['compiler']['object_files']['extension']}"
|
||||
|
||||
execute(cmd_str)
|
||||
end
|
||||
|
||||
def build_linker_fields(config)
|
||||
command = tackit(config['linker']['path'])
|
||||
options = ''
|
||||
options += squash('', config['linker']['options']) unless config['linker']['options'].nil?
|
||||
includes = ''
|
||||
includes += squash(config['linker']['includes']['prefix'],
|
||||
config['linker']['includes']['items']) unless config['linker']['includes']['items'].nil?
|
||||
includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR)
|
||||
return {:command => command, :options => options, :includes => includes}
|
||||
end
|
||||
|
||||
def link(config, exe_name, obj_list)
|
||||
cmd_str = "#{config["path"]}#{config["linker"]} "
|
||||
if !config["path"].nil?
|
||||
cmd_str += "-B#{config["path"]} "
|
||||
end
|
||||
cmd_str += (obj_list.map{|obj|"#{SYSTEST_BUILD_DIR}#{obj} "}).join +
|
||||
"-o #{SYSTEST_BUILD_DIR}#{exe_name}#{EXE_EXTENSION}"
|
||||
linker = build_linker_fields(config)
|
||||
cmd_str = "#{linker[:command]}#{linker[:options]}#{linker[:includes]} " +
|
||||
(obj_list.map{|obj|"#{config['linker']['object_files']['path']}#{obj} "}).join +
|
||||
"#{config['linker']['bin_files']['prefix']} #{config['linker']['bin_files']['destination']}#{exe_name}#{config['linker']['bin_files']['extension']}"
|
||||
execute(cmd_str)
|
||||
end
|
||||
|
||||
def yaml_read(filename)
|
||||
return YAML.load(File.read(filename))
|
||||
end
|
||||
|
||||
def report(message)
|
||||
puts message
|
||||
$stdout.flush
|
||||
$stderr.flush
|
||||
def build_simulator_fields(config)
|
||||
return nil if config['simulator'].nil?
|
||||
command = ''
|
||||
command += (tackit(config['simulator']['path']) + ' ') unless config['simulator']['path'].nil?
|
||||
pre_support = ''
|
||||
pre_support = squash('', config['simulator']['pre_support']) unless config['simulator']['pre_support'].nil?
|
||||
post_support = ''
|
||||
post_support = squash('', config['simulator']['post_support']) unless config['simulator']['post_support'].nil?
|
||||
return {:command => command, :pre_support => pre_support, :post_support => post_support}
|
||||
end
|
||||
|
||||
def execute(command_string, verbose=true)
|
||||
@@ -102,16 +152,24 @@ module RakefileHelpers
|
||||
return output
|
||||
end
|
||||
|
||||
def report_summary
|
||||
def report_summary(config)
|
||||
summary = UnityTestSummary.new
|
||||
summary.set_root_path($here)
|
||||
summary.set_targets(Dir["#{SYSTEST_BUILD_DIR}*.test*"])
|
||||
summary.set_targets(Dir["#{config['compiler']['build_path']}*.test*"])
|
||||
summary.run
|
||||
end
|
||||
|
||||
def run_systests(config, test_files)
|
||||
|
||||
puts 'Running system tests...'
|
||||
|
||||
test_defines = ['TEST']
|
||||
my_config = config.dup
|
||||
my_config['compiler']['defines']['items'] = [] if my_config['compiler']['defines']['items'].nil?
|
||||
my_config['compiler']['defines']['items'] << 'TEST'
|
||||
|
||||
include_dirs = get_local_include_dirs(my_config)
|
||||
|
||||
test_files.each do |test|
|
||||
obj_list = []
|
||||
test_base = File.basename(test, C_EXTENSION)
|
||||
@@ -121,63 +179,73 @@ module RakefileHelpers
|
||||
if header =~ /^Mock(.*)\.h/i
|
||||
module_name = $1
|
||||
report "Generating mock for module #{module_name}..."
|
||||
cmock = CMock.new(SYSTEST_MOCKS_DIR, ['Types.h'])
|
||||
cmock.setup_mocks("#{SYSTEST_SOURCE_DIR}#{module_name}.h")
|
||||
cmock = CMock.new(config['compiler']['mocks_path'], ['Types.h'])
|
||||
cmock.setup_mocks("#{config['compiler']['source_path']}#{module_name}.h")
|
||||
end
|
||||
|
||||
src_file = find_source_file(header)
|
||||
src_file = find_source_file(header, include_dirs)
|
||||
if !src_file.nil?
|
||||
compile(config, src_file, test_defines)
|
||||
obj_list << header.ext(OBJ_EXTENSION)
|
||||
obj_list << header.ext(config['compiler']['object_files']['extension'])
|
||||
end
|
||||
end
|
||||
|
||||
# Generate and build the test runner
|
||||
runner_name = test_base + '_Runner.c'
|
||||
runner_path = SYSTEST_BUILD_DIR + runner_name
|
||||
runner_path = config['compiler']['build_path'] + runner_name
|
||||
test_gen = UnityTestRunnerGenerator.new
|
||||
test_gen.run(test, runner_path, ['Types'])
|
||||
compile(config, runner_path, test_defines)
|
||||
obj_list << runner_name.ext(OBJ_EXTENSION)
|
||||
obj_list << runner_name.ext(config['compiler']['object_files']['extension'])
|
||||
|
||||
# Build the test file
|
||||
compile(config, test, test_defines)
|
||||
obj_list << test_base.ext(OBJ_EXTENSION)
|
||||
obj_list << test_base.ext(config['compiler']['object_files']['extension'])
|
||||
|
||||
# Link the test executable
|
||||
link(config, test_base, obj_list)
|
||||
|
||||
# Run test and generate results file
|
||||
output = execute(SYSTEST_BUILD_DIR + test_base + EXE_EXTENSION)
|
||||
test_results = SYSTEST_BUILD_DIR + test_base
|
||||
simulator = build_simulator_fields(config)
|
||||
executable = config['linker']['bin_files']['destination'] + test_base + config['linker']['bin_files']['extension']
|
||||
if simulator.nil?
|
||||
cmd_str = executable
|
||||
else
|
||||
cmd_str = "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}"
|
||||
end
|
||||
output = execute(cmd_str)
|
||||
test_results = config['compiler']['build_path'] + test_base
|
||||
if output.match(/OK$/m).nil?
|
||||
test_results += '.testfail'
|
||||
else
|
||||
test_results += '.testpass'
|
||||
end
|
||||
File.open(test_results, 'w') do |f|
|
||||
f.print output
|
||||
end
|
||||
File.open(test_results, 'w') { |f| f.print output }
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
def build_application(config, main)
|
||||
|
||||
puts "Building application..."
|
||||
|
||||
obj_list = []
|
||||
main_path = SYSTEST_SOURCE_DIR + main + '.c'
|
||||
executable_path = SYSTEST_BUILD_DIR + main + EXE_EXTENSION
|
||||
main_path = config['compiler']['source_path'] + main + C_EXTENSION
|
||||
executable_path = config['linker']['bin_files']['destination'] + main + config['linker']['bin_files']['extension']
|
||||
main_base = File.basename(main_path, C_EXTENSION)
|
||||
headers = extract_headers(main_path)
|
||||
include_dirs = get_local_include_dirs(config)
|
||||
|
||||
headers.each do |header|
|
||||
src_file = find_source_file(header)
|
||||
src_file = find_source_file(header, include_dirs)
|
||||
if !src_file.nil?
|
||||
compile(config, src_file)
|
||||
obj_list << header.ext(OBJ_EXTENSION)
|
||||
obj_list << header.ext(config['compiler']['object_files']['extension'])
|
||||
end
|
||||
end
|
||||
|
||||
compile(config, main_path)
|
||||
obj_list << main_base.ext(OBJ_EXTENSION)
|
||||
obj_list << main_base.ext(config['compiler']['object_files']['extension'])
|
||||
|
||||
link(config, main_base, obj_list)
|
||||
end
|
||||
|
||||
@@ -32,7 +32,9 @@ int AppMain(void)
|
||||
{
|
||||
Executor_Init();
|
||||
|
||||
while(Executor_Run());
|
||||
while(Executor_Run());
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifndef TEST
|
||||
|
||||
@@ -10,6 +10,11 @@ float TemperatureCalculator_Calculate(uint16 millivolts)
|
||||
const double coefficient_B = -0.1382009;
|
||||
double sensor_voltage = ((double)millivolts / 1000);
|
||||
double resistance;
|
||||
|
||||
if (millivolts == 0)
|
||||
{
|
||||
return -INFINITY;
|
||||
}
|
||||
|
||||
// Series resistor is 5k Ohms; Reference voltage is 3.0V
|
||||
// R(t) = A * e^(B*t); R is resistance of thermisor; t is temperature in C
|
||||
|
||||
@@ -55,15 +55,15 @@ void testShouldWeightEachSubsequentValueBy25PercentAfterInitialValue(void)
|
||||
void setInvalidTemperatureAndVerifyReinitialized(float invalidTemperature)
|
||||
{
|
||||
TemperatureFilter_Init();
|
||||
TEST_WRAP(setValueAndVerifyResponse(100.0f, 100.0f));
|
||||
TEST_WRAP(setValueAndVerifyResponse(invalidTemperature, -INFINITY));
|
||||
TEST_WRAP(setValueAndVerifyResponse(14.3f, 14.3f));
|
||||
setValueAndVerifyResponse(100.0f, 100.0f);
|
||||
setValueAndVerifyResponse(invalidTemperature, -INFINITY);
|
||||
setValueAndVerifyResponse(14.3f, 14.3f);
|
||||
}
|
||||
|
||||
void testShouldResetAverageIfPassedInfinityOrInvalidValue(void)
|
||||
{
|
||||
TEST_WRAP(setInvalidTemperatureAndVerifyReinitialized(-INFINITY));
|
||||
TEST_WRAP(setInvalidTemperatureAndVerifyReinitialized(+INFINITY));
|
||||
TEST_WRAP(setInvalidTemperatureAndVerifyReinitialized(+NAN));
|
||||
TEST_WRAP(setInvalidTemperatureAndVerifyReinitialized(-NAN));
|
||||
setInvalidTemperatureAndVerifyReinitialized(-INFINITY);
|
||||
setInvalidTemperatureAndVerifyReinitialized(+INFINITY);
|
||||
setInvalidTemperatureAndVerifyReinitialized(+NAN);
|
||||
setInvalidTemperatureAndVerifyReinitialized(-NAN);
|
||||
}
|
||||
|
||||
@@ -140,7 +140,7 @@ class CMockGeneratorPluginExpectTest < Test::Unit::TestCase
|
||||
expected = [" Mock.Apple_CallCount++;\n",
|
||||
" if (Mock.Apple_CallCount > Mock.Apple_CallsExpected)\n",
|
||||
" {\n",
|
||||
" TEST_THROW(\"Apple Called More Times Than Expected\");\n",
|
||||
" TEST_FAIL(\"Apple Called More Times Than Expected\");\n",
|
||||
" }\n"
|
||||
]
|
||||
returned = @cmock_generator_plugin_expect.mock_implementation(function_name, function_args)
|
||||
@@ -158,7 +158,7 @@ class CMockGeneratorPluginExpectTest < Test::Unit::TestCase
|
||||
expected = [" Mock.Cherry_CallCount++;\n",
|
||||
" if (Mock.Cherry_CallCount > Mock.Cherry_CallsExpected)\n",
|
||||
" {\n",
|
||||
" TEST_THROW(\"Cherry Called More Times Than Expected\");\n",
|
||||
" TEST_FAIL(\"Cherry Called More Times Than Expected\");\n",
|
||||
" }\n",
|
||||
"mocked_retval_1",
|
||||
"mocked_retval_2"
|
||||
|
||||
Reference in New Issue
Block a user