annotate test/suite3/main.cc @ 606:85b7a117b807

- more statics in test code (this is partly needed on an experimental freebsd sparc64 build where the elf cleanup code crashes for some reason ... it's probably that experimental build, but a good change to do regardless)
author Tassilo Philipp
date Wed, 21 Sep 2022 15:20:58 +0200
parents d73dc7ad37e4
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
1 /*
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
3 Package: dyncall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
4 Library: test
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
5 File: test/suite3/main.cc
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
6 Description:
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
7 License:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
8
606
85b7a117b807 - more statics in test code (this is partly needed on an experimental freebsd sparc64 build where the elf cleanup code crashes for some reason ... it's probably that experimental build, but a good change to do regardless)
Tassilo Philipp
parents: 413
diff changeset
9 Copyright (c) 2007-2022 Daniel Adler <dadler@uni-goettingen.de>,
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
10 Tassilo Philipp <tphilipp@potion-studios.com>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
11
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
12 Permission to use, copy, modify, and distribute this software for any
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
13 purpose with or without fee is hereby granted, provided that the above
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
14 copyright notice and this permission notice appear in all copies.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
15
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
16 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
17 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
18 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
19 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
20 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
21 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
22 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
23
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
24 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
25
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
26
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
27
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
28 #include "../../dyncall/dyncall.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29 #include "config.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30 #include "../../dyncall/dyncall_value.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31 #include <math.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32 #include <stdlib.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33 #include "../common/platformInit.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34 #include "../common/platformInit.c" /* Impl. for functions only used in this translation unit */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
37 int getId();
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
38 DCpointer getFunc(int x);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39 DCValue* getArg(int pos);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
40
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
41
606
85b7a117b807 - more statics in test code (this is partly needed on an experimental freebsd sparc64 build where the elf cleanup code crashes for some reason ... it's probably that experimental build, but a good change to do regardless)
Tassilo Philipp
parents: 413
diff changeset
42 static DCint valueInt [NARGS];
85b7a117b807 - more statics in test code (this is partly needed on an experimental freebsd sparc64 build where the elf cleanup code crashes for some reason ... it's probably that experimental build, but a good change to do regardless)
Tassilo Philipp
parents: 413
diff changeset
43 static DClonglong valueLongLong[NARGS];
85b7a117b807 - more statics in test code (this is partly needed on an experimental freebsd sparc64 build where the elf cleanup code crashes for some reason ... it's probably that experimental build, but a good change to do regardless)
Tassilo Philipp
parents: 413
diff changeset
44 static DCdouble valueDouble [NARGS];
85b7a117b807 - more statics in test code (this is partly needed on an experimental freebsd sparc64 build where the elf cleanup code crashes for some reason ... it's probably that experimental build, but a good change to do regardless)
Tassilo Philipp
parents: 413
diff changeset
45 static DCfloat valueFloat [NARGS];
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48 bool equals(int select, int pos, void* data)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50 switch(select)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52 case 0: return ( getArg(pos)->i == valueInt [pos] ); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53 case 1: return ( getArg(pos)->l == valueLongLong[pos] ); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54 case 2: return ( getArg(pos)->d == valueDouble [pos] ); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55 case 3: return ( getArg(pos)->f == valueFloat [pos] ); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57 return false;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61 void clearValues();
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 void init()
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 for (int i = 0 ; i < NARGS ; ++i ) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 valueInt[i] = DCint(i);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 valueLongLong[i] = DClonglong(i);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 valueDouble[i] = DCdouble(i);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71 valueFloat[i] = DCfloat(i);
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
72 }
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76 void push(DCCallVM* pCall, int select, int pos)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77 {
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
78 switch(select)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80 case 0: dcArgInt ( pCall, valueInt [pos] ); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81 case 1: dcArgLongLong( pCall, valueLongLong[pos] ); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82 case 2: dcArgDouble ( pCall, valueDouble [pos] ); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83 case 3: dcArgFloat ( pCall, valueFloat [pos] ); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
88 #define test(x) if (!(x)) return false
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90
413
d73dc7ad37e4 - fix nameclash due to a previous and bad cleanup
Tassilo Philipp
parents: 410
diff changeset
91 bool test_case(int x)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93 clearValues();
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
95 DCCallVM* pCall = dcNewCallVM(4096);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 dcReset(pCall);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97 int y = x;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98 int selects[NARGS] = { 0, };
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 int pos = 0;
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
100 for(pos = 0;y>0;++pos)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101 {
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
102 int select = (y-1) % NTYPES;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103 selects[pos] = select;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
104 push(pCall,select,pos);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
105 y = (y-1) / NTYPES;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
106 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107 dcCallVoid(pCall,getFunc(x));
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
108
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
109 test( getId() == x );
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
110
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111 for(int i = 0;i<pos;++i) {
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
112 test( equals( selects[i], i, getArg(i) ) );
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
113 }
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
114
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
115 dcFree(pCall);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
116 return true;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
117 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
118
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
119
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
120 int powerfact(int x, int n)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
121 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
122 if (n==0) return 0;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
123 return static_cast<int>( pow((double)x,n)+powerfact(x,n-1) );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
124 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
125
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
126
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
127 bool run_range(int from, int to)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
128 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
129 bool tr = true;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
130 for (int i = from ; i < to ; ++i ) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
131 printf("%d:",i);
413
d73dc7ad37e4 - fix nameclash due to a previous and bad cleanup
Tassilo Philipp
parents: 410
diff changeset
132 bool r = test_case(i);
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
133 printf("%d\n", r);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
134 tr &= r;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
135 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
136 return tr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
137 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
138
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
139 extern "C" {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
140
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
141 int main(int argc, char* argv[])
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
142 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
143 dcTest_initPlatform();
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
144
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
145 bool success = false;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
146 init();
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
147 if (argc == 2) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
148 int index = atoi(argv[1]);
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
149 success = run_range( index, index+1 );
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
150 } else if (argc == 3) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
151 int from = atoi(argv[1]);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
152 int to = atoi(argv[2])+1;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
153 success = run_range(from,to);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
154 } else {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
155 int ncalls = powerfact(NTYPES,NARGS)+1;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
156 success = run_range(0,ncalls);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
157 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
158
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
159 printf("result: suite3: %d\n", success);
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
160
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
161 dcTest_deInitPlatform();
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
162
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
163 return !success;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
164 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
165
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
166 } // extern "C"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
167