Mercurial > pub > dyncall > dyncall
annotate test/plain/test_structs.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 | e63089fe5bef |
children | 1cf6a4a94aca |
rev | line source |
---|---|
0 | 1 /* |
2 | |
3 Package: dyncall | |
4 Library: test | |
5 File: test/plain/test_structs.c | |
324
dd78bd0152af
- removal of never-adopted mini-test framework stub
Tassilo Philipp
parents:
141
diff
changeset
|
6 Description: |
0 | 7 License: |
8 | |
9 Copyright (c) 2010-2015 Olivier Chafik <olivier.chafik@gmail.com> | |
324
dd78bd0152af
- removal of never-adopted mini-test framework stub
Tassilo Philipp
parents:
141
diff
changeset
|
10 2019 Tassilo Philipp <tphilipp@potion-studios.com> |
0 | 11 |
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 | |
14 copyright notice and this permission notice appear in all copies. | |
15 | |
16 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
17 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
18 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
19 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
20 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
21 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
22 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
23 | |
24 */ | |
25 | |
26 | |
27 | |
28 | |
29 #include "../../dyncall/dyncall.h" | |
30 #include "../../dyncall/dyncall_signature.h" | |
31 #include "../../dyncall/dyncall_struct.h" | |
32 #include "../common/platformInit.h" | |
33 | |
34 #define DC_TEST_INT_EQUAL(expected, computed) { \ | |
35 if (expected != computed) \ | |
36 printf("expected = %d, computed = %d\n\n", (int)expected, (int)computed); \ | |
324
dd78bd0152af
- removal of never-adopted mini-test framework stub
Tassilo Philipp
parents:
141
diff
changeset
|
37 ret = (expected == computed) && ret; \ |
0 | 38 } |
39 #define DC_TEST_STRUCT_SIZE(type, s) { \ | |
40 DCsize expected = sizeof(type), computed = dcStructSize(s);\ | |
41 DC_TEST_INT_EQUAL(expected, computed); \ | |
42 } | |
43 | |
324
dd78bd0152af
- removal of never-adopted mini-test framework stub
Tassilo Philipp
parents:
141
diff
changeset
|
44 int testStructSizes() |
dd78bd0152af
- removal of never-adopted mini-test framework stub
Tassilo Philipp
parents:
141
diff
changeset
|
45 { |
dd78bd0152af
- removal of never-adopted mini-test framework stub
Tassilo Philipp
parents:
141
diff
changeset
|
46 int ret = 1; |
0 | 47 |
48 { | |
49 typedef struct { | |
50 double a, b, c, d; | |
51 } S; | |
52 | |
53 size_t size; | |
54 DCstruct* s = dcNewStruct(4, DEFAULT_ALIGNMENT); | |
55 dcStructField(s, DC_SIGCHAR_DOUBLE, DEFAULT_ALIGNMENT, 1); | |
56 dcStructField(s, DC_SIGCHAR_DOUBLE, DEFAULT_ALIGNMENT, 1); | |
57 dcStructField(s, DC_SIGCHAR_DOUBLE, DEFAULT_ALIGNMENT, 1); | |
58 dcStructField(s, DC_SIGCHAR_DOUBLE, DEFAULT_ALIGNMENT, 1); | |
59 dcCloseStruct(s); | |
60 | |
61 DC_TEST_STRUCT_SIZE(S, s); | |
62 dcFreeStruct(s); | |
63 } | |
64 { | |
65 typedef struct { | |
66 char a, b; | |
67 void* p[3]; | |
68 } S; | |
69 | |
70 size_t size; | |
71 DCstruct* s = dcNewStruct(3, DEFAULT_ALIGNMENT); | |
72 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); | |
73 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); | |
74 dcStructField(s, DC_SIGCHAR_POINTER, DEFAULT_ALIGNMENT, 3); | |
75 dcCloseStruct(s); | |
76 | |
77 DC_TEST_STRUCT_SIZE(S, s); | |
78 dcFreeStruct(s); | |
79 } | |
80 { | |
81 typedef struct { | |
82 short a; | |
83 struct { | |
84 char a, b; | |
85 void* p[3]; | |
86 } sub; | |
87 short b; | |
88 } S; | |
89 | |
90 size_t size; | |
91 DCstruct* s = dcNewStruct(3, DEFAULT_ALIGNMENT); | |
92 dcStructField(s, DC_SIGCHAR_SHORT, DEFAULT_ALIGNMENT, 1); | |
93 dcSubStruct(s, 3, DEFAULT_ALIGNMENT, 1); | |
94 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); | |
95 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); | |
96 dcStructField(s, DC_SIGCHAR_POINTER, DEFAULT_ALIGNMENT, 3); | |
97 dcCloseStruct(s); | |
98 dcStructField(s, DC_SIGCHAR_SHORT, DEFAULT_ALIGNMENT, 1); | |
99 dcCloseStruct(s); | |
100 | |
101 DC_TEST_STRUCT_SIZE(S, s); | |
102 dcFreeStruct(s); | |
103 } | |
104 | |
105 #define TEST_MONO_STRUCT(type, sig) \ | |
106 { \ | |
107 typedef struct { \ | |
108 type v; \ | |
109 } S; \ | |
110 \ | |
111 DCstruct* s = dcNewStruct(1, DEFAULT_ALIGNMENT); \ | |
112 dcStructField(s, sig, DEFAULT_ALIGNMENT, 1); \ | |
113 dcCloseStruct(s); \ | |
114 \ | |
115 DC_TEST_STRUCT_SIZE(S, s); \ | |
116 dcFreeStruct(s); \ | |
117 } | |
118 | |
119 TEST_MONO_STRUCT(char, DC_SIGCHAR_CHAR); | |
120 TEST_MONO_STRUCT(unsigned char, DC_SIGCHAR_UCHAR); | |
121 TEST_MONO_STRUCT(short, DC_SIGCHAR_SHORT); | |
122 TEST_MONO_STRUCT(unsigned short, DC_SIGCHAR_USHORT); | |
123 TEST_MONO_STRUCT(int, DC_SIGCHAR_INT); | |
124 TEST_MONO_STRUCT(unsigned int, DC_SIGCHAR_UINT); | |
125 TEST_MONO_STRUCT(long, DC_SIGCHAR_LONG); | |
126 TEST_MONO_STRUCT(unsigned long, DC_SIGCHAR_ULONG); | |
127 TEST_MONO_STRUCT(long long, DC_SIGCHAR_LONGLONG); | |
128 TEST_MONO_STRUCT(unsigned long long, DC_SIGCHAR_ULONGLONG); | |
129 TEST_MONO_STRUCT(void*, DC_SIGCHAR_POINTER); | |
130 TEST_MONO_STRUCT(float, DC_SIGCHAR_FLOAT); | |
131 TEST_MONO_STRUCT(double, DC_SIGCHAR_DOUBLE); | |
132 | |
324
dd78bd0152af
- removal of never-adopted mini-test framework stub
Tassilo Philipp
parents:
141
diff
changeset
|
133 return ret; |
dd78bd0152af
- removal of never-adopted mini-test framework stub
Tassilo Philipp
parents:
141
diff
changeset
|
134 } |
0 | 135 |
136 | |
137 | |
138 typedef struct | |
139 { | |
140 char a, b, c; | |
141 } FewValues; | |
142 | |
143 double sum_FewValues(FewValues values) | |
144 { | |
145 printf("sum_FewValues(a = %d, b = %d, c = %d)\n", (int)values.a, (int)values.b, (int)values.c); | |
146 return ((double)values.a) + ((double)values.b) + ((double)values.c); | |
147 } | |
148 | |
149 | |
150 typedef struct | |
151 { | |
152 char a, b; | |
153 double p[10]; | |
154 } SomeValues; | |
155 | |
156 double sum_SomeValues(SomeValues values) | |
157 { | |
158 return ((double)values.a) + ((double)values.b) + values.p[0] + values.p[1] + values.p[2]; | |
159 } | |
160 | |
161 | |
324
dd78bd0152af
- removal of never-adopted mini-test framework stub
Tassilo Philipp
parents:
141
diff
changeset
|
162 int testCallStructs() |
dd78bd0152af
- removal of never-adopted mini-test framework stub
Tassilo Philipp
parents:
141
diff
changeset
|
163 { |
dd78bd0152af
- removal of never-adopted mini-test framework stub
Tassilo Philipp
parents:
141
diff
changeset
|
164 int ret = 1; |
0 | 165 |
166 DCCallVM* pc = dcNewCallVM(4096); | |
167 { | |
168 FewValues values; | |
169 double calledSum, expectedSum; | |
170 DCstruct* s = dcNewStruct(3, DEFAULT_ALIGNMENT); | |
171 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); | |
172 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); | |
173 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); | |
174 dcCloseStruct(s); | |
175 | |
176 DC_TEST_STRUCT_SIZE(FewValues, s); | |
177 | |
178 values.a = 1; | |
179 values.b = 2; | |
180 values.c = 3; | |
181 | |
182 dcMode(pc, DC_CALL_C_DEFAULT); | |
183 dcReset(pc); | |
184 printf("BEFORE dcArgStruct\n"); | |
185 dcArgStruct(pc, s, &values); | |
186 printf("AFTER dcArgStruct\n"); | |
187 calledSum = dcCallDouble(pc, (DCpointer)&sum_FewValues); | |
188 expectedSum = sum_FewValues(values); | |
189 | |
190 DC_TEST_INT_EQUAL(expectedSum, calledSum); | |
191 dcFreeStruct(s); | |
192 } | |
193 { | |
194 SomeValues values; | |
195 double calledSum, expectedSum; | |
196 DCstruct* s = dcNewStruct(3, DEFAULT_ALIGNMENT); | |
197 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); | |
198 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); | |
199 dcStructField(s, DC_SIGCHAR_DOUBLE, DEFAULT_ALIGNMENT, 10); | |
200 dcCloseStruct(s); | |
201 | |
202 DC_TEST_STRUCT_SIZE(SomeValues, s); | |
203 | |
204 values.a = 1; | |
205 values.b = 2; | |
206 values.p[0] = 10; | |
207 values.p[1] = 11; | |
208 values.p[2] = 12; | |
209 | |
210 dcMode(pc, DC_CALL_C_DEFAULT); | |
211 dcReset(pc); | |
212 dcArgStruct(pc, s, &values); | |
213 calledSum = dcCallDouble(pc, (DCpointer) &sum_SomeValues); | |
214 expectedSum = sum_SomeValues(values); | |
215 | |
216 DC_TEST_INT_EQUAL(expectedSum, calledSum); | |
217 dcFreeStruct(s); | |
218 } | |
219 | |
220 dcFree(pc); | |
221 | |
324
dd78bd0152af
- removal of never-adopted mini-test framework stub
Tassilo Philipp
parents:
141
diff
changeset
|
222 return ret; |
dd78bd0152af
- removal of never-adopted mini-test framework stub
Tassilo Philipp
parents:
141
diff
changeset
|
223 } |
0 | 224 |