erlang: gen_server behaviour (+10 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:
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user