erlang: register/whereis, Phase 5 complete (+12 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled

This commit is contained in:
2026-04-25 05:43:57 +00:00
parent 47a59343a1
commit 8e809614ba
6 changed files with 202 additions and 17 deletions

View File

@@ -843,6 +843,65 @@
(ev "Sup = supervisor:start_link(sup7, []), receive after 5 -> ok end, supervisor:stop(Sup)")))
"ok")
;; ── register / whereis / registered ─────────────────────────────
(er-eval-test "register returns true"
(nm (ev "register(me, self())")) "true")
(er-eval-test "whereis registered self"
(nm (ev "register(me, self()), Pid = whereis(me), if Pid =:= self() -> matched; true -> nope end"))
"matched")
(er-eval-test "whereis undefined"
(nm (ev "whereis(no_such)")) "undefined")
(er-eval-test "send via registered atom"
(nm (ev "register(srv, self()), srv ! hello, receive M -> M end"))
"hello")
(er-eval-test "send to spawned registered"
(nm
(ev "Me = self(), P = spawn(fun () -> receive {From, X} -> From ! {got, X} end end), register(child, P), child ! {Me, payload}, receive {got, V} -> V end"))
"payload")
(er-eval-test "unregister returns true"
(nm (ev "register(a, self()), unregister(a)")) "true")
(er-eval-test "unregister then whereis"
(nm (ev "register(a, self()), unregister(a), whereis(a)"))
"undefined")
(er-eval-test "registered/0 lists names"
(ev "register(a, self()), register(b, self()), register(c, self()), length(registered())")
3)
(er-eval-test "register dup raises"
(do
(ev "P = spawn(fun () -> register(d, self()), register(d, self()) end), receive after 0 -> ok end")
(let ((reason (er-proc-field (er-mk-pid 1) :exit-reason)))
(nm (if (er-atom? reason) reason (nth (get reason :elements) 0)))))
"badarg")
(er-eval-test "unregister missing raises"
(do
(ev "P = spawn(fun () -> unregister(no_such) end), receive after 0 -> ok end")
(let ((reason (er-proc-field (er-mk-pid 1) :exit-reason)))
(nm (if (er-atom? reason) reason (nth (get reason :elements) 0)))))
"badarg")
(er-eval-test "dead process auto-unregisters"
;; Register a child while it's alive (still in receive). Send `die` so
;; it exits. After scheduler drains, whereis should return undefined.
(nm
(ev "P = spawn(fun () -> receive die -> exit(killed) end end), register(was_alive, P), P ! die, receive after 5 -> ok end, whereis(was_alive)"))
"undefined")
(er-eval-test "send to unregistered name raises"
(do
(ev "P = spawn(fun () -> no_such ! oops end), receive after 0 -> ok end")
(let ((reason (er-proc-field (er-mk-pid 1) :exit-reason)))
(nm (if (er-atom? reason) reason (nth (get reason :elements) 0)))))
"badarg")
(define
er-eval-test-summary
(str "eval " er-eval-test-pass "/" er-eval-test-count))