comparison test/plain/test_main.c @ 324:dd78bd0152af

- removal of never-adopted mini-test framework stub - test/plain: better output and cleanup - test/plain_c++: better output and re-enabled this calls for other platforms than windows (was disabled by mistake)
author Tassilo Philipp
date Thu, 21 Nov 2019 12:50:37 +0100
parents f5577f6bf97a
children da4b267c10bf
comparison
equal deleted inserted replaced
323:6ffb6a00cf55 324:dd78bd0152af
1 /* 1 /*
2 2
3 Package: dyncall 3 Package: dyncall
4 Library: test 4 Library: test
5 File: test/plain/test_main.c 5 File: test/plain/test_main.c
6 Description: 6 Description:
7 License: 7 License:
8 8
9 Copyright (c) 2007-2018 Daniel Adler <dadler@uni-goettingen.de>, 9 Copyright (c) 2007-2019 Daniel Adler <dadler@uni-goettingen.de>,
10 Tassilo Philipp <tphilipp@potion-studios.com> 10 Tassilo Philipp <tphilipp@potion-studios.com>
11 11
12 Permission to use, copy, modify, and distribute this software for any 12 Permission to use, copy, modify, and distribute this software for any
13 purpose with or without fee is hereby granted, provided that the above 13 purpose with or without fee is hereby granted, provided that the above
14 copyright notice and this permission notice appear in all copies. 14 copyright notice and this permission notice appear in all copies.
24 */ 24 */
25 25
26 26
27 27
28 28
29 #include "../common/test_framework.h"
30 #include "../../dyncall/dyncall.h" 29 #include "../../dyncall/dyncall.h"
31 #include "../common/platformInit.h" 30 #include "../common/platformInit.h"
32 #include "../common/platformInit.c" /* Impl. for functions only used in this translation unit */ 31 #include "../common/platformInit.c" /* Impl. for functions only used in this translation unit */
33 32
34 33
35 /* ------------------------------------------------------------------------- 34 /* -------------------------------------------------------------------------
36 * test: identity function calls 35 * test: identity function calls
37 * ------------------------------------------------------------------------- */ 36 * ------------------------------------------------------------------------- */
38 37
39 #define DEF_FUNCS(API,NAME) \ 38 #define DEF_FUNCS(API,NAME) \
40 void API fun_##NAME##_v() { } \ 39 void API fun_##NAME##_v() { g_void_testval = 1; } \
41 DCbool API fun_##NAME##_b(DCbool x) { return x; } \ 40 DCbool API fun_##NAME##_b(DCbool x) { return x; } \
42 DCint API fun_##NAME##_i(DCint x) { return x; } \ 41 DCint API fun_##NAME##_i(DCint x) { return x; } \
43 DClong API fun_##NAME##_j(DClong x) { return x; } \ 42 DClong API fun_##NAME##_j(DClong x) { return x; } \
44 DClonglong API fun_##NAME##_l(DClonglong x) { return x; } \ 43 DClonglong API fun_##NAME##_l(DClonglong x) { return x; } \
45 DCfloat API fun_##NAME##_f(DCfloat x) { return x; } \ 44 DCfloat API fun_##NAME##_f(DCfloat x) { return x; } \
47 DCpointer API fun_##NAME##_p(DCpointer x) { return x; } 46 DCpointer API fun_##NAME##_p(DCpointer x) { return x; }
48 47
49 /* __cdecl */ 48 /* __cdecl */
50 49
51 #if !defined(DC__OS_Win32) 50 #if !defined(DC__OS_Win32)
52 # define __declspec(X)
53 # define __cdecl 51 # define __cdecl
54 #endif 52 #endif
55 53
54 int g_void_testval;
56 DEF_FUNCS(__cdecl,c) 55 DEF_FUNCS(__cdecl,c)
57 56
58 DC_DEFINE_TEST_FUNC_BEGIN(testCallC) 57 int testCallC()
58 {
59 int ret = 1;
59 60
60 DCCallVM* pc = dcNewCallVM(4096); 61 DCCallVM* pc = dcNewCallVM(4096);
61 dcMode(pc,DC_CALL_C_DEFAULT); 62 dcMode(pc,DC_CALL_C_DEFAULT);
62 /* void */ 63 /* void */
63 dcReset(pc); 64 dcReset(pc);
65 g_void_testval = 0;
64 dcCallVoid(pc, (DCpointer) &fun_c_v); 66 dcCallVoid(pc, (DCpointer) &fun_c_v);
67 ret = g_void_testval && ret;
65 /* bool */ 68 /* bool */
66 { 69 {
67 DCbool r, val=DC_TRUE; 70 DCbool r, val=DC_TRUE;
68 dcReset(pc); 71 dcReset(pc);
69 dcArgBool(pc, val); 72 dcArgBool(pc, val);
70 r = dcCallBool(pc, (DCpointer) &fun_c_b); 73 r = dcCallBool(pc, (DCpointer) &fun_c_b);
71 DC_TEST(r == val); 74 printf("bt (cdecl): %d\n", (r == val));
75 ret = (r == val) && ret;
72 76
73 val=DC_FALSE; 77 val=DC_FALSE;
74 dcReset(pc); 78 dcReset(pc);
75 dcArgBool(pc, val); 79 dcArgBool(pc, val);
76 r = dcCallBool(pc, (DCpointer) &fun_c_b); 80 r = dcCallBool(pc, (DCpointer) &fun_c_b);
77 DC_TEST(r == val); 81 printf("bf (cdecl): %d\n", (r == val));
82 ret = (r == val) && ret;
78 } 83 }
79 /* int */ 84 /* int */
80 { 85 {
81 DCint r, val=1234; 86 DCint r, val=1234;
82 dcReset(pc); 87 dcReset(pc);
83 dcArgInt(pc, val); 88 dcArgInt(pc, val);
84 r = dcCallInt(pc, (DCpointer) &fun_c_i); 89 r = dcCallInt(pc, (DCpointer) &fun_c_i);
85 DC_TEST(r == val); 90 printf("i (cdecl): %d\n", (r == val));
91 ret = (r == val) && ret;
86 } 92 }
87 /* long */ 93 /* long */
88 { 94 {
89 DClong r, val=(DClong) 0xCAFEBABEL; 95 DClong r, val=(DClong) 0xCAFEBABEL;
90 dcReset(pc); 96 dcReset(pc);
91 dcArgLong(pc, val); 97 dcArgLong(pc, val);
92 r = dcCallLong(pc, (DCpointer) &fun_c_j); 98 r = dcCallLong(pc, (DCpointer) &fun_c_j);
93 DC_TEST(r == val); 99 printf("l (cdecl): %d\n", (r == val));
100 ret = (r == val) && ret;
94 } 101 }
95 /* long long */ 102 /* long long */
96 { 103 {
97 DClonglong r, val=(DClonglong) 0xCAFEBABEDEADC0DELL; 104 DClonglong r, val=(DClonglong) 0xCAFEBABEDEADC0DELL;
98 dcReset(pc); 105 dcReset(pc);
99 dcArgLongLong(pc, val); 106 dcArgLongLong(pc, val);
100 r = dcCallLongLong(pc, (DCpointer) &fun_c_l); 107 r = dcCallLongLong(pc, (DCpointer) &fun_c_l);
101 DC_TEST(r == (DClonglong)val); 108 printf("ll (cdecl): %d\n", (r == (DClonglong)val));
109 ret = (r == (DClonglong)val) && ret;
102 } 110 }
103 /* float */ 111 /* float */
104 { 112 {
105 DCfloat r, val=1.234567f; 113 DCfloat r, val=1.234567f;
106 dcReset(pc); 114 dcReset(pc);
107 dcArgFloat(pc, val); 115 dcArgFloat(pc, val);
108 r = dcCallFloat(pc, (DCpointer) &fun_c_f); 116 r = dcCallFloat(pc, (DCpointer) &fun_c_f);
109 DC_TEST(r == val); 117 printf("f (cdecl): %d\n", (r == val));
118 ret = (r == val) && ret;
110 } 119 }
111 /* double */ 120 /* double */
112 { 121 {
113 DCdouble r, val=1.23456789; 122 DCdouble r, val=1.23456789;
114 dcReset(pc); 123 dcReset(pc);
115 dcArgDouble(pc, val); 124 dcArgDouble(pc, val);
116 r = dcCallDouble(pc, (DCpointer) &fun_c_d); 125 r = dcCallDouble(pc, (DCpointer) &fun_c_d);
117 DC_TEST(r == val); 126 printf("d (cdecl): %d\n", (r == val));
127 ret = (r == val) && ret;
118 } 128 }
119 /* ptr */ 129 /* ptr */
120 { 130 {
121 DCpointer r; 131 DCpointer r;
122 dcReset(pc); 132 dcReset(pc);
123 dcArgPointer(pc, (DCpointer) &fun_c_b); 133 dcArgPointer(pc, (DCpointer) &fun_c_b);
124 r = dcCallPointer(pc, (DCpointer) &fun_c_p); 134 r = dcCallPointer(pc, (DCpointer) &fun_c_p);
125 DC_TEST(r == (DCpointer) &fun_c_b); 135 printf("p (cdecl): %d\n", (r == (DCpointer) &fun_c_b));
136 ret = (r == (DCpointer) &fun_c_b) && ret;
126 } 137 }
127 dcFree(pc); 138 dcFree(pc);
128 139
129 DC_DEFINE_TEST_FUNC_END 140 return ret;
141 }
130 142
131 143
132 #ifdef DC__OS_Win32 144 #ifdef DC__OS_Win32
133 /* win32 __stdcall */ 145 /* win32 __stdcall */
134 146
135 DEF_FUNCS(__stdcall,std) 147 DEF_FUNCS(__stdcall,std)
136 148
137 DC_DEFINE_TEST_FUNC_BEGIN(testCallStd) 149 int testCallStd()
150 {
151 int ret = 1;
138 152
139 DCCallVM* pc = dcNewCallVM(4096); 153 DCCallVM* pc = dcNewCallVM(4096);
140 dcMode(pc,DC_CALL_C_X86_WIN32_STD); 154 dcMode(pc,DC_CALL_C_X86_WIN32_STD);
141 /* void */ 155 /* void */
142 dcReset(pc); 156 dcReset(pc);
157 g_void_testval = 0;
143 dcCallVoid(pc, (DCpointer) &fun_std_v); 158 dcCallVoid(pc, (DCpointer) &fun_std_v);
159 ret = g_void_testval && ret;
144 /* bool */ 160 /* bool */
145 { 161 {
146 DCbool r, val=DC_TRUE; 162 DCbool r, val=DC_TRUE;
147 dcReset(pc); 163 dcReset(pc);
148 dcArgBool(pc, val); 164 dcArgBool(pc, val);
149 r = dcCallBool(pc, (DCpointer) &fun_std_b); 165 r = dcCallBool(pc, (DCpointer) &fun_std_b);
150 DC_TEST(r == val); 166 printf("bt (stdcall): %d\n", (r == val));
167 ret = (r == val) && ret;
151 168
152 val=DC_FALSE; 169 val=DC_FALSE;
153 dcReset(pc); 170 dcReset(pc);
154 dcArgBool(pc, val); 171 dcArgBool(pc, val);
155 r = dcCallBool(pc, (DCpointer) &fun_std_b); 172 r = dcCallBool(pc, (DCpointer) &fun_std_b);
156 DC_TEST(r == val); 173 printf("bf (stdcall): %d\n", (r == val));
174 ret = (r == val) && ret;
157 } 175 }
158 /* int */ 176 /* int */
159 { 177 {
160 DCint r, val=1234; 178 DCint r, val=1234;
161 dcReset(pc); 179 dcReset(pc);
162 dcArgInt(pc, val); 180 dcArgInt(pc, val);
163 r = dcCallInt(pc, (DCpointer) &fun_std_i); 181 r = dcCallInt(pc, (DCpointer) &fun_std_i);
164 DC_TEST(r == val); 182 printf("i (stdcall): %d\n", (r == val));
183 ret = (r == val) && ret;
165 } 184 }
166 /* long */ 185 /* long */
167 { 186 {
168 DClong r, val=0xCAFEBABEUL; 187 DClong r, val=0xCAFEBABEUL;
169 dcReset(pc); 188 dcReset(pc);
170 dcArgLong(pc, val); 189 dcArgLong(pc, val);
171 r = dcCallLong(pc, (DCpointer) &fun_std_j); 190 r = dcCallLong(pc, (DCpointer) &fun_std_j);
172 DC_TEST(r == val); 191 printf("l (stdcall): %d\n", (r == val));
192 ret = (r == val) && ret;
173 } 193 }
174 /* long long */ 194 /* long long */
175 { 195 {
176 DClonglong r, val=0xCAFEBABEDEADC0DEULL; 196 DClonglong r, val=0xCAFEBABEDEADC0DEULL;
177 dcReset(pc); 197 dcReset(pc);
178 dcArgLongLong(pc, val); 198 dcArgLongLong(pc, val);
179 r = dcCallLongLong(pc, (DCpointer) &fun_std_l); 199 r = dcCallLongLong(pc, (DCpointer) &fun_std_l);
180 DC_TEST(r == val); 200 printf("ll (stdcall): %d\n", (r == val));
201 ret = (r == val) && ret;
181 } 202 }
182 /* float */ 203 /* float */
183 { 204 {
184 DCfloat r, val=1.234567f; 205 DCfloat r, val=1.234567f;
185 dcReset(pc); 206 dcReset(pc);
186 dcArgFloat(pc, val); 207 dcArgFloat(pc, val);
187 r = dcCallFloat(pc, (DCpointer) &fun_std_f); 208 r = dcCallFloat(pc, (DCpointer) &fun_std_f);
188 DC_TEST(r == val); 209 printf("f (stdcall): %d\n", (r == val));
210 ret = (r == val) && ret;
189 } 211 }
190 /* double */ 212 /* double */
191 { 213 {
192 DCdouble r, val=1.23456789; 214 DCdouble r, val=1.23456789;
193 dcReset(pc); 215 dcReset(pc);
194 dcArgDouble(pc, val); 216 dcArgDouble(pc, val);
195 r = dcCallDouble(pc, (DCpointer) &fun_std_d); 217 r = dcCallDouble(pc, (DCpointer) &fun_std_d);
196 DC_TEST(r == val); 218 printf("d (stdcall): %d\n", (r == val));
219 ret = (r == val) && ret;
197 } 220 }
198 /* ptr */ 221 /* ptr */
199 { 222 {
200 DCpointer r; 223 DCpointer r;
201 dcReset(pc); 224 dcReset(pc);
202 dcArgPointer(pc, (DCpointer) &fun_c_b); 225 dcArgPointer(pc, (DCpointer) &fun_c_b);
203 r = dcCallPointer(pc, (DCpointer) &fun_std_p); 226 r = dcCallPointer(pc, (DCpointer) &fun_std_p);
204 DC_TEST(r == &fun_c_b); 227 printf("p (stdcall): %d\n", (r == &fun_c_b));
228 ret = (r == &fun_c_b) && ret;
205 } 229 }
206 dcFree(pc); 230 dcFree(pc);
207 231
208 DC_DEFINE_TEST_FUNC_END 232 return ret;
233 }
209 234
210 #endif 235 #endif
211 236
212 237
213 #ifdef DC__OS_Win32 238 #ifdef DC__OS_Win32
214 /* win32 __fastcall */ 239 /* win32 __fastcall */
215 240
216 DEF_FUNCS(__fastcall,fast) 241 DEF_FUNCS(__fastcall,fast)
217 242
218 DC_DEFINE_TEST_FUNC_BEGIN(testCallFast) 243 int testCallFast()
244 {
245 int ret = 1;
219 246
220 DCCallVM* pc = dcNewCallVM(4096); 247 DCCallVM* pc = dcNewCallVM(4096);
221 #ifdef DC__C_GNU 248 #ifdef DC__C_GNU
249 # define FT "GNU"
222 dcMode(pc,DC_CALL_C_X86_WIN32_FAST_GNU); 250 dcMode(pc,DC_CALL_C_X86_WIN32_FAST_GNU);
223 #else 251 #else
252 # define FT "MS"
224 dcMode(pc,DC_CALL_C_X86_WIN32_FAST_MS); 253 dcMode(pc,DC_CALL_C_X86_WIN32_FAST_MS);
225 #endif 254 #endif
226 /* void */ 255 /* void */
227 dcReset(pc); 256 dcReset(pc);
257 g_void_testval = 0;
228 dcCallVoid(pc, (DCpointer) &fun_fast_v); 258 dcCallVoid(pc, (DCpointer) &fun_fast_v);
259 ret = g_void_testval && ret;
229 /* bool */ 260 /* bool */
230 { 261 {
231 DCbool r, val=DC_TRUE; 262 DCbool r, val=DC_TRUE;
232 dcReset(pc); 263 dcReset(pc);
233 dcArgBool(pc, val); 264 dcArgBool(pc, val);
234 r = dcCallBool(pc, (DCpointer) &fun_fast_b); 265 r = dcCallBool(pc, (DCpointer) &fun_fast_b);
235 DC_TEST(r == val); 266 printf("bt ("FT"fastcall): %d\n", (r == val));
267 ret = (r == val) && ret;
236 268
237 val=DC_FALSE; 269 val=DC_FALSE;
238 dcReset(pc); 270 dcReset(pc);
239 dcArgBool(pc, val); 271 dcArgBool(pc, val);
240 r = dcCallBool(pc, (DCpointer) &fun_fast_b); 272 r = dcCallBool(pc, (DCpointer) &fun_fast_b);
241 DC_TEST(r == val); 273 printf("bf ("FT"fastcall): %d\n", (r == val));
274 ret = (r == val) && ret;
242 } 275 }
243 /* int */ 276 /* int */
244 { 277 {
245 DCint r, val=1234; 278 DCint r, val=1234;
246 dcReset(pc); 279 dcReset(pc);
247 dcArgInt(pc, val); 280 dcArgInt(pc, val);
248 r = dcCallInt(pc, (DCpointer) &fun_fast_i); 281 r = dcCallInt(pc, (DCpointer) &fun_fast_i);
249 DC_TEST(r == val); 282 printf("i ("FT"fastcall): %d\n", (r == val));
283 ret = (r == val) && ret;
250 } 284 }
251 /* long */ 285 /* long */
252 { 286 {
253 DClong r, val=0xCAFEBABEUL; 287 DClong r, val=0xCAFEBABEUL;
254 dcReset(pc); 288 dcReset(pc);
255 dcArgLong(pc, val); 289 dcArgLong(pc, val);
256 r = dcCallLong(pc, (DCpointer) &fun_fast_j); 290 r = dcCallLong(pc, (DCpointer) &fun_fast_j);
257 DC_TEST(r == val); 291 printf("l ("FT"fastcall): %d\n", (r == val));
292 ret = (r == val) && ret;
258 } 293 }
259 /* long long */ 294 /* long long */
260 { 295 {
261 DClonglong r, val=0xCAFEBABEDEADC0DEULL; 296 DClonglong r, val=0xCAFEBABEDEADC0DEULL;
262 dcReset(pc); 297 dcReset(pc);
263 dcArgLongLong(pc, val); 298 dcArgLongLong(pc, val);
264 r = dcCallLongLong(pc, (DCpointer) &fun_fast_l); 299 r = dcCallLongLong(pc, (DCpointer) &fun_fast_l);
265 DC_TEST(r == val); 300 printf("ll ("FT"fastcall): %d\n", (r == val));
301 ret = (r == val) && ret;
266 } 302 }
267 /* float */ 303 /* float */
268 { 304 {
269 DCfloat r, val=1.234567f; 305 DCfloat r, val=1.234567f;
270 dcReset(pc); 306 dcReset(pc);
271 dcArgFloat(pc, val); 307 dcArgFloat(pc, val);
272 r = dcCallFloat(pc, (DCpointer) &fun_fast_f); 308 r = dcCallFloat(pc, (DCpointer) &fun_fast_f);
273 DC_TEST(r == val); 309 printf("f ("FT"fastcall): %d\n", (r == val));
310 ret = (r == val) && ret;
274 } 311 }
275 /* double */ 312 /* double */
276 { 313 {
277 DCdouble r, val=1.23456789; 314 DCdouble r, val=1.23456789;
278 dcReset(pc); 315 dcReset(pc);
279 dcArgDouble(pc, val); 316 dcArgDouble(pc, val);
280 r = dcCallDouble(pc, (DCpointer) &fun_fast_d); 317 r = dcCallDouble(pc, (DCpointer) &fun_fast_d);
281 DC_TEST(r == val); 318 printf("d ("FT"fastcall): %d\n", (r == val));
319 ret = (r == val) && ret;
282 } 320 }
283 /* ptr */ 321 /* ptr */
284 { 322 {
285 DCpointer r; 323 DCpointer r;
286 dcReset(pc); 324 dcReset(pc);
287 dcArgPointer(pc, (DCpointer) &fun_c_b); 325 dcArgPointer(pc, (DCpointer) &fun_c_b);
288 r = dcCallPointer(pc, (DCpointer) &fun_fast_p); 326 r = dcCallPointer(pc, (DCpointer) &fun_fast_p);
289 DC_TEST(r == &fun_c_b); 327 printf("p ("FT"fastcall): %d\n", (r == &fun_c_b));
328 ret = (r == &fun_c_b) && ret;
290 } 329 }
291 dcFree(pc); 330 dcFree(pc);
292 331
293 DC_DEFINE_TEST_FUNC_END 332 return ret;
294 #endif 333 }
334
335 #endif
336
295 337
296 int testCallStructs(); 338 int testCallStructs();
297 int testStructSizes(); 339 int testStructSizes();
340
298 int main(int argc, char* argv[]) 341 int main(int argc, char* argv[])
299 { 342 {
300 int b = TRUE; 343 int r = 1;
301 dcTest_initPlatform(); 344 dcTest_initPlatform();
302 345
303 b = b && testCallC(); 346 r = testCallC() && r;
304 printf("C:%d\n",b); 347 r = testStructSizes() && r;
305 348 /*r = testCallStructs() && r;*/
306 b = b && testStructSizes();
307 printf("Struct Sizes:%d\n",b);
308
309 /*b = b && testCallStructs();
310 printf("Call Structs:%d\n",b);*/
311
312 #if defined(DC__OS_Win32) 349 #if defined(DC__OS_Win32)
313 350 r = testCallStd() && r;
314 b = b && testCallStd(); 351 r = testCallFast() && r;
315 printf("Std:%d\n",b); 352 #endif
316 353
317 b = b && testCallFast(); 354 printf("result: plain: %d\n", r);
318 #ifdef DC__C_GNU
319 printf("FastGNU:%d\n",b);
320 #else
321 printf("FastMS:%d\n",b);
322 #endif
323
324 #endif
325
326 printf("result: plain: %d\n", b);
327 355
328 dcTest_deInitPlatform(); 356 dcTest_deInitPlatform();
329 357
330 return !b; 358 return !r;
331 } 359 }
332 360