diff --git a/src/builtins/internal.c b/src/builtins/internal.c index edf39e3e..2f30b727 100644 --- a/src/builtins/internal.c +++ b/src/builtins/internal.c @@ -293,7 +293,14 @@ B indistinguishable_c2(B t, B w, B x) { return m_i32(r); } -#ifdef TEST_BITCPY +B internalTemp_c1(B t, B x) { + return x; +} + +#if DEBUG && !defined(TEST_UTILS) + #define TEST_UTILS 1 +#endif +#ifdef TEST_UTILS #include "../utils/mut.h" #endif #if NATIVE_COMPILER @@ -304,68 +311,92 @@ B indistinguishable_c2(B t, B w, B x) { extern i32 fullCellFills; extern i32 cellFillErrored; #endif -#if TEST_RANGE - #include "../utils/calls.h" -#endif -#if TEST_GROUP_STAT +#if TEST_UTILS && SINGELI extern void (*const si_group_statistics_i8)(void*,usz,uint8_t*,usz*,uint8_t*,usz*,int8_t*); extern void (*const si_group_statistics_i16)(void*,usz,uint8_t*,usz*,uint8_t*,usz*,int16_t*); extern void (*const si_group_statistics_i32)(void*,usz,uint8_t*,usz*,uint8_t*,usz*,int32_t*); #endif -B internalTemp_c1(B t, B x) { - #if TEST_GROUP_STAT - u8 bad; usz neg; u8 sort; usz change; i32 max; - #define CASE(T) \ - if (TI(x,elType)==el_##T) { T max_t; si_group_statistics_##T(tyany_ptr(x), IA(x), &bad, &neg, &sort, &change, &max_t); max = max_t; } \ - else - CASE(i8) CASE(i16) CASE(i32) - thrM("bad eltype"); - #undef CASE - decG(x); - f64* rp; B r = m_f64arrv(&rp, 5); - rp[0] = bad; rp[1] = neg; rp[2] = sort; rp[3] = change; rp[4] = max; - return r; - #endif - #if TEST_RANGE - i64 buf[2]; - bool b = getRange_fns[TI(x,elType)](tyany_ptr(x), buf, IA(x)); - decG(x); - f64* rp; - B r = m_f64arrv(&rp, 3); - rp[0] = buf[0]; - rp[1] = buf[1]; - rp[2] = b; - return r; - #endif - #if TEST_CELL_FILLS - if (isNum(x)) fullCellFills = o2iG(x); - B r = m_i32(cellFillErrored); - cellFillErrored = 0; - return r; - #endif - #if NATIVE_COMPILER - switchComp(); - B r = bqn_exec(x, bi_N); - switchComp(); - return r; - #endif - #ifdef TEST_BITCPY - SGetU(x) - bit_cpyN(bitarr_ptr(GetU(x,0)), o2s(GetU(x,1)), bitany_ptr(GetU(x,2)), o2s(GetU(x,3)), o2s(GetU(x,4))); - #endif - return x; -} - + B internalTemp_c2(B t, B w, B x) { - #if NATIVE_COMPILER - return c2(native_comp, w, x); - #endif - #ifdef TEST_MUT - SGetU(x) - FILL_TO(tyarr_ptr(w), o2s(GetU(x,0)), o2s(GetU(x,1)), GetU(x,2), o2s(GetU(x,3))); - dec(w); - #endif - return x; + i32 o = o2i(w); + B r; + switch (o) { + case 0: { + printI(x); + return x; + } + + #if NATIVE_COMPILER + case 100: { + SGet(x) + r = c2(native_comp, Get(x,0), Get(x,1)); + goto dec_ret; + } + case 101: { + switchComp(); + B r = bqn_exec(x, bi_N); + switchComp(); + return r; + } + #endif + + #if TEST_UTILS + case 201: { // test/mut.bqn + SGetU(x) + FILL_TO(tyarr_ptr(GetU(x,4)), o2s(GetU(x,0)), o2s(GetU(x,1)), GetU(x,2), o2s(GetU(x,3))); + return x; + } + case 202: { // test/bitcpy.bqn + SGetU(x) + bit_cpyN(bitarr_ptr(GetU(x,0)), o2s(GetU(x,1)), bitany_ptr(GetU(x,2)), o2s(GetU(x,3)), o2s(GetU(x,4))); + return x; + } + case 203: { // test/cases/build-specific/test_range.bqn + i64 buf[2]; + bool b = getRange_fns[TI(x,elType)](tyany_ptr(x), buf, IA(x)); + decG(x); + f64* rp; + B r = m_f64arrv(&rp, 3); + rp[0] = buf[0]; + rp[1] = buf[1]; + rp[2] = b; + return r; + } + #endif + + #if TEST_UTILS && SINGELI + case 298: { // test/cases/build-specific/test_group_stat.bqn + u8 bad; usz neg; u8 sort; usz change; i32 max; + #define CASE(T) \ + if (TI(x,elType)==el_##T) { T max_t; si_group_statistics_##T(tyany_ptr(x), IA(x), &bad, &neg, &sort, &change, &max_t); max = max_t; } \ + else + CASE(i8) CASE(i16) CASE(i32) + thrM("bad eltype"); + #undef CASE + decG(x); + f64* rp; B r = m_f64arrv(&rp, 5); + rp[0] = bad; rp[1] = neg; rp[2] = sort; rp[3] = change; rp[4] = max; + return r; + } + #endif + + #if TEST_CELL_FILLS + case 299: { // test/cells.bqn + if (isNum(x)) fullCellFills = o2iG(x); + B r = m_i32(cellFillErrored); + cellFillErrored = 0; + return r; + } + #endif + + default: + thrF("Unknown/unsupported •internal.Temp mode: %i", o); + } + thrM("•internal.Temp: shouldn't break!"); + + dec_ret: MAYBE_UNUSED; + dec(x); + return r; } B heapDump_c1(B t, B x) { diff --git a/test/README.md b/test/README.md index 257c70a3..7f5a7faa 100644 --- a/test/README.md +++ b/test/README.md @@ -1,6 +1,6 @@ ## Tests -Must be run from the projects root directory. +Must be run from the projects root directory. Some tests require `-DTEST_UTILS` (enabled by default in debug builds) ``` C test/mainCfgs.sh path/to/mlochbaum/BQN // run the test suite for a couple primary configurations @@ -10,9 +10,9 @@ test/run.bqn // run tests in test/cases/ ./BQN test/cmp.bqn // fuzz-test scalar comparison functions =≠<≤>≥ ./BQN test/equal.bqn // fuzz-test 𝕨≡𝕩 ./BQN test/copy.bqn // fuzz-test creating new arrays with elements copied from another -./BQN test/bitcpy.bqn // fuzz-test bit_cpy; requires -DTEST_BITCPY +./BQN test/bitcpy.bqn // fuzz-test bit_cpy ./BQN test/bit.bqn // fuzz-test •bit functions -./BQN test/mut.bqn // fuzz-test mut.h (currently just bitarr fill); requires -DTEST_MUT +./BQN test/mut.bqn // fuzz-test mut.h (currently just bitarr fill) ./BQN test/hash.bqn // fuzz-test hashing ./BQN test/squeezeValid.bqn // fuzz-test squeezing giving a correct result ./BQN test/squeezeExact.bqn // fuzz-test squeezing giving the exact smallest result @@ -41,7 +41,7 @@ tests: # the '(' and ')' lines must have no other characters in them ) -# flags addable anywhere in code: +# flags addable anywhere in code to restrict when it's run: %SLOW # enable only if 'slow' argument present %!DEBUG # disable if 'debug' argument present %!HEAPVERIFY # disable if 'heapverify' argument present diff --git a/test/bitcpy.bqn b/test/bitcpy.bqn index 3933b9ea..fd318afc 100644 --- a/test/bitcpy.bqn +++ b/test/bitcpy.bqn @@ -1,4 +1,3 @@ -# make o3-singeli f=-DTEST_BITCPY && ./BQN test/bitcpy.bqn ⟨Temp, Type, Unshare, Squeeze, Info, Variation⟩ ← •internal u ← ⌊100×(•UnixTime+1|100וMonoTime)@ # u ↩ 123 @@ -21,7 +20,7 @@ Do ← { 𝕊: i ← ↕bl exp ← ((bs+i)⊏b)⌾((as+i)⊸⊏) a aC ← Unshare a - Temp ⟨aC, as, b, bs, bl⟩ + 202 Temp ⟨aC, as, b, bs, bl⟩ aC ≢ exp? •Out "Fail:" F ← {(¬ ·∧`⌾⌽ ' '⊸=)⊸/ ⥊' '∾˘˜ ↑‿64⥊ '0'+𝕩} diff --git a/test/cases/build-specific/test_group_stat.bqn b/test/cases/build-specific/test_group_stat.bqn index eb0b8fe5..5cdeb8ec 100644 --- a/test/cases/build-specific/test_group_stat.bqn +++ b/test/cases/build-specific/test_group_stat.bqn @@ -1,7 +1,6 @@ -# needs: Singeli & -DTEST_GROUP_STAT -"basic test doesn't work; are you on a -DTEST_GROUP_STAT build?" ! 0‿0‿1‿10‿9 ≡ •internal.Temp ↕10 +298 •internal.Temp ↕10 %% 0‿0‿1‿10‿9 -%DEF tvar AllEq←{v←⊑𝕩 ⋄ {𝕩≡v?1;!𝕩‿v}¨ ⥊𝕩 ⋄ v} ⋄ _tvar ← {Sel _𝕣 a: AllEq {Sel •internal.Temp 𝕩•internal.Variation a}¨ ∊⟜"Ai8"‿"Ai16"‿"Ai32"⊸/ •internal.ListVariations •internal.Squeeze a} +%DEF tvar AllEq←{v←⊑𝕩 ⋄ {𝕩≡v?1;!𝕩‿v}¨ ⥊𝕩 ⋄ v} ⋄ _tvar ← {Sel _𝕣 a: AllEq {Sel 298 •internal.Temp 𝕩•internal.Variation a}¨ ∊⟜"Ai8"‿"Ai16"‿"Ai32"⊸/ •internal.ListVariations •internal.Squeeze a} %USE tvar ⋄ ⊢_tvar ↕10 %% 0‿0‿1‿10‿9 %USE tvar ⋄ AllEq {a←𝕩⥊0 ⋄ AllEq {⊑_tvar ¯2⌾(𝕩⊸⊑) a}¨ ↕𝕩}¨ 1+↕40 %% 1 diff --git a/test/cases/build-specific/test_range.bqn b/test/cases/build-specific/test_range.bqn index 6aec2704..44e36fc2 100644 --- a/test/cases/build-specific/test_range.bqn +++ b/test/cases/build-specific/test_range.bqn @@ -1,12 +1,11 @@ -# needs: -DTEST_RANGE -"basic test doesn't work; are you on a -DTEST_RANGE build?" ! 1‿9‿1 ≡ •internal.Temp 3‿1‿4‿1‿5‿9 +203 •internal.Temp 3‿1‿4‿1‿5‿9 %% 1‿9‿1 -%DEF invalid Invalid ← {·‿·‿0: 1; s‿e‿1: (s<-2⋆52) ∨ e>2⋆52}∘•internal.Temp +%DEF invalid Invalid ← {·‿·‿0: 1; s‿e‿1: (s<-2⋆52) ∨ e>2⋆52} 203•internal.Temp⊢ -≢(⟨⟨0‿9‿1,↕10⟩ ⋄ ⟨¯5‿¯3‿1 ⋄ ¯5‿¯3‿¯4‿¯4‿¯4‿¯4‿¯4⟩⟩∾{⟨⟨¯2,𝕩-3,1⟩,¯2+↕𝕩⟩}¨1+↕100) {exp‿a𝕊𝕩: exp (⋈!≡) •internal.Temp 𝕩•internal.Variation a}⌜ "Ai8"‿"Ai16"‿"Ai32"‿"Af64" -T←⋈ ! ⊣ ≡ ·•internal.Temp "Ab"•internal.Variation⊢ ⋄ ≠{𝕊n: 1‿1‿1 T 𝕩⥊1 ⋄ 0‿0‿1 T 𝕩⥊0 ⋄ 0‿1 {0‿1‿1 T (¬𝕨)⌾(𝕩⊸⊑) n⥊𝕨}¨⍟(n>1) 2•rand.Range n}¨1+↕500 +≢(⟨⟨0‿9‿1,↕10⟩ ⋄ ⟨¯5‿¯3‿1 ⋄ ¯5‿¯3‿¯4‿¯4‿¯4‿¯4‿¯4⟩⟩∾{⟨⟨¯2,𝕩-3,1⟩,¯2+↕𝕩⟩}¨1+↕100) {exp‿a𝕊𝕩: exp (⋈!≡) 203•internal.Temp 𝕩•internal.Variation a}⌜ "Ai8"‿"Ai16"‿"Ai32"‿"Af64" +T←⋈ ! ⊣ ≡ 203•internal.Temp "Ab"•internal.Variation⊢ ⋄ ≠{𝕊n: 1‿1‿1 T 𝕩⥊1 ⋄ 0‿0‿1 T 𝕩⥊0 ⋄ 0‿1 {0‿1‿1 T (¬𝕨)⌾(𝕩⊸⊑) n⥊𝕨}¨⍟(n>1) 2•rand.Range n}¨1+↕500 %USE invalid ⋄ Invalid¨ ⟨↕4, -⊸∾ 2⋆↕50, π×↕4, 10⥊2⋆60⟩ %% 0‿0‿1‿1 %USE invalid ⋄ ⟨2⋆63, 1.5, 0÷0⟩ {𝕨!Invalid 𝕨⌾(𝕩⊸⊑) 20⥊0}⌜ ↕20 %USE invalid ⋄ p←⟨1+2⋆-52, 1-2⋆-53⟩ ⋄ {𝕩!Invalid 𝕩⌾(10⊸⊑) 20⥊0}¨ ⟨∞, ¯∞, 0.1, ¯0.1⟩ ∾ ((1∾p) ×⌜ -⊸∾ 2⋆54+↕12) ∾○⥊ p ×⌜ 2⋆↕70 -≠{! 0‿0‿1 ≡ •internal.Temp 𝕩↑(𝕩⥊0)∾10⥊0÷0}¨ 1+↕10 -{𝕩!0= 2⊑•internal.Temp (0÷0)¨⌾((⍷𝕩)⊸⊏) 10⥊0}¨ ↕10‿10‿10 +≠{! 0‿0‿1 ≡ 203•internal.Temp 𝕩↑(𝕩⥊0)∾10⥊0÷0}¨ 1+↕10 +{𝕩!0= 2⊑ 203•internal.Temp (0÷0)¨⌾((⍷𝕩)⊸⊏) 10⥊0}¨ ↕10‿10‿10 diff --git a/test/cells.bqn b/test/cells.bqn index b5ceac3d..ac49dcc3 100644 --- a/test/cells.bqn +++ b/test/cells.bqn @@ -125,9 +125,9 @@ RunTests ← { HTests ← { 𝕊: okTests ← ok/tests hasFill ← 0=ok/valid - cbqni.Temp 2 ⋄ f1 ← RunTests okTests /˜ hasFill - cbqni.Temp 1 ⋄ f0 ← RunTests okTests /˜ ¬hasFill - cbqni.Temp 0 + 299 cbqni.Temp 2 ⋄ f1 ← RunTests okTests /˜ hasFill + 299 cbqni.Temp 1 ⋄ f0 ← RunTests okTests /˜ ¬hasFill + 299 cbqni.Temp 0 (⍋⍋hasFill) ⊏ f0∾f1 } hCBQNFile •FChars •Repr HTests⌾(ok⊸/) "err"¨ tests @@ -137,7 +137,7 @@ RunTests ← { tests ← GetTests@ •Out ∾⟨"Running ", •Repr ≠tests, " tests on base CBQN.."⟩ - cfe‿fo ← <˘⍉>{cbqni.Temp@ ⋄ (cbqni.Temp@) ⋈ ⊑RunTests ⋈𝕩}¨ tests + cfe‿fo ← <˘⍉>{299 cbqni.Temp@ ⋄ (299 cbqni.Temp@) ⋈ ⊑RunTests ⋈𝕩}¨ tests validFile •FChars '0'+ 2⌊ cfe + 2×"err"⊸≡¨ fo # 2: errored; 1: invalid fill; 0: valid fill { 𝕊: diff --git a/test/mut.bqn b/test/mut.bqn index 4b8a42d9..3aed019b 100644 --- a/test/mut.bqn +++ b/test/mut.bqn @@ -7,7 +7,7 @@ Do ← {𝕊: mut ← "Ab"•internal.Variation orig l ← Range (1+≠orig)-s v ← Range 2 - mut •internal.Temp ⟨0,s,0,l⟩ + 201 •internal.Temp ⟨0,s,0,l,mut⟩ exp ← 0¨⌾((s+↕l)⊸⊏) orig mut ≢ exp? •Show '0'+orig