erlang: binary pattern matching <<...>> (+21 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled

This commit is contained in:
2026-04-25 06:54:58 +00:00
parent 193b0c04be
commit ce8ff8b738
6 changed files with 334 additions and 7 deletions

View File

@@ -937,6 +937,63 @@
(nm (nth (get (get (ev "[{ok, X} || X <- [a, b]]") :head) :elements) 0))
"ok")
;; ── binary literals / patterns ────────────────────────────────
(er-eval-test "binary tag"
(get (ev "<<>>") :tag) "binary")
(er-eval-test "is_binary empty" (nm (ev "is_binary(<<>>)")) "true")
(er-eval-test "is_binary 3 bytes"
(nm (ev "is_binary(<<1, 2, 3>>)")) "true")
(er-eval-test "is_binary list" (nm (ev "is_binary([1, 2])")) "false")
(er-eval-test "byte_size 0" (ev "byte_size(<<>>)") 0)
(er-eval-test "byte_size 3" (ev "byte_size(<<1, 2, 3>>)") 3)
(er-eval-test "byte_size 16-bit" (ev "byte_size(<<256:16>>)") 2)
(er-eval-test "byte_size 32-bit" (ev "byte_size(<<999999:32>>)") 4)
;; Match
(er-eval-test "match single byte"
(ev "<<X>> = <<7>>, X") 7)
(er-eval-test "match X:8"
(ev "<<X:8>> = <<200>>, X") 200)
(er-eval-test "match 16-bit decode"
(ev "<<X:16>> = <<1, 0>>, X") 256)
(er-eval-test "match 16-bit hi byte"
(ev "<<X:16>> = <<2, 1>>, X") 513)
(er-eval-test "match A:8 B:16"
(ev "<<A:8, B:16>> = <<1, 0, 2>>, A + B") 3)
(er-eval-test "match three 8-bit"
(ev "<<A, B, C>> = <<1, 2, 3>>, A + B + C") 6)
;; Tail binary
(er-eval-test "tail rest size"
(ev "<<_:8, Rest/binary>> = <<1, 2, 3, 4>>, byte_size(Rest)") 3)
(er-eval-test "tail rest content"
(ev "<<_:8, Rest/binary>> = <<1, 2, 3, 4>>, <<X:8, _/binary>> = Rest, X") 2)
;; Match failure
(er-eval-test "size mismatch fails"
(do
(ev "P = spawn(fun () -> <<X:8, Y:8>> = <<1>>, ok end), receive after 0 -> ok end")
(let ((reason (er-proc-field (er-mk-pid 1) :exit-reason)))
(cond
(er-tuple? reason) (nm (nth (get reason :elements) 0))
(er-atom? reason) (get reason :name)
:else nil)))
"badmatch")
;; Equality
(er-eval-test "binary =:= self"
(nm (ev "B = <<1, 2, 3>>, B =:= B")) "true")
(er-eval-test "binary =:= same"
(nm (ev "<<1, 2>> =:= <<1, 2>>")) "true")
(er-eval-test "binary =/= different"
(nm (ev "<<1, 2>> =:= <<1, 3>>")) "false")
;; Construction with computed value
(er-eval-test "build with var"
(ev "X = 42, byte_size(<<X>>)") 1)
(er-eval-test "build with size var"
(ev "X = 7, byte_size(<<X:16>>)") 2)
(define
er-eval-test-summary
(str "eval " er-eval-test-pass "/" er-eval-test-count))