branch: externals/hyperbole
commit 9a39300fcbbcb99b09a0f8a519cff33394a9268d
Merge: 6befc489c5 27461eb409
Author: Bob Weiner <r...@gnu.org>
Commit: Bob Weiner <r...@gnu.org>
    Merge branch 'rsw' of hyperbole into rsw
---
 ChangeLog            |  27 +++++++++++++
 hbut.el              |  33 +++++++++++++---
 hui-menu.el          |   4 +-
 test/hbut-tests.el   |  32 +++++++++++++++-
 test/hyrolo-tests.el | 104 +++++++++++++++++++++++++++++++++++++++++++++------
 5 files changed, 180 insertions(+), 20 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 3a7c5ce484..af5219e739 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,30 @@
+2024-02-12  Mats Lidell  <ma...@gnu.org>
+
+* test/hyrolo-tests.el (hyrolo-tests--modify-test-data): Helper for
+    modifying org test data for outline and markdown files.
+    (hyrolo-tests--outline-content-otl)
+    (hyrolo-tests--outline-content-md): Use hyrolo-tests--modify-test-data.
+    (hyrolo-tests---org-expected-outline-for-top-level)
+    (hyrolo-tests---org-expected-outline-for-overview): Add expected
+    outline for org test data.
+    (hyrolo-tests--top-level-outline-for-all-file-types): Test top level 
outline.
+    (hyrolo-tests--overview-outline-for-all-file-types): Test overview outline.
+
+2024-02-11  Mats Lidell  <ma...@gnu.org>
+
+* test/hbut-tests.el (hbut-tests--ebut-act-calls-hbut-act)
+    (hbut-tests--ibut-act-calls-hbut-act): Add test for new act functions
+    with error cases.
+
+* hui-menu.el (hui-menu-explicit-buttons): Use ebut:act-label.
+
+* hbut.el (ibut:act-label, ebut:act-label): Rename ebut:act and ibut:act
+    since they take a label as arg.
+    (ebut:act, ibut:act): Add new act functions taking a hbut as
+    arg. Allow only to be called with ebut or ibut respectively. If
+    falling back on hbut:current check that it is of the same type as the
+    call.
+
 2024-02-08  Mats Lidell  <ma...@gnu.org>
 
 * test/hyrolo-tests.el: Make hide tests more forgiving about hiding
diff --git a/hbut.el b/hbut.el
index fa09f5dd90..e1884e862e 100644
--- a/hbut.el
+++ b/hbut.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    18-Sep-91 at 02:57:09
-;; Last-Mod:     21-Jan-24 at 10:31:14 by Bob Weiner
+;; Last-Mod:     11-Feb-24 at 23:43:08 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -122,7 +122,19 @@ indicating the source of any of its Hyperbole buttons.")
   "*Non-nil value saves button data when button source is saved.
 Nil disables saving.")
 
-(defun    ebut:act (label)
+(defun    ebut:act (&optional ebut)
+  "Perform action for optional explicit Hyperbole button symbol EBUT.
+Default is the symbol hbut:current."
+  (interactive (list (hbut:get (hargs:read-match "Activate labeled Hyperbole 
button: "
+                                                (ebut:alist)
+                                                nil t nil 'ebut))))
+  (unless ebut
+    (setq ebut 'hbut:current))
+  (if (ebut:is-p ebut)
+      (hbut:act ebut)
+    (error "(ebut:act): Expected an ebut but got a but of type %s" (hattr:get 
ebut 'categ))))
+
+(defun    ebut:act-label (label)
   "Activate Hyperbole explicit button with LABEL from the current buffer."
   (interactive (list (hargs:read-match "Activate explicit button labeled: "
                                       (ebut:alist)
@@ -131,7 +143,7 @@ Nil disables saving.")
         (but (ebut:get lbl-key)))
     (if but
        (hbut:act but)
-      (error "(ebut:act): No explicit button labeled: %s" label))))
+      (error "(ebut:act-label): No explicit button labeled: %s" label))))
 
 (defun    ebut:alist (&optional file)
   "Return alist of ebuts in FILE or the current buffer.
@@ -1692,8 +1704,19 @@ Keys in optional KEY-SRC or the current buffer."
 ;;; ibut class - Implicit Hyperbole Buttons
 ;;; ========================================================================
 
+(defun    ibut:act (&optional ibut)
+  "Perform action for optional implicit Hyperbole button symbol IBUT.
+Default is the symbol hbut:current."
+  (interactive (list (hbut:get (hargs:read-match "Activate labeled Hyperbole 
button: "
+                                                (ibut:alist)
+                                                nil t nil 'ibut))))
+  (unless ibut
+    (setq ibut 'hbut:current))
+  (if (ibut:is-p ibut)
+      (hbut:act ibut)
+    (error "(ebut:act): Expected an ibut but got a but of type %s" (hattr:get 
ibut 'categ))))
 
-(defun    ibut:act (label)
+(defun    ibut:act-label (label)
   "Activate Hyperbole implicit button with <[LABEL]> from the current buffer."
   (interactive (list (hargs:read-match "Activate implicit button labeled: "
                                       (ibut:alist)
@@ -1702,7 +1725,7 @@ Keys in optional KEY-SRC or the current buffer."
         (but (ibut:get lbl-key)))
     (if but
        (hbut:act but)
-      (error "(ibut:act): No implicit button labeled: %s" label))))
+      (error "(ibut:act-label): No implicit button labeled: %s" label))))
 
 (defun    ibut:alist (&optional file)
   "Return alist of labeled ibuts in FILE or the current buffer.
diff --git a/hui-menu.el b/hui-menu.el
index 7d3bd8abbd..650cb07c61 100644
--- a/hui-menu.el
+++ b/hui-menu.el
@@ -3,7 +3,7 @@
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    28-Oct-94 at 10:59:44
-;; Last-Mod:     21-Jan-24 at 10:31:58 by Bob Weiner
+;; Last-Mod:      2-Feb-24 at 21:41:16 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -110,7 +110,7 @@ BROWSER-OPTION marks current active menu option as 
selected."
                                 (not hui-menu-order-explicit-buttons))
                           :style toggle :selected 
hui-menu-order-explicit-buttons]
                          "Activate:")
-                       (mapcar (lambda (label) (vector label `(ebut:act 
,label) t))
+                       (mapcar (lambda (label) (vector label `(ebut:act-label 
,label) t))
                                (if hui-menu-order-explicit-buttons
                                    (sort labels #'string-lessp)
                                  labels))
diff --git a/test/hbut-tests.el b/test/hbut-tests.el
index 80d34eb95f..f8a6574bb2 100644
--- a/test/hbut-tests.el
+++ b/test/hbut-tests.el
@@ -3,7 +3,7 @@
 ;; Author:       Mats Lidell <ma...@gnu.org>
 ;;
 ;; Orig-Date:    30-may-21 at 09:33:00
-;; Last-Mod:     20-Jan-24 at 15:43:50 by Mats Lidell
+;; Last-Mod:     11-Feb-24 at 23:35:14 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -738,6 +738,36 @@ See #10 for the proper way to add an ibutton name.
       (hbut-tests:should-match-tmp-folder buf-str)
       (should (null (hattr:get 'hbut:current 'name))))))
 
+(ert-deftest hbut-tests--ebut-act-calls-hbut-act ()
+  "Verify `ebut:act' calls `hbut:act'."
+  (mocklet (((hbut:act 'button) => t)
+            ((ebut:is-p 'button) => t))
+    (should (ebut:act 'button)))
+  (mocklet (((hbut:act 'hbut:current) => t)
+            ((ebut:is-p 'hbut:current) => t))
+    (should (ebut:act)))
+  (mocklet ((ebut:is-p => nil))
+    (should-error (ebut:act 'button))
+    (should-error (ebut:act)))
+  (progn
+    (hattr:clear 'hbut:current)
+    (should-error (ebut:act))))
+
+(ert-deftest hbut-tests--ibut-act-calls-hbut-act ()
+  "Verify `ibut:act' calls `hbut:act'."
+  (mocklet (((hbut:act 'button) => t)
+            ((ibut:is-p 'button) => t))
+    (should (ibut:act 'button)))
+  (mocklet (((hbut:act 'hbut:current) => t)
+            ((ibut:is-p 'hbut:current) => t))
+    (should (ibut:act)))
+  (mocklet ((ibut:is-p => nil))
+    (should-error (ibut:act 'button))
+    (should-error (ibut:act)))
+  (progn
+    (hattr:clear 'hbut:current)
+    (should-error (ibut:act))))
+
 ;; This file can't be byte-compiled without the `el-mock' package (because of
 ;; the use of the `with-mock' macro), which is not a dependency of Hyperbole.
 ;;  Local Variables:
diff --git a/test/hyrolo-tests.el b/test/hyrolo-tests.el
index 82edf07c59..4d52b519dc 100644
--- a/test/hyrolo-tests.el
+++ b/test/hyrolo-tests.el
@@ -3,7 +3,7 @@
 ;; Author:       Mats Lidell <ma...@gnu.org>
 ;;
 ;; Orig-Date:    19-Jun-21 at 22:42:00
-;; Last-Mod:      8-Feb-24 at 13:57:13 by Mats Lidell
+;; Last-Mod:     12-Feb-24 at 23:01:15 by Mats Lidell
 ;;
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 ;;
@@ -986,19 +986,24 @@ body
 body
 * h-org 2
 body
-** h-org-2.1
+** h-org 2.1
 body
 "
   "Outline content for org files.")
 
+(defun hyrolo-tests--modify-test-data (star type str)
+  "Replace * with STAR and org with TYPE in STR.
+Useful for creating outline and markdown test data from org examples."
+  (replace-regexp-in-string
+   "org" type
+   (replace-regexp-in-string (regexp-quote "*") star str)))
+
 (defconst hyrolo-tests--outline-content-otl
-  (replace-regexp-in-string "org" "otl" hyrolo-tests--outline-content-org)
+  (hyrolo-tests--modify-test-data "*" "otl" hyrolo-tests--outline-content-org)
   "Outline content for otl files.")
 
 (defconst hyrolo-tests--outline-content-md
-  (replace-regexp-in-string
-   (regexp-quote "*") "#"
-   (replace-regexp-in-string "org" "md" hyrolo-tests--outline-content-org))
+  (hyrolo-tests--modify-test-data "#" "md" hyrolo-tests--outline-content-org)
   "Outline content for markdown files.")
 
 (ert-deftest hyrolo-tests--forward-same-level-org-level2 ()
@@ -1197,7 +1202,7 @@ body...
 ** h-org 1.1...
 ** h-org 1.2...
 * h-org 2...
-** h-org-2.1...
+** h-org 2.1...
 "
                                          ) "$")
                    (hyrolo-tests--outline-as-string)))
@@ -1213,7 +1218,7 @@ body...
 ** h-org 1.1...
 ** h-org 1.2...
 * h-org 2...
-** h-org-2.1...
+** h-org 2.1...
 "
                            (hyrolo-tests--outline-as-string (point))))
 
@@ -1227,7 +1232,7 @@ body...
 ** h-org 1.1...
 ** h-org 1.2...
 * h-org 2...
-** h-org-2.1...
+** h-org 2.1...
 "
                            (hyrolo-tests--outline-as-string (point)))))
       (kill-buffer hyrolo-display-buffer)
@@ -1289,7 +1294,7 @@ body
 *** h-org 1.2.1
 body
 * h-org 2...
-** h-org-2.1...
+** h-org 2.1...
 "
                              (hyrolo-tests--outline-as-string (point))))
             ;; Hide it again
@@ -1354,14 +1359,89 @@ body
           (hy-test-helpers:consume-input-events)
           (should (string=
                    (concat (hyrolo-tests--hyrolo-section-header org-file1)
-                           "* h-org 1\nbody\n** h-org 1.1\nbody\n** h-org 
1.2\nbody\n*** h-org 1.2.1\nbody\n* h-org 2\nbody\n** h-org-2.1...\n")
+                           "* h-org 1\nbody\n** h-org 1.1\nbody\n** h-org 
1.2\nbody\n*** h-org 1.2.1\nbody\n* h-org 2\nbody\n** h-org 2.1...\n")
                    (hyrolo-tests--outline-as-string)))
 
           (should (hact 'kbd-key "TAB"))
           (hy-test-helpers:consume-input-events)
           (should (string=
                    (concat (hyrolo-tests--hyrolo-section-header org-file1)
-                           "* h-org 1\nbody\n** h-org 1.1\nbody\n** h-org 
1.2\nbody\n*** h-org 1.2.1\nbody\n* h-org 2\nbody\n** h-org-2.1\nbody\n")
+                           "* h-org 1\nbody\n** h-org 1.1\nbody\n** h-org 
1.2\nbody\n*** h-org 1.2.1\nbody\n* h-org 2\nbody\n** h-org 2.1\nbody\n")
+                   (hyrolo-tests--outline-as-string))))
+      (kill-buffer hyrolo-display-buffer)
+      (hy-delete-files-and-buffers hyrolo-file-list))))
+
+(defconst hyrolo-tests---org-expected-outline-for-top-level
+  "\
+* h-org 1...
+* h-org 2...
+"
+  "Expected outline for org test data.")
+
+(ert-deftest hyrolo-tests--top-level-outline-for-all-file-types ()
+  "Verify `hyrolo-top-level' shows first level for all supported file types."
+  (let* ((org-file1 (make-temp-file "hypb" nil ".org" 
hyrolo-tests--outline-content-org))
+         (otl-file1 (make-temp-file "hypb" nil ".otl" 
hyrolo-tests--outline-content-otl))
+         (md-file1 (make-temp-file "hypb" nil ".md" 
hyrolo-tests--outline-content-md))
+         (kotl-file1 (hyrolo-tests--gen-kotl-outline "h-kotl" "body" 2))
+         (hyrolo-file-list (list org-file1 otl-file1 md-file1 kotl-file1)))
+    (unwind-protect
+        (progn
+          (hyrolo-grep "body")
+          (hyrolo-top-level)
+
+          (should (string=
+                   (concat (hyrolo-tests--hyrolo-section-header org-file1)
+                           hyrolo-tests---org-expected-outline-for-top-level
+                           (hyrolo-tests--hyrolo-section-header otl-file1)
+                           (hyrolo-tests--modify-test-data "*" "otl" 
hyrolo-tests---org-expected-outline-for-top-level)
+                           (hyrolo-tests--hyrolo-section-header md-file1)
+                           (hyrolo-tests--modify-test-data "#" "md" 
hyrolo-tests---org-expected-outline-for-top-level)
+                           (hyrolo-tests--hyrolo-section-header kotl-file1)
+                           "\
+   1. h-kotl...
+     1a. h-kotl 1...
+")
+                   (hyrolo-tests--outline-as-string))))
+      (kill-buffer hyrolo-display-buffer)
+      (hy-delete-files-and-buffers hyrolo-file-list))))
+
+(defconst hyrolo-tests---org-expected-outline-for-overview
+  "\
+* h-org 1...
+** h-org 1.1...
+** h-org 1.2...
+*** h-org 1.2.1...
+* h-org 2...
+** h-org 2.1...
+"
+  "Expected outline for org test data.")
+
+(ert-deftest hyrolo-tests--overview-outline-for-all-file-types ()
+  "Verify `hyrolo-overview' shows all level headings for all supported file 
types."
+  (let* ((org-file1 (make-temp-file "hypb" nil ".org" 
hyrolo-tests--outline-content-org))
+         (otl-file1 (make-temp-file "hypb" nil ".otl" 
hyrolo-tests--outline-content-otl))
+         (md-file1 (make-temp-file "hypb" nil ".md" 
hyrolo-tests--outline-content-md))
+         (kotl-file1 (hyrolo-tests--gen-kotl-outline "h-kotl" "body" 2))
+         (hyrolo-file-list (list org-file1 otl-file1 md-file1 kotl-file1)))
+    (unwind-protect
+        (progn
+          (hyrolo-grep "body")
+          (hyrolo-overview nil)
+
+          (should (string=
+                   (concat (hyrolo-tests--hyrolo-section-header org-file1)
+                           hyrolo-tests---org-expected-outline-for-overview
+                           (hyrolo-tests--hyrolo-section-header otl-file1)
+                           (hyrolo-tests--modify-test-data "*" "otl" 
hyrolo-tests---org-expected-outline-for-overview)
+                           (hyrolo-tests--hyrolo-section-header md-file1)
+                           (hyrolo-tests--modify-test-data "#" "md" 
hyrolo-tests---org-expected-outline-for-overview)
+                           (hyrolo-tests--hyrolo-section-header kotl-file1)
+                           "\
+   1. h-kotl...
+     1a. h-kotl 1...
+       1a1. h-kotl 2...
+")
                    (hyrolo-tests--outline-as-string))))
       (kill-buffer hyrolo-display-buffer)
       (hy-delete-files-and-buffers hyrolo-file-list))))

Reply via email to