nuttx-apps/examples/bastest
YAMAMOTO Takashi c304624fab Replace "STACKSIZE = 2048" with CONFIG_DEFAULT_TASK_SIZE
For now, I left the following instances because it isn't
clear to me why they are using the different values.
Maybe they need one-by-one inspection.

    examples/igmp/Makefile:STACKSIZE = 1024
    examples/powerled/Makefile:STACKSIZE = 1024
    examples/powermonitor/Makefile:STACKSIZE = 768
    examples/relays/Makefile:STACKSIZE = 512
    examples/smps/Makefile:STACKSIZE = 1024
    graphics/screenshot/Makefile:STACKSIZE = 4096
    system/flash_eraseall/Makefile:STACKSIZE = 1024
    testing/cxxtest/Makefile:STACKSIZE = 4096
    testing/smart_test/Makefile:STACKSIZE = 4096
2020-03-27 02:43:11 -05:00
..
tests Remove extra whitespace from files (#43) 2020-01-31 08:29:24 -06:00
.gitignore Revert "Don't generate .depend anymore" 2020-03-22 23:09:40 -05:00
bastest_main.c Application.mk and main.c files: Change builtin's entry point from main to xxx_main by macro expansion. This change make the entry point fully compliant with POSIX/ANSI standard. 2019-10-06 06:14:56 -06:00
Kconfig apps/: Modification to build system: Unified application compilation rules 2018-09-03 09:29:56 -06:00
Make.defs apps/: In all Make.def files, append to CONFIGURED_APPS patch with the absolute path. 2019-10-17 11:33:59 -06:00
Makefile Replace "STACKSIZE = 2048" with CONFIG_DEFAULT_TASK_SIZE 2020-03-27 02:43:11 -05:00
README.txt BAS: A few more fixes to the test 2014-11-09 08:41:21 -06:00

README
======

  This directory contains a small program that will mount a ROMFS file system
  containing the BASIC test files extracted from the BAS 2.4 release.

Background
==========
  Bas is an interpreter for the classic dialect of the programming language
  BASIC.  It is pretty compatible to typical BASIC interpreters of the 1980s,
  unlike some other UNIX BASIC interpreters, that implement a different
  syntax, breaking compatibility to existing programs.  Bas offers many ANSI
  BASIC statements for structured programming, such as procedures, local
  variables and various loop types.  Further there are matrix operations,
  automatic LIST indentation and many statements and functions found in
  specific classic dialects.  Line numbers are not required.

  The interpreter tokenises the source and resolves references to variables
  and jump targets before running the program.  This compilation pass
  increases efficiency and catches syntax errors, type errors and references
  to variables that are never initialised.  Bas is written in ANSI C for
  UNIX systems.

License
=======
  BAS 2.4 is released as part of NuttX under the standard 3-clause BSD license
  use by all components of NuttX.  This is not incompatible with the original
  BAS 2.4 licensing

  Copyright (c) 1999-2014 Michael Haardt

  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.

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

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
---------------
 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.

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 "/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
-----
1. The logic in this test will fail opening the test.out file if there is no
   writable file system mount at /tmp.
2. 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