* support/regression/fwk/include/testfwk.h: Fixed up to use function pts correctly.
[fw/sdcc] / support / regression / fwk / lib / testfwk.c
1 /** Test framework support functions.
2  */
3 #include <testfwk.h>
4 #include <stdarg.h>
5
6 /** Define this if the port's div or mod functions are broken.
7     A slow loop based method will be substituded.
8 */
9 #define BROKEN_DIV_MOD          1
10
11 void _putchar(char c);
12 void _exitEmu(void);
13
14 #if BROKEN_DIV_MOD
15 int __div(int num, int denom)
16 {
17     int q = 0;
18     while (num >= denom) {
19         q++;
20         num -= denom;
21     }
22     return q;
23 }
24
25 int __mod(int num, int denom)
26 {
27     while (num >= denom) {
28         num -= denom;
29     }
30     return num;
31 }
32 #else
33 int __div(int num, int denom)
34 {
35     return num/denom;
36 }
37
38 int __mod(int num, int denom)
39 {
40     return num%denom;
41 }
42 #endif
43
44 static void _printn(int n) 
45 {
46     int rem;
47
48     if (n < 0) {
49         _putchar('-');
50         n = -n;
51     }
52
53     rem = __mod(n, 10);
54     if (rem != n) {
55         _printn(__div(n, 10));
56     }
57     _putchar('0' + rem);
58 }
59
60 void __printf(const char *szFormat, ...) REENTRANT
61 {
62     va_list ap;
63     va_start(ap, szFormat);
64
65     while (*szFormat) {
66         if (*szFormat == '%') {
67             switch (*++szFormat) {
68             case 's': {
69                 char *sz = va_arg(ap, char *);
70                 while (*sz) {
71                     _putchar(*sz++);
72                 }
73                 break;
74             }
75             case 'u': {
76                 int i = va_arg(ap, int);
77                 _printn(i);
78                 break;
79             }
80             case '%':
81                 _putchar('%');
82                 break;
83             default:
84                 break;
85             }
86         }
87         else {
88             _putchar(*szFormat);
89         }
90         szFormat++;
91     }
92     va_end(ap);
93 }
94
95 int __numTests;
96 int __numFailures;
97
98 void 
99 __fail(const char *szMsg, const char *szCond, const char *szFile, int line)
100 {
101     __printf("--- FAIL: \"%s\" on %s at %s:%u\n", szMsg, szCond, szFile, line);
102     __numFailures++;
103 }
104
105 int 
106 main(void)
107 {
108     TESTFUNP *cases;
109     int numCases = 0;
110
111     __printf("--- Running: %s\n", getSuiteName());
112
113     cases = suite();
114
115     while (*cases) {
116         __printf("Running %u\n", numCases);
117         (*cases)();
118         cases++;
119         numCases++;
120     }
121     
122     __printf("--- Summary: %u/%u/%u: %u failed of %u tests in %u cases.\n", 
123            __numFailures, __numTests, numCases,
124            __numFailures, __numTests, numCases
125            );
126
127     _exitEmu();
128
129     return 0;
130 }