chore: migrate conditional bindings for Emacs 31

This commit is contained in:
Kinneyzhang 2026-08-26 00:09:58 +08:00
parent f0674b348c
commit af01b71e3f
13 changed files with 224 additions and 224 deletions

View File

@ -62,7 +62,7 @@
(defun etaf-compiler--compile-property (form programs)
"Compile property FORM, returning `(DESCRIPTOR . PROGRAMS)'."
(if-let ((literal (etaf-compiler--literal form)))
(if-let* ((literal (etaf-compiler--literal form)))
(cons (list :kind 'static :value (cdr literal)) programs)
(let ((index (length programs)))
(cons (list :kind 'hole :index index)
@ -137,7 +137,7 @@
(defun etaf-compiler--compile (form)
"Compile FORM into `(BLUEPRINT PROGRAM-CODE...)', or return nil."
(when-let ((compiled (etaf-compiler--compile-block form '(0) nil)))
(when-let* ((compiled (etaf-compiler--compile-block form '(0) nil)))
(let* ((root (car compiled))
(programs (cadr compiled))
(id (secure-hash 'sha256 (prin1-to-string form)))

View File

@ -333,14 +333,14 @@ load. INITIAL-RESULT and AUTO-LOAD are mutually exclusive."
(maphash
(lambda (identity _present)
(unless (gethash identity new-set)
(when-let ((selected-ref
(when-let* ((selected-ref
(gethash identity selected-refs)))
(setf (etaf-value selected-ref) nil))))
old-set)
(maphash
(lambda (identity _present)
(unless (gethash identity old-set)
(when-let ((selected-ref
(when-let* ((selected-ref
(gethash identity selected-refs)))
(setf (etaf-value selected-ref) t))))
new-set)))))
@ -362,7 +362,7 @@ load. INITIAL-RESULT and AUTO-LOAD are mutually exclusive."
(etaf-on-scope-dispose
(lambda ()
(clrhash (etaf-data--controller-selected-refs controller))
(when-let ((dispose (etaf-data--source-function
(when-let* ((dispose (etaf-data--source-function
source :dispose nil)))
(funcall dispose))))))
(when auto-load

View File

@ -131,7 +131,7 @@ the position."
start end (<= start position) (< position end))
(push (list host-ref start (- end start)) candidates)))))
(setq candidates (sort candidates #'etaf--activation-candidate-before-p))
(if-let ((candidate (car candidates)))
(if-let* ((candidate (car candidates)))
(etaf-dispatch-event runtime (car candidate) 'press)
(unless quiet
(user-error "No interactive ETAF Host at point")))))
@ -234,7 +234,7 @@ When called interactively without arguments, focus the first visible Host."
(let ((buffer (window-buffer window)))
(when (buffer-live-p buffer)
(with-current-buffer buffer
(when-let ((runtime (etaf-runtime-for-buffer buffer)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer)))
(goto-char position)
(etaf--activation-at-position runtime position t))))))))

View File

@ -387,7 +387,7 @@ When called interactively, suggest a timestamped `.eld' file in
(interactive)
;; Keep correlation IDs monotonic even if an active operation clears history.
(setq etaf-performance--record-ring nil)
(when-let ((panel (get-buffer "*ETAF Performance*")))
(when-let* ((panel (get-buffer "*ETAF Performance*")))
(with-current-buffer panel
(when (derived-mode-p 'etaf-performance-panel-mode)
(tabulated-list-revert))))
@ -698,7 +698,7 @@ KIND, LABEL, optional RUNTIME, and optional BUFFER are evaluated once."
(defun etaf-performance--uninstall-function (function)
"Remove recorder advice installed on FUNCTION."
(when-let ((entry (assq function etaf-performance--installed-advices)))
(when-let* ((entry (assq function etaf-performance--installed-advices)))
(advice-remove function (cdr entry))
(setq etaf-performance--installed-advices
(delq entry etaf-performance--installed-advices))))
@ -785,7 +785,7 @@ package defining FUNCTION is loaded. Return FUNCTION."
(defun etaf-performance--format-report (operation)
"Return compact public backend metadata for OPERATION."
(if-let ((report (plist-get (etaf-performance-operation-metadata operation)
(if-let* ((report (plist-get (etaf-performance-operation-metadata operation)
:ebox)))
(format "%s/%s d:%s o:%s tp:%s/%s/%s%s"
(or (plist-get report :strategy) "-")

View File

@ -142,7 +142,7 @@ Runtime, watchers run synchronously.")
((etaf-effect-active-p subscriber)
(unless (gethash subscriber etaf--dispatch-effect-set)
(puthash subscriber t etaf--dispatch-effect-set)
(if-let ((scheduler (etaf-effect-scheduler subscriber)))
(if-let* ((scheduler (etaf-effect-scheduler subscriber)))
(funcall scheduler subscriber)
(etaf-reactive-effect-run subscriber))))))
subscribers)))
@ -210,7 +210,7 @@ Runtime, watchers run synchronously.")
(when (and (etaf-effect-p effect) (etaf-effect-active-p effect))
(setf (etaf-effect-active-p effect) nil)
(etaf--clear-effect-deps effect)
(when-let ((cleanup (etaf-effect-on-stop effect)))
(when-let* ((cleanup (etaf-effect-on-stop effect)))
(setf (etaf-effect-on-stop effect) nil)
(funcall cleanup)))
effect)
@ -422,7 +422,7 @@ diagnostics. Return a stop function."
(when cleanup
(funcall cleanup)
(setq cleanup nil))
(when-let ((result (funcall callback new-value previous)))
(when-let* ((result (funcall callback new-value previous)))
(when (functionp result)
(setq cleanup result)))))))))
(setq effect
@ -451,7 +451,7 @@ effect. If FUNCTION returns a function, it cleans up the previous run."
(lambda ()
(when (etaf-effect-active-p effect)
(when cleanup (funcall cleanup) (setq cleanup nil))
(when-let ((result (etaf-reactive-effect-run effect)))
(when-let* ((result (etaf-reactive-effect-run effect)))
(when (functionp result) (setq cleanup result))))))
(setq effect
(etaf-reactive-effect-create
@ -519,7 +519,7 @@ effect. If FUNCTION returns a function, it cleans up the previous run."
(setf (etaf-effect-scope-effects scope) nil
(etaf-effect-scope-children scope) nil
(etaf-effect-scope-cleanups scope) nil)
(when-let ((parent (etaf-effect-scope-parent scope)))
(when-let* ((parent (etaf-effect-scope-parent scope)))
(setf (etaf-effect-scope-children parent)
(delq scope (etaf-effect-scope-children parent))))
(nreverse errors))))

View File

@ -63,7 +63,7 @@
(defun etaf--resource-run-cleanup (resource)
"Run RESOURCE's current cleanup once."
(when-let ((cleanup (etaf-resource-cleanup resource)))
(when-let* ((cleanup (etaf-resource-cleanup resource)))
(setf (etaf-resource-cleanup resource) nil)
(funcall cleanup)))

View File

@ -343,7 +343,7 @@ the sequential `etaf--pvec-put' contract."
(unless (hash-table-p updates)
(error "ETAF Theme paint update requires an active candidate"))
(if (eq property :border)
(if-let ((parts (etaf--theme-border-paint-parts resolved)))
(if-let* ((parts (etaf--theme-border-paint-parts resolved)))
(let* ((shape (car parts))
(color (cadr parts))
(spec (etaf--theme-paint-face-spec
@ -423,7 +423,7 @@ the sequential `etaf--pvec-put' contract."
(etaf--contribution-index-host-removals index)
(etaf--contribution-index-semantic-removals index)))
(setq index nil)
(if-let ((entry (assoc key
(if-let* ((entry (assoc key
(etaf--contribution-index-values index slot))))
(setq found entry)
(setq index (etaf--contribution-index-base index)))))
@ -482,7 +482,7 @@ the sequential `etaf--pvec-put' contract."
generation 'context-consumers))
(let ((provider-id (caar entry)))
(dolist (effect-id (cdr entry))
(when-let ((effect (etaf--generation-effect generation effect-id)))
(when-let* ((effect (etaf--generation-effect generation effect-id)))
(let ((consumer-id (etaf--generation-effect-semantic-id effect)))
(unless (= provider-id consumer-id)
(cl-pushnew consumer-id
@ -668,7 +668,7 @@ FULL-P means candidate tables describe the complete mounted tree."
(defun etaf-runtime-generation (runtime)
"Return RUNTIME's committed generation id."
(if-let ((generation (etaf-runtime-current-generation runtime)))
(if-let* ((generation (etaf-runtime-current-generation runtime)))
(etaf-generation-generation-id generation)
0))
@ -702,12 +702,12 @@ FULL-P means candidate tables describe the complete mounted tree."
(defun etaf--generation-semantic (generation identity)
"Return IDENTITY semantic node from GENERATION."
(when-let ((id (gethash identity (etaf-generation-identity-index generation))))
(when-let* ((id (gethash identity (etaf-generation-identity-index generation))))
(etaf--pvec-get (etaf-generation-semantic-nodes generation) id)))
(defun etaf--generation-effect-semantic (generation effect-id)
"Return EFFECT-ID semantic node from GENERATION."
(when-let ((effect (etaf--pvec-get
(when-let* ((effect (etaf--pvec-get
(etaf-generation-effect-map generation) effect-id)))
(etaf--pvec-get (etaf-generation-semantic-nodes generation)
(etaf--generation-effect-semantic-id effect))))
@ -1012,7 +1012,7 @@ effect-to-source edges. It is intentionally immutable and suitable as an
(defun etaf--runtime-route-scheduler (route source)
"Route dirty SOURCE through opaque ROUTE to its current generation."
(when-let ((runtime
(when-let* ((runtime
(gethash (etaf-runtime-route-mount-epoch route)
etaf--runtime-route-registry)))
(when (etaf-runtime-mounted-p runtime)
@ -1144,7 +1144,7 @@ when the requested boundary is no longer mounted."
(defun etaf--runtime-component-env-signature (runtime component-id)
"Return COMPONENT-ID's candidate or committed input signature in RUNTIME."
(when component-id
(or (when-let ((env (gethash component-id
(or (when-let* ((env (gethash component-id
(etaf-runtime-candidate-component-envs runtime))))
(list (copy-tree (plist-get env :props))
(copy-tree (plist-get env :slots))))
@ -1366,7 +1366,7 @@ receive an independent Host effect."
(defun etaf--runtime-finish-semantic-host
(runtime semantic-id &optional content content-parts)
"Seal SEMANTIC-ID Host child order from RUNTIME candidate graph."
(when-let ((record (gethash semantic-id
(when-let* ((record (gethash semantic-id
(etaf-runtime-candidate-graph-nodes runtime))))
(setf (etaf--semantic-host-child-ids record)
(copy-sequence
@ -1515,7 +1515,7 @@ need to know how Behavior attributes are merged."
(old-key (gethash identity old-resources))
(candidate-key (gethash identity candidate-resources)))
(unless (and candidate (eq candidate old))
(when-let ((cleanup (cdr old)))
(when-let* ((cleanup (cdr old)))
(etaf--runtime-run-contained-cleanup
runtime 'behavior-remove identity cleanup))
(when old-key
@ -1534,7 +1534,7 @@ need to know how Behavior attributes are merged."
(defun etaf--runtime-rollback-behaviors (runtime)
"Dispose Behavior installers created by a failed RUNTIME candidate."
(when-let ((candidate (etaf-runtime-candidate-behaviors runtime)))
(when-let* ((candidate (etaf-runtime-candidate-behaviors runtime)))
(dolist (entry (reverse
(sort (let (entries)
(maphash (lambda (key value)
@ -1558,7 +1558,7 @@ need to know how Behavior attributes are merged."
(etaf-runtime-behavior-resource-keys runtime))))
(same-state (eq state old-state)))
(unless same-state
(when-let ((cleanup (cdr state)))
(when-let* ((cleanup (cdr state)))
(etaf--runtime-run-contained-cleanup
runtime 'behavior-rollback identity cleanup))
(when (and candidate-key (not (equal candidate-key old-key)))
@ -1811,7 +1811,7 @@ need to know how Behavior attributes are merged."
(etaf-runtime-candidate-graph-children runtime))
(remhash range-id (etaf-runtime-candidate-graph-children runtime))
(dolist (child-id children)
(when-let ((child
(when-let* ((child
(gethash child-id
(etaf-runtime-candidate-graph-nodes runtime))))
(let ((copy (copy-sequence child)))
@ -1886,7 +1886,7 @@ need to know how Behavior attributes are merged."
'component-output effect-id)
:item-host-ids child-ids :item-identity-index item-index)))
(dolist (child-id child-ids)
(when-let ((child (gethash child-id
(when-let* ((child (gethash child-id
(etaf-runtime-candidate-graph-nodes runtime))))
(let ((copy (copy-sequence child)))
(cond ((etaf--semantic-host-p copy)
@ -1901,7 +1901,7 @@ need to know how Behavior attributes are merged."
(puthash child-id copy
(etaf-runtime-candidate-graph-nodes runtime)))))
(dolist (item-id all-item-ids)
(when-let ((item (gethash item-id
(when-let* ((item (gethash item-id
(etaf-runtime-candidate-graph-nodes runtime))))
(when (etaf--semantic-host-p item)
(puthash (etaf--semantic-host-identity item) item-id item-index))))
@ -1931,7 +1931,7 @@ need to know how Behavior attributes are merged."
(puthash effect-id nodes
(etaf-runtime-candidate-range-artifacts runtime))
(dolist (child-id child-ids)
(when-let ((child (gethash child-id
(when-let* ((child (gethash child-id
(etaf-runtime-candidate-graph-nodes runtime))))
(let ((nested
(cond
@ -2038,13 +2038,13 @@ need to know how Behavior attributes are merged."
;; subtree. Preserve the artifact root's contribution entry so
;; a stable interactive child (for example a Button Component)
;; remains dispatchable without traversing unrelated descendants.
(when-let ((host-ref (plist-get artifact :host-ref)))
(when-let ((handlers
(when-let* ((host-ref (plist-get artifact :host-ref)))
(when-let* ((handlers
(etaf--generation-index-lookup
old-generation 'handlers host-ref)))
(puthash host-ref (copy-tree handlers)
(etaf-runtime-candidate-handlers runtime)))
(when-let ((host-props
(when-let* ((host-props
(etaf--generation-index-lookup
old-generation 'host-props host-ref)))
(puthash host-ref (copy-tree host-props)
@ -2309,12 +2309,12 @@ need to know how Behavior attributes are merged."
(when (and (etaf--semantic-host-p semantic)
(etaf--semantic-host-host-ref semantic))
(let ((host-ref (etaf--semantic-host-host-ref semantic)))
(when-let ((handlers
(when-let* ((handlers
(etaf--generation-index-lookup
generation 'handlers host-ref)))
(puthash host-ref (copy-tree handlers)
(etaf-runtime-candidate-handlers runtime)))
(when-let ((props
(when-let* ((props
(etaf--generation-index-lookup
generation 'host-props host-ref)))
(puthash host-ref (copy-tree props)
@ -2377,7 +2377,7 @@ need to know how Behavior attributes are merged."
(puthash semantic-id (copy-sequence children)
(etaf-runtime-candidate-graph-children runtime))
(dolist (child-id children)
(when-let ((child (etaf--pvec-get
(when-let* ((child (etaf--pvec-get
(etaf-generation-semantic-nodes generation) child-id)))
(etaf--runtime-carry-committed-subtree runtime generation child)))))
@ -2543,7 +2543,7 @@ need to know how Behavior attributes are merged."
(signal 'etaf-runtime-error
(list "raw-ebox :value must return one public Ebox node")))
(setq node (copy-tree node))
(when-let ((key-thunk (etaf--raw-ebox-key-thunk raw)))
(when-let* ((key-thunk (etaf--raw-ebox-key-thunk raw)))
(let ((key (funcall key-thunk)))
(etaf--validate-key key)
(setq node (plist-put node :key key)))))
@ -2827,7 +2827,7 @@ The candidate uses resolved VALUE, DEPS, and NODES."
(defun etaf--runtime-keyed-range-snapshot (expr)
"Return EXPR's validated keyed Range snapshot, or nil."
(when-let ((snapshot-function (etaf--expr-range-snapshot expr)))
(when-let* ((snapshot-function (etaf--expr-range-snapshot expr)))
(let ((key-function (etaf--expr-range-key expr))
(item-function (etaf--expr-range-item expr))
(snapshot (funcall snapshot-function)))
@ -2991,7 +2991,7 @@ The candidate uses resolved VALUE, DEPS, and NODES."
(etaf-runtime-candidate-inline-host-ids runtime)
:test #'eql)
(etaf--runtime-invalidate-semantic-ancestors runtime host-id)
(when-let ((component
(when-let* ((component
(etaf--pvec-get
(etaf-generation-semantic-nodes generation)
(etaf--semantic-inline-range-component-id old))))
@ -3270,7 +3270,7 @@ Generation, including its effects and Host contributions."
;; node itself remains attached and is overwritten in place.
(maphash
(lambda (semantic-id semantic)
(when-let ((old (etaf--pvec-get
(when-let* ((old (etaf--pvec-get
(etaf-generation-semantic-nodes base) semantic-id)))
(when (and (etaf--semantic-host-p old)
(etaf--semantic-host-p semantic)
@ -3332,7 +3332,7 @@ Generation, including its effects and Host contributions."
new-effects metrics)))))))
(remove-effect
(effect-id)
(when-let ((old-effect
(when-let* ((old-effect
(and effect-map
(etaf--pvec-get effect-map effect-id metrics
'effect))))
@ -3440,7 +3440,7 @@ Generation, including its effects and Host contributions."
(dolist (effect-id (etaf-runtime-candidate-removed-effect-ids runtime))
(remove-effect effect-id))
(dolist (semantic-id (etaf-runtime-candidate-removed-semantic-ids runtime))
(when-let ((old-node (and base
(when-let* ((old-node (and base
(etaf--pvec-get
(etaf-generation-semantic-nodes base)
semantic-id))))
@ -3576,7 +3576,7 @@ Generation, including its effects and Host contributions."
(defun etaf--runtime-complete-generation (runtime old generation)
"Complete RUNTIME from OLD through GENERATION and prune obsolete routes."
(when-let ((focus-ref (etaf-runtime-focus-ref runtime)))
(when-let* ((focus-ref (etaf-runtime-focus-ref runtime)))
(let ((props (etaf--generation-index-lookup
generation 'host-props focus-ref)))
(unless (and (numberp (plist-get props :tab-index))
@ -3585,7 +3585,7 @@ Generation, including its effects and Host contributions."
(setf (etaf-runtime-focus-ref runtime) nil))))
(maphash
(lambda (_identity semantic)
(when-let ((instance
(when-let* ((instance
(gethash (etaf--semantic-component-resource-key semantic)
(etaf-runtime-resource-registry runtime))))
(setf (etaf--component-instance-context instance)
@ -3671,7 +3671,7 @@ Generation, including its effects and Host contributions."
(etaf-runtime-candidate-behavior-resource-keys runtime)))
(maphash
(lambda (effect-id artifact)
(when-let ((semantic
(when-let* ((semantic
(etaf--generation-effect-semantic
generation effect-id)))
(let ((key (etaf--semantic-component-artifact-key semantic)))
@ -3681,7 +3681,7 @@ Generation, including its effects and Host contributions."
(etaf-runtime-candidate-artifacts runtime))
(maphash
(lambda (effect-id artifact)
(when-let ((range
(when-let* ((range
(etaf--generation-effect-semantic
generation effect-id)))
(let ((key (etaf--semantic-backend-range-artifact-key range)))
@ -3728,7 +3728,7 @@ Generation, including its effects and Host contributions."
(old (etaf--generation-participant-old participant))
(candidate (etaf--generation-participant-candidate participant))
paint-updates)
(when-let ((table
(when-let* ((table
(etaf-runtime-candidate-theme-paint-updates runtime)))
(maphash (lambda (slot spec)
(push (cons slot (copy-tree spec)) paint-updates))
@ -3743,7 +3743,7 @@ Generation, including its effects and Host contributions."
(setf (etaf--generation-participant-state participant) 'published
success t))
(unless success
(when-let ((paint-journal
(when-let* ((paint-journal
(etaf--generation-participant-paint-journal participant)))
(tp-paint-slot-rollback-updates paint-journal)
(setf (etaf--generation-participant-paint-journal participant) nil))
@ -3752,7 +3752,7 @@ Generation, including its effects and Host contributions."
(defun etaf--runtime-participant-rollback (participant)
"Rollback PARTICIPANT generation exactly and idempotently."
(when-let ((paint-journal
(when-let* ((paint-journal
(etaf--generation-participant-paint-journal participant)))
(tp-paint-slot-rollback-updates paint-journal)
(setf (etaf--generation-participant-paint-journal participant) nil))
@ -3838,7 +3838,7 @@ Generation, including its effects and Host contributions."
generation (etaf--semantic-component-child-ids semantic)))
found)
(dolist (semantic-id descendants)
(when-let ((slot-range
(when-let* ((slot-range
(let ((node (etaf--pvec-get
(etaf-generation-semantic-nodes generation)
semantic-id)))
@ -3922,7 +3922,7 @@ Generation, including its effects and Host contributions."
(etaf--resolve-property-value
(etaf--host-property-binding-expression
binding)))))))
(if-let ((component-id
(if-let* ((component-id
(etaf--semantic-host-component-id base)))
(etaf--runtime-call-with-component-env
runtime component-id evaluate)
@ -4518,7 +4518,7 @@ Generation, including its effects and Host contributions."
:test #'eql)
(etaf--runtime-invalidate-semantic-ancestors
runtime (etaf--semantic-inline-range-parent-id inline))
(when-let ((component
(when-let* ((component
(etaf--pvec-get
(etaf-generation-semantic-nodes
(etaf-runtime-current-generation runtime))
@ -4607,7 +4607,7 @@ Generation, including its effects and Host contributions."
(or (gethash (etaf--semantic-component-identity record)
(etaf-runtime-candidate-semantic-nodes runtime))
record))))
(when-let ((key (etaf--semantic-component-artifact-key record)))
(when-let* ((key (etaf--semantic-component-artifact-key record)))
(push key
(etaf-runtime-candidate-invalidated-artifact-keys runtime)))
(setf (etaf--semantic-component-artifact-key candidate) nil)
@ -5190,10 +5190,10 @@ backend anchor proof failed; ordinary root turns keep their artifact reuse."
(pop tail)
(unless (memq key '(:viewport-width :viewport-height))
(error "Unknown ETAF mount option: %S" key)))))
(when-let ((width (plist-get options :viewport-width)))
(when-let* ((width (plist-get options :viewport-width)))
(unless (and (numberp width) (> width 0))
(error "ETAF mount :viewport-width must be positive: %S" width)))
(when-let ((height (plist-get options :viewport-height)))
(when-let* ((height (plist-get options :viewport-height)))
(unless (and (numberp height) (> height 0))
(error "ETAF mount :viewport-height must be positive: %S" height)))
options)
@ -5238,7 +5238,7 @@ of requiring an immediate viewport rerender."
(etaf-scope-stop (etaf-runtime-scope runtime))
(maphash
(lambda (identity state)
(when-let ((cleanup (cdr state)))
(when-let* ((cleanup (cdr state)))
(etaf--runtime-run-contained-cleanup
runtime 'behavior-unmount identity cleanup)))
(etaf-runtime-behaviors runtime))

View File

@ -157,7 +157,7 @@ form, or core Host. A collision receives a semantic `-view' alias."
(etaf--component-error
"Component %S is already registered" name)))
(puthash name spec etaf--view-registry)
(when-let ((alias (etaf--component-alias name)))
(when-let* ((alias (etaf--component-alias name)))
(let ((existing (gethash alias etaf--view-registry)))
(when (and existing (not (eq existing spec))
(not etaf--allow-component-redefinition))

View File

@ -129,10 +129,10 @@
(defun etaf-counter-example-close ()
"Unmount and kill the counter example buffer."
(interactive)
(when-let ((runtime
(when-let* ((runtime
(etaf-runtime-for-buffer etaf-counter-example-buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer etaf-counter-example-buffer-name)))
(when-let* ((buffer (get-buffer etaf-counter-example-buffer-name)))
(kill-buffer buffer)))
(provide 'etaf-counter-example)

View File

@ -179,10 +179,10 @@ Use BORDER and BACKGROUND for its semantic color family."
(defun etaf-data-example-close ()
"Unmount and kill the Data Controller example buffer."
(interactive)
(when-let ((runtime
(when-let* ((runtime
(etaf-runtime-for-buffer etaf-data-example-buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer etaf-data-example-buffer-name)))
(when-let* ((buffer (get-buffer etaf-data-example-buffer-name)))
(kill-buffer buffer)))
(provide 'etaf-data-example)

View File

@ -133,10 +133,10 @@
(defun etaf-resource-example-close ()
"Unmount and kill the Resource lifecycle example buffer."
(interactive)
(when-let ((runtime
(when-let* ((runtime
(etaf-runtime-for-buffer etaf-resource-example-buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer etaf-resource-example-buffer-name)))
(when-let* ((buffer (get-buffer etaf-resource-example-buffer-name)))
(kill-buffer buffer)))
(provide 'etaf-resource-example)

View File

@ -306,9 +306,9 @@
'(runtime reactive ebox tp)))
(etaf-performance-operation-stages record)))
(etaf-performance-records))))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer))))))
(ert-deftest etaf-performance-panel-has-operation-and-stage-entries ()

View File

@ -1456,9 +1456,9 @@
(etaf-runtime-root-node
(etaf-runtime-for-buffer buffer-name))
:color))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-mounted-styles-stop-at-nested-component-boundaries ()
@ -1473,9 +1473,9 @@
(etaf-runtime-root-node
(etaf-runtime-for-buffer buffer-name))
:color))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-theme-defaults-are-inherited-and-overridable ()
@ -1488,9 +1488,9 @@
(node (etaf-runtime-root-node runtime)))
(should (equal "theme-color" (ebox-get node :color)))
(should (equal "theme-bg" (ebox-get node :bgcolor)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-theme-token-resolves-static-component-style ()
@ -1505,9 +1505,9 @@
(etaf-runtime-root-node
(etaf-runtime-for-buffer buffer-name))
:color))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-theme-token-resolves-nested-fallback-before-transform ()
@ -1551,9 +1551,9 @@
"#EEEEEE"))
(should (equal (etaf-test--face-value face :background)
"#111111"))))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-theme-paint-slot-rolls-back-with-generation-failure ()
@ -1582,9 +1582,9 @@
(should (= generation (etaf-runtime-generation runtime)))
(should (equal "#111111"
(plist-get (tp-paint-slot-spec slot) :foreground)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-theme-and-component-change-publish-one-final-artifact ()
@ -1627,9 +1627,9 @@
(should (equal "#111111" (background slot))))
(should (string-match-p
"Dark" (etaf-test--buffer-text buffer-name)))))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-runtime-detached-component-subtree-retires-host-effects ()
@ -1664,9 +1664,9 @@
(should
(equal "#222222"
(plist-get (tp-paint-slot-spec color) :foreground))))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-theme-resolves-explicit-light-dark-palette ()
@ -1729,9 +1729,9 @@
(should (= etaf-test-updated-count 1))
(etaf-unmount (etaf-runtime-for-buffer buffer-name))
(should (= etaf-test-unmounted-count 1)))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-runtime-recollects-late-branch-dependencies ()
@ -1748,9 +1748,9 @@
(setf (etaf-value etaf-test-branch-late-cell) "late-updated")
(with-current-buffer buffer-name
(should (equal "late-updated" (buffer-string)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-runtime-branch-switch-keeps-equal-sources-distinct ()
@ -1774,9 +1774,9 @@
(setf (etaf-value etaf-test-branch-late-cell) "new-only")
(should (= (1+ before) (etaf-runtime-generation runtime)))
(should (equal "new-only" (etaf-test--buffer-text buffer-name)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-theme-validation-snapshot-is-shared-across-contexts ()
"Validate one immutable Theme value once for all inheriting Context frames."
@ -1810,9 +1810,9 @@
(setf (etaf-value etaf-test-theme-cell) 'light)
(with-current-buffer buffer-name
(should (equal "light" (buffer-string)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-behavior-event-and-action-share-runtime-boundary ()
@ -1847,9 +1847,9 @@
(etaf-runtime-handlers runtime)))))
(etaf-unmount runtime))
(should (= etaf-test-behavior-cleanups 1)))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-runtime-composes-host-and-behavior-events-in-order ()
@ -1873,9 +1873,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(etaf-dispatch-event (etaf-runtime-for-buffer buffer-name)
'composed 'press)
(should (equal order '(host behavior))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-behavior-replacement-disposes-previous-installer ()
@ -1912,9 +1912,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(setf (etaf-value marker) 1)
(should (= 3 etaf-test-behavior-installs))
(should (= 2 etaf-test-behavior-cleanups)))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-behavior-rollback-cleanups-continue-and-diagnose ()
@ -2285,9 +2285,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(with-current-buffer buffer-name
(should (equal "B" (buffer-string))))
(should (= 1 etaf-test-setup-count)))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-runtime-keeps-last-committed-view-after-render-error ()
@ -2308,9 +2308,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(setf (etaf-value fail-p) nil)
(with-current-buffer buffer-name
(should (equal "stable:0" (buffer-string)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-runtime-keeps-published-state-when-lifecycle-fails ()
@ -2334,9 +2334,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(setf (etaf-value label) "C")
(with-current-buffer buffer-name
(should (equal "C" (buffer-string)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-events-support-payload-and-cyclic-focus ()
@ -2359,9 +2359,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (eq 'first (etaf-focus-next runtime)))
(etaf-dispatch-event runtime 'second 'input "value" t)
(should (equal "value" payload))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-event-dispatch-batches-reactive-publication ()
@ -2379,9 +2379,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
"source=2 computed=4 watch:2 effect:4"
(buffer-string))))
(should (= 1 (- (etaf-runtime-generation runtime) before)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-pvec-put-many-preserves-values-and-shares-untouched-branches ()
@ -2448,9 +2448,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (= 1 (hash-table-count etaf-test-retained-render-counts)))
(should (eq old-index (etaf-generation-identity-index new)))
(should (<= (etaf--generation-metrics-node-copies metrics) 128)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-shared-source-renders-siblings-in-one-commit ()
"Render exactly two subscribing siblings and publish one candidate."
@ -2493,9 +2493,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (zerop (gethash "U" etaf-test-retained-render-counts 0)))
(should (= 1 root-calls))
(should (= 1 (hash-table-count (etaf-ref-subscribers shared))))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-root-rebuild-retains-unchanged-sibling-routes ()
"Retain an unchanged sibling semantic subtree across a Root-owned rebuild."
@ -2530,9 +2530,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (= root-before root-calls))
(should (= 1 (gethash "R" etaf-test-retained-render-counts 0)))
(should (zerop (gethash "B" etaf-test-retained-render-counts 0)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-setup-read-is-not-a-render-dependency ()
"Do not subscribe a Component render owner to setup-only reads."
@ -2552,9 +2552,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(setf (etaf-value render-source) "B")
(should (= (1+ before) (etaf-runtime-generation runtime)))
(should (equal "B" (etaf-test--buffer-text buffer-name)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-dependency-only-promotion-skips-ebox-publication ()
"Promote changed dependencies/output inputs without an Ebox commit."
@ -2575,9 +2575,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(setf (etaf-value source) 1)
(should (= (1+ before) (etaf-runtime-generation runtime)))
(should (zerop commits))))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-equal-component-input-skips-render ()
"Promote an input target dependency change without running its render target."
@ -2596,9 +2596,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(setf (etaf-value trigger) 1)
(should (= (1+ before) (etaf-runtime-generation runtime)))
(should (zerop etaf-test-input-render-count))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-input-target-precedes-render-target ()
"Render once with final inputs regardless of batched source write order."
@ -2625,9 +2625,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (= 1 etaf-test-priority-render-count))
(should (= 1 (- (etaf-runtime-generation runtime) before)))
(should (equal "B/1" (etaf-test--buffer-text buffer-name)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer))))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer))))))
(ert-deftest etaf-runtime-local-component-retains-caller-style-environment ()
"Preserve caller style/slot environment across a Component-only update."
@ -2650,9 +2650,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (equal "B" (substring-no-properties text)))
(should (equal '(:foreground "retained-color")
(get-text-property 0 'face text)))))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-lazy-computed-owns-its-underlying-dependency ()
"Route Component to computed while its ordinary effect owns the base ref."
@ -2673,9 +2673,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(setf (etaf-value etaf-test-lazy-computed-base) 3)
(should (= (1+ before) (etaf-runtime-generation runtime)))
(should (equal "6" (etaf-test--buffer-text buffer-name))))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-reactive-post-publication-write-runs-next-runtime-turn ()
"Drain a lifecycle source write as a distinct following Runtime turn."
@ -2695,9 +2695,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(setf (etaf-value source) 1)
(should (= 2 (- (etaf-runtime-generation runtime) before)))
(should (equal "1/1" (etaf-test--buffer-text buffer-name)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-route-is-opaque-and-unmount-disarms-sources ()
"Keep sources free of Runtime closures and remove route tokens on unmount."
@ -2713,7 +2713,7 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (gethash route (etaf-ref-subscribers source)))
(etaf-unmount runtime)
(should (= baseline (hash-table-count (etaf-ref-subscribers source)))))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-participant-publish-failure-restores-generation ()
"Restore generation and Ebox state when participant publish fails after swap."
@ -2784,9 +2784,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (equal "1=2" (etaf-test--buffer-text buffer-name)))
(etaf-runtime-flush runtime)
(should (equal "1=3" (etaf-test--buffer-text buffer-name))))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-artifact-registry-stays-bounded ()
"Discard superseded artifacts after repeated Component publications."
@ -2805,9 +2805,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (<= (hash-table-count
(etaf-runtime-artifact-registry runtime))
baseline))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-prepublication-journals-are-exception-atomic ()
"Rollback partial resource, artifact, and route installation immediately."
@ -2845,7 +2845,7 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(etaf--view-call 'etaf-test-retained-leaf
(list :label 1 :cell source) nil))
(etaf-unmount (etaf-runtime-for-buffer buffer-name))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-route-arm-kth-failure-is-bounded-and-retryable ()
"Rollback each partial route arm and keep repeated failures bounded."
@ -2900,9 +2900,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (zerop (hash-table-count (etaf-ref-subscribers left))))
(should (zerop (hash-table-count
(etaf-ref-subscribers right))))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer))))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer))))))
(ert-deftest etaf-runtime-published-generation-resolves-new-resource ()
"Make every newly published resource membership immediately resolvable."
@ -2943,9 +2943,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(etaf-generation-identity-index generation)))))))
(setf (etaf-value show) t)))
(should (= 1 checked)))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-local-parent-does-not-carry-unchanged-descendants ()
"Avoid generation subtree carry for 500 unchanged children of a dirty parent."
@ -2965,9 +2965,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(setf (etaf-value etaf-test-wide-parent-source) 1))
(should (zerop (hash-table-count
etaf-test-retained-render-counts)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-direct-expr-publishes-child-range-only ()
"Publish a direct material-child expr without running its Component owner."
@ -3044,9 +3044,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
child-id)))
(walk child-id))))
(walk 0)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-view-expr-callsite-token-is-stable ()
"Give repeated values from one compiled expr site the same opaque token."
@ -3081,9 +3081,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(etaf-generation-identity-index generation))
(should (= 1 (length ranges)))
(push (etaf--semantic-range-token (car ranges)) tokens)))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer))))
(should (eq (car tokens) (cadr tokens)))))
(ert-deftest etaf-runtime-does-not-encode-ebox-layout-shapes ()
@ -3195,9 +3195,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(list 'host range-id :key 'b)
(etaf--semantic-range-item-identity-index range))))
(if b-id (should (= b-id id)) (setq b-id id))))))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer))))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer))))))
(ert-deftest etaf-runtime-two-direct-ranges-batch-one-publication ()
"Evaluate and splice two disjoint Ranges once in one logical commit."
@ -3227,9 +3227,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (= 1 commits))
(should (= 1 (hash-table-count
(etaf-ref-subscribers etaf-test-range-source))))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-range-artifact-survives-root-rebuild ()
"Relower current Range graph after Root change without application thunks."
@ -3285,9 +3285,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(setf (etaf-value etaf-test-range-source) '((b . "B")))
(should (= 1 etaf-test-range-evals))
(should (string-match-p "B" (etaf-test--buffer-text buffer-name)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-range-address-survives-preceding-static-insert ()
"Keep Range id/ref when its material parent's preceding siblings change."
@ -3322,9 +3322,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (eq range-ref (etaf--semantic-range-range-ref range))))
(setf (etaf-value etaf-test-range-source) '((a . "A")))
(should (= 1 etaf-test-range-evals))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-range-rebuild-keeps-bare-string-siblings ()
"Keep mounted synthetic string Hosts through Range invalidation and rebuild."
@ -3344,9 +3344,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (string-match-p "prefix" text))
(should (string-match-p "A" text))
(should (string-match-p "suffix" text))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-range-failure-rolls-back-and-manual-retries ()
"Restore Range graph/artifacts/buffer for prepublish and final-accept failure."
@ -3400,9 +3400,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(etaf-runtime-flush runtime)
(should (string-match-p "B"
(etaf-test--buffer-text buffer-name))))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-direct-range-rejects-step4b-output-without-reownership ()
"Reject direct Component/raw output while retaining Range-only dependency."
@ -3429,9 +3429,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(etaf--generation-effect generation effect-id)))
(etaf--generation-source-effects
generation etaf-test-unsupported-range-source))))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer))))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer))))))
(ert-deftest etaf-runtime-direct-range-normalizes-bare-string-item ()
"Represent a bare direct expr string as one synthetic semantic text Host."
@ -3454,9 +3454,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (= 1 (length (etaf--semantic-range-item-host-ids range))))
(should (string-match-p "hello"
(etaf-test--buffer-text buffer-name)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-range-recursively-retains-and-removes-host-subtree ()
"Retain keyed nested Hosts and tombstone their full removed subtree."
@ -3532,9 +3532,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should-not (etaf--pvec-get
(etaf-generation-children-table new-generation)
semantic-id))))))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-inline-effect-replaces-only-containing-host ()
"Update one inline site beside 500 unrelated Components with one Host commit."
@ -3612,9 +3612,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(etaf--pvec-get
(etaf-generation-parent-table generation)
(etaf--semantic-inline-range-semantic-id inline)))))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-inline-effects-coalesce-per-host ()
"Coalesce two inline effects in one Host and split two distinct Hosts."
@ -3647,9 +3647,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (= 1 host-replaces))
(should (= 1 commits))
(should (= 1 etaf-test-inline-updated-count))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer))))
(let ((buffer-name " *etaf-inline-two-host-test*")
(etaf-test-inline-shared (etaf-ref "0"))
(etaf-test-inline-shared-evals 0)
@ -3670,9 +3670,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (= 2 etaf-test-inline-shared-evals))
(should (= 2 host-replaces))
(should (= 1 commits)))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-inline-output-equal-promotes-dependencies-only ()
"Promote an inline branch dependency change without Ebox publication."
@ -3709,9 +3709,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (= (1+ before) (etaf-runtime-generation runtime)))
(should (zerop commits))
(should (zerop etaf-test-inline-branch-updated))))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-slot-inline-keeps-authoring-component-environment ()
"Read authoring parent props through default and forwarded named slots."
@ -3740,9 +3740,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (= 1 etaf-test-slot-parent-renders))
(should (zerop etaf-test-slot-forwarder-renders))
(should (zerop etaf-test-slot-consumer-renders)))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer))))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer))))))
(ert-deftest etaf-runtime-nested-component-input-reads-caller-candidate-props ()
"Resolve child input thunks from final candidate parent props."
@ -3755,9 +3755,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (equal "A" (etaf-test--buffer-text buffer-name)))
(setf (etaf-value label) "B")
(should (equal "B" (etaf-test--buffer-text buffer-name))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-inline-and-input-fixed-point-uses-final-props-once ()
"Run input, inline, and Component render once for either source write order."
@ -3788,9 +3788,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (= 1 etaf-test-inline-priority-renders))
(should (= 1 etaf-test-inline-priority-updated))
(should (equal "B/1" (etaf-test--buffer-text buffer-name)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer))))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer))))))
(ert-deftest etaf-runtime-range-and-input-fixed-point-reuses-range-candidate ()
"Evaluate direct Range once when Component input changes in the same turn."
@ -3818,9 +3818,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (= 1 etaf-test-range-component-renders))
(should (string-match-p "B/1"
(etaf-test--buffer-text buffer-name)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer))))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer))))))
(ert-deftest etaf-runtime-slot-range-direct-source-skips-component-renders ()
"Update default, forwarded named, and fallback slot Ranges directly."
@ -3872,9 +3872,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(get-text-property
0 'face (buffer-string))))))
(should (= 1 etaf-test-slot-author-updated))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer))))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer))))))
(ert-deftest etaf-runtime-slot-range-two-sites-batch-one-commit ()
"Evaluate two projection sites and publish two Range replacements once."
@ -3899,9 +3899,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (= 2 etaf-test-slot-range-evals))
(should (= 2 range-replaces))
(should (= 1 commits)))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-slot-retarget-equal-output-promotes-dependencies ()
"Retarget caller slot deps without rendering Consumer or publishing Ebox."
@ -3936,9 +3936,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
generation etaf-test-slot-branch-left))
(should (etaf--generation-source-effects
generation etaf-test-slot-branch-right)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-slot-range-rolls-back-rebuilds-and-removes-items ()
"Keep slot Range state atomic across rollback, rebuild, and item removal."
@ -3993,9 +3993,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(etaf-generation-parent-table generation) item-id))
(should-not (etaf--pvec-get
(etaf-generation-children-table generation) item-id))))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-material-fragment-is-one-retained-range-owner ()
"Update a material fragment without rendering its Component or Root."
@ -4037,9 +4037,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (eq 'fragment
(etaf--generation-effect-kind
(etaf--generation-effect generation effect-id))))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-material-raw-ebox-is-one-opaque-range-owner ()
"Update raw value and key through one opaque Range effect."
@ -4103,9 +4103,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (equal before (etaf-test--buffer-text buffer-name))))
(etaf-runtime-flush runtime)
(should (string-match-p "C" (etaf-test--buffer-text buffer-name)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-root-effect-owns-one-semantic-root-range ()
"Publish Root changes through one semantic Root Range and root replacement."
@ -4159,9 +4159,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (equal before (etaf-test--buffer-text buffer-name))))
(etaf-runtime-flush runtime)
(should (string-match-p "C" (etaf-test--buffer-text buffer-name)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-transparent-component-publishes-output-range ()
"Publish transparent Component nil/one/many output through one Range."
@ -4228,9 +4228,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(etaf-runtime-flush runtime)
(should (string-match-p "C"
(etaf-test--buffer-text buffer-name)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-transparent-chain-shares-nearest-backend-anchor ()
"Update an inner transparent Component without rendering its ancestors."
@ -4260,9 +4260,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (= 1 range-replaces))
(should (= 1 commits))
(should (string-match-p "B" (etaf-test--buffer-text buffer-name))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-runtime-parent-rerender-rebuilds-invalidated-artifact ()
"Rebuild a committed parent anchor after a descendant-only publication."
@ -4288,9 +4288,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
runtime '(etaf-host (root :view)))
:bgcolor)
"dark"))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-runtime-context-provider-promotes-consumer-atomically ()
@ -4329,9 +4329,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(get-text-property 0 'face (buffer-string)))))
(should-not (eq old-generation
(etaf-runtime-current-generation runtime)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-generation-owns-handler-ref-and-focus-contributions ()
"Dispatch only committed handlers and remove stale focus membership."
@ -4382,9 +4382,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should-error (etaf-dispatch-event runtime 'target 'press)
:type 'etaf-event-error)
(should-not (etaf-focused-host-ref runtime))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-candidate-reintroduced-host-cancels-contribution-removal ()
"Cancel a Host tombstone when the same stable ref is re-registered."
@ -4492,9 +4492,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(etaf--generation-effect-kind
(etaf--generation-effect generation
(cadar edges)))))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-context-edge-belongs-to-slot-range-effect ()
"Invalidate the authored slot Range without rendering its consumer."
@ -4523,9 +4523,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (eq 'slot
(etaf--generation-effect-kind
(etaf--generation-effect generation effect-id))))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-context-cycle-validator-allows-long-chain-and-rejects-cycle ()
"Settle a long Context graph and reject one deterministic cross-edge cycle."
@ -4593,9 +4593,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(let ((text (buffer-string)))
(should (equal "PB" (substring-no-properties text)))
(should (get-text-property 1 'face text)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(when-let* ((buffer (get-buffer buffer-name))) (kill-buffer buffer)))))
(ert-deftest etaf-event-dispatch-noop-does-not-publish ()
"Do not publish when an event callback changes no reactive state."
@ -4607,9 +4607,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(before (etaf-runtime-generation runtime)))
(etaf-dispatch-event runtime 'event-batch-noop 'press)
(should (= before (etaf-runtime-generation runtime)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-event-dispatch-nested-batches-once ()
@ -4624,9 +4624,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (equal "Outer Inner nested"
(etaf-test--buffer-text buffer-name)))
(should (= 1 (- (etaf-runtime-generation runtime) before)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-event-dispatch-batches-behavior-two-ref-write ()
@ -4642,9 +4642,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (equal "Toggle left=on right=on"
(etaf-test--buffer-text buffer-name)))
(should (= 1 (- (etaf-runtime-generation runtime) before)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-event-dispatch-batches-computed-theme ()
@ -4661,9 +4661,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should (equal "Theme theme=dark"
(etaf-test--buffer-text buffer-name)))
(should (= 1 (- (etaf-runtime-generation runtime) before)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-event-dispatch-batches-resource-success-and-error ()
@ -4696,9 +4696,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
"status=error value=none error=yes"
(buffer-string))))
(should (= 1 (- (etaf-runtime-generation runtime) before)))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer))
(etaf-resource-dispose resource))))
@ -4746,9 +4746,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(etaf-unmount runtime))
(with-current-buffer buffer-name
(should-not etaf-input-mode)))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-activation-skips-disabled-and-callbackless-hosts ()
@ -4777,9 +4777,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(list window
(etaf-host-ref-position runtime 'passive))))))
(should (= 0 etaf-test-event-count))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-mount-publishes-through-ebox ()
@ -4791,7 +4791,7 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(etaf-view (text :color "#F4F6FB" "Mounted")))
(with-current-buffer buffer-name
(should (equal "Mounted" (buffer-string)))))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
(ert-deftest etaf-mount-accepts-final-initial-viewport ()
@ -4815,9 +4815,9 @@ Event composition is a Runtime contract, not a UI-library helper contract."
(should-error
(etaf-mount buffer-name (etaf-view (text "Invalid"))
'(:viewport-width 0))))
(when-let ((runtime (etaf-runtime-for-buffer buffer-name)))
(when-let* ((runtime (etaf-runtime-for-buffer buffer-name)))
(etaf-unmount runtime))
(when-let ((buffer (get-buffer buffer-name)))
(when-let* ((buffer (get-buffer buffer-name)))
(kill-buffer buffer)))))
;;; etaf-tests.el ends here