;; lists-ext tests — lists:sort/1, lists:sort/2, lists:usort/1. ;; Each case evaluates an Erlang expression that reduces to the bool ;; atom `true` (via =:= on the sorted result) and checks its name. (define er-lx-test-count 0) (define er-lx-test-pass 0) (define er-lx-test-fails (list)) (define er-lx-test (fn (name actual expected) (set! er-lx-test-count (+ er-lx-test-count 1)) (if (= actual expected) (set! er-lx-test-pass (+ er-lx-test-pass 1)) (append! er-lx-test-fails {:name name :expected expected :actual actual})))) ;; eval an Erlang source string and return the result atom's name (define er-lx-nm (fn (src) (get (erlang-eval-ast src) :name))) ;; ── lists:sort/1 ────────────────────────────────────────────────── (er-lx-test "sort/1 ascending" (er-lx-nm "lists:sort([3,1,2]) =:= [1,2,3]") "true") (er-lx-test "sort/1 already sorted" (er-lx-nm "lists:sort([1,2,3]) =:= [1,2,3]") "true") (er-lx-test "sort/1 empty" (er-lx-nm "lists:sort([]) =:= []") "true") (er-lx-test "sort/1 singleton" (er-lx-nm "lists:sort([7]) =:= [7]") "true") (er-lx-test "sort/1 keeps duplicates" (er-lx-nm "lists:sort([3,1,2,1]) =:= [1,1,2,3]") "true") (er-lx-test "sort/1 length preserved" (erlang-eval-ast "length(lists:sort([5,4,3,2,1]))") 5) (er-lx-test "sort/1 term order: number < atom" (er-lx-nm "lists:sort([b,a,1]) =:= [1,a,b]") "true") (er-lx-test "sort/1 tuples elementwise" (er-lx-nm "lists:sort([{2,a},{1,b},{1,a}]) =:= [{1,a},{1,b},{2,a}]") "true") ;; ── lists:sort/2 ────────────────────────────────────────────────── (er-lx-test "sort/2 ascending =<" (er-lx-nm "lists:sort(fun(A,B) -> A =< B end, [3,1,2]) =:= [1,2,3]") "true") (er-lx-test "sort/2 descending >=" (er-lx-nm "lists:sort(fun(A,B) -> A >= B end, [1,3,2]) =:= [3,2,1]") "true") (er-lx-test "sort/2 stable on equal keys" (er-lx-nm "lists:sort(fun({A,_},{B,_}) -> A =< B end, [{1,x},{1,y},{0,z}]) =:= [{0,z},{1,x},{1,y}]") "true") (er-lx-test "sort/2 empty" (er-lx-nm "lists:sort(fun(A,B) -> A =< B end, []) =:= []") "true") ;; ── lists:usort/1 ───────────────────────────────────────────────── (er-lx-test "usort/1 removes duplicates" (er-lx-nm "lists:usort([3,1,2,1,3]) =:= [1,2,3]") "true") (er-lx-test "usort/1 empty" (er-lx-nm "lists:usort([]) =:= []") "true") (er-lx-test "usort/1 all equal collapses to one" (er-lx-nm "lists:usort([5,5,5]) =:= [5]") "true") (er-lx-test "usort/1 already unique" (er-lx-nm "lists:usort([1,2,3]) =:= [1,2,3]") "true") (er-lx-test "usort/1 length after dedup" (erlang-eval-ast "length(lists:usort([4,4,2,2,1,1,4]))") 3)