diff --git a/basic.js b/basic.js index 141b149..7c6719f 100644 --- a/basic.js +++ b/basic.js @@ -632,7 +632,6 @@ this.basic = (function() { throw new EndProgram(); }, - ////////////////////////////////////////////////////////////////////// // // Error Handling Statements @@ -641,6 +640,7 @@ this.basic = (function() { 'onerr_goto': function ONERR_GOTO(line) { state.onerr_handler = line; + throw new NextLine(); }, 'resume': function RESUME() { diff --git a/samples/sample.unittests.txt b/samples/sample.unittests.txt index 1bd958d..73e9804 100644 --- a/samples/sample.unittests.txt +++ b/samples/sample.unittests.txt @@ -10,9 +10,12 @@ 110 A = 1 : A$ = "a" : A(1) = 2 : A$(1) = "b" : CLEAR 200 REM Feature Detection -210 LR = 0 : ONERR GOTO 220 : GR : LR = 1 -220 HR = 0 : ONERR GOTO 240 : HGR : HR = 1 -230 PD = 0 : ONERR GOTO 240 : X = PDL(0) : PD = 1 +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" @@ -122,125 +125,128 @@ 3000 PRINT : PRINT "Error Handling "; 3010 T$ = "ONERR GOTO" -: T = 1 : ONERR GOTO 3015 : T = 1 / 0 -3011 T = 2 +: 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 : T = 1 / T : GOTO 3029 +: 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 -: GOSUB 3045 +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 3101 -: NEXT +: T = 1 : ONERR GOTO 3102 +3101 NEXT : T = 2 -3101 S = (T=1) AND (PEEK(222)=0) : GOSUB 1 +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 3121 -: RETURN +: T = 1 : ONERR GOTO 3122 +3121 RETURN : T = 2 -3121 S = (T=1) AND (PEEK(222)=22) : GOSUB 1 +3122 S = (T=1) AND (PEEK(222)=22) : GOSUB 1 3130 T$ = "OUT OF DATA" -: T = 1 : ONERR GOTO 3131 -: FOR A = 1 TO 1000 : READ A$ : NEXT +: T = 1 : ONERR GOTO 3132 +3131 FOR A = 1 TO 1000 : READ A$ : NEXT : T = 2 -3131 S = (T=1) AND (PEEK(222)=42) : GOSUB 1 +3132 S = (T=1) AND (PEEK(222)=42) : GOSUB 1 3140 T$ = "ILLEGAL QUANTITY" -: T = 1 : ONERR GOTO 3141 -: A% = 32768 +: T = 1 : ONERR GOTO 3142 +3141 A% = 32768 : T = 2 -3141 S = (T=1) AND (PEEK(222)=53) : GOSUB 1 +3142 S = (T=1) AND (PEEK(222)=53) : GOSUB 1 3145 T$ = "ILLEGAL QUANTITY" -: T = 1 : ONERR GOTO 3146 -: A = ASC("") +: T = 1 : ONERR GOTO 3147 +3146 A = ASC("") : T = 2 -3146 S = (T=1) AND (PEEK(222)=53) : GOSUB 1 +3147 S = (T=1) AND (PEEK(222)=53) : GOSUB 1 3150 T$ = "OVERFLOW" : -: T = 1 : ONERR GOTO 3151 -: A = 256^256^256 +: T = 1 : ONERR GOTO 3152 +3151 A = 256^256^256 : T = 2 -3151 S = (T=1) AND (PEEK(222)=69) : GOSUB 1 +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 3161 -: REM A$ = "x" +: 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 -3161 REM S = (T=1) AND (PEEK(222)=77) : GOSUB 1 +3162 REM S = (T=1) AND (PEEK(222)=77) : GOSUB 1 3170 T$ = "UNDEFINED STATEMENT" : -: T = 1 : ONERR GOTO 3171 -: GOTO 3172 +: T = 1 : ONERR GOTO 3172 +3171 GOTO 3173 : T = 2 -3171 S = (T=1) AND (PEEK(222)=90) : GOSUB 1 +3172 S = (T=1) AND (PEEK(222)=90) : GOSUB 1 3180 T$ = "BAD SUBSCRIPT" : -: T = 1 : ONERR GOTO 3181 -: DIM BS(3) : BS(4) = 123 +: T = 1 : ONERR GOTO 3182 +3181 DIM BS(3) : BS(4) = 123 : T = 2 -3181 S = (T=1) AND (PEEK(222)=107) : GOSUB 1 +3182 S = (T=1) AND (PEEK(222)=107) : GOSUB 1 3190 T$ = "REDIMENSION ARRAY" : -: T = 1 : ONERR GOTO 3191 -: DIM RA(3) : DIM RA(3) +: T = 1 : ONERR GOTO 3192 +3191 DIM RA(3) : DIM RA(3) : T = 2 -3191 S = (T=1) AND (PEEK(222)=120) : GOSUB 1 +3192 S = (T=1) AND (PEEK(222)=120) : GOSUB 1 3200 T$ = "DIVISION BY ZERO" : -: T = 1 : ONERR GOTO 3201 -: A = 1 / 0 +: T = 1 : ONERR GOTO 3202 +3201 A = 1 / 0 : T = 2 -3201 S = (T=1) AND (PEEK(222)=133) : GOSUB 1 +3202 S = (T=1) AND (PEEK(222)=133) : GOSUB 1 3210 T$ = "TYPE MISMATCH" : -: T = 1 : ONERR GOTO 3211 -: RESTORE : FOR I = 1 TO 1000 : READ A : NEXT +: T = 1 : ONERR GOTO 3212 +3211 RESTORE : FOR I = 1 TO 1000 : READ A : NEXT : T = 2 -3211 S = (T=1) AND (PEEK(222)=163) : GOSUB 1 +3212 S = (T=1) AND (PEEK(222)=163) : GOSUB 1 3215 T$ = "TYPE MISMATCH" : -: T = 1 : ONERR GOTO 3216 -: RESTORE : FOR I = 1 TO 1000 : READ A% : NEXT +: T = 1 : ONERR GOTO 3217 +3216 RESTORE : FOR I = 1 TO 1000 : READ A% : NEXT : T = 2 -3216 S = (T=1) AND (PEEK(222)=163) : GOSUB 1 +3217 S = (T=1) AND (PEEK(222)=163) : GOSUB 1 -3220 T$ = "STRING TOO LONG" : REM Strings are "infinite", can't test +3220 T$ = "STRING TOO LONG" + : REM Strings are "infinite", can't test 3230 T$ = "FORMULA TOO COMPLEX" -: REM T = 1 : ONERR GOTO 3231 -: REM DEF FN FC(x) = FN FC(x) + 1 : X = FN FC(0) +: REM T = 1 : ONERR GOTO 3232 +3231 REM DEF FN FC(x) = FN FC(x) + 1 : X = FN FC(0) : REM T = 2 -3231 REM S = (T=1) AND (PEEK(222)=191): GOSUB 1 +3232 REM S = (T=1) AND (PEEK(222)=191): GOSUB 1 3240 T$ = "UNDEFINED FUNCTION" : -: T = 1 : ONERR GOTO 3241 -: X = FN UF(0) +: T = 1 : ONERR GOTO 3242 +3241 X = FN UF(0) : T = 2 -3241 S = (T=1) AND (PEEK(222)=224) : GOSUB 1 +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 3261 -: STOP +: T = 1 : ONERR GOTO 3262 +3261 STOP : T = 2 -3261 S = (T=1) AND (PEEK(222)=255) : GOSUB 1 +3262 S = (T=1) AND (PEEK(222)=255) : GOSUB 1 3270 T$ = "CALL-3288" : : T = 1 : ONERR GOTO 3274 @@ -254,6 +260,12 @@ : 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 @@ -748,7 +760,8 @@ 17040 T$ = "Sequential Access/ONERR" : PRINT CHR$(4)"OPEN JABBERWOCKY" : PRINT CHR$(4)"READ JABBERWOCKY" -: ONERR GOTO 17042 : N = 0 +: 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 @@ -801,16 +814,16 @@ : S = (A2(1.5) = 123) : GOSUB 1 18060 T$ = "Array Lower Bounds" -: T = 1 : ONERR GOTO 18061 -: X = A2(-1) : +: T = 1 : ONERR GOTO 18062 +18061 X = A2(-1) : : T = 2 -18061 S = (T=1) AND (PEEK(222)=53) : GOSUB 1 : POKE 216,0 +18062 S = (T=1) AND (PEEK(222)=53) : GOSUB 1 : POKE 216,0 18070 T$ = "Array Upper Bounds" -: T = 1 : ONERR GOTO 18071 -: X = A2(11) : +: T = 1 : ONERR GOTO 18072 +18071 X = A2(11) : : T = 2 -18071 S = (T=1) AND (PEEK(222)=107) : GOSUB 1 : POKE 216,0 +18072 S = (T=1) AND (PEEK(222)=107) : GOSUB 1 : POKE 216,0 18080 T$ = "Duplicate Lines" 18081 T = 1