-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest.sh
executable file
·215 lines (168 loc) · 6.41 KB
/
test.sh
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
#!/bin/bash
OPT=$*
TARGET=bin/freq
try() {
expected="$1"
input="$2"
echo "$input" | $TARGET $OPT > tmp.ll
actual=`lli tmp.ll`
if [ "$actual" == "$expected" ]; then
echo "$input => $actual"
else
echo "$input => $expected expected, but got $actual"
exit 1
fi
}
try_except() {
input="$1"
echo "$input" | $TARGET $OPT > tmp.ll
lli tmp.ll &>/dev/null
actual=$?
if [ $actual != 0 ]; then
echo "$input return error code, correctly"
else
echo "$input should return error code, but got $actual"
exit 1
fi
}
try_file() {
expected="$1"
input="$2"
$TARGET $OPT -i "$2" -o "tmp.ll"
actual=`lli tmp.ll`
if [ "$actual" = "$expected" ]; then
echo "$input => $actual"
else
echo "$input => $expected expected, but got $actual"
exit 1
fi
}
# --------- tests for num
try 0 "fun main(){ print(0) }"
try 42 "fun main(){ print(42) }"
# --------- tests for add
try 30 "fun main(){ print(10 + 10 + 10) }"
# --------- tests for sub
try 10 "fun main(){ print(10 - 10 + 10) }"
try 10 "fun main(){ print(10 + 10 - 10) }"
try 10 "fun main(){ print(-10 + 10 + 10) }"
try 10 "fun main(){ print( 10 + -10 + 10) }"
try 10 "fun main(){ print( 10 + 10 + -10) }"
try 10 "fun main(){ print(-10 + +10 + +10) }"
try 10 "fun main(){ print(+10 + -10 + +10) }"
try 10 "fun main(){ print(+10 + +10 + -10) }"
# --------- tests for uni-plus
try 10 "fun main(){ print( +++10 ) }"
# --------- tests for uni-minus
try 10 "fun main(){ print( - - 10 ) }"
try 10 "fun main(){ print( --10 ) }"
try 10 "fun main(){ print( -+-10 ) }"
try "-10" "fun main(){ print( -+10 ) }"
try "-10" "fun main(){ print( +-10 ) }"
# --------- tests for file read
try_file 20 "test/add.fq"
# --------- tests for mul
try 100 "fun main(){ print( 10 * 10 ) }"
try 1000 "fun main(){ print( 10 * 10 * 10 ) }"
try 200 "fun main(){ print( 10 * (10 + 10) ) }"
try 110 "fun main(){ print( (10 * 10) + 10 ) }"
try 1000 "fun main(){ print( 10 * (10 * 10) ) }"
try 1000 "fun main(){ print( (10 * 10) * 10 ) }"
try 0 "fun main(){ print( 10 * 0 ) }"
try 0 "fun main(){ print( 0 * 10 ) }"
try 0 "fun main(){ print( 10 * -0 ) }"
try 0 "fun main(){ print( -0 * 10 ) }"
# --------- tests for div
try 1 "fun main(){ print( 10 / 10 ) }"
try 1 "fun main(){ print( 100 / 10 / 10 ) }" # it means, div is left-assoc...
try 100 "fun main(){ print( 100 / (10 / 10) ) }"
try 1 "fun main(){ print( (100 / 10) / 10 ) }"
# In LLVM, how to catch this???
# try_except "10 / 0" # zero division.
try 0 "fun main(){ print( 0 / 10 ) }"
# In LLVM, how to catch this???
# try_except 0 "10 / -0" # zero division
try 0 "fun main(){ print( -0 / 10 ) }"
# --------- tests for equality
try 1 "fun main(){ print( 0 == 0 ) }"
try 0 "fun main(){ print( 0 == 1 ) }"
try 0 "fun main(){ print( 1 == 0 ) }"
try 1 "fun main(){ print( 0 == (0 + 0) ) }"
try 0 "fun main(){ print( 0 == (1 + 0) ) }"
try 0 "fun main(){ print( 0 == (0 + 1) ) }"
try 1 "fun main(){ print( 0 == (1 * 0) ) }"
try 1 "fun main(){ print( 0 == (0 * 1) ) }"
# --------- tests for inequality
try 0 "fun main(){ print( 0 != 0 ) }"
try 1 "fun main(){ print( 0 != 1 ) }"
try 1 "fun main(){ print( 1 != 0 ) }"
try 0 "fun main(){ print( 0 != (0 + 0) ) }"
try 1 "fun main(){ print( 0 != (1 + 0) ) }"
try 1 "fun main(){ print( 0 != (0 + 1) ) }"
try 0 "fun main(){ print( 0 != (1 * 0) ) }"
try 0 "fun main(){ print( 0 != (0 * 1) ) }"
# --------- tests for lt
try 1 "fun main(){ print( 10 < 100 ) }"
try 0 "fun main(){ print( 100 < 10 ) }"
try 0 "fun main(){ print( 10 < 10 ) }"
# --------- tests for lteq
try 1 "fun main(){ print( 10 <= 100 ) }"
try 0 "fun main(){ print( 100 <= 10 ) }"
try 1 "fun main(){ print( 10 <= 10 ) }"
# --------- tests for gt
try 0 "fun main() { print( 10 > 100 ) }"
try 1 "fun main() { print( 100 > 10 ) }"
try 0 "fun main() { print( 10 > 10 ) }"
# --------- tests for gteq
try 0 "fun main() { print( 10 >= 100 ) }"
try 1 "fun main() { print( 100 >= 10 ) }"
try 1 "fun main() { print( 10 >= 10 ) }"
# --------- tests for stmts
try 22 "fun main(){ 10 + 1; print( 20 + 2 ) }"
# --------- tests for variables
try 10 "fun main() { let a = 10; print( a ) }"
try 11 "fun main() { let a = 10; print( a + 1 ) }"
try 7 "fun main() { let a = 10; let b = 3; print( a - b ) }"
try 7 "fun main() { let alpha = 10; let beta = 3; print( alpha - beta ) }"
try 7 "fun main() { let a0 = 10; let a1 = 3; print( a0 - a1 ) }"
try 7 "fun main() { let a0 = 10; a0 = a0 - 3; print( a0 ) }"
# --------- tests for block
try 3 "fun main() { { let a = 1; let b = 2; print(a + b) } }"
try 3 "fun main() { print({ let a = 1; let b = 2; a + b }) }"
# --------- tests for func
try 1 "fun main() { let a = 1; print(a) } fun sub() { let a = 2; print(a) }"
try 2 "fun sub() { let a = 1; print(a) } fun main() { let a = 2; print(a) }"
# --------- tests for func call
try 15 "fun sub(a) { a + 10 } fun main() { let r = sub(5); print(r) }"
# --------- tests for ret
try 10 "fun sub(a) { return 10 } fun main() { print( sub(0) ) }"
try 10 "fun sub(a) { return 10; 20 } fun main() { print( sub(0) ) }"
try 10 "fun sub(a) { return 10; return 20 } fun main() { print( sub(0) ) }"
# --------- tests for single stmt function
try 10 "fun sub(a) return 10 fun main() { print( sub(0) ) }"
try 10 "fun sub(a) return 10; fun main() { print( sub(0) ) }"
try 5 "fun sub(a) return a fun main() { print( sub(5) ) }"
try 5 "fun sub(a) return a; fun main() { print( sub(5) ) }"
try 5 "fun sub(a) a fun main() { print( sub(5) ) }"
try 5 "fun sub(a) a; fun main() { print( sub(5) ) }"
# --------- tests for if statement
try 10 "fun main() { if (1) { print(10) } else { print(20) } }"
try 20 "fun main() { if (0) { print(10) } else { print(20) } }"
try 10 "fun main() { if (1) { if(1) print(10) else print(20) } else { print(30) } }"
try 20 "fun main() { if (1) { if(0) print(10) else print(20) } else { print(30) } }"
try 30 "fun main() { if (0) { if(1) print(10) else print(20) } else { print(30) } }"
try 10 "fun main() { if (1) { print(10) } else { if (1) { print(20) } else { print(30) } } }"
try 20 "fun main() { if (0) { print(10) } else { if (1) { print(20) } else { print(30) } } }"
try 30 "fun main() { if (0) { print(10) } else { if (0) { print(20) } else { print(30) } } }"
try_file 20 "test/if.fq"
try_file 10 "test/if_2.fq"
try "10" "fun main() { if (1) { print(10) } }"
try "" "fun main() { if (0) { print(10) } }"
# --------- tests for loop statement
try "2
1
0" "fun main() { let a = 3; loop { a = a - 1; print(a); a } }"
try "2
1
0" "fun main() { let a = 3; loop if (a != 0) { a = a - 1; print(a) } }"
echo OK