erlang: binary pattern matching <<...>> (+21 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
This commit is contained in:
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user