(defpackage :cl-tty-slot-test (:use :cl :cl-tty.slot :fiveam)) (in-package :cl-tty-slot-test) (def-suite slot-suite :description "Slot system tests") (in-suite slot-suite) (def-test defslot-register ( ) (clear-slot :test-slot) (defslot :test-slot :order 1 :render-fn (lambda () "hello")) (is-true (slot-p :test-slot))) (def-test slot-render-calls ( ) (clear-slot :test-slot) (defslot :test-slot :order 1 :render-fn (lambda () "a")) (defslot :test-slot :order 2 :render-fn (lambda () "b")) (is (equal '("a" "b") (slot-render :test-slot)))) (def-test slot-render-empty ( ) (clear-slot :ghost) (is-false (slot-render :ghost))) (def-test clear-slot-removes ( ) (clear-slot :test-slot) (defslot :test-slot :order 1 :render-fn (lambda () "x")) (clear-slot :test-slot) (is-false (slot-p :test-slot))) (def-test defslot-nil-render-fn ( ) "defslot with nil (default) render-fn should not crash slot-render." (clear-slot :nil-slot) (defslot :nil-slot :order 1) (is-true (slot-p :nil-slot)) (is (equal '(nil) (slot-render :nil-slot))) (clear-slot :nil-slot)) (def-test defslot-duplicate-same-order ( ) "Multiple defslot calls with the same order should all register." (clear-slot :dup-slot) (defslot :dup-slot :order 5 :render-fn (lambda () "first")) (defslot :dup-slot :order 5 :render-fn (lambda () "second")) (let ((result (slot-render :dup-slot))) (is (= 2 (length result))) ;; Entries with same order are prepended, so "second" comes first (is (equal "second" (first result))) (is (equal "first" (second result)))) (clear-slot :dup-slot)) (def-test slot-render-with-args ( ) "slot-render passes arguments to all registered render-fns." (clear-slot :args-slot) (defslot :args-slot :order 1 :render-fn (lambda (x y) (format nil "~a+~a" x y))) (let ((result (slot-render :args-slot 3 4))) (is (equal '("3+4") result))) (clear-slot :args-slot))