erlang: link/unlink/monitor/demonitor + refs (+17 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:
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user