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