test01.bas
==========
Scalar variable assignment
Test File
---------
10 a=1
20 print a
30 a$="hello"
40 print a$
50 a=0.0002
60 print a
70 a=2.e-6
80 print a
90 a=.2e-6
100 print a
Expected Result
---------------
1
hello
0.0002
2e-06
2e-07
test02.bas
==========
Array variable assignment
Test File
---------
10 dim a(1)
20 a(0)=10
30 a(1)=11
40 a=12
50 print a(0)
60 print a(1)
70 print a
Expected Result
---------------
10
11
12
test03.bas
==========
FOR loops
Test File
---------
10 for i=0 to 10
20 print i
30 if i=5 then exit for
40 next
50 for i=0 to 0
60 print i
70 next I
80 for i=1 to 0 step -1
90 print i
100 next
110 for i=1 to 0
120 print i
130 next
140 for i$="" to "aaaaaaaaaa" step "a"
150 print i$
160 next
Expected Result
---------------
0
1
2
3
4
5
0
1
0
a
aa
aaa
aaaa
aaaaa
aaaaaa
aaaaaaa
aaaaaaaa
aaaaaaaaa
aaaaaaaaaa
test04.bas
==========
REPEAT UNTIL loop
Test File
---------
10 a=1
20 repeat
30 print a
40 a=a+1
50 until a=10
Expected Result
---------------
1
2
3
4
5
6
7
8
9
test05.bas
==========
GOSUB RETURN subroutines
Test File
---------
10 gosub 100
20 gosub 100
30 end
100 gosub 200
110 gosub 200
120 return
200 print "hello, world":return
Expected Result
---------------
hello, world
hello, world
hello, world
hello, world
test06.bas
==========
Recursive function without arguments
Test File
---------
10 def fnloop
20 if n=0.0 then
30 r=0.0
40 else
50 print n
60 n=n-1.0
70 r=fnloop()
80 end if
90 =r
100 n=10
110 print fnloop
Expected Result
---------------
10
9
8
7
6
5
4
3
2
1
0
test07.bas
==========
Recursive function with arguments
Test File
---------
10 def fna(x)
20 if x=0 then r=1 else r=x*fna(x-1)
30 =r
40 print fna(7)
Expected Result
---------------
5040
test08.bas
==========
DATA, READ and RESTORE
Test File
---------
10 data "a",b
20 data "c","d
40 read j$
50 print "j=";j$
60 restore 20
70 for i=1 to 3
80 read j$,k$
90 print "j=";j$;" k=";k$
100 next
Expected Result
---------------
j=a
j=c k=d
Error: end of `data' in line 80 at:
80 read j$,k$
^
test09.bas
==========
LOCAL variables
Test File
---------
10 def fna(a)
20 local b
30 b=a+1
40 =b
60 b=3
70 print b
80 print fna(4)
90 print b
Expected Result
---------------
3
5
3
test10.bas
==========
PRINT USING
Test File
---------
10 print using "!";"abcdef"
20 print using "\ \";"abcdef"
30 print using "###-";-1
40 print using "###-";0
50 print using "###-";1
60 print using "###+";-1
70 print using "###+";0
80 print using "###+";1
90 print using "#####,";1000
100 print using "**#,##.##";1000.00
110 print using "+##.##";1
120 print using "+##.##";1.23400
130 print using "+##.##";123.456
140 print using "+##.";123.456
150 print using "+##";123.456
160 print using "abc def ###.## efg";1.3
170 print using "###.##^^^^^";5
180 print using "###.##^^^^";1000
190 print using ".##^^^^";5.0
200 print using "##^^^^";2.3e-9
210 print using ".##^^^^";2.3e-9
220 print using "#.#^^^^";2.3e-9
230 print using ".####^^^^^";-011466
240 print using "$*,***,***,***.**";3729825.24
250 print using "$**********.**";3729825.24
260 print using "$$###.##";456.78
270 print using "a!b";"S"
280 print using "a!b";"S","T"
290 print using "a!b!c";"S"
300 print using "a!b!c";"S","T"
Expected Result
---------------
a
abc
1-
0
1
1-
0+
1+
1,000
*1,000.00
+1.00
+1.23
+123.46
+123.
+123
abc def 1.30 efg
500.00E-002
100.00E+01
.50E+01
23E-10
.23E-08
2.3E-09
-.1147E+005
$***3,729,825.24
$**3729825.24
$456.78
aSb
aSbaTb
aSb
aSbTc
test11.bas
==========
OPEN and LINE INPUT
Test File
---------
10 open "i",1,"test.bas"
20 while not eof(1)
30 line input #1,a$
40 print a$
50 wend
Expected Result
---------------
10 open "i",1,"test.bas"
20 while not eof(1)
30 line input #1,a$
40 print a$
50 wend
test12.bas
==========
Exception handling
Test File
---------
10 on error print "global handler 1 caught error in line ";erl : resume 30
20 print mid$("",-1)
30 on error print "global handler 2 caught error in line ";erl : end
40 def procx
50 on error print "local handler caught error in line";erl : goto 70
60 print 1/0
70 end proc
80 procx
90 print 1 mod 0
Expected Result
---------------
global handler 1 caught error in line 20
local handler caught error in line 60
global handler 2 caught error in line 90
test01.bas
==========
Unnumbered lines
Test File
---------
print "a"
goto 20
print "b"
20 print "c"
Expected Result
---------------
a
c
test14.bas
==========
SELECT CASE
Test File
---------
10 for i=0 to 9
20 for j=0 to 9
30 print i,j
40 select case i
50 case 0
60 print "i after case 0"
70 case 1
80 print "i after case 1"
90 select case j
100 case 0
110 print "j after case 0"
120 end select
130 case 3 to 5,7
140 print "i after case 3 to 5, 7"
150 case is <9
160 print "is after case is <9"
170 case else
180 print "i after case else"
190 end select
200 next
210 next
Expected Result
---------------
0 0
i after case 0
0 1
i after case 0
0 2
i after case 0
0 3
i after case 0
0 4
i after case 0
0 5
i after case 0
0 6
i after case 0
0 7
i after case 0
0 8
i after case 0
0 9
i after case 0
1 0
i after case 1
j after case 0
1 1
i after case 1
1 2
i after case 1
1 3
i after case 1
1 4
i after case 1
1 5
i after case 1
1 6
i after case 1
1 7
i after case 1
1 8
i after case 1
1 9
i after case 1
2 0
is after case is <9
2 1
is after case is <9
2 2
is after case is <9
2 3
is after case is <9
2 4
is after case is <9
2 5
is after case is <9
2 6
is after case is <9
2 7
is after case is <9
2 8
is after case is <9
2 9
is after case is <9
3 0
i after case 3 to 5, 7
3 1
i after case 3 to 5, 7
3 2
i after case 3 to 5, 7
3 3
i after case 3 to 5, 7
3 4
i after case 3 to 5, 7
3 5
i after case 3 to 5, 7
3 6
i after case 3 to 5, 7
3 7
i after case 3 to 5, 7
3 8
i after case 3 to 5, 7
3 9
i after case 3 to 5, 7
4 0
i after case 3 to 5, 7
4 1
i after case 3 to 5, 7
4 2
i after case 3 to 5, 7
4 3
i after case 3 to 5, 7
4 4
i after case 3 to 5, 7
4 5
i after case 3 to 5, 7
4 6
i after case 3 to 5, 7
4 7
i after case 3 to 5, 7
4 8
i after case 3 to 5, 7
4 9
i after case 3 to 5, 7
5 0
i after case 3 to 5, 7
5 1
i after case 3 to 5, 7
5 2
i after case 3 to 5, 7
5 3
i after case 3 to 5, 7
5 4
i after case 3 to 5, 7
5 5
i after case 3 to 5, 7
5 6
i after case 3 to 5, 7
5 7
i after case 3 to 5, 7
5 8
i after case 3 to 5, 7
5 9
i after case 3 to 5, 7
6 0
is after case is <9
6 1
is after case is <9
6 2
is after case is <9
6 3
is after case is <9
6 4
is after case is <9
6 5
is after case is <9
6 6
is after case is <9
6 7
is after case is <9
6 8
is after case is <9
6 9
is after case is <9
7 0
i after case 3 to 5, 7
7 1
i after case 3 to 5, 7
7 2
i after case 3 to 5, 7
7 3
i after case 3 to 5, 7
7 4
i after case 3 to 5, 7
7 5
i after case 3 to 5, 7
7 6
i after case 3 to 5, 7
7 7
i after case 3 to 5, 7
7 8
i after case 3 to 5, 7
7 9
i after case 3 to 5, 7
8 0
is after case is <9
8 1
is after case is <9
8 2
is after case is <9
8 3
is after case is <9
8 4
is after case is <9
8 5
is after case is <9
8 6
is after case is <9
8 7
is after case is <9
8 8
is after case is <9
8 9
is after case is <9
9 0
i after case else
9 1
i after case else
9 2
i after case else
9 3
i after case else
9 4
i after case else
9 5
i after case else
9 6
i after case else
9 7
i after case else
9 8
i after case else
9 9
i after case else
test15.bas
==========
FIELD, PUT and GET
Test File
---------
a$="a"
open "r",1,"test.dat",128
print "before field a$=";a$
field #1,10 as a$
field #1,5 as b$,5 as c$
lset b$="hi"
rset c$="ya"
print "a$=";a$
put #1
close #1
print "after close a$=";a$
open "r",2,"test.dat",128
field #2,10 as b$
get #2
print "after get b$=";b$
close #2
kill "test.dat"
Expected Result
---------------
before field a$=a
a$=hi ya
after close a$=
after get b$=hi ya
test16.bas
==========
SWAP
Test File
---------
a=1 : b=2
print "a=";a;"b=";b
swap a,b
print "a=";a;"b=";b
dim a$(1,1),b$(1,1)
a$(1,0)="a" : b$(0,1)="b"
print "a$(1,0)=";a$(1,0);"b$(0,1)=";b$(0,1)
swap a$(1,0),b$(0,1)
print "a$(1,0)=";a$(1,0);"b$(0,1)=";b$(0,1)
Expected Result
---------------
a= 1 b= 2
a= 2 b= 1
a$(1,0)=ab$(0,1)=b
a$(1,0)=bb$(0,1)=a
test17.bas
==========
DO, EXIT DO, LOOP
Test File
---------
print "loop started"
i=1
do
print "i is";i
i=i+1
if i>10 then exit do
loop
print "loop ended"
Expected Result
---------------
loop started
i is 1
i is 2
i is 3
i is 4
i is 5
i is 6
i is 7
i is 8
i is 9
i is 10
loop ended
test18.bas
==========
DO WHILE, LOOP
Test File
---------
print "loop started"
x$=""
do while len(x$)<3
print "x$ is ";x$
x$=x$+"a"
y$=""
do while len(y$)<2
print "y$ is ";y$
y$=y$+"b"
loop
loop
print "loop ended"
Expected Result
---------------
loop started
x$ is
y$ is
y$ is b
x$ is a
y$ is
y$ is b
x$ is aa
y$ is
y$ is b
loop ended
test19.bas
==========
ELSEIF
Test File
---------
for x=1 to 3
if x=1 then
print "1a"
else
if x=2 then
print "2a"
else
print "3a"
end if
end if
next
for x=1 to 3
if x=1 then
print "1b"
elseif x=2 then
print "2b"
elseif x=3 then print "3b"
next
Expected Result
---------------
1a
2a
3a
1b
2b
3b
test20.bas
==========
Caller trace
Test File
---------
10 gosub 20
20 gosub 30
30 procb
40 def proca
50 print "hi"
60 stop
70 end proc
80 def procb
90 proca
100 end proc
Expected Result
---------------
hi
Break in line 60 at:
60 stop
^
Proc Called in line 90 at:
90 proca
^
Proc Called in line 30 at:
30 procb
^
Called in line 20 at:
20 gosub 30
^
Called in line 10 at:
10 gosub 20
^
test21.bas
==========
Matrix assignment
Test File
---------
dim a(3,4)
for i=0 to 3
for j=0 to 4
a(i,j)=i*10+j
print a(i,j);
next
print
next
mat b=a
for i=0 to 3
for j=0 to 4
print b(i,j);
next
print
next
Expected Result
---------------
0 1 2 3 4
10 11 12 13 14
20 21 22 23 24
30 31 32 33 34
0 0 0 0 0
0 11 12 13 14
0 21 22 23 24
0 31 32 33 34
test22.bas
==========
MAT PRINT
Test File
---------
dim a(2,2)
for i=0 to 2
for j=0 to 2
a(i,j)=i*10+j
next
next
for j=1 to 2
for i=1 to 2
print using " ##.##";a(i,j),
next
print
next
mat print using " ##.##";a,a
Expected Result
---------------
11.00 21.00
12.00 22.00
11.00 12.00
21.00 22.00
11.00 12.00
21.00 22.00
test23.bas
==========
Matrix addition and subtraction
Test File
---------
dim a(2,2)
a(2,2)=2.5
dim b%(2,2)
b%(2,2)=3
mat print a
mat a=a-b%
mat print a
dim c$(2,2)
c$(2,1)="hi"
mat print c$
mat c$=c$+c$
mat print c$
Expected Result
---------------
0 0
0 2.5
0 0
0 -0.5
hi
hihi
test24.bas
==========
Matrix multiplication
Test File
---------
10 dim b(2,3),c(3,2)
20 for i=1 to 2 : for j=1 to 3 : read b(i,j) : next : next
30 for i=1 to 3 : for j=1 to 2 : read c(i,j) : next : next
40 mat a=b*c
50 mat print b,c,a
60 data 1,2,3,3,2,1
70 data 1,2,2,1,3,3
Expected Result
---------------
1 2 3
3 2 1
1 2
2 1
3 3
14 13
10 11
test25.bas
==========
Matrix scalar multiplication
Test File
---------
10 dim a(3,3)
20 for i=1 to 3 : for j=1 to 3 : read a(i,j) : next : next
30 mat print a
40 mat a=(3)*a
45 print
50 mat print a
60 data 1,2,3,4,5,6,7,8,9
80 dim inch_array(5,1),cm_array(5,1)
90 mat read inch_array
100 data 1,12,36,100,39.37
110 mat print inch_array
120 mat cm_array=(2.54)*inch_array
130 mat print cm_array
Expected Result
---------------
1 2 3
4 5 6
7 8 9
3 6 9
12 15 18
21 24 27
1
12
36
100
39.37
2.54
30.48
91.44
254
99.9998
test26.bas
==========
MAT READ
Test File
---------
dim a(3,3)
data 5,5,5,8,8,8,3,3
mat read a(2,3)
mat print a
Expected Result
---------------
5 5 5
8 8 8
test27.bas
==========
Matrix inversion
Test File
---------
data 1,2,3,4
mat read a(2,2)
mat print a
mat b=inv(a)
mat print b
mat c=a*b
mat print c
Expected Result
---------------
1 2
3 4
-2 1
1.5 -0.5
1 0
0 1
test28.bas
==========
TDL BASIC FNRETURN/FNEND
Test File
---------
def fnfac(n)
if n=1 then fnreturn 1
fnend n*fnfac(n-1)
print fnfac(10)
Expected Result
---------------
3628800
test29.bas
==========
TDL INSTR
Test File
---------
print instr("123456789","456");" = 4?"
print INSTR("123456789","654");" = 0?"
print INSTR("1234512345","34");" = 3?"
print INSTR("1234512345","34",6);" = 8?"
print INSTR("1234512345","34",6,2);" = 0?"
print INSTR("1234512345","34",6,4);" = 8?"
Expected Result
---------------
4 = 4?
0 = 0?
3 = 3?
8 = 8?
0 = 0?
8 = 8?
test30.bas
==========
Type mismatch check
Test File
---------
print 1+"a"
Expected Result
---------------
Error: Invalid binary operand at: end of program
test31.bas
==========
PRINT default format
Test File
---------
10 for i=-8 to 8
20 x=1+1/3 : y=1 : j=i
30 for j=i to -1 : x=x/10 : y=y/10 : next
40 for j=i to 1 step -1 : x=x*10 : y=y*10 : next
50 print x,y
60 next
Expected Result
---------------
1.333333e-08 1e-08
1.333333e-07 1e-07
1.333333e-06 1e-06
1.333333e-05 1e-05
0.000133 0.0001
0.001333 0.001
0.013333 0.01
0.133333 0.1
1.333333 1
13.33333 10
133.3333 100
1333.333 1000
13333.33 10000
133333.3 100000
1333333 1000000
1.333333e+07 1e+07
1.333333e+08 1e+08
test032.bas
==========
SUB routines
Test File
---------
PUTS("abc")
END
SUB PUTS(s$)
FOR i=1 to LEN(s$) : print mid$(s$,i,1); : NEXT
PRINT
END SUB
Expected Result
---------------
abc
test33.bas
==========
OPEN FOR BINARY
Test File
---------
open "test.out" for binary as 1
put 1,1,"xy"
put 1,3,"z!"
put 1,10,1/3
put 1,20,9999
close 1
open "test.out" for binary as 1
s$=" "
get 1,1,s$
get 1,10,x
get 1,20,n%
close
print s$
print x
print n%
kill "test.out"
Expected Result
---------------
xyz!
0.333333
9999
test34.bas
==========
OPTION BASE
Test File
---------
option base 3
dim a(3,5)
a(3,3)=1
a(3,5)=2
print a(3,3)
print a(3,5)
option base -2
dim b(-1,2)
b(-2,-2)=10
b(-1,2)=20
print a(3,3)
print a(3,5)
print b(-2,-2)
print b(-1,2)
Expected Result
---------------
1
2
1
2
10
20
test35.bas
==========
Real to integer conversion
Test File
---------
a%=1.2
print a%
a%=1.7
print a%
a%=-0.2
print a%
a%=-0.7
print a%
Expected Result
---------------
1
2
0
-1
test36.bas
==========
OPEN file locking
Test File
---------
on error goto 10
print "opening file"
open "test.out" for output lock write as #1
print "open succeeded"
if command$<>"enough" then shell "sh ./test/runbas test.bas enough"
end
10 print "open failed"
Expected Result
---------------
opening file
open succeeded
opening file
open failed
test37.bas
==========
LINE INPUT reaching EOF
Test File
---------
10 open "i",1,"test.ref"
20 while not eof(1)
30 line input #1,a$
40 if a$="abc" then print a$; else print "def"
50 wend
Result
------
Output should match test.ref
test38.bas
==========
MAT REDIM
Test File
---------
dim x(10)
mat read x
mat print x
mat redim x(7)
mat print x
mat redim x(12)
mat print x
data 1,2,3,4,5,6,7,8,9,10
Expected Result
---------------
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
1
2
3
4
5
6
7
0
0
0
0
0
test39.bas
==========
Nested function and procedure calls
Test File
---------
def proc_a(x)
print fn_b(1,x)
end proc
def fn_b(a,b)
= a+fn_c(b)
def fn_c(b)
= b+3
proc_a(2)
Expected Result
---------------
6
test40.bas
==========
IMAGE
Test File
---------
d=3.1
print using "#.#";d
print using 10;d
10 image #.##
Expected Result
---------------
3.1
3.10
test41.bas
==========
EXIT FUNCTION
Test File
---------
function f(c)
print "f running"
if (c) then f=42 : exit function
f=43
end function
print f(0)
print f(1)
Expected Result
---------------
f running
43
f running
42
test42.bas
==========
Arithmetic
Test File
---------
10 print 4.7\3
20 print -2.3\1
30 print int(-2.3)
40 print int(2.3)
50 print fix(-2.3)
60 print fix(2.3)
70 print fp(-2.3)
80 print fp(2.3)
Expected Result
---------------
1
-2
-3
2
-2
2
-0.3
0.3
test43.bas
==========
Matrix multiplication size checks
Test File
---------
DIM a(3,3),b(3,1),c(3,3)
MAT READ a
MAT READ b
MAT c=a*b
MAT PRINT c
DATA 1,2,3,4,5,6,7,8,9
DATA 5,3,2
erase b
DIM b(3)
RESTORE
MAT READ a
MAT READ b
MAT c=a*b
MAT PRINT c
Expected Result
---------------
17
47
77
Error: Dimension mismatch in line 14 at:
mat c=a*b
^
test44.bas
==========
DELETE
Test File
---------
10 print 10
20 print 20
30 print 30
40 print 40
50 print 50
60 print 60
70 print 70
Usage
-----
load "test.bas"
delete -20
delete 60-
delete 30-40
delete 15
list
Expected Result
---------------
Error: No such line at: 15
50 print 50
test45.bas
==========
MID$ on left side
Test File
---------
10 mid$(a$,6,4) = "ABCD"
20 print a$
30 a$="0123456789"
40 mid$(a$,6,4) = "ABCD"
50 print a$
60 a$="0123456789"
70 let mid$(a$,6,4) = "ABCD"
80 print a$
Expected Result
---------------
01234ABCD9
01234ABCD9
test46.bas
==========
END used without program
Test File
---------
for i=1 to 10:print i;:next i:end
Expected Result
---------------
1 2 3 4 5 6 7 8 9 10
test47.bas
==========
MAT WRITE
Test File
---------
dim a(3,4)
for i=0 to 3
for j=0 to 4
a(i,j)=i*10+j
print a(i,j);
next
print
next
mat write a
Expected Result
---------------
0 1 2 3 4
10 11 12 13 14
20 21 22 23 24
30 31 32 33 34
11,12,13,14
21,22,23,24
31,32,33,34
test48.bas
==========
Multi assignment
Test File
---------
a,b = 10
print a,b
dim c(10)
a,c(a) = 2
print a,c(2),c(10)
a$,b$="test"
print a$,b$
Expected Result
---------------
10 10
2 0 2
test test
test49.bas
==========
Matrix determinant
Test File
---------
width 120
dim a(7,7),b(7,7)
mat read a
mat print a;
print
data 58,71,67,36,35,19,60
data 50,71,71,56,45,20,52
data 64,40,84,50,51,43,69
data 31,28,41,54,31,18,33
data 45,23,46,38,50,43,50
data 41,10,28,17,33,41,46
data 66,72,71,38,40,27,69
mat b=inv(a)
mat print b
print det
Expected Result
---------------
58 71 67 36 35 19 60
50 71 71 56 45 20 52
64 40 84 50 51 43 69
31 28 41 54 31 18 33
45 23 46 38 50 43 50
41 10 28 17 33 41 46
66 72 71 38 40 27 69
9.636025e+07 320206 -537449 2323650 -1.135486e+07 3.019632e+07
-9.650941e+07
4480 15 -25 108 -528 1404 -4487
-39436 -131 220 -951 4647 -12358 39497
273240 908 -1524 6589 -32198 85625 -273663
-1846174 -6135 10297 -44519 217549 -578534 1849032
1.315035e+07 43699 -73346 317110 -1549606 4120912 -1.31707e+07
-9.636079e+07 -320208 537452 -2323663 1.135493e+07 -3.019649e+07
9.650995e+07
1
test50.bas
==========
Min and max function
Test File
---------
print min(1,2)
print min(2,1)
print min(-0.3,0.3)
print min(-0.3,4)
print max(1,2)
print max(2,1)
print max(-0.3,0.3)
print max(-0.3,4)
Expected Result
---------------
1
1
-0.3
-0.3
2
2
0.3
4
test51.bas
==========
Print items
Test File
---------
PRINT "Line 1";TAB(78);1.23456789
Expected Result
---------------
Line 1
1.234568
test52.bas
==========
MAT INPUT
Test File
---------
dim a(2,2)
mat input a
mat print a
mat input a
mat print a
Test File
---------
1,2,3,4,5
1
3,4
Expected Result
---------------
?
1 2
3 4
? ?
1 0
3 4