mirror of
https://github.com/inexorabletash/jsbasic.git
synced 2024-11-30 01:49:29 +00:00
17b0baf7e5
Fixes #32 The RdAltChar (mousetext) is not accurate. Under Virtual II it seems to always return true if the 80 column firmware is active, regardless of which character set is active.
933 lines
25 KiB
Plaintext
933 lines
25 KiB
Plaintext
|
|
0 GOTO 100
|
|
|
|
1 REM LET T$ = "test desc" : LET S = 0 OR 1 : GOSUB 1
|
|
2 IF S THEN PRINT ".";
|
|
3 IF NOT S THEN INVERSE : PRINT " Test ";T$;" Failed "; : NORMAL : PRINT ""; : F = F + 1
|
|
4 TE = TE + 1 : TS = TS + (NOT NOT S) : S = 0 : RETURN
|
|
|
|
100 REM Pre-test for CLEAR
|
|
110 A = 1 : A$ = "a" : A(1) = 2 : A$(1) = "b" : CLEAR
|
|
|
|
200 REM Feature Detection
|
|
210 LR = 0 : ONERR GOTO 220
|
|
211 GR : LR = 1
|
|
220 HR = 0 : ONERR GOTO 240
|
|
221 HGR : HR = 1
|
|
230 PD = 0 : ONERR GOTO 240
|
|
231 X = PDL(0) : PD = 1
|
|
240 POKE 216,0
|
|
|
|
300 PR#3 : TEXT : HOME : PRINT "Unit Tests"
|
|
|
|
1000 PRINT : PRINT "Variable Control ";
|
|
|
|
1010 REM Ensure CLEAR in line 110 occurred
|
|
: T$ = "CLEAR"
|
|
: S = ( A = 0 ) : GOSUB 1
|
|
: S = ( A$ = "" ) : GOSUB 1
|
|
: S = ( A(1) = 0 ) : GOSUB 1
|
|
: S = ( A$(1) = "" ) : GOSUB 1
|
|
|
|
1020 T$ = "Implicit LET"
|
|
: A = 123 : S = ( A = 123 ) : GOSUB 1
|
|
: A$ = "abc" : S = ( A$ = "abc" ) : GOSUB 1
|
|
: A(1) = 234: S = ( A(1) = 234 ) : GOSUB 1
|
|
: A$(1) = "bcd" : S = ( A$(1) = "bcd" ) : GOSUB 1
|
|
|
|
1030 T$ = "Explicit LET"
|
|
: LET A = 123 : S = ( A = 123 ) : GOSUB 1
|
|
: LET A$ = "abc" : S = ( A$ = "abc" ) : GOSUB 1
|
|
: LET A(1) = 234 : S = ( A(1) = 234 ) : GOSUB 1
|
|
: LET A$(1) = "bcd" : S = ( A$(1) = "bcd" ) : GOSUB 1
|
|
|
|
1040 T$ = "DIM"
|
|
: DIM AR(12)
|
|
: FOR I = 0 TO 12 : AR(I) = I : NEXT
|
|
: T = 0 : U = 0
|
|
: FOR I = 0 TO 12 : T = T + I : U = U + AR(I) : NEXT
|
|
: S = (T = U) : GOSUB 1
|
|
|
|
1050 T$ = "DEF FN"
|
|
: DEF FN FA(X) = X+X : S = (FN FA(3) = 6) : GOSUB 1
|
|
: DEF FN FB(X) = X*X : S = (FN FB(3) = 9) : GOSUB 1
|
|
|
|
|
|
2000 PRINT : PRINT "Flow Control ";
|
|
|
|
2010 T$ = "GOTO" : T = 1 : GOTO 2017 : T = T + 1
|
|
2015 T = T + 1 : GOTO 2019 : T = T + 1
|
|
2017 T = T + 1 : GOTO 2015
|
|
2018 T = T + 1
|
|
2019 S = (T=3) : GOSUB 1
|
|
|
|
2020 T$ = "GOSUB/RETURN" : T = 1 : GOSUB 2025 : GOTO 2029
|
|
2025 T = T + 1 : RETURN
|
|
2029 S = (T=2) : GOSUB 1
|
|
|
|
2030 T$ = "ON GOTO" : T = 1 : ON 2 GOTO 2031, 2032, 2033
|
|
2031 T = T + 1
|
|
2032 T = T + 1
|
|
2033 T = T + 1
|
|
2034 S = (T=3) : GOSUB 1
|
|
2035 T$ = "ON GOTO (EDGE CASE: 0)" : T = 1 : ONERR GOTO 2039
|
|
2036 ON 0 GOTO 2037, 2038 : T = T + 3
|
|
2037 T = T + 1
|
|
2038 T = T + 1
|
|
2039 S = (T=6) : POKE 216,0 : GOSUB 1
|
|
2040 T$ = "ON GOTO (EDGE CASE: -0.1)" : T = 1 : ONERR GOTO 2044
|
|
2041 ON -0.1 GOTO 2042, 2043 : T = T + 3
|
|
2042 T = T + 1
|
|
2043 T = T + 1
|
|
2044 S = (T=1) AND (PEEK(222)=53): POKE 216,0 : GOSUB 1
|
|
|
|
|
|
2045 T$ = "ON GOTO (EDGE CASE: 255.2)" : T = 1 : ONERR GOTO 2049
|
|
2046 ON 255.2 GOTO 2047, 2048 : T = T + 3
|
|
2047 T = T + 1
|
|
2048 T = T + 1
|
|
2049 S = (T=6) : POKE 216,0 : GOSUB 1
|
|
2050 T$ = "ON GOTO (EDGE CASE: 256)" : T = 1 : ONERR GOTO 2054
|
|
2051 ON -0.1 GOTO 2052, 2053 : T = T + 3
|
|
2052 T = T + 1
|
|
2053 T = T + 1
|
|
2054 S = (T=1) AND (PEEK(222)=53): POKE 216,0 : GOSUB 1
|
|
|
|
|
|
2060 T$ = "ON GOSUB" : T = 1 : ON 2 GOSUB 2061, 2062, 2063 : GOTO 2064
|
|
2061 T = T + 1 : RETURN
|
|
2062 T = T + 2 : RETURN
|
|
2063 T = T + 3 : RETURN
|
|
2064 S = (T=3) : GOSUB 1
|
|
2065 T$ = "ON GOSUB (EDGE CASE: 0)" : T = 1 : ONERR GOTO 2069
|
|
2066 ON 0 GOSUB 2067, 2068 : GOTO 2070
|
|
2067 T = T + 2 : RETURN
|
|
2068 T = T + 3 : RETURN
|
|
2069 T = 255
|
|
2070 S = (T=1) : POKE 216,0 : GOSUB 1
|
|
2071 T$ = "ON GOSUB (EDGE CASE: -0.1)" : T = 1 : ONERR GOTO 2075
|
|
2072 ON -0.1 GOSUB 2073, 2074 : T = T + 5 : GOTO 2075
|
|
2073 T = T + 2 : RETURN
|
|
2074 T = T + 3 : RETURN
|
|
2075 S = (T=1) AND (PEEK(222)=53): POKE 216,0 : GOSUB 1
|
|
2076 T$ = "ON GOSUB (EDGE CASE: 255.2)" : T = 1 : ONERR GOTO 2080
|
|
2077 ON 255.2 GOSUB 2078, 2079 : GOTO 2081
|
|
2078 T = T + 2 : RETURN
|
|
2079 T = T + 3 : RETURN
|
|
2080 T = 255
|
|
2081 S = (T=1) : POKE 216,0 : GOSUB 1
|
|
2082 T$ = "ON GOSUB (EDGE CASE: 256)" : T = 1 : ONERR GOTO 2086
|
|
2083 ON 256 GOSUB 2084, 2085 : T = T + 5 : GOTO 2086
|
|
2084 T = T + 2 : RETURN
|
|
2085 T = T + 3 : RETURN
|
|
2086 S = (T=1) AND (PEEK(222)=53): POKE 216,0 : GOSUB 1
|
|
|
|
2150 T$ = "POP" : T = 1 : GOSUB 2155 : T = T + 1 : GOTO 2159
|
|
2155 T = T + 1 : GOSUB 2156 : T = T + 5
|
|
2156 POP : T = T + 1 : RETURN
|
|
2159 S = (T=4) : GOSUB 1
|
|
|
|
2160 T$ = "FOR"
|
|
: T = 0 : FOR I = 1 TO 10 : T = T + I : NEXT
|
|
: S = (T = 55) : GOSUB 1
|
|
2161 T$ = "FOR STEP"
|
|
: T = 0 : FOR I = 1 TO 10 STEP 2 : T = T + I : NEXT
|
|
: S = (T = 25) : GOSUB 1
|
|
2162 T$ = "FOR STEP"
|
|
: T = 0 : FOR I = 10 TO 1 STEP -1 : T = T + I : NEXT
|
|
: S = (T = 55) : GOSUB 1
|
|
2163 T$ = "FOR STEP"
|
|
: T = 0 : FOR I = 10 TO 1 : T = T + I : NEXT
|
|
: S = (T = 10) : GOSUB 1
|
|
|
|
2170 T$ = "NEXT"
|
|
: T = 0 : FOR I = 1 TO 10 : FOR J = 1 TO 10 : FOR K = 1 TO 10 : T = T + 1 : NEXT J, I
|
|
: S = (T=100) : GOSUB 1
|
|
|
|
2180 T$ = "IF THEN"
|
|
: T = 1 : IF 0 THEN T = 2
|
|
2181 S = (T=1) : GOSUB 1
|
|
: T = 1 : IF 1 THEN T = 2 : T = 3
|
|
2182 S = (T=3) : GOSUB 1
|
|
|
|
2190 T$ = "IF GOTO"
|
|
: T = 1 : IF 0 GOTO 2192 : T = 2
|
|
2191 T = 3
|
|
2192 S = (T=3) : GOSUB 1
|
|
: T = 1 : IF 1 GOTO 2194 : T = 2
|
|
2193 T = 3
|
|
2194 S = (T=1) : GOSUB 1
|
|
|
|
2200 T$ = "Empty String is False"
|
|
: T = 1 : IF "" THEN T = 2
|
|
2201 S = (T=1) : GOSUB 1
|
|
|
|
2210 T$ = "Non-Empty String is True"
|
|
: T = 1 : IF "abc" THEN T = 2
|
|
2211 S = (T=2) : GOSUB 1
|
|
|
|
|
|
3000 PRINT : PRINT "Error Handling ";
|
|
|
|
3010 T$ = "ONERR GOTO"
|
|
: T = 1 : ONERR GOTO 3015
|
|
3011 T = 1 / 0
|
|
3012 T = 2
|
|
3015 S = (T=1) : GOSUB 1
|
|
|
|
3020 T$ = "RESUME"
|
|
: T = 0 : ONERR GOTO 3025
|
|
3021 T = 1 / T : GOTO 3029
|
|
3025 T = 1 : RESUME
|
|
3029 S = (T=1) : GOSUB 1
|
|
|
|
3040 T$ = "RETURN FROM LOOP"
|
|
: T = 1 : ONERR GOTO 3046
|
|
3041 GOSUB 3045
|
|
: GOTO 3048
|
|
3045 FOR I = 1 TO 10 : RETURN
|
|
3046 T = 2 : REM ONERR goes here
|
|
3048 S = (T=1) : GOSUB 1
|
|
|
|
3100 T$ = "NEXT WITHOUT FOR"
|
|
: T = 1 : ONERR GOTO 3102
|
|
3101 NEXT
|
|
: T = 2
|
|
3102 S = (T=1) AND (PEEK(222)=0) : GOSUB 1
|
|
|
|
3110 T$ = "SYNTAX ERROR" : REM Compile time only, can't test!
|
|
|
|
3120 T$ = "RETURN WITHOUT GOSUB"
|
|
: T = 1 : ONERR GOTO 3122
|
|
3121 RETURN
|
|
: T = 2
|
|
3122 S = (T=1) AND (PEEK(222)=22) : GOSUB 1
|
|
|
|
3130 T$ = "OUT OF DATA"
|
|
: T = 1 : ONERR GOTO 3132
|
|
3131 FOR A = 1 TO 1000 : READ A$ : NEXT
|
|
: T = 2
|
|
3132 S = (T=1) AND (PEEK(222)=42) : GOSUB 1
|
|
|
|
3140 T$ = "ILLEGAL QUANTITY"
|
|
: T = 1 : ONERR GOTO 3142
|
|
3141 A% = 32768
|
|
: T = 2
|
|
3142 S = (T=1) AND (PEEK(222)=53) : GOSUB 1
|
|
|
|
3145 T$ = "ILLEGAL QUANTITY"
|
|
: T = 1 : ONERR GOTO 3147
|
|
3146 A = ASC("")
|
|
: T = 2
|
|
3147 S = (T=1) AND (PEEK(222)=53) : GOSUB 1
|
|
|
|
3150 T$ = "OVERFLOW" :
|
|
: T = 1 : ONERR GOTO 3152
|
|
3151 A = 256^256^256
|
|
: T = 2
|
|
3152 S = (T=1) AND (PEEK(222)=69) : GOSUB 1
|
|
|
|
3160 T$ = "OUT OF MEMORY" : REM Not consistent enough across browsers
|
|
: REM T = 1 : ONERR GOTO 3162
|
|
3161 REM A$ = "x"
|
|
: REM FOR I = 0 TO 1 STEP 0 : A$ = A$ + A$ : NEXT
|
|
: REM T = 2
|
|
3162 REM S = (T=1) AND (PEEK(222)=77) : GOSUB 1
|
|
|
|
3170 T$ = "UNDEFINED STATEMENT" :
|
|
: T = 1 : ONERR GOTO 3172
|
|
3171 GOTO 3173
|
|
: T = 2
|
|
3172 S = (T=1) AND (PEEK(222)=90) : GOSUB 1
|
|
|
|
3180 T$ = "BAD SUBSCRIPT" :
|
|
: T = 1 : ONERR GOTO 3182
|
|
3181 DIM BS(3) : BS(4) = 123
|
|
: T = 2
|
|
3182 S = (T=1) AND (PEEK(222)=107) : GOSUB 1
|
|
|
|
3190 T$ = "REDIMENSION ARRAY" :
|
|
: T = 1 : ONERR GOTO 3192
|
|
3191 DIM RA(3) : DIM RA(3)
|
|
: T = 2
|
|
3192 S = (T=1) AND (PEEK(222)=120) : GOSUB 1
|
|
|
|
3200 T$ = "DIVISION BY ZERO" :
|
|
: T = 1 : ONERR GOTO 3202
|
|
3201 A = 1 / 0
|
|
: T = 2
|
|
3202 S = (T=1) AND (PEEK(222)=133) : GOSUB 1
|
|
|
|
3210 T$ = "TYPE MISMATCH" :
|
|
: T = 1 : ONERR GOTO 3212
|
|
3211 RESTORE : FOR I = 1 TO 1000 : READ A : NEXT
|
|
: T = 2
|
|
3212 S = (T=1) AND (PEEK(222)=163) : GOSUB 1
|
|
|
|
3215 T$ = "TYPE MISMATCH" :
|
|
: T = 1 : ONERR GOTO 3217
|
|
3216 RESTORE : FOR I = 1 TO 1000 : READ A% : NEXT
|
|
: T = 2
|
|
3217 S = (T=1) AND (PEEK(222)=163) : GOSUB 1
|
|
|
|
3220 T$ = "STRING TOO LONG"
|
|
: REM Strings are "infinite", can't test
|
|
|
|
3230 T$ = "FORMULA TOO COMPLEX"
|
|
: REM T = 1 : ONERR GOTO 3232
|
|
3231 REM DEF FN FC(x) = FN FC(x) + 1 : X = FN FC(0)
|
|
: REM T = 2
|
|
3232 REM S = (T=1) AND (PEEK(222)=191): GOSUB 1
|
|
|
|
3240 T$ = "UNDEFINED FUNCTION" :
|
|
: T = 1 : ONERR GOTO 3242
|
|
3241 X = FN UF(0)
|
|
: T = 2
|
|
3242 S = (T=1) AND (PEEK(222)=224) : GOSUB 1
|
|
|
|
3250 T$ = "RE-ENTER" : REM Can't test until input can be synthesized
|
|
|
|
3260 T$ = "BREAK" :
|
|
: T = 1 : ONERR GOTO 3262
|
|
3261 STOP
|
|
: T = 2
|
|
3262 S = (T=1) AND (PEEK(222)=255) : GOSUB 1
|
|
|
|
3270 T$ = "CALL-3288" :
|
|
: T = 1 : ONERR GOTO 3274
|
|
3271 GOSUB 3272
|
|
: T = T + 1
|
|
: GOTO 3275
|
|
3272 X = FN UF(0)
|
|
: T = 10
|
|
3274 CALL -3288
|
|
: T = T + 1
|
|
: RETURN
|
|
3275 S = (T=3) : GOSUB 1
|
|
|
|
3280 T$ = "ONERR GOTO skips rest of line"
|
|
: T = 1
|
|
: ONERR GOTO 3281
|
|
: T = 2
|
|
3281 S = (T=1) : GOSUB 1
|
|
|
|
|
|
3999 POKE 216,0 : REM Disable ONERR handler
|
|
|
|
|
|
|
|
4000 PRINT : PRINT "Input/Output ";
|
|
: PRINT "UNIT TESTS NOT FULLY IMPLEMENTED ";
|
|
|
|
4010 REM **********************************************
|
|
4010 REM Do I/O as a follow-on module and introduce
|
|
4010 REM a non-standard screen-scraping function
|
|
4010 REM **********************************************
|
|
|
|
4010 REM **********************************************
|
|
4010 REM Test TRACE/NOTRACE as part of I/O functions
|
|
4010 REM **********************************************
|
|
|
|
|
|
|
|
4100 T$ = "HTAB" :
|
|
: SX = PEEK(36) : SY = PEEK(37)
|
|
: HTAB 10 : T = PEEK(36)
|
|
: POKE 36, SX : POKE 37, SY
|
|
: S = (T = 10 - 1) : GOSUB 1
|
|
|
|
4110 T$ = "VTAB" :
|
|
: SX = PEEK(36) : SY = PEEK(37)
|
|
: VTAB 10 : T = PEEK(37)
|
|
: POKE 36, SX : POKE 37, SY
|
|
: S = (T = 10 - 1) : GOSUB 1
|
|
|
|
4120 T$ = "Comma Operator" :
|
|
: SX = PEEK(36) : SY = PEEK(37)
|
|
: VTAB 23 : HTAB 1 : PRINT 1, : T = PEEK(36)
|
|
: VTAB 23 : HTAB 1 : PRINT SPC(40);
|
|
: POKE 36, SX : POKE 37, SY
|
|
: S = (T = 16) : GOSUB 1
|
|
|
|
4130 T$ = "Semicolon Operator" :
|
|
: SX = PEEK(36) : SY = PEEK(37)
|
|
: VTAB 23 : HTAB 1 : PRINT "abc"; : T = PEEK(36)
|
|
: VTAB 23 : HTAB 1 : PRINT SPC(40);
|
|
: POKE 36, SX : POKE 37, SY
|
|
: S = (T = 3) : GOSUB 1
|
|
|
|
4140 T$ = "SPC Operator" :
|
|
: SX = PEEK(36) : SY = PEEK(37)
|
|
: VTAB 23 : HTAB 1 : PRINT "abc";SPC(10) : T = PEEK(36)
|
|
: VTAB 23 : HTAB 1 : PRINT SPC(40)
|
|
: POKE 36, SX : POKE 37, SY
|
|
: S = (T = 13) : GOSUB 1
|
|
|
|
4150 T$ = "TAB Operator" :
|
|
: SX = PEEK(36) : SY = PEEK(37)
|
|
: VTAB 23 : HTAB 1 : PRINT "abc";TAB(10) : T = PEEK(36)
|
|
: VTAB 23 : HTAB 1 : PRINT SPC(40)
|
|
: POKE 36, SX : POKE 37, SY
|
|
: S = (T = 9) : GOSUB 1
|
|
|
|
|
|
|
|
|
|
5000 PRINT : PRINT "Miscellaneous ";
|
|
|
|
5010 T$ = "REM" : T = 1 : REM T = 2 : T = 3
|
|
5011 S = (T=1) : GOSUB 1
|
|
|
|
|
|
|
|
6000 PRINT : PRINT "Inline Data ";
|
|
|
|
6001 DATA 1,2,3
|
|
6002 DATA "A","B","C"
|
|
|
|
6010 T$ = "READ"
|
|
: RESTORE
|
|
: READ T : S = (T=1) : GOSUB 1
|
|
: READ T,U : S = (T=2 AND U=3) : GOSUB 1
|
|
: READ A$ : S = (A$="A") : GOSUB 1
|
|
: READ A$,B$ : S = (A$="B" AND B$="C") : GOSUB 1
|
|
|
|
6020 T$ = "RESTORE" : RESTORE
|
|
: READ T : S = (T=1) : GOSUB 1
|
|
: READ T,U : S = (T=2 AND U=3) : GOSUB 1
|
|
: READ A$ : S = (A$="A") : GOSUB 1
|
|
: READ A$,B$ : S = (A$="B" AND B$="C") : GOSUB 1
|
|
|
|
|
|
7000 PRINT : PRINT "Lo-Res Graphics ";
|
|
7001 IF NOT LR THEN PRINT "<skipping GR tests>" : GOTO 8000
|
|
|
|
7010 T$ = "GR"
|
|
: U = PEEK(36) : V = PEEK(37) : GR : S = (PEEK(37) = 23) : TEXT : POKE 36,U : POKE 37,V : GOSUB 1
|
|
: U = PEEK(36) : V = PEEK(37) : GR : S = (PEEK(34) = 20) : TEXT : POKE 36,U : POKE 37,V : GOSUB 1
|
|
|
|
7011 POKE 49232,0 : POKE 49234,0 : POKE 49238,0
|
|
|
|
7020 T$ = "COLOR="
|
|
: T = 0 : U = 0 : FOR I = 0 TO 15 : COLOR= I : PLOT 0,0 : T = T + I : U = U + SCRN(0,0) : NEXT
|
|
: S = (T=U) : GOSUB 1
|
|
: T = 1 : ONERR GOTO 7022
|
|
7021 COLOR=256
|
|
: T = 2
|
|
7022 S = (T=1) AND (PEEK(222)=53) : GOSUB 1
|
|
|
|
7030 T$ = "PLOT"
|
|
: COLOR= 5 : PLOT 0,0 : PLOT 39,0 : PLOT 0,47 : PLOT 39,47
|
|
: COLOR= 6 : PLOT 0,0 : PLOT 39,0 : PLOT 0,47 : PLOT 39,47
|
|
: S = (SCRN(0,0)=6 AND SCRN(39,0)=6 AND SCRN(0,47)=6 AND SCRN(39,47)=6) : GOSUB 1
|
|
|
|
7040 T$ = "HLIN"
|
|
: COLOR= 0 : FOR Y = 0 TO 5: FOR X = 0 TO 10 : PLOT X,Y : NEXT : NEXT
|
|
: FOR I = 1 TO 5 : COLOR= I : HLIN I,10-I AT I : NEXT
|
|
: T = 0 : FOR Y = 0 TO 5: FOR X = 0 TO 10 : T = T + SCRN(X,Y) : NEXT : NEXT
|
|
: S = (T=55) : GOSUB 1
|
|
|
|
7050 T$ = "VLIN"
|
|
: COLOR= 0 : FOR Y = 0 TO 10: FOR X = 0 TO 5 : PLOT X,Y : NEXT : NEXT
|
|
: FOR I = 1 TO 5 : COLOR= I : VLIN I,10-I AT I : NEXT
|
|
: T = 0 : FOR Y = 0 TO 10: FOR X = 0 TO 5 : T = T + SCRN(X,Y) : NEXT : NEXT
|
|
: S = (T=55) : GOSUB 1
|
|
|
|
: COLOR= 6 : PLOT 0,0 : PLOT 39,0 : PLOT 0,47 : PLOT 39,47
|
|
: S = (SCRN(0,0)=6 AND SCRN(39,0)=6 AND SCRN(0,47)=6 AND SCRN(39,47)=6) : GOSUB 1
|
|
|
|
7900 REM Something memorable
|
|
7910 FOR I = 0 TO 15
|
|
: COLOR= I
|
|
: HLIN I, 39-I AT I
|
|
: HLIN I, 39-I AT 39 - I
|
|
: VLIN I, 39-I AT I
|
|
: VLIN I, 39-I AT 39 - I
|
|
: NEXT
|
|
|
|
7999 TEXT
|
|
8000 PRINT : PRINT "Hi-Res Graphics ";
|
|
8001 IF NOT HR THEN PRINT "<skipping HGR test>" : GOTO 9000
|
|
|
|
8020 T$ = "HCOLOR="
|
|
: HGR
|
|
: T = 0 : U = 0 : FOR I = 0 TO 7 : HCOLOR= I : HPLOT 0,0 : T = T + I : U = U + HSCRN(0,0) : NEXT
|
|
: S = (T=U) : GOSUB 1
|
|
|
|
8030 T$ = "HPLOT"
|
|
: HGR
|
|
: HCOLOR= 5 : HPLOT 0,0 : HPLOT 39,0 : HPLOT 0,47 : HPLOT 39,47
|
|
: HCOLOR= 6 : HPLOT 0,0 : HPLOT 39,0 : HPLOT 0,47 : HPLOT 39,47
|
|
: S = (HSCRN(0,0)=6 AND HSCRN(39,0)=6 AND HSCRN(0,47)=6 AND HSCRN(39,47)=6) : GOSUB 1
|
|
|
|
8040 T$ = "HPLOT x1,y1 TO x2,y2"
|
|
: HGR
|
|
: FOR Y = 0 TO 7: HCOLOR= Y : HPLOT 0,Y TO 7,Y: NEXT
|
|
: T = 0 : U = 0 : FOR I = 0 TO 7 : T = T + HSCRN(I,I) : U = U + I : NEXT
|
|
: S = (T=U) : GOSUB 1
|
|
|
|
8050 T$ = "HPLOT TO x2,y2"
|
|
: HGR
|
|
: FOR X = 0 TO 7: HCOLOR= X : HPLOT X*2,0 : HPLOT TO X*2,7 : NEXT
|
|
: T = 0 : U = 0 : FOR I = 0 TO 7 : T = T + HSCRN(I*2,I) : U = U + I : NEXT
|
|
: S = (T=U) : GOSUB 1
|
|
|
|
8100 REM Visual Check
|
|
|
|
8110 HGR
|
|
|
|
8120 T$ = "HCOLOR="
|
|
: T = 0 : U = 0 : FOR I = 0 TO 7 : HCOLOR= I : HPLOT 0,0 : T = T + I : NEXT
|
|
|
|
8130 T$ = "HPLOT x,y"
|
|
: HCOLOR= 3 : HPLOT 0,0 : HPLOT 279,0 : HPLOT 0,191 : HPLOT 279,191
|
|
|
|
8140 T$ = "HPLOT TO x,y"
|
|
: HCOLOR= 2 : HPLOT 10,10 : HPLOT TO 269,10 : HPLOT TO 269,181 : HPLOT TO 10,181 : HPLOT TO 10,10
|
|
|
|
8150 T$ = "HPLOT x,y TO x,y"
|
|
: HCOLOR= 1 : HPLOT 20,20 TO 259,20 : HPLOT 259,20 TO 259,171 : HPLOT 259,171 TO 20,171 : HPLOT 20,171 TO 20,20
|
|
|
|
8160 T$ = "HPLOT x,y TO x,y TO x,y"
|
|
: HCOLOR= 5 : HPLOT 30,30 TO 249,30 TO 249,161 TO 30,161 TO 30,30
|
|
|
|
8200 HGR : REM Something visually memorable
|
|
|
|
8210 W = 279 : H = 159
|
|
8220 FOR I = 0 TO 1 STEP 0.05
|
|
8230 HCOLOR= 1 : HPLOT 0,H * I TO W* (1-I),0
|
|
8231 HCOLOR= 2 : HPLOT 0,H * (1-I) TO W* (1-I),H
|
|
8232 HCOLOR= 5 : HPLOT W,H * I TO W * I,0
|
|
8233 HCOLOR= 6 : HPLOT W,H * (1-I) TO W * I,H
|
|
8234 NEXT
|
|
|
|
8999 TEXT
|
|
|
|
|
|
|
|
9000 PRINT : PRINT "POKE Compatibility Shims ";
|
|
: PRINT "UNIT TESTS NOT YET IMPLEMENTED ";
|
|
9001 POKE 49168,0 : POKE -16368,0 : REM Clear kbd strobe
|
|
9002 POKE 49200,0 : POKE -16336,0 : REM Toggle speaker
|
|
9003 POKE 49232,0 : POKE -16304,0 : REM Graphics mode
|
|
9004 POKE 49234,0 : POKE -16302,0 : REM Full graphics mode
|
|
9005 POKE 49235,0 : POKE -16301,0 : REM Split screen mode
|
|
9006 POKE 49238,0 : POKE -16298,0 : REM Lores mode
|
|
9007 POKE 49239,0 : POKE -16297,0 : REM Hires mode
|
|
9008 POKE 49233,0 : POKE -16303,0 : REM Text mode
|
|
9009 SPEED= 0 : SPEED= 255 : REM SPEED= (no-op)
|
|
|
|
10000 PRINT : PRINT "Numeric Functions ";
|
|
10001 DEF FN E(X) = ABS(X) < 0.001 : REM Within-Epsilon
|
|
|
|
10010 T$ = "ABS()"
|
|
: S = (ABS(1) = 1) : GOSUB 1
|
|
: S = (ABS(-1) = 1) : GOSUB 1
|
|
: S = (ABS(0) = 0) : GOSUB 1
|
|
|
|
10020 T$ = "ATN()"
|
|
: S = FN E(ATN(0) - 0.000) : GOSUB 1
|
|
: S = FN E(ATN(1) - 0.785) : GOSUB 1
|
|
: S = FN E(ATN(2) - 1.107) : GOSUB 1
|
|
|
|
10030 T$ = "COS()"
|
|
: S = FN E(COS(0) - 1.000) : GOSUB 1
|
|
: S = FN E(COS(1) - 0.540) : GOSUB 1
|
|
: S = FN E(COS(2) - -0.416) : GOSUB 1
|
|
|
|
10040 T$ = "EXP()"
|
|
: S = FN E(EXP(0) - 1.000) : GOSUB 1
|
|
: S = FN E(EXP(1) - 2.718) : GOSUB 1
|
|
: S = FN E(EXP(2) - 7.389) : GOSUB 1
|
|
|
|
10050 T$ = "INT()"
|
|
: S = (INT(1) = 1) : GOSUB 1
|
|
: S = (INT(1.5) = 1) : GOSUB 1
|
|
: S = (INT(-1.5) = -2) : GOSUB 1
|
|
|
|
10060 T$ = "LOG()"
|
|
: S = FN E(LOG(1) - 0.000) : GOSUB 1
|
|
: S = FN E(LOG(2) - 0.693) : GOSUB 1
|
|
: S = FN E(LOG(3) - 1.098) : GOSUB 1
|
|
|
|
10070 T$ = "RND()"
|
|
: T = RND(1) : S = (FN E(T - RND(0))) : GOSUB 1
|
|
: T = RND(-1) : T = RND(1) : U = RND(-1) : U = RND(1) : S = (FN E(T - U)) : GOSUB 1
|
|
|
|
10080 T$ = "SGN()"
|
|
: S = (SGN(-123)=-1): GOSUB 1
|
|
: S = (SGN( 0)= 0): GOSUB 1
|
|
: S = (SGN( 123)= 1): GOSUB 1
|
|
|
|
10090 T$ = "SIN()"
|
|
: S = FN E(SIN(0) - 0.000) : GOSUB 1
|
|
: S = FN E(SIN(1) - 0.841) : GOSUB 1
|
|
: S = FN E(SIN(2) - 0.909) : GOSUB 1
|
|
|
|
10100 T$ = "SQR()"
|
|
: S = FN E(SQR(0) - 0.000) : GOSUB 1
|
|
: S = FN E(SQR(1) - 1.000) : GOSUB 1
|
|
: S = FN E(SQR(2) - 1.414) : GOSUB 1
|
|
|
|
10110 T$ = "TAN()"
|
|
: S = FN E(TAN(0) - 0.000) : GOSUB 1
|
|
: S = FN E(TAN(1) - 1.557) : GOSUB 1
|
|
: S = FN E(TAN(2) --2.185) : GOSUB 1
|
|
|
|
|
|
11000 PRINT : PRINT "String Functions ";
|
|
|
|
11010 T$ = "LEN()"
|
|
: S = (LEN("ABC") = 3) : GOSUB 1
|
|
: S = (LEN("") = 0) : GOSUB 1
|
|
|
|
11020 T$ = "LEFT$()"
|
|
: S = (LEFT$("ABC",0) = "") : GOSUB 1
|
|
: S = (LEFT$("ABC",2) = "AB") : GOSUB 1
|
|
: S = (LEFT$("ABC",4) = "ABC") : GOSUB 1
|
|
|
|
11030 T$ = "MID$()"
|
|
: S = (MID$("ABCD",2,2) = "BC") : GOSUB 1
|
|
: S = (MID$("ABCD",3) = "CD") : GOSUB 1
|
|
: S = (MID$("ABCD",4,3) = "D") : GOSUB 1
|
|
|
|
11040 T$ = "RIGHT$()"
|
|
: S = (RIGHT$("ABC",0) = "") : GOSUB 1
|
|
: S = (RIGHT$("ABC",2) = "BC") : GOSUB 1
|
|
: S = (RIGHT$("ABC",4) = "ABC") : GOSUB 1
|
|
|
|
|
|
12000 PRINT : PRINT "Type Conversion Functions ";
|
|
|
|
12010 T$ = "ASC()"
|
|
: S = (ASC(" ") = 32) : GOSUB 1
|
|
: S = (ASC("A") = 65) : GOSUB 1
|
|
: S = (ASC("z") = 122) : GOSUB 1
|
|
: S = (ASC(CHR$(4)) = 4) : GOSUB 1
|
|
|
|
12020 T$ = "CHR$()"
|
|
: S = (CHR$(32) = " ") : GOSUB 1
|
|
: S = (CHR$(65) = "A") : GOSUB 1
|
|
: S = (CHR$(122) = "z") : GOSUB 1
|
|
|
|
12030 T$ = "STR$()"
|
|
: S = (STR$(-1) = "-1") : GOSUB 1
|
|
: S = (STR$(1.5) = "1.5") : GOSUB 1
|
|
: S = (STR$(3.1415) = "3.1415") : GOSUB 1
|
|
: S = (VAL(STR$(3.1415)) = 3.1415) : GOSUB 1
|
|
|
|
12040 T$ = "VAL()"
|
|
: S = (VAL("-1") = -1) : GOSUB 1
|
|
: S = (VAL("1.5") = 1.5) : GOSUB 1
|
|
: S = (VAL("3.1415") = 3.1415) : GOSUB 1
|
|
|
|
|
|
13000 PRINT : PRINT "System Interaction Functions ";
|
|
|
|
13010 T$ = "FRE()"
|
|
: S = (FRE(0) OR 1) : GOSUB 1
|
|
|
|
13020 IF NOT PD THEN PRINT "<skipping PDL()>"; : GOTO 13030
|
|
13021 T$ = "PDL()"
|
|
: T = PDL(0) : S = (0 <= T) AND (T < 256) : GOSUB 1
|
|
|
|
13030 T$ = "POS()"
|
|
: T = POS(0) : HTAB 1 : S = (POS(0) = 0) : HTAB T + 1 : GOSUB 1
|
|
|
|
13040 IF NOT LR THEN PRINT "<skipping SCRN()>"; : GOTO 13050
|
|
13041 T$ = "SCRN()"
|
|
: T = 0 : FOR I = 0 TO 15 : COLOR= I : PLOT I,I : T = T + I : NEXT
|
|
: U = 0 : FOR I = 0 TO 15 : U = U + SCRN(I,I) : NEXT
|
|
: S = (T=U) : GOSUB 1
|
|
|
|
13050 IF NOT HR THEN PRINT "<skipping HSCRN()>"; : GOTO 13060
|
|
13051 T$ = "HSCRN()"
|
|
: T = 0 : FOR I = 0 TO 7 : HCOLOR= I : HPLOT I,I : T = T + I : NEXT
|
|
: U = 0 : FOR I = 0 TO 7 : U = U + HSCRN(I,I) : NEXT
|
|
: S = (T=U) : GOSUB 1
|
|
|
|
13060 REM (goto target)
|
|
|
|
14000 PRINT : PRINT "User Defined Functions ";
|
|
|
|
14010 T$ = "FN A()"
|
|
: DEF FN A(X) = X + X : S = (FN A(3) = 6) : GOSUB 1
|
|
: DEF FN A(X) = X * X : S = (FN A(3) = 9) : GOSUB 1
|
|
|
|
14020 T$ = "FN A$() [language extension]"
|
|
: DEF FN A$(X$) = X$ + X$ : S = (FN A$("ABC") = "ABCABC") : GOSUB 1
|
|
|
|
15000 PRINT : PRINT "PEEK Compatibility Shims ";
|
|
: PRINT "UNIT TESTS NOT FULLY IMPLEMENTED ";
|
|
15001 X = PEEK(49152) : X = PEEK(-16384) : REM Read keyboard
|
|
15002 X = PEEK(49168) : X = PEEK(-16368) : REM Clear keyboard strobe
|
|
15003 X = PEEK(49200) : X = PEEK(-16336) : REM Toggle speaker (no-op)
|
|
15004 X = PEEK(49248) : X = PEEK(-16288) : REM Read paddle button 3
|
|
15005 X = PEEK(49249) : X = PEEK(-16287) : REM Read paddle button 0
|
|
15006 X = PEEK(49250) : X = PEEK(-16286) : REM Read paddle button 1
|
|
15007 X = PEEK(49251) : X = PEEK(-16285) : REM Read paddle button 2
|
|
15008 X = PEEK(78) + 256 * PEEK(79) : REM Entropy generator
|
|
|
|
15010 REM **********************************************
|
|
15010 REM Do as part of I/O follow-on module
|
|
15010 REM **********************************************
|
|
|
|
15020 T$ = "PEEK(49178) RdTEXT"
|
|
: S = (PEEK(49178) > 127) : GOSUB 1
|
|
: U = PEEK(36) : V = PEEK(37) : GR : S = (PEEK(49178) < 128) : TEXT : POKE 36,U : POKE 37,V : GOSUB 1
|
|
|
|
15030 T$ = "PEEK(49179) RdMIXED"
|
|
: HGR : S = (PEEK(49179) > 127) : TEXT : GOSUB 1
|
|
: HGR2 : S = (PEEK(49179) < 128) : TEXT : GOSUB 1
|
|
|
|
15040 T$ = "PEEK(49180) RdPage2"
|
|
: HGR2 : S = (PEEK(49180) > 127) : TEXT : GOSUB 1
|
|
: HGR : S = (PEEK(49180) < 128) : TEXT : GOSUB 1
|
|
|
|
15050 T$ = "PEEK(49181) RdHiRes"
|
|
: HGR : S = (PEEK(49181) > 127) : TEXT : GOSUB 1
|
|
: U = PEEK(36) : V = PEEK(37) : GR : S = (PEEK(49181) < 128) : TEXT : POKE 36,U : POKE 37,V : GOSUB 1
|
|
|
|
15060 T$ = "PEEK(49182) RdAltChar"
|
|
: S = (PEEK(49182) < 128) : GOSUB 1
|
|
: PRINT CHR$(15);CHR$(27); : S = (PEEK(49182) > 127) : PRINT CHR$(24);CHR$(14); : GOSUB 1
|
|
|
|
15070 T$ = "PEEK(49183) Rd80Col"
|
|
: S = (PEEK(49183) > 127) : GOSUB 1
|
|
|
|
|
|
16000 PRINT : PRINT "Operators ";
|
|
|
|
16010 T$ = "="
|
|
: S = (1 = 1.0) : GOSUB 1
|
|
: S = ("ABC" = "ABC") : GOSUB 1
|
|
|
|
16020 T$ = "<"
|
|
: S = (1 < 2) : GOSUB 1
|
|
: S = ("A" < "B") : GOSUB 1
|
|
|
|
16030 T$ = ">"
|
|
: S = (2 > 1) : GOSUB 1
|
|
: S = ("B" > "A") : GOSUB 1
|
|
|
|
16040 T$ = "<="
|
|
: S = (1 <= 1) : GOSUB 1
|
|
: S = (1 <= 2) : GOSUB 1
|
|
: S = (1 < = 1) : GOSUB 1
|
|
: S = (1 < = 2) : GOSUB 1
|
|
: S = ("A" <= "A") : GOSUB 1
|
|
: S = ("A" <= "B") : GOSUB 1
|
|
: S = ("A" < = "A") : GOSUB 1
|
|
: S = ("A" < = "B") : GOSUB 1
|
|
16041 T$ = "=<"
|
|
: S = (1 =< 1) : GOSUB 1
|
|
: S = (1 =< 2) : GOSUB 1
|
|
: S = (1 = < 1) : GOSUB 1
|
|
: S = (1 = < 2) : GOSUB 1
|
|
: S = ("A" =< "A") : GOSUB 1
|
|
: S = ("A" =< "B") : GOSUB 1
|
|
: S = ("A" = < "A") : GOSUB 1
|
|
: S = ("A" = < "B") : GOSUB 1
|
|
|
|
16050 T$ = ">="
|
|
: S = (1 >= 1) : GOSUB 1
|
|
: S = (2 >= 1) : GOSUB 1
|
|
: S = (1 > = 1) : GOSUB 1
|
|
: S = (2 > = 1) : GOSUB 1
|
|
: S = ("B" >= "A") : GOSUB 1
|
|
: S = ("B" >= "B") : GOSUB 1
|
|
: S = ("B" > = "A") : GOSUB 1
|
|
: S = ("B" > = "B") : GOSUB 1
|
|
16051 T$ = "=>"
|
|
: S = (1 => 1) : GOSUB 1
|
|
: S = (2 => 1) : GOSUB 1
|
|
: S = (1 = > 1) : GOSUB 1
|
|
: S = (2 = > 1) : GOSUB 1
|
|
: S = ("B" => "A") : GOSUB 1
|
|
: S = ("B" => "B") : GOSUB 1
|
|
: S = ("B" = > "A") : GOSUB 1
|
|
: S = ("B" = > "B") : GOSUB 1
|
|
|
|
16060 T$ = "<>"
|
|
: S = (1 <> 2) : GOSUB 1
|
|
: S = (1 < > 2) : GOSUB 1
|
|
: S = ("A" <> "B") : GOSUB 1
|
|
: S = ("A" < > "B") : GOSUB 1
|
|
16061 T$ = "><"
|
|
: S = (1 >< 2) : GOSUB 1
|
|
: S = (1 > < 2) : GOSUB 1
|
|
: S = ("A" >< "B") : GOSUB 1
|
|
: S = ("A" > < "B") : GOSUB 1
|
|
|
|
16070 T$ = "AND" : S = (1 AND 1) : GOSUB 1
|
|
16080 T$ = "OR" : S = (0 OR 1) : GOSUB 1
|
|
16090 T$ = "NOT" : S = (NOT 0) : GOSUB 1
|
|
|
|
16100 T$ = "^"
|
|
: S = (0^0 = 1) : GOSUB 1
|
|
: S = (1^1 = 1) : GOSUB 1
|
|
: S = (2^2 = 4) : GOSUB 1
|
|
: S = (3^0 = 1) : GOSUB 1
|
|
: S = (FN E(1.5^-2 - 0.444)) : GOSUB 1
|
|
|
|
16110 T$ = "*"
|
|
: S = (1*0 = 0) : GOSUB 1
|
|
: S = (1*1 = 1) : GOSUB 1
|
|
: S = (-1*1 = -1) : GOSUB 1
|
|
: S = (-1*-1 = 1) : GOSUB 1
|
|
: S = (0.5*2 = 1) : GOSUB 1
|
|
|
|
16120 T$ = "/"
|
|
: S = (1/1 = 1) : GOSUB 1
|
|
: S = (-1/1 = -1) : GOSUB 1
|
|
: S = (-1/-1 = 1) : GOSUB 1
|
|
: S = (2/0.5 = 4) : GOSUB 1
|
|
|
|
16130 T$ = "+"
|
|
: S = (0+0 = 0) : GOSUB 1
|
|
: S = (0+1 = 1) : GOSUB 1
|
|
: S = (-1+1 = 0) : GOSUB 1
|
|
: S = (1.5+.5 = 2) : GOSUB 1
|
|
: S = ("A"+"B" = "AB") : GOSUB 1
|
|
: S = ("A"+"B"+"C" = "ABC") : GOSUB 1
|
|
: S = (""+"" = "") : GOSUB 1
|
|
|
|
16140 T$ = "-"
|
|
: S = (0-0 = 0) : GOSUB 1
|
|
: S = (1-0 = 1) : GOSUB 1
|
|
: S = (-1--1 = 0) : GOSUB 1
|
|
: S = (1.5-.5 = 1) : GOSUB 1
|
|
|
|
16150 T$ = "Precedence"
|
|
: S = (FN E((2 + 3 - 4 * 5 / 6 ^ 7) - 4.999)) : GOSUB 1
|
|
|
|
17000 PRINT : PRINT "DOS Commands ";
|
|
|
|
17010 PRINT CHR$(4)"OPEN TESTDATA"
|
|
: PRINT CHR$(4)"CLOSE TESTDATA"
|
|
: PRINT CHR$(4)"DELETE TESTDATA"
|
|
|
|
17020 T$ = "Sequential Access OPEN/WRITE/READ"
|
|
: PRINT CHR$(4)"OPEN TESTDATA"
|
|
: PRINT CHR$(4)"WRITE TESTDATA"
|
|
: FOR I = 1 TO 10 : PRINT I : NEXT
|
|
: PRINT CHR$(4)"CLOSE TESTDATA"
|
|
: PRINT CHR$(4)"OPEN TESTDATA"
|
|
: PRINT CHR$(4)"READ TESTDATA"
|
|
: T = 0 : FOR I = 1 TO 10 : INPUT J : T = T + J : NEXT
|
|
: PRINT CHR$(4)"CLOSE TESTDATA"
|
|
: S = (T = 55) : GOSUB 1
|
|
|
|
17030 T$ = "Sequential Access APPEND/WRITE/READ"
|
|
: PRINT CHR$(4)"APPEND TESTDATA"
|
|
: PRINT CHR$(4)"WRITE TESTDATA"
|
|
: FOR I = 1 TO 10 : PRINT -I : NEXT
|
|
: PRINT CHR$(4)"CLOSE TESTDATA"
|
|
: PRINT CHR$(4)"OPEN TESTDATA"
|
|
: PRINT CHR$(4)"READ TESTDATA"
|
|
: T = 0 : FOR I = 1 TO 20 : INPUT J : T = T + J : NEXT
|
|
: PRINT CHR$(4)"CLOSE TESTDATA"
|
|
: S = (T = 0) : GOSUB 1
|
|
|
|
17040 T$ = "Sequential Access/ONERR"
|
|
: PRINT CHR$(4)"OPEN JABBERWOCKY"
|
|
: PRINT CHR$(4)"READ JABBERWOCKY"
|
|
: ONERR GOTO 17042
|
|
17041 N = 0
|
|
: FOR N = 0 TO 10 : INPUT A$ : NEXT
|
|
17042 POKE 216,0 : PRINT CHR$(4)"CLOSE" : S = (N = 4) : GOSUB 1
|
|
|
|
17050 T$ = "RENAME"
|
|
: PRINT CHR$(4)"OPEN TESTDATA"
|
|
: PRINT CHR$(4)"WRITE TESTDATA"
|
|
: FOR I = 1 TO 10 : PRINT I : NEXT
|
|
: PRINT CHR$(4)"CLOSE TESTDATA"
|
|
: PRINT CHR$(4)"RENAME TESTDATA, DATA2"
|
|
: PRINT CHR$(4)"OPEN DATA2"
|
|
: PRINT CHR$(4)"READ DATA2"
|
|
: T = 0 : FOR I = 1 TO 10 : INPUT J : T = T + J : NEXT
|
|
: PRINT CHR$(4)"CLOSE DATA2"
|
|
: S = (T = 55) : GOSUB 1
|
|
|
|
17500 T$ = "Fixed Length OPEN/WRITE/READ"
|
|
: F$ = "FIXEDLENTEST"
|
|
: PRINT CHR$(4)"OPEN "F$",L16"
|
|
: FOR I = 1 TO 20 : PRINT CHR$(4)"WRITE "F$",R";I : PRINT I * I : NEXT
|
|
: PRINT CHR$(4)"CLOSE "F$
|
|
: PRINT CHR$(4)"OPEN "F$",L16"
|
|
: T = 0 : FOR I = 20 TO 1 STEP -2 : PRINT CHR$(4)"READ "F$",R";I : INPUT J : T = T + J : NEXT
|
|
: PRINT CHR$(4)"CLOSE "F$
|
|
: S = (T = 1540) : GOSUB 1
|
|
|
|
18000 PRINT : PRINT "Regression Tests ";
|
|
|
|
18010 T$ = "global rhs in OR"
|
|
: T = 0 : FOR I = 1 TO 4
|
|
18011 IF I = 1 OR I = 3 GOTO 18014
|
|
18012 IF I = 2 OR I = 4 GOTO 18014
|
|
18013 T = 1
|
|
18014 NEXT
|
|
: S = (T=0) : GOSUB 1
|
|
|
|
18020 T$ = "Operator Associativity"
|
|
: S = (10 / 2 * 5 = 25): GOSUB 1
|
|
: S = (2 ^ 3 ^ 4 = 4096): GOSUB 1
|
|
|
|
18030 T$ = "VAL() on bad input"
|
|
: S = (VAL("") = 0): GOSUB 1
|
|
: S = (VAL("abc") = 0): GOSUB 1
|
|
|
|
18040 T$ = "Array Dimensions"
|
|
: DIM A1(10) : X = A1(10)
|
|
: S = (1): GOSUB 1
|
|
|
|
18050 T$ = "Non-integer Array Indices"
|
|
: DIM A2(10) : A2(1) = 123
|
|
: S = (A2(1.5) = 123) : GOSUB 1
|
|
|
|
18060 T$ = "Array Lower Bounds"
|
|
: T = 1 : ONERR GOTO 18062
|
|
18061 X = A2(-1) :
|
|
: T = 2
|
|
18062 S = (T=1) AND (PEEK(222)=53) : GOSUB 1 : POKE 216,0
|
|
|
|
18070 T$ = "Array Upper Bounds"
|
|
: T = 1 : ONERR GOTO 18072
|
|
18071 X = A2(11) :
|
|
: T = 2
|
|
18072 S = (T=1) AND (PEEK(222)=107) : GOSUB 1 : POKE 216,0
|
|
|
|
18080 T$ = "Duplicate Lines"
|
|
18081 T = 1
|
|
18082 T = T + 1 : REM Should be overwritten
|
|
18082 T = T + 1
|
|
18083 S = (T = 2) : GOSUB 1
|
|
|
|
18090 T$ = "Line Ordering"
|
|
18092 T = 2
|
|
18091 T = 1
|
|
18093 S = (T = 2) : GOSUB 1
|
|
|
|
18100 T$ = "Output Hook Precedence"
|
|
: A$ = "abc" + CHR$(7) + "xyz"
|
|
: PRINT CHR$(4)"OPEN TESTDATA"
|
|
: PRINT CHR$(4)"WRITE TESTDATA"
|
|
: PRINT A$
|
|
: PRINT CHR$(4)"CLOSE TESTDATA"
|
|
: PRINT CHR$(4)"OPEN TESTDATA"
|
|
: PRINT CHR$(4)"READ TESTDATA"
|
|
: INPUT B$
|
|
: PRINT CHR$(4)"CLOSE TESTDATA"
|
|
: S = (A$ = B$) : GOSUB 1
|
|
|
|
18110 T$ = "Invalid DOS Command"
|
|
: T = 1 : ONERR GOTO 18112
|
|
18111 PRINT CHR$(4);CHR$(5)
|
|
: T = 2
|
|
18112 S = (T=1) AND (PEEK(222)=16) : GOSUB 1
|
|
|
|
20000 PRINT : PRINT : PRINT "Executed tests: "; TE
|
|
20010 PRINT "Successful tests: "; TS
|
|
20019 IF F THEN INVERSE
|
|
20020 PRINT "Failed tests: "; F; : NORMAL
|