1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
# ==========================================
# 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 File.expand_path(File.dirname(__FILE__)) + "/../test_helper"
require File.expand_path(File.dirname(__FILE__)) + '/../../lib/cmock_generator_plugin_return_thru_ptr'
describe CMockGeneratorPluginReturnThruPtr, "Verify CMockGeneratorPluginReturnThruPtr Module" do
before do
create_mocks :config, :utils
# int *Oak(void)"
@void_func = {:name => "Oak", :args => [], :return => test_return[:int_ptr]}
# char *Maple(int blah)
@simple_func = {:name => "Maple",
:args => [{:name => "blah", :type => "int", :ptr? => false}],
:return => test_return[:string],
:contains_ptr? => false}
# void Pine(int chicken, const int beef, int *tofu)
@complex_func = {:name => "Pine",
:args => [{ :type => "int",
:name => "chicken",
:ptr? => false,
},
{ :type => "const int*",
:name => "beef",
:ptr? => true,
:const? => true,
},
{ :type => "int*",
:name => "tofu",
:ptr? => true,
}],
:return => test_return[:void],
:contains_ptr? => true }
#no strict ordering
@cmock_generator_plugin_return_thru_ptr = CMockGeneratorPluginReturnThruPtr.new(@config, @utils)
end
after do
end
def simple_func_expect
@utils.expect :ptr_or_str?, false, ['int']
end
def complex_func_expect
@utils.expect :ptr_or_str?, false, ['int']
@utils.expect :ptr_or_str?, true, ['const int*']
@utils.expect :ptr_or_str?, true, ['int*']
end
it "have set up internal priority correctly on init" do
assert_equal(9, @cmock_generator_plugin_return_thru_ptr.priority)
end
it "not include any additional include files" do
assert(!@cmock_generator_plugin_return_thru_ptr.respond_to?(:include_files))
end
it "not add to typedef structure for functions of style 'int* func(void)'" do
returned = @cmock_generator_plugin_return_thru_ptr.instance_typedefs(@void_func)
assert_equal("", returned)
end
it "add to tyepdef structure mock needs of functions of style 'void func(int chicken, int* pork)'" do
complex_func_expect()
expected = " char ReturnThruPtr_tofu_Used;\n" +
" int* ReturnThruPtr_tofu_Val;\n" +
" int ReturnThruPtr_tofu_Size;\n"
returned = @cmock_generator_plugin_return_thru_ptr.instance_typedefs(@complex_func)
assert_equal(expected, returned)
end
it "not add an additional mock interface for functions not containing pointers" do
simple_func_expect()
returned = @cmock_generator_plugin_return_thru_ptr.mock_function_declarations(@simple_func)
assert_equal("", returned)
end
it "add a mock function declaration only for non-const pointer arguments" do
complex_func_expect();
expected =
"#define Pine_ReturnThruPtr_tofu(tofu)" +
" Pine_CMockReturnMemThruPtr_tofu(__LINE__, tofu, sizeof(int))\n" +
"#define Pine_ReturnArrayThruPtr_tofu(tofu, cmock_len)" +
" Pine_CMockReturnMemThruPtr_tofu(__LINE__, tofu, (int)(cmock_len * (int)sizeof(*tofu)))\n" +
"#define Pine_ReturnMemThruPtr_tofu(tofu, cmock_size)" +
" Pine_CMockReturnMemThruPtr_tofu(__LINE__, tofu, cmock_size)\n" +
"void Pine_CMockReturnMemThruPtr_tofu(UNITY_LINE_TYPE cmock_line, int* tofu, int cmock_size);\n"
returned = @cmock_generator_plugin_return_thru_ptr.mock_function_declarations(@complex_func)
assert_equal(expected, returned)
end
it "add mock interfaces only for non-const pointer arguments" do
complex_func_expect();
expected =
"void Pine_CMockReturnMemThruPtr_tofu(UNITY_LINE_TYPE cmock_line, int* tofu, int cmock_size)\n" +
"{\n" +
" CMOCK_Pine_CALL_INSTANCE* cmock_call_instance = " +
"(CMOCK_Pine_CALL_INSTANCE*)CMock_Guts_GetAddressFor(CMock_Guts_MemEndOfChain(Mock.Pine_CallInstance));\n" +
" UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringPtrPreExp);\n" +
" cmock_call_instance->ReturnThruPtr_tofu_Used = 1;\n" +
" cmock_call_instance->ReturnThruPtr_tofu_Val = tofu;\n" +
" cmock_call_instance->ReturnThruPtr_tofu_Size = cmock_size;\n" +
"}\n\n"
returned = @cmock_generator_plugin_return_thru_ptr.mock_interfaces(@complex_func).join("")
assert_equal(expected, returned)
end
it "add mock implementations only for non-const pointer arguments" do
complex_func_expect()
expected =
" if (cmock_call_instance->ReturnThruPtr_tofu_Used)\n" +
" {\n" +
" UNITY_TEST_ASSERT_NOT_NULL(tofu, cmock_line, CMockStringPtrIsNULL);\n" +
" memcpy((void*)tofu, (void*)cmock_call_instance->ReturnThruPtr_tofu_Val,\n" +
" cmock_call_instance->ReturnThruPtr_tofu_Size);\n" +
" }\n"
returned = @cmock_generator_plugin_return_thru_ptr.mock_implementation(@complex_func).join("")
assert_equal(expected, returned)
end
end
|