cfad47cfa3/t3compiler/tads3/test/data/test_top.t

4b825dc642cb6eb9a060e54bf8d69288fbee4904cfad47cfa334b206c65f22086bcc5d63e6f70944
1
/*
2
 *   Top-level parsing test - input for test_prs_top
3
 */
4
5
#include "tads.h"
6
7
function main()
8
{
9
    local i, j;
10
    local iter;
11
12
    for (iter = 0 ; iter < 5 ; ++iter)
13
    {
14
        i = 7;
15
        j = factorial(i);
16
        
17
        tadsSay('iter[' + iter + ']: ' + i + '! = ' + j + '\n');
18
    }
19
20
    test_for_locals();
21
22
    test_break_cont();
23
24
    test_while();
25
26
    test_do_while();
27
28
    test_switch();
29
30
//    test_catch();
31
}
32
33
#if 0
34
function test_catch()
35
{
36
    try
37
    {
38
        local i, j;
39
        
40
        tadsSay('calculating 5 + \'x\'...\n');
41
        i = 5;
42
        j = 'x';
43
        tadsSay(i + j);
44
    }
45
    catch (RuntimeError exc)
46
    {
47
        tadsSay('caught a run-time error!\n');
48
    }
49
50
    try
51
    {
52
        tadsSay('here\'s a "try" with a "finally" block...\n');
53
    }
54
    finally
55
    {
56
        tadsSay('okay, we\'re in the finally!\n');
57
    }
58
59
    try
60
    {
61
        local i, j;
62
        
63
        tadsSay('calculating 5 + \'x\' in "try" with "catch" and "finally"...\n');
64
        i = 5;
65
        j = 'x';
66
        tadsSay(i + j);
67
    }
68
    catch (RuntimeError exc)
69
    {
70
        tadsSay('caught a RuntimeError\n');
71
    }
72
    finally
73
    {
74
        tadsSay('this is the finally block\n');
75
    }
76
77
    tadsSay('done with exception tests\n');
78
}
79
#endif
80
81
function factorial(x)
82
{
83
    if (x > 1)
84
        return x * factorial(x-1);
85
    else
86
        return 1;
87
}
88
89
function test_for_locals()
90
{
91
    local x;
92
    local i = 'outer i';
93
    
94
    for (local i = 1, x = 'bye', local j = 'hello' ; i < 5 ; ++i)
95
        tadsSay('i = ' + i + ', j = ' + j + ', x = ' + x + '\n');
96
97
    tadsSay('at outer scope: i = ' + i + '\n');
98
}
99
100
function test_break_cont()
101
{
102
    for (local i = 1 ; i < 10 ; ++i)
103
    {
104
        tadsSay('test break - i = ' + i + '\n');
105
        if (i == 5)
106
            break;
107
    }
108
109
    for (local i = 1 ; i < 10 ; ++i)
110
    {
111
        tadsSay('test continue - i = ' + i + '\n');
112
        if (i >= 5)
113
            continue;
114
115
        tadsSay('...not continuing this time!\n');
116
    }
117
}
118
119
function test_while()
120
{
121
    local i;
122
123
    i = 0;
124
    while (i < 5)
125
    {
126
        tadsSay('this is while loop iteration #' + i + '\n');
127
        ++i;
128
    }
129
130
    while (i > 0)
131
    {
132
        tadsSay('this is while loop 2 - iteration #' + i + '\n');
133
        break;
134
    }
135
136
    while (i > 0)
137
    {
138
        tadsSay('this is while loop 3 - iteration #' + i + '\n');
139
        --i;
140
        if (i <= 2)
141
            continue;
142
        --i;
143
    }
144
}
145
146
function test_do_while()
147
{
148
    local i;
149
150
    i = 0;
151
    do
152
    {
153
        tadsSay('this is do loop - iteration #' + i + '\n');
154
    } while (i++ < 5);
155
156
    do
157
    {
158
        tadsSay('this is do loop 2 - iteration #' + i + '\n');
159
        if (i > 6)
160
            break;
161
        ++i;
162
    }
163
    while (i < 10);
164
165
    do
166
    {
167
        tadsSay('this is do loop 3 - iteration #' + i + '\n');
168
        --i;
169
        if (i < 3)
170
            continue;
171
        --i;
172
    } while (i > 0);
173
}
174
175
function test_switch()
176
{
177
    local i;
178
179
    i = 3;
180
    tadsSay('no breaks - i = ' + i + '\n');
181
    switch(i)
182
    {
183
    case 1:
184
        tadsSay('case 1\n');
185
        
186
    case 2:
187
        tadsSay('case 2\n');
188
        
189
    case 3:
190
        tadsSay('case 3\n');
191
        
192
    case 4:
193
        tadsSay('case 4\n');
194
        
195
    case 5:
196
        tadsSay('case 5\n');
197
198
    default:
199
        tadsSay('default 1\n');
200
    }
201
202
    i = 2;
203
    tadsSay('with breaks - i = ' + i + '\n');
204
    switch(i)
205
    {
206
    case 1:
207
        tadsSay('case 1\n');
208
        break;
209
        
210
    case 2:
211
        tadsSay('case 2\n');
212
        break;
213
        
214
    case 3:
215
        tadsSay('case 3\n');
216
        break;
217
        
218
    case 4:
219
        tadsSay('case 4\n');
220
        break;
221
        
222
    case 5:
223
        tadsSay('case 5\n');
224
        break;
225
    }
226
}
227
228
function test()
229
{
230
    /* this loop never terminates... */
231
    for (;;)
232
    {
233
    }
234
235
    /* ...so this statement is unreachable - we should get a warning */
236
    test();
237
    main();
238
}
239
240
function test2()
241
{
242
    /* 
243
     *   This function only returns with a value, because the end of the
244
     *   "for" is unreachable - we should NOT get a warning about
245
     *   returning with and without a value 
246
     */
247
    for (;;)
248
    {
249
        return 1;
250
    }
251
}    
252
253
function test2()
254
{
255
    /* 
256
     *   this function implicitly returns both with and without a value -
257
     *   we should get a warning about this 
258
     */
259
    for (local i = 1, local j = 2 ; i < 100 ; ++i)
260
    {
261
        return i;
262
    }
263
}
264
265
/*
266
 *   required entrypoint function 
267
 */
268
function _main(args)
269
{
270
    tadsSay('... this is _main() ...\n');
271
    main();
272
    tadsSay('... _main() exiting ...\n');
273
}