part of examples/bastest is moved to examples/bastest.testcases.md
22 KiB
Test Overview
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
0.000
0.0000020
0.0000002
Notes
Output would differ on other platforms NttX does not use scientific notation in floating point output.
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
test13.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
0.0000000 0.0000000
0.0000001 0.0000001
0.0000013 0.0000010
0.0000133 0.0000100
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
13333333.3333333 10000000.0000000
133333333.3333333 100000000.0000000
Notes
Output would differ on other platforms NttX does not use scientific notation in floating point output.
test32.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 "/tmp/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 "/tmp/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 "/tmp/test.out"
Expected Result
xyz!
0.333333
9999
Notes
The logic in this test will fail if there is no writable file system mount at
/tmp
.
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 "/tmp/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
Notes
-
The logic in this test will fail opening the test.out file if there is no writable file system mount at
/tmp
. -
This test will still currently fail when try to fork the shell because support for that feature is not implemented. The following error message should be received:
Error: Forking child process failed (Unknown error) in line 5 at: if command$<>"enough" then shell "sh ./test/runbas test.bas enough" ^
test37.bas
LINE INPUT
reaching EOF
Test File
10 open "i",1,"/mnt/romfs/test37.dat"
20 while not eof(1)
30 line input #1,a$
40 if a$="abc" then print a$; else print "def"
50 wend
Data file (/mnt/romfs/test37.dat
)
abc
Result
abc
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
Notes
Output will differ because NuttX does not use scientific notation in output. Some minor rounding differences may also be expected.
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