diff --git a/test/bit.bqn b/test/bit.bqn new file mode 100644 index 00000000..121320cb --- /dev/null +++ b/test/bit.bqn @@ -0,0 +1,27 @@ +u ← ⌊100×(•UnixTime+1|100וMonoTime)@ +r ← •MakeRand •Show u +⟨RandVals, casts⟩ ← ⟨r⟩ •Import "utils.bqn" + +# Test •bit._cast first +# Convert unsigned width 𝕗 to 𝕘 +_cvtu_ ← { + 𝕗=𝕘 ? 𝕩 ; + 𝕗<𝕘 ? b←2⋆𝕗 ⋄ +⟜(b⊸×)˝⍉∘‿(𝕘÷𝕗)⥊𝕩 ; + b←2⋆𝕘 ⋄ ⥊⍉>1(-⊸↓-b×↓)⌊∘÷⟜b⍟(↕1+𝕗÷𝕘)𝕩 +} +_bitcast ← { fr‿to _𝕣 𝕩: + S ← {𝕊:𝕩+𝕨×𝕩<0; 𝕊⁼:𝕩-𝕨×𝕩≥𝕨÷2} + _off ← {(⊑"uci"⊐1⊑𝕗)⊑⟨⊢,-⟜@,(2⋆⊑𝕗)⊸S⟩} + f‿t ← ⊑¨𝕗 + to _off⁼ f _cvtu_ t fr _off 𝕩 +} + +TestCast ← { f‿t 𝕊 len: + c ← 𝕨 ⊏ casts + len +↩ (1⌈÷˜´⊑¨c) | -len # Round up to exact conversion + (c _bitcast ≡ c •bit._cast) len RandVals f +} +cs ← / 64>⊑¨casts # TODO floats +cx ← ⊏⟜(32‿'c'⊸≢¨casts)⊸/ cs # TODO 32-bit char output +ls ← (↕100) ∾ r.Range¨⊸+ ⌊ 100 × ↕∘⌈⌾(1.5⊸⋆⁼) 100 +{cs (⋈ !∘TestCast 𝕩˙)⌜ cx}¨ ls diff --git a/test/utils.bqn b/test/utils.bqn index 817781f2..5aba7103 100644 --- a/test/utils.bqn +++ b/test/utils.bqn @@ -11,6 +11,7 @@ chr ← 0‿0‿0‿0‿0‿1‿1‿1 specF64 ⇐ ∾⟜- π‿2∾ ÷⟜0⊸∾ 1‿0 specI32 ⇐ "Ai32" •internal.Variation ∧ (<⟜(2⋆31)∧≥⟜(-2⋆31))⊸/ ∾⟜- ≥⟜0⊸/ ∧⥊(¯4+↕8) +⌜ 2⋆↕32 vars ⇐ "Ab"‿"Ai8"‿"Ai16"‿"Ai32"‿"Af64"‿"Ac8"‿"Ac16"‿"Ac32" +casts ⇐ 1‿8‿16‿32‿64‿8‿16‿32⋈¨"uiiifccc" specInts ⇐ 7‿15({(<⟜(2⋆𝕨)∧≥⟜(-2⋆𝕨))⊸/𝕩}¨⟜<∾⋈∘⊢)specI32 # TODO 8-bit integer spec is kinda stupid spec0 ← ⟨0‿1⟩∾specInts∾⟨specF64⟩∾@+∾⟜(⌽1114111-↕16)⌾(2⊸⊑) (<⟜1114111∧≥⟜0)⊸/¨ specInts spec0 (5/¯128‿¯127‿¯126‿¯2‿¯1‿0‿1‿2‿125‿126‿127)⊸∾⌾(1⊸⊑)↩ @@ -43,4 +44,4 @@ RandVals ⇐ { ! "f64arr" ≡ •internal.Type 10 RandVals 4 ! "c8arr" ≡ •internal.Type 10 RandVals 5 ! "c16arr" ≡ •internal.Type 10 RandVals 6 -! "c32arr" ≡ •internal.Type 10 RandVals 7 \ No newline at end of file +! "c32arr" ≡ •internal.Type 10 RandVals 7