|
|
1.1 root 1: /*
2: * Code to test Hatari expression evaluation in src/debug/evaluate.c
3: */
4: #include <stdio.h>
5: #include <SDL_types.h>
6: #include <stdbool.h>
7: #include "stMemory.h"
8: #include "evaluate.h"
9: #include "m68000.h"
10: #include "main.h"
11: #include "screen.h"
12: #include "video.h"
13:
14: #define VBL_VALUE 21
15:
16: int main(int argc, const char *argv[])
17: {
18: /* expected to fail */
19: const char *failure[] = {
20: "1+2*",
21: "*1+2",
22: "1+(2",
23: "1)+2",
24: "foo+1+bar",
25: };
26: /* expected to succeed, with given result */
27: struct {
28: const char *expression;
29: Uint32 result;
30: } success[] = {
31: { "1+2*3", 7 },
32: { "(2+5)*3", 9 },
33: { "d0 + 2", 12 },
34: { "VBL+10", VBL_VALUE + 10 },
35: { "~%101 & $f0f0f ^ 0x21 * 0x200", 0xF4D0A },
36: };
37: int i, offset, tests = 0, errors = 0;
38: const char *expression, *errstr;
39: Uint32 result;
40:
41: /* set values needed by above succesful calculations */
42: nVBLs = VBL_VALUE;
43: memset(Regs, 0, sizeof(Regs));
44: Regs[REG_D0] = 10;
45: memset(STRam, 0, sizeof(STRam));
46: /* expressions use long access */
47: STRam[2+5] = 0;
48: STRam[2+6] = 0;
49: STRam[2+7] = 0;
50: STRam[2+8] = 3;
51:
52: fprintf(stderr, "\nExpressions that should FAIL:\n");
53:
54: for (i = 0; i < ARRAYSIZE(failure); i++) {
55: expression = failure[i];
56: fprintf(stderr, "- '%s'\n", expression);
57: errstr = Eval_Expression(expression, &result, &offset, false);
58: if (errstr) {
59: fprintf(stderr, "%*c-%s\n",
60: 3+offset, '^', errstr);
61: } else {
62: fprintf(stderr, " => %x\n ***Unexpected SUCCESS from expression***\n",
63: (Uint32)result);
64: errors++;
65: }
66: }
67: tests += i;
68:
69: fprintf(stderr, "\nExpressions that should SUCCEED with given result:\n");
70:
71: for (i = 0; i < ARRAYSIZE(success); i++) {
72: expression = success[i].expression;
73: fprintf(stderr, "- '%s'\n", expression);
74: errstr = Eval_Expression(expression, &result, &offset, false);
75: if (errstr) {
76: fprintf(stderr, "%*c-%s\n ***Unexpected ERROR in expression***\n",
77: 3+offset, '^', errstr);
78: errors++;
79: } else if (result != success[i].result) {
80: fprintf(stderr, " => %x (not %x)\n ***Wrong result from expression***\n",
81: (Uint32)result, (Uint32)success[i].result);
82: errors++;
83: } else {
84: fprintf(stderr, " => 0x%x\n", (Uint32)result);
85: }
86: }
87: tests += i;
88:
89: if (errors) {
90: fprintf(stderr, "\n***Detected %d ERRORs in %d automated tests!***\n\n",
91: errors, tests);
92: } else {
93: fprintf(stderr, "\nFinished without any errors!\n\n");
94: }
95: return errors;
96: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.