From b454cbb0617626282f48b19dbd44a0b2a12ceb74 Mon Sep 17 00:00:00 2001 From: Kinneyzhang Date: Sun, 26 Jul 2026 23:58:12 +0800 Subject: [PATCH] Make two doctest assertions property-order-insensitive for Emacs 28 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Emacs 28 stores/prints text-property plists in a different order than 29+; the S-mystyle and L-paramgroup assertions compared whole prin1 strings and failed on 28.1 only. Compare per property instead (face, tp-name, tp-layers — the stack order inside tp-layers is stable), and note the version-dependent print order beside both README examples. Co-Authored-By: Claude Fable 5 --- README.md | 4 ++++ README_CN.md | 3 +++ tp-doctest.el | 53 +++++++++++++++++++++++++++++++-------------------- 3 files changed, 39 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 61f96a9..cb873cd 100644 --- a/README.md +++ b/README.md @@ -597,6 +597,8 @@ LAYER-NAME can be a symbol representing a layer defined by `define-tp` or a grou :data '((my-color . "blue"))) (tp-set " " 'my-style) ;; => #(" " 0 1 (face (:foreground "blue") tp-name my-style)) +;; (the printed ORDER of properties may differ across Emacs +;; versions; the values are identical) ;; Merge multiple faces in a single call (duplicate properties auto-merged) (tp-set "emacs" @@ -1827,6 +1829,8 @@ The first layer in the definition is the top layer (visible by default). ;; => #("emacs" 0 5 (face (:foreground "orange") tp-name tp-test-l1 ;; tp-layers ((face (:foreground "red") tp-name tp-test-l2) ;; (face (:background "green") tp-name tp-test-l3)))) +;; (top-level property print order may differ across Emacs versions; +;; the tp-layers stack order itself is stable) ``` --- diff --git a/README_CN.md b/README_CN.md index 6dbecc6..bae2aa5 100644 --- a/README_CN.md +++ b/README_CN.md @@ -587,6 +587,7 @@ LAYER-NAME 可以是通过 `define-tp` 定义的自定义文本属性名称或 :data '((my-color . "blue"))) (tp-set " " 'my-style) ;; => #(" " 0 1 (face (:foreground "blue") tp-name my-style)) +;; (属性的打印顺序在不同 Emacs 版本间可能不同,值本身一致) ;; 单次调用中合并多个 face(重复属性自动合并) (tp-set "emacs" @@ -1813,6 +1814,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ;; => #("emacs" 0 5 (face (:foreground "orange") tp-name tp-test-l1 ;; tp-layers ((face (:foreground "red") tp-name tp-test-l2) ;; (face (:background "green") tp-name tp-test-l3)))) +;; (顶层属性的打印顺序在不同 Emacs 版本间可能不同, +;; tp-layers 栈内顺序本身是稳定的) ``` --- diff --git a/tp-doctest.el b/tp-doctest.el index 8189784..669db3a 100644 --- a/tp-doctest.el +++ b/tp-doctest.el @@ -98,12 +98,15 @@ (tp-layer-props 'full-name-layer))) ;; ---- tp-set my-style ---- -(chk-str "S-mystyle" "#(\" \" 0 1 (face (:foreground \"blue\") tp-name my-style))" - (progn - (define-tp my-style () - :props '(face (:foreground $my-color)) - :data '((my-color . "blue"))) - (tp-set " " 'my-style))) +;; Compared per property: the ORDER properties print in varies across +;; Emacs versions (28 vs 29+), the values do not. +(chk "S-mystyle" '((:foreground "blue") my-style) + (progn + (define-tp my-style () + :props '(face (:foreground $my-color)) + :data '((my-color . "blue"))) + (let ((r (tp-set " " 'my-style))) + (list (tp-at 0 'face r) (tp-at 0 'tp-name r))))) ;; ---- tp-member ---- (chk "M-member-str" '((face nil) nil) @@ -232,21 +235,29 @@ '("first-quarter" . (display "🌓")) '("full" . (display "🌕"))) (tp-layer-props 'moon-phases-full))) -(chk-str "L-paramgroup" - "#(\"emacs\" 0 5 (face (:foreground \"orange\") tp-name tp-test-l1 tp-layers ((face (:foreground \"red\") tp-name tp-test-l2) (face (:background \"green\") tp-name tp-test-l3))))" - (progn - (tp-layer-reset) - (define-tp tp-test-l1 (color) - `(face (:foreground ,color))) - (define-tp tp-test-l2 (color) - `(face (:foreground ,color))) - (define-tp tp-test-l3 () - '(face (:background "green"))) - (define-tps tp-test-group1 (color) - `(tp-test-l1 ,color) - '(tp-test-l2 "red") - 'tp-test-l3) - (tp-set "emacs" 'tp-test-group1 "orange"))) +;; Compared per property (print order of the top-level plist varies +;; across Emacs versions; the tp-layers stack order itself is stable). +(chk "L-paramgroup" + '((:foreground "orange") + tp-test-l1 + ((face (:foreground "red") tp-name tp-test-l2) + (face (:background "green") tp-name tp-test-l3))) + (progn + (tp-layer-reset) + (define-tp tp-test-l1 (color) + `(face (:foreground ,color))) + (define-tp tp-test-l2 (color) + `(face (:foreground ,color))) + (define-tp tp-test-l3 () + '(face (:background "green"))) + (define-tps tp-test-group1 (color) + `(tp-test-l1 ,color) + '(tp-test-l2 "red") + 'tp-test-l3) + (let ((r (tp-set "emacs" 'tp-test-group1 "orange"))) + (list (tp-at 0 'face r) + (tp-at 0 'tp-name r) + (tp-at 0 'tp-layers r))))) (chk "L-props" '((face bold help-echo "tip") (face bold help-echo "tip" tp-name my-layer)) (progn