erlang: gen_server behaviour (+10 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled

This commit is contained in:
2026-04-25 04:36:29 +00:00
parent 424b5ca472
commit 8717094e74
6 changed files with 153 additions and 10 deletions

View File

@@ -699,6 +699,75 @@
(ev "Me = self(), spawn(fun () -> m9:work(Me) end), receive done -> ok end"))
(er-mk-atom "ok"))
;; ── gen_server (OTP-lite) ──────────────────────────────────────
(do
(er-load-gen-server!)
(erlang-load-module
"-module(ctr).
init(N) -> {ok, N}.
handle_call(get, _F, S) -> {reply, S, S}.
handle_call({set, V}, _F, _S) -> {reply, ok, V}.
handle_call({add, K}, _F, S) -> {reply, S + K, S + K}.
handle_cast(inc, S) -> {noreply, S + 1}.
handle_cast(dec, S) -> {noreply, S - 1}.
handle_cast({add, K}, S) -> {noreply, S + K}.
handle_info(_M, S) -> {noreply, S}.")
nil)
(er-eval-test "gen_server start + call get"
(ev "P = gen_server:start_link(ctr, 10), gen_server:call(P, get)")
10)
(er-eval-test "gen_server cast then call"
(ev "P = gen_server:start_link(ctr, 0), gen_server:cast(P, inc), gen_server:cast(P, inc), gen_server:cast(P, inc), gen_server:call(P, get)")
3)
(er-eval-test "gen_server call returns reply"
(ev "P = gen_server:start_link(ctr, 5), gen_server:call(P, {add, 7})")
12)
(er-eval-test "gen_server state mutation"
(ev "P = gen_server:start_link(ctr, 5), gen_server:call(P, {set, 99}), gen_server:call(P, get)")
99)
(er-eval-test "gen_server stop returns ok"
(nm (ev "P = gen_server:start_link(ctr, 0), gen_server:stop(P)"))
"ok")
(er-eval-test "gen_server cast returns ok immediately"
(nm (ev "P = gen_server:start_link(ctr, 0), gen_server:cast(P, inc)"))
"ok")
(er-eval-test "gen_server multi-state mutations"
(ev "P = gen_server:start_link(ctr, 0), gen_server:cast(P, {add, 100}), gen_server:cast(P, dec), gen_server:cast(P, dec), gen_server:call(P, get)")
98)
;; Stack server — exercises a different state shape.
(do
(erlang-load-module
"-module(stk).
init(_) -> {ok, []}.
handle_call(pop, _F, []) -> {reply, empty, []};
handle_call(pop, _F, [H | T]) -> {reply, {ok, H}, T};
handle_call(peek, _F, []) -> {reply, empty, []};
handle_call(peek, _F, [H | T]) -> {reply, {ok, H}, [H | T]};
handle_call(size, _F, S) -> {reply, length(S), S}.
handle_cast({push, V}, S) -> {noreply, [V | S]}.
handle_info(_M, S) -> {noreply, S}.")
nil)
(er-eval-test "stack push/pop"
(ev "P = gen_server:start_link(stk, ignored), gen_server:cast(P, {push, 1}), gen_server:cast(P, {push, 2}), gen_server:cast(P, {push, 3}), gen_server:call(P, size)")
3)
(er-eval-test "stack lifo"
(ev "P = gen_server:start_link(stk, ignored), gen_server:cast(P, {push, 1}), gen_server:cast(P, {push, 2}), gen_server:cast(P, {push, 3}), {ok, V} = gen_server:call(P, pop), V")
3)
(er-eval-test "stack empty pop"
(nm (ev "P = gen_server:start_link(stk, ignored), gen_server:call(P, pop)"))
"empty")
(define
er-eval-test-summary
(str "eval " er-eval-test-pass "/" er-eval-test-count))