erlang: link/unlink/monitor/demonitor + refs (+17 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled

This commit is contained in:
2026-04-25 02:16:04 +00:00
parent aa7d691028
commit c363856df6
6 changed files with 262 additions and 7 deletions

View File

@@ -432,6 +432,76 @@
(nm (er-last-main-exit-reason)))
"from_fn")
;; ── refs / link / monitor ──────────────────────────────────────
(er-eval-test "make_ref tag"
(get (ev "make_ref()") :tag) "ref")
(er-eval-test "is_reference fresh"
(nm (ev "R = make_ref(), is_reference(R)")) "true")
(er-eval-test "is_reference pid"
(nm (ev "is_reference(self())")) "false")
(er-eval-test "is_reference number"
(nm (ev "is_reference(42)")) "false")
(er-eval-test "make_ref distinct"
(nm (ev "R1 = make_ref(), R2 = make_ref(), R1 =:= R2")) "false")
(er-eval-test "make_ref same id eq"
(nm (ev "R = make_ref(), R =:= R")) "true")
(er-eval-test "link returns true"
(nm (ev "P = spawn(fun () -> ok end), link(P)")) "true")
(er-eval-test "self link returns true"
(nm (ev "link(self())")) "true")
(er-eval-test "unlink returns true"
(nm (ev "P = spawn(fun () -> ok end), link(P), unlink(P)")) "true")
(er-eval-test "unlink without link"
(nm (ev "P = spawn(fun () -> ok end), unlink(P)")) "true")
(er-eval-test "monitor returns ref"
(get (ev "P = spawn(fun () -> ok end), monitor(process, P)") :tag)
"ref")
(er-eval-test "monitor refs distinct"
(nm (ev "P = spawn(fun () -> ok end), R1 = monitor(process, P), R2 = monitor(process, P), R1 =:= R2"))
"false")
(er-eval-test "demonitor returns true"
(nm (ev "P = spawn(fun () -> ok end), R = monitor(process, P), demonitor(R)"))
"true")
;; Bidirectional link recorded on both sides.
(er-eval-test "link bidirectional"
(do
(ev "P = spawn(fun () -> receive forever -> ok end end), link(P)")
;; After eval, check links on main + child via accessors.
(and
(= (len (er-proc-field (er-mk-pid 0) :links)) 1)
(= (len (er-proc-field (er-mk-pid 1) :links)) 1)))
true)
;; unlink clears both sides.
(er-eval-test "unlink clears both"
(do
(ev "P = spawn(fun () -> receive forever -> ok end end), link(P), unlink(P)")
(and
(= (len (er-proc-field (er-mk-pid 0) :links)) 0)
(= (len (er-proc-field (er-mk-pid 1) :links)) 0)))
true)
;; monitor adds entries to both lists.
(er-eval-test "monitor records both sides"
(do
(ev "P = spawn(fun () -> receive forever -> ok end end), monitor(process, P)")
(and
(= (len (er-proc-field (er-mk-pid 0) :monitors)) 1)
(= (len (er-proc-field (er-mk-pid 1) :monitored-by)) 1)))
true)
;; demonitor clears both lists.
(er-eval-test "demonitor clears both"
(do
(ev "P = spawn(fun () -> receive forever -> ok end end), R = monitor(process, P), demonitor(R)")
(and
(= (len (er-proc-field (er-mk-pid 0) :monitors)) 0)
(= (len (er-proc-field (er-mk-pid 1) :monitored-by)) 0)))
true)
(define
er-eval-test-summary
(str "eval " er-eval-test-pass "/" er-eval-test-count))