cfad47cfa3/t3compiler/tads3/test/data/basic.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_label_break();
31
}
32
33
function test_unref_locals(x, y, z)
34
{
35
    local i;
36
    local j;
37
38
    if (x = y)   // note that this should get a warning about the assignment
39
    {
40
        if ((x = z) != 0) // should get no warning here
41
        {
42
            local i;
43
            local j;
44
45
            /* the outer 'i' should still be unreferenced */
46
            i = 1;
47
48
            /* the inner 'j' should be unreferenced, too */
49
        }
50
    }
51
}
52
53
function factorial(x)
54
{
55
    if (x > 1)
56
        return x * factorial(x-1);
57
    else
58
        return 1;
59
}
60
61
function test_for_locals()
62
{
63
    local x;
64
    local i = 'outer i';
65
    
66
    for (local i = 1, x = 'bye', local j = 'hello' ; i < 5 ; ++i, x += '!')
67
        tadsSay('i = ' + i + ', j = ' + j + ', x = ' + x + '\n');
68
69
    tadsSay('at outer scope: i = ' + i + '\n');
70
}
71
72
function test_break_cont()
73
{
74
    for (local i = 1 ; i < 10 ; ++i)
75
    {
76
        tadsSay('test break - i = ' + i + '\n');
77
        if (i == 5)
78
            break;
79
    }
80
81
    for (local i = 1 ; i < 10 ; ++i)
82
    {
83
        tadsSay('test continue - i = ' + i + '\n');
84
        if (i >= 5)
85
            continue;
86
87
        tadsSay('...not continuing this time!\n');
88
    }
89
}
90
91
function test_while()
92
{
93
    local i;
94
95
    i = 0;
96
    while (i < 5)
97
    {
98
        tadsSay('this is while loop iteration #' + i + '\n');
99
        ++i;
100
    }
101
102
    while (i > 0)
103
    {
104
        tadsSay('this is while loop 2 - iteration #' + i + '\n');
105
        break;
106
    }
107
108
    while (i > 0)
109
    {
110
        tadsSay('this is while loop 3 - iteration #' + i + '\n');
111
        --i;
112
        if (i <= 2)
113
            continue;
114
        --i;
115
    }
116
}
117
118
function test_do_while()
119
{
120
    local i;
121
122
    i = 0;
123
    do
124
    {
125
        tadsSay('this is do loop - iteration #' + i + '\n');
126
    } while (i++ < 5);
127
128
    do
129
    {
130
        tadsSay('this is do loop 2 - iteration #' + i + '\n');
131
        if (i > 6)
132
            break;
133
        ++i;
134
    }
135
    while (i < 10);
136
137
    do
138
    {
139
        tadsSay('this is do loop 3 - iteration #' + i + '\n');
140
        --i;
141
        if (i < 3)
142
            continue;
143
        --i;
144
    } while (i > 0);
145
}
146
147
function test_switch()
148
{
149
    local i;
150
151
    i = 3;
152
    tadsSay('no breaks - i = ' + i + '\n');
153
    switch(i)
154
    {
155
    case 1:
156
        tadsSay('case 1\n');
157
        
158
    case 2:
159
        tadsSay('case 2\n');
160
        
161
    case 3:
162
        tadsSay('case 3\n');
163
        
164
    case 4:
165
        tadsSay('case 4\n');
166
        
167
    case 5:
168
        tadsSay('case 5\n');
169
170
    default:
171
        tadsSay('default 1\n');
172
    }
173
174
    i = 2;
175
    tadsSay('with breaks - i = ' + i + '\n');
176
    switch(i)
177
    {
178
    case 1:
179
        tadsSay('case 1\n');
180
        break;
181
        
182
    case 2:
183
        tadsSay('case 2\n');
184
        break;
185
        
186
    case 3:
187
        tadsSay('case 3\n');
188
        break;
189
        
190
    case 4:
191
        tadsSay('case 4\n');
192
        break;
193
        
194
    case 5:
195
        tadsSay('case 5\n');
196
        break;
197
    }
198
}
199
200
function test()
201
{
202
    /* this loop never terminates... */
203
    for (;;)
204
    {
205
    }
206
207
    /* ...so this statement is unreachable - we should get a warning */
208
    test();
209
    main();
210
}
211
212
function test2()
213
{
214
    /* 
215
     *   This function only returns with a value, because the end of the
216
     *   "for" is unreachable - we should NOT get a warning about
217
     *   returning with and without a value 
218
     */
219
    for (;;)
220
    {
221
        return 1;
222
    }
223
}    
224
225
function test3()
226
{
227
    /* 
228
     *   this function implicitly returns both with and without a value -
229
     *   we should get a warning about this 
230
     */
231
    for (local i = 1, local j = 2 ; i < 100 ; ++i)
232
    {
233
        return i;
234
    }
235
}
236
237
/*
238
 *   labeled break test
239
 */
240
function test_label_break()
241
{
242
    tadsSay('\bLabeled Break Test\b');
243
244
    tadsSay('starting stm1:\n');
245
246
stm1:
247
    {
248
        tadsSay('we\'re now in stm1...\n');
249
        tadsSay('preparing to break...\n');
250
        break stm1;
251
252
        tadsSay('after the break???\n');
253
    }
254
255
    tadsSay('here we are after stm1\n');
256
257
    tadsSay('starting stm2:\n');
258
stm2:
259
    {
260
        for (local i = 1 ; i < 5 ; ++i)
261
        {
262
            tadsSay('\t- loop: i = ' + i + '\n');
263
            if (i == 3)
264
                break stm2;
265
        }
266
267
        /* this label is unreferenced - we should get a warning about it */
268
    stm3:
269
        tadsSay('done with loop\n');
270
    }
271
    tadsSay('after stm2\n');
272
}
273
274
/*
275
 *   required entrypoint function 
276
 */
277
function _main(args)
278
{
279
    tadsSay('... this is _main() ...\n');
280
    main();
281
    tadsSay('... _main() exiting ...\n');
282
}