erlang: ETS-lite (+13 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled

This commit is contained in:
2026-04-25 07:32:24 +00:00
parent ce8ff8b738
commit a8cfd84f18
6 changed files with 234 additions and 6 deletions

View File

@@ -994,6 +994,55 @@
(er-eval-test "build with size var"
(ev "X = 7, byte_size(<<X:16>>)") 2)
;; ── ETS-lite ──────────────────────────────────────────────────
(er-eval-test "ets:new returns name"
(nm (ev "ets:new(t1, [set])")) "t1")
(er-eval-test "ets:insert returns true"
(nm (ev "T = ets:new(t2, [set]), ets:insert(T, {foo, 1})")) "true")
(er-eval-test "ets:lookup hit"
(ev "T = ets:new(t3, [set]), ets:insert(T, {foo, 42}), [{foo, V}] = ets:lookup(T, foo), V")
42)
(er-eval-test "ets:lookup miss returns []"
(get (ev "T = ets:new(t4, [set]), ets:lookup(T, no_such)") :tag) "nil")
(er-eval-test "ets:insert replaces (set semantics)"
(ev "T = ets:new(t5, [set]), ets:insert(T, {x, 1}), ets:insert(T, {x, 2}), ets:insert(T, {x, 3}), [{x, V}] = ets:lookup(T, x), V")
3)
(er-eval-test "ets:info size grows"
(ev "T = ets:new(t6, [set]), ets:insert(T, {a, 1}), ets:insert(T, {b, 2}), ets:insert(T, {c, 3}), ets:info(T, size)")
3)
(er-eval-test "ets:info size after delete"
(ev "T = ets:new(t7, [set]), ets:insert(T, {a, 1}), ets:insert(T, {b, 2}), ets:delete(T, a), ets:info(T, size)")
1)
(er-eval-test "ets:tab2list length"
(ev "T = ets:new(t8, [set]), ets:insert(T, {a, 1}), ets:insert(T, {b, 2}), ets:insert(T, {c, 3}), length(ets:tab2list(T))")
3)
(er-eval-test "ets:delete table returns true"
(nm (ev "T = ets:new(t9, [set]), ets:delete(T)")) "true")
(er-eval-test "ets:lookup after table delete"
(do
(ev "P = spawn(fun () -> T = ets:new(t10, [set]), ets:delete(T), ets:lookup(T, x) end), receive after 0 -> ok end")
(let ((reason (er-proc-field (er-mk-pid 1) :exit-reason)))
(cond
(er-atom? reason) (get reason :name)
:else (nm reason))))
"badarg")
;; Sum a column via lookup chain.
(er-eval-test "ets aggregate"
(ev "T = ets:new(t11, [set]), ets:insert(T, {a, 10}), ets:insert(T, {b, 20}), ets:insert(T, {c, 30}), [{a, A}] = ets:lookup(T, a), [{b, B}] = ets:lookup(T, b), [{c, C}] = ets:lookup(T, c), A + B + C")
60)
;; Tuple key (non-atom).
(er-eval-test "ets tuple key"
(nm
(ev "T = ets:new(t12, [set]), ets:insert(T, {{x, 1}, hello}), [{{x, 1}, V}] = ets:lookup(T, {x, 1}), V"))
"hello")
;; Tables are independent.
(er-eval-test "ets two tables independent"
(ev "T1 = ets:new(t13, [set]), T2 = ets:new(t14, [set]), ets:insert(T1, {x, 1}), ets:insert(T2, {x, 99}), [{x, A}] = ets:lookup(T1, x), [{x, B}] = ets:lookup(T2, x), A + B")
100)
(define
er-eval-test-summary
(str "eval " er-eval-test-pass "/" er-eval-test-count))