etaf-playground/tests/etaf-playground-tests.el
Kinneyzhang 082eff2f6c feat: polish the responsive ETAF showcase
Use a single display-safe viewport owner, responsive Flex sections, and the warm Ebox Flex reference visual language across the Showcase and compact examples.\n\nVerification: make check EMACS=/Applications/Emacs.app/Contents/MacOS/Emacs; GUI single-window screenshots for compact/fullscreen Overview, Work items interaction, dark Theme, core, and optional UI views.
2026-08-05 11:36:56 +08:00

156 lines
7.5 KiB
EmacsLisp

;;; etaf-playground-tests.el --- ETAF example tests -*- lexical-binding: t; -*-
(require 'ert)
(require 'etaf-playground)
(defun etaf-playground-test--layout-property (node key)
"Return layout KEY from ordinary or Flex NODE."
(if (plist-member node key)
(plist-get node key)
(plist-get (plist-get node :box) key)))
(ert-deftest etaf-playground-mounts-and-dispatches-core-example ()
"Mount the public playground and update its retained counter."
(let ((buffer-name " *etaf-playground-test*"))
(unwind-protect
(progn
(etaf-mount buffer-name (etaf-playground-view))
(with-current-buffer buffer-name
(should (string-match-p "ETAF Playground" (buffer-string)))
(should (string-match-p "Count: 0" (buffer-string))))
(etaf-dispatch-event (etaf-runtime-for-buffer buffer-name)
'increment 'press)
(with-current-buffer buffer-name
(should (string-match-p "Count: 1" (buffer-string)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-playground-ui-entry-keeps-catalog-optional ()
"Load the catalog only through the optional UI entry point."
(require 'etaf-ui)
(let ((buffer-name " *etaf-playground-ui-test*"))
(unwind-protect
(progn
(etaf-mount buffer-name (etaf-playground-ui-view))
(with-current-buffer buffer-name
(should (string-match-p "Official Components" (buffer-string)))
(should (string-match-p "Controlled checkbox" (buffer-string)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-playground-showcase-covers-public-interaction-path ()
"Mount the Showcase and exercise its navigation, data, and theme events."
(let ((buffer-name " *etaf-playground-showcase-test*"))
(unwind-protect
(progn
(etaf-mount buffer-name (etaf-playground-showcase-view))
(with-current-buffer buffer-name
(should (string-match-p "ETAF Showcase" (buffer-string)))
(should (string-match-p "VISIBLE WORK ITEMS" (buffer-string)))
(should (string-match-p "4" (buffer-string))))
(let ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-dispatch-event runtime 'showcase-open-work-items 'press)
(with-current-buffer buffer-name
(should (string-match-p "Work items" (buffer-string)))
(should (string-match-p "T-101" (buffer-string))))
(etaf-dispatch-event runtime 'showcase-task-T-101 'press)
(with-current-buffer buffer-name
(should (string-match-p "Selected T-101" (buffer-string))))
(etaf-dispatch-event runtime 'showcase-add-task 'press)
(with-current-buffer buffer-name
(should (string-match-p "T-107" (buffer-string))))
(etaf-dispatch-event runtime 'showcase-nav-theme 'press)
(with-current-buffer buffer-name
(should (string-match-p "Theme and semantics" (buffer-string))))
(etaf-dispatch-event runtime 'showcase-theme-toggle 'press)
(with-current-buffer buffer-name
(should (string-match-p "Dark theme" (buffer-string)))
(should (string-match-p "Dark semantic surface" (buffer-string))))
(etaf-dispatch-event runtime 'showcase-nav-overview 'press)
(with-current-buffer buffer-name
(should (string-match-p "Overview" (buffer-string)))
(should (string-match-p "Dark semantic surface" (buffer-string))))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-playground-showcase-keeps-backgrounds-layered ()
"Keep the root canvas background separate from semantic surface boxes."
(let ((buffer-name " *etaf-playground-showcase-layering-test*"))
(unwind-protect
(progn
(etaf-mount buffer-name (etaf-playground-showcase-view))
(let* ((runtime (etaf-runtime-for-buffer buffer-name))
(root (etaf-runtime-root-node runtime))
(layout (plist-get root :ebox-content-node))
(children (plist-get layout :children)))
(should (equal (plist-get root :bgcolor) "#F8F5EE"))
(should-not (plist-member root :surface-properties))
(should (equal (mapcar (lambda (node)
(etaf-playground-test--layout-property
node :bgcolor))
children)
'("#FFFDF8" nil "#FFFDF8")))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-playground-showcase-delegates-viewport-width-to-host ()
"Let the host own viewport width and stretch each shell section inside it."
(let ((buffer-name " *etaf-playground-width-owner-test*")
(ebox-viewport-width 900)
(ebox-viewport-height 40))
(unwind-protect
(progn
(etaf-mount buffer-name (etaf-playground-showcase-view))
(let* ((runtime (etaf-runtime-for-buffer buffer-name))
(root (etaf-runtime-root-node runtime))
(layout (plist-get root :ebox-content-node))
(children (plist-get layout :children))
(main (nth 1 children)))
(should (eq (plist-get root :width) 'stretch))
(should (eq (plist-get main :ebox-type) 'box))
(should (eq (plist-get (plist-get main :ebox-content-node)
:ebox-type)
'stack))
(should (cl-every
(lambda (node)
(eq (etaf-playground-test--layout-property node :width)
'stretch))
children))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-playground-showcase-syncs-to-window-body-width ()
"Exclude fringes and other window chrome from the Ebox viewport width."
(let (rerender-arguments)
(cl-letf (((symbol-function 'get-buffer-window)
(lambda (_buffer _all-frames) 'showcase-window))
((symbol-function 'window-pixel-width)
(lambda (_window) 900))
((symbol-function 'window-body-width)
(lambda (_window &optional pixelwise) (and pixelwise 880)))
((symbol-function 'window-body-height)
(lambda (_window) 40))
((symbol-function 'window-frame)
(lambda (_window) 'showcase-frame))
((symbol-function 'frame-char-width)
(lambda (_frame) 8))
((symbol-function 'ebox-rerender-buffer-with-context)
(lambda (&rest arguments)
(setq rerender-arguments arguments))))
(etaf-playground--showcase-sync-viewport "*Showcase*")
(should (equal rerender-arguments '("*Showcase*" 872 40))))))
(provide 'etaf-playground-tests)
;;; etaf-playground-tests.el ends here