review fixes: 3 blocking bugs + 2 improvements
B1: modern-backend now inherits from backend (was standalone class)
B2: draw-rect y-position bug — loop now tracks row offset
B3: Layout module added to ASDF system definition
I1: 6 smoke tests replaced with behavioral tests (captured output)
I3: 6 edge case tests: empty, single-child, zero-size, deep
nesting, large padding, negative grow
Also fixed:
- Added missing make-simple-backend constructor to simple.lisp
- Added in-package to classes.lisp and simple.lisp (SBCL's load
restores *package* after each load, breaking batch-mode loading)
This commit is contained in:
@@ -6,6 +6,14 @@
|
||||
(def-suite backend-suite :description "Backend protocol tests")
|
||||
(in-suite backend-suite)
|
||||
|
||||
;; ── Helpers ─────────────────────────────────────────────────────
|
||||
|
||||
(defun make-capturing-backend ()
|
||||
"Create a simple-backend that writes to a string stream."
|
||||
(let* ((s (make-string-output-stream))
|
||||
(b (make-simple-backend :output-stream s)))
|
||||
(values b s)))
|
||||
|
||||
;; ── Simple Backend ──────────────────────────────────────────────
|
||||
|
||||
(defun run-tests ()
|
||||
@@ -19,32 +27,55 @@
|
||||
(let ((b (make-simple-backend)))
|
||||
(is (typep b 'simple-backend))
|
||||
(initialize-backend b)
|
||||
(is (capable-p b :truecolor) nil "simple backend has no truecolor")
|
||||
(is-false (capable-p b :truecolor) "simple backend has no truecolor")
|
||||
(shutdown-backend b)))
|
||||
|
||||
(test simple-backend-draw-text
|
||||
"simple-backend renders text at position, ignoring style"
|
||||
(let ((b (make-simple-backend)))
|
||||
(multiple-value-bind (b s) (make-capturing-backend)
|
||||
(initialize-backend b)
|
||||
(draw-text b 0 0 "hello" nil nil)
|
||||
(draw-text b 0 0 "hello" :red nil :bold t :italic t)
|
||||
(shutdown-backend b)
|
||||
(is-t t)))
|
||||
(is (string= (get-output-stream-string s) "hello")
|
||||
"draw-text should output the string ignoring style")))
|
||||
|
||||
(test simple-backend-border-single
|
||||
"simple-backend draws ASCII single border"
|
||||
(let ((b (make-simple-backend)))
|
||||
(test simple-backend-draw-border
|
||||
"simple-backend draws ASCII border with +-| characters"
|
||||
(multiple-value-bind (b s) (make-capturing-backend)
|
||||
(initialize-backend b)
|
||||
(draw-border b 0 0 10 5 :style :single)
|
||||
(draw-border b 0 0 5 3 :style :single)
|
||||
(shutdown-backend b)
|
||||
(is-t t)))
|
||||
(let ((out (get-output-stream-string s)))
|
||||
(is (search "-----" out) "top edge should have 5 dashes")
|
||||
(is (search "| |" out) "middle row should have pipe sides"))))
|
||||
|
||||
(test simple-backend-border-rounded
|
||||
"simple-backend falls back to straight edges for rounded"
|
||||
(let ((b (make-simple-backend)))
|
||||
(test simple-backend-draw-rounded
|
||||
"simple-backend falls back to straight edges for rounded style"
|
||||
(multiple-value-bind (b s) (make-capturing-backend)
|
||||
(initialize-backend b)
|
||||
(draw-border b 0 0 10 5 :style :rounded)
|
||||
(draw-border b 0 0 5 3 :style :rounded)
|
||||
(shutdown-backend b)
|
||||
(is-t t)))
|
||||
(let ((out (get-output-stream-string s)))
|
||||
;; Rounded falls back to ASCII — identical output to single
|
||||
(is (search "-----" out) "rounded style produces same dashes as single"))))
|
||||
|
||||
(test simple-backend-draw-link
|
||||
"simple-backend renders link as plain text"
|
||||
(multiple-value-bind (b s) (make-capturing-backend)
|
||||
(initialize-backend b)
|
||||
(draw-link b 0 0 "click me" "http://example.com")
|
||||
(shutdown-backend b)
|
||||
(is (string= (get-output-stream-string s) "click me")
|
||||
"simple-backend ignores URL, outputs text only")))
|
||||
|
||||
(test simple-backend-draw-ellipsis
|
||||
"simple-backend renders ... for ellipsis"
|
||||
(multiple-value-bind (b s) (make-capturing-backend)
|
||||
(initialize-backend b)
|
||||
(draw-ellipsis b 0 0 5)
|
||||
(shutdown-backend b)
|
||||
(is (string= (get-output-stream-string s) "...")
|
||||
"ellipsis should output 3 dots")))
|
||||
|
||||
;; ── Backend Capabilities ───────────────────────────────────────
|
||||
|
||||
@@ -54,8 +85,8 @@
|
||||
(initialize-backend b)
|
||||
(dolist (f '(:truecolor :osc8 :sync :mouse :bracketed-paste
|
||||
:kitty-keyboard :sixel :cursor-style))
|
||||
(is (capable-p b f) nil
|
||||
(format nil "~s should not be supported on simple-backend" f)))
|
||||
(is-false (capable-p b f)
|
||||
(format nil "~s should not be supported on simple-backend" f)))
|
||||
(shutdown-backend b)))
|
||||
|
||||
;; ── Backend Size ───────────────────────────────────────────────
|
||||
@@ -71,32 +102,37 @@
|
||||
(is (>= lines 3)))
|
||||
(shutdown-backend b)))
|
||||
|
||||
;; ── Drawing Primitives ─────────────────────────────────────────
|
||||
;; ── Backend Protocol: Defaults and No-ops ──────────────────────
|
||||
|
||||
(test draw-rect-fills-area
|
||||
"draw-rect fills a rectangular area with background"
|
||||
(test default-methods-are-no-ops
|
||||
"Default backend methods don't error"
|
||||
(let ((b (make-simple-backend)))
|
||||
(initialize-backend b)
|
||||
(draw-rect b 0 0 5 3 :bg nil)
|
||||
(shutdown-backend b)
|
||||
(is-t t)))
|
||||
|
||||
(test draw-text-multi-line
|
||||
"draw-text handles strings with newlines"
|
||||
(let ((b (make-simple-backend)))
|
||||
(initialize-backend b)
|
||||
(draw-text b 0 0 "line1~%line2" nil nil)
|
||||
(shutdown-backend b)
|
||||
(is-t t)))
|
||||
|
||||
;; ── Synchronization ────────────────────────────────────────────
|
||||
(is (null (multiple-value-list (cursor-hide b))))
|
||||
(is (null (multiple-value-list (cursor-show b))))
|
||||
(is (null (multiple-value-list (cursor-style b :block))))
|
||||
(is (null (multiple-value-list (begin-sync b))))
|
||||
(is (null (multiple-value-list (end-sync b))))
|
||||
(shutdown-backend b)))
|
||||
|
||||
(test sync-is-noop-on-simple
|
||||
"begin-sync and end-sync are no-ops on simple-backend"
|
||||
(let ((b (make-simple-backend)))
|
||||
"begin-sync and end-sync produce no output on simple-backend"
|
||||
(multiple-value-bind (b s) (make-capturing-backend)
|
||||
(initialize-backend b)
|
||||
(begin-sync b)
|
||||
(draw-text b 0 0 "in sync" nil nil)
|
||||
(end-sync b)
|
||||
(shutdown-backend b)
|
||||
(is-t t)))
|
||||
(is (string= (get-output-stream-string s) "in sync")
|
||||
"no sync escape sequences should appear")))
|
||||
|
||||
;; ── Draw-rect ──────────────────────────────────────────────────
|
||||
|
||||
(test draw-rect-fills-area-correctly
|
||||
"draw-rect with background writes nothing to output (simple-backend no-op)"
|
||||
(multiple-value-bind (b s) (make-capturing-backend)
|
||||
(initialize-backend b)
|
||||
(draw-rect b 0 0 5 3 :bg :red)
|
||||
(shutdown-backend b)
|
||||
(is (string= (get-output-stream-string s) "")
|
||||
"draw-rect is a no-op on simple-backend")))
|
||||
|
||||
Reference in New Issue
Block a user