aboutsummaryrefslogtreecommitdiffhomepage
path: root/testexec/mainapp/return.slul
blob: 9e4856195e791bd0043293d66cf70b9dea80fc66 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331

#
# Test of return
#
# Copyright © 2022-2023 Samuel Lidén Borell <samuel@kodafritt.se>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#

func retflow_none1()
{
}

func retflow_none2(bool choice)
{
    if choice { }
    else { }
}

func retflow_simple1() -> bool
{
    return true
}

func retflow_simple2(bool choice) -> bool
{
    if choice { }
    else { }
    return true
}

func retflow_nested() -> bool
{
    {
        return true
    }
}

func retflow_if(int choice) -> bool
{
    if choice == 1 return true
    else return false
}

func retflow_elseif(int choice) -> bool
{
    if      choice ==   1 return true
    else if choice < -100 return choice == -300
    else if choice <  -10 return choice == -30
    else if choice <    0 return choice == -3
    else return false
}

func retflow_elseif_nested(int choice) -> bool
{
    if choice < 100 {
        if choice == 1 return true
        else if choice < -10 return choice == -30
        else if choice < 0 return choice == -3
        else return false
    } else {
        if choice == 101 return true
        else {
            do { } while false
            return false
        }
    }
}

func retflow_if_goto1(int choice) -> int
{
    if choice == 1 return 11
    else if choice == 2 goto cont
    else return 33
  cont:
    return 22
}

func retflow_if_goto2(int choice) -> int
{
    if choice == 1 return 11
    else if choice == 2 { }
    else goto out
  back:
    return 33
  out:
    goto back
}

func retflow_goto() -> bool
{
  again:
    goto again
}

func retflow_while_endless1() -> bool
{
    while true { }
}

func retflow_while_endless2(int choice) -> bool
{
    var int x = choice
    while true {
        x += 1
      top:
        if x == 10 goto bottom
        else if x == 20 goto top
        else if x == 30 goto inner
        else if x > 100 {
          inner:
            x = 0
        }
      bottom:
    }
}

func retflow_while_not_endless1(int choice) -> bool
{
    var int x = choice
    while true {
        x += 1
      top:
        if x == 10 goto bottom
        else if x == 20 goto top
        else if x == 30 goto inner
        else if x > 100 {
          inner:
            x = 0
            goto after
        }
      bottom:
    }
  after:
    return true
}

func retflow_while_not_endless2(int choice) -> bool
{
    var int x = choice
    if choice == 0 {
      before:
        return false
    }
    while true {
        x += 1
      top:
        if x == 10 goto bottom
        else if x == 20 goto top
        else if x == 30 goto inner
        else if x > 100 {
          inner:
            x = 0
            goto before
        }
      bottom:
    }
}

func retflow_dowhile_endless() -> bool
{
    do { } while true
}

func retflow_dowhile_not_endless() -> bool
{
    do { } while false
    return true
}

func retflow_switch1(int x) -> int
{
    switch x {
    case 1:
        return 11
    default:
        return 99
    }
}

func retflow_switch2(int x) -> int
{
    switch x {
    case 1:
        return 11
    case 2:
        return 22
    case 3:
        return 33
    default:
        return 99
    }
}

func retflow_switch3(int x, int y) -> int
{
    if x < 0 {
        switch y {
        case 1:
            return 1
        default:
            return 9
        }
    } else if x > 0 {
        switch y {
        case 1:
            return 11
        case 2:
            return 22
        default:
            return 99
        }
    } else {
        switch y {
        case 1:
            return 111
        case 2:
            return 222
        case 3:
            return 333
        default:
            return 999
        }
    }
}

func retflow_gototarget_simple(int choice) -> bool
{
    if choice == 1 goto skip
    return true
  skip:
    return false
}

func retflow_gototarget_loop(int choice) -> bool
{
    if choice == 1 goto skip
    return true
    while true {
        {
          skip:
            return false
        }
    }
}

func return_test()
{
    retflow_none1()
    retflow_none2(true)
    assert retflow_simple1()
    assert retflow_simple2(false)
    assert retflow_nested()
    assert retflow_if(1)
    assert not retflow_if(2)
    assert retflow_elseif(1)
    assert retflow_elseif(-300)
    assert retflow_elseif(-30)
    assert retflow_elseif(-3)
    assert not retflow_elseif(-101)
    assert not retflow_elseif(-11)
    assert not retflow_elseif(-1)
    assert retflow_elseif(1)
    assert retflow_elseif_nested(1)
    assert retflow_elseif_nested(-30)
    assert retflow_elseif_nested(-3)
    assert not retflow_elseif_nested(-11)
    assert not retflow_elseif_nested(-1)
    assert not retflow_elseif_nested(99)
    assert retflow_elseif_nested(101)
    assert not retflow_elseif_nested(100)
    assert retflow_if_goto1(1) == 11
    assert retflow_if_goto1(2) == 22
    assert retflow_if_goto1(3) == 33
    assert retflow_if_goto1(0) == 33
    assert retflow_if_goto1(0x40000001) == 33
    assert retflow_if_goto2(1) == 11
    assert retflow_if_goto2(2) == 33
    assert retflow_if_goto2(3) == 33
    # These contain endless loops. So they have to be skipped
    #retflow_goto()
    #retflow_while_endless1()
    #retflow_while_endless2()
    assert retflow_while_not_endless1(100)
    assert retflow_while_not_endless1(90)
    assert retflow_while_not_endless1(29)
    assert retflow_while_not_endless1(20) # values < 20 cause an endless loop
    assert not retflow_while_not_endless2(0)
    assert not retflow_while_not_endless2(31)
    assert not retflow_while_not_endless2(20) # values < 20 cause an endless loop
    # More endless loops. Skipped
    #retflow_dowhile_endless()
    #retflow_dowhile_not_endless()
    assert retflow_switch1(1) == 11
    assert retflow_switch1(0) == 99
    assert retflow_switch1(2) == 99
    assert retflow_switch2(1) == 11
    assert retflow_switch2(2) == 22
    assert retflow_switch2(3) == 33
    assert retflow_switch2(4) == 99
    assert retflow_switch2(0) == 99
    assert retflow_switch3(-1, 1) == 1
    assert retflow_switch3(-1, 2) == 9
    assert retflow_switch3(1, 1) == 11
    assert retflow_switch3(1, 2) == 22
    assert retflow_switch3(1, 3) == 99
    assert retflow_switch3(0, 1) == 111
    assert retflow_switch3(0, 2) == 222
    assert retflow_switch3(0, 3) == 333
    assert retflow_switch3(0, 4) == 999
    assert retflow_switch3(0, 0) == 999
    assert not retflow_gototarget_simple(1)
    assert retflow_gototarget_simple(2)
    assert not retflow_gototarget_loop(1)
    assert retflow_gototarget_loop(2)
}