From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Karl Fogel Newsgroups: gmane.emacs.devel Subject: Re: Add new functions to mark/unmark/delete all bookmarks Date: Thu, 06 Aug 2020 20:10:43 -0500 Message-ID: <87v9hv45ws.fsf@red-bean.com> References: <20200724005105.11f85d5f@pineapple> <87pn8ku3y9.fsf@red-bean.com> <20200725124618.49a073b1@pineapple> <87o8nyvufq.fsf@red-bean.com> <20200731045809.4587b13d@pineapple> <87pn88lmqp.fsf@red-bean.com> <20200806195949.79440f5a@pineapple> Reply-To: Karl Fogel Mime-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="34034"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux) Cc: emacs-devel@gnu.org To: Matthew White Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Fri Aug 07 03:11:30 2020 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1k3quv-0008ij-QE for ged-emacs-devel@m.gmane-mx.org; Fri, 07 Aug 2020 03:11:30 +0200 Original-Received: from localhost ([::1]:51358 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1k3quu-0004hy-SD for ged-emacs-devel@m.gmane-mx.org; Thu, 06 Aug 2020 21:11:28 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:53550) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1k3quK-0004If-Jl for emacs-devel@gnu.org; Thu, 06 Aug 2020 21:10:53 -0400 Original-Received: from newsp.red-bean.com ([45.79.25.59]:50076 helo=sanpietro.red-bean.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1k3quH-000520-3D for emacs-devel@gnu.org; Thu, 06 Aug 2020 21:10:52 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=red-bean.com; s=202005newsp; h=Content-Type:MIME-Version:Message-ID: In-Reply-To:Date:Reply-To:References:Subject:Cc:To:From:Sender: Content-Transfer-Encoding:Content-ID:Content-Description; bh=G0LxzeQ2s0r9yQ5WGQFeL/TKzPBXPbW9q7l+mPnaUjM=; t=1596762646; x=1597972246; b=YT96Gm+4ycBOjtomrxSAj1wh8lk3HyeDQ8FsipiYBH9cblfg0yXvBe0saxaow46nhfrHJWXBxd hSipwvVZ3JFeKOfS2jjbD0zkM0PIzK3knV1hBlypav4nACpI7CbPwcMBhbiODzkjEF6iz5n79BizY +NGn5uMGPAv4ccyCMuUFbfswx+nCAEH25kZrcLgNVlrbv3/l6rGJTfsuc42CA26ZB927cTTIvYvK8 5LvQsysYDl3ErDlR28AuEzUwgeX+P4eypZV4M8bNHMK6eVQq9cSinKMyjZz3X+Iijdob4YoY8lLcR fHa7E5N6jn4/8bmj/hu28+0LSg3UoPtr1QlFQ==; Original-Received: from 99-112-125-163.lightspeed.cicril.sbcglobal.net ([99.112.125.163]:48018 helo=floss) by sanpietro.red-bean.com with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1k3quC-0003Oh-KX; Fri, 07 Aug 2020 01:10:44 +0000 In-Reply-To: <20200806195949.79440f5a@pineapple> (Matthew White's message of "Thu, 6 Aug 2020 19:59:49 +0200") Received-SPF: pass client-ip=45.79.25.59; envelope-from=kfogel@red-bean.com; helo=sanpietro.red-bean.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/08/06 21:10:46 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, URIBL_BLOCKED=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.io gmane.emacs.devel:253487 Archived-At: --=-=-= Content-Type: text/plain Content-Transfer-Encoding: quoted-printable >Karl, I waited to answer you in the hope of getting the paperwork... >Still nothing here... I don't know if the FSF already registered my >copyright assignment request, they have my signature, though. I'll ask about it in a separate thread, no problem. Maybe it's all done an= d we just didn't get the news yet. >About the patch, your help is priceless, Karl. I have no trouble to >attach an amended patch, what pressures me is to give you the right >credits! In these days I was thinking how you make me look smarter >than I really am... > >Do as you feel, Karl. The attached patch is my attempt to give you >credit, but you are free to do a follow-up commit, if you prefer. Aw, Matthew, thanks, but you did all the hard work here! If you're okay wi= th it, when I apply the commit I'll just change your commit message to incl= ude a simple phrase like "Thanks to Karl Fogel for pre-commit review" or so= mething like that. Best regards, =2DKarl >>From 716c427928f0b1c9a124608869f848556edc2e12 Mon Sep 17 00:00:00 2001 >From: Matthew White >Date: Thu, 23 Jul 2020 21:14:32 +0000 >Subject: [PATCH] Add ability to mark/unmark/delete all bookmarks > >Special thanks to Karl Fogel, for the priceless help given to review >and correct this commit. > >* lisp/bookmark.el (bookmark-delete-all): New function to delete all > bookmarks. > (bookmark-bmenu-mark-all): New function to mark all bookmarks in the > bookmark list buffer. > (bookmark-bmenu-unmark-all): New function to unmark all bookmarks in > the bookmark list buffer. > (bookmark-bmenu-delete-all): New function to mark for deletion all > bookmarks in the bookmark list buffer. > (bookmark-map): Map "D" to `bookmark-delete-all'. > (bookmark-bmenu-mode-map): New mappping for "M" to > `bookmark-bmenu-mark-all'. > (bookmark-bmenu-mode-map): New mappping for "U" to > `bookmark-bmenu-unmark-all'. > (bookmark-bmenu-mode-map): New mappping for "D" to > `bookmark-bmenu-delete-all'. > (bookmark-bmenu-mark-all): New bookmark menu to > `bookmark-delete-all'. > (easy-menu-define): New bookmark menu to `bookmark-bmenu-mark-all'. > (easy-menu-define): New bookmark menu to > `bookmark-bmenu-unmark-all'. > (easy-menu-define): New bookmark menu to > `bookmark-bmenu-delete-all'. > (bookmark-bmenu-select): Update docstring to include a reference to > `bookmark-bmenu-mark-all'. > (bookmark-bmenu-mode): Update docstring. Add/Update description: > `bookmark-bmenu-mark-all', `bookmark-bmenu-delete-all', > `bookmark-bmenu-execute-deletions', and `bookmark-bmenu-unmark-all'. >* test/lisp/bookmark-resources/test-list.bmk: New bookmark file to > test a list of bookmarks. >* test/lisp/bookmark-tests.el (bookmark-tests-bookmark-file-list): New > reference to the bookmark file used for testing a list of bookmarks. > (bookmark-tests-bookmark-list-0, bookmark-tests-bookmark-list-1, > bookmark-tests-bookmark-list-2): New cached values for testing a > list of bookmark. > (bookmark-tests-cache-timestamp-list): New variable to set > `bookmark-bookmarks-timestamp'. > (with-bookmark-test-list): New macro environment to test a list of > bookmarks. > (with-bookmark-test-file-list): New macro environment to test a list > of bookmarks with example.txt. > (with-bookmark-bmenu-test-list): New macro environment to test > functions about a list of bookmarks from `bookmark-bmenu-list'. > (bookmark-tests-all-names-list, bookmark-tests-get-bookmark-list, > bookmark-tests-get-bookmark-record-list): New functions to test the > records of the list of bookmarks. > (bookmark-tests-make-record-list): New function to test the creation > of a record from example.txt with a list of bookmarks loaded. > (bookmark-tests-delete-all): New function to test > `bookmark-delete-all'. > (bookmark-test-bmenu-any-marks-list): New function to test > `bookmark-bmenu-any-marks' with a list of bookmarks. > (bookmark-test-bmenu-mark-all): New function to test > `bookmark-bmenu-mark-all'. > (bookmark-test-bmenu-unmark-all): New function to test > `bookmark-bmenu-unmark-all'. > (bookmark-test-bmenu-delete-all): New function to test > `bookmark-bmenu-delete-all'. >--- > lisp/bookmark.el | 78 +++++++- > test/lisp/bookmark-resources/test-list.bmk | 20 ++ > test/lisp/bookmark-tests.el | 215 +++++++++++++++++++++ > 3 files changed, 311 insertions(+), 2 deletions(-) > create mode 100644 test/lisp/bookmark-resources/test-list.bmk > >diff --git a/lisp/bookmark.el b/lisp/bookmark.el >index de7d60f97e..24264d7d38 100644 >--- a/lisp/bookmark.el >+++ b/lisp/bookmark.el >@@ -200,6 +200,7 @@ A non-nil value may result in truncated bookmark names= ." > (define-key map "f" 'bookmark-insert-location) ;"f"ind > (define-key map "r" 'bookmark-rename) > (define-key map "d" 'bookmark-delete) >+ (define-key map "D" 'bookmark-delete-all) > (define-key map "l" 'bookmark-load) > (define-key map "w" 'bookmark-write) > (define-key map "s" 'bookmark-save) >@@ -1374,6 +1375,23 @@ probably because we were called from there." > (bookmark-save))) >=20 >=20 >+;;;###autoload >+(defun bookmark-delete-all (&optional no-confirm) >+ "Permanently delete all bookmarks. >+If optional argument NO-CONFIRM is non-nil, don't ask for >+confirmation." >+ (interactive "P") >+ (when (or no-confirm >+ (yes-or-no-p "Permanently delete all bookmarks? ")) >+ (bookmark-maybe-load-default-file) >+ (setq bookmark-alist-modification-count >+ (+ bookmark-alist-modification-count (length bookmark-alist))) >+ (setq bookmark-alist nil) >+ (bookmark-bmenu-surreptitiously-rebuild-list) >+ (when (bookmark-time-to-save-p) >+ (bookmark-save)))) >+ >+ > (defun bookmark-time-to-save-p (&optional final-time) > "Return t if it is time to save bookmarks to disk, nil otherwise. > Optional argument FINAL-TIME means this is being called when Emacs >@@ -1600,12 +1618,15 @@ unique numeric suffixes \"<2>\", \"<3>\", etc." > (define-key map "\C-d" 'bookmark-bmenu-delete-backwards) > (define-key map "x" 'bookmark-bmenu-execute-deletions) > (define-key map "d" 'bookmark-bmenu-delete) >+ (define-key map "D" 'bookmark-bmenu-delete-all) > (define-key map " " 'next-line) > (define-key map "n" 'next-line) > (define-key map "p" 'previous-line) > (define-key map "\177" 'bookmark-bmenu-backup-unmark) > (define-key map "u" 'bookmark-bmenu-unmark) >+ (define-key map "U" 'bookmark-bmenu-unmark-all) > (define-key map "m" 'bookmark-bmenu-mark) >+ (define-key map "M" 'bookmark-bmenu-mark-all) > (define-key map "l" 'bookmark-bmenu-load) > (define-key map "r" 'bookmark-bmenu-rename) > (define-key map "R" 'bookmark-bmenu-relocate) >@@ -1627,8 +1648,10 @@ unique numeric suffixes \"<2>\", \"<3>\", etc." > ["Select Marked Bookmarks" bookmark-bmenu-select t] > "---" > ["Mark Bookmark" bookmark-bmenu-mark t] >+ ["Mark all Bookmarks" bookmark-bmenu-mark-all t] > ["Unmark Bookmark" bookmark-bmenu-unmark t] > ["Unmark Backwards" bookmark-bmenu-backup-unmark t] >+ ["Unmark all Bookmarks" bookmark-bmenu-unmark-all t] > ["Toggle Display of Filenames" bookmark-bmenu-toggle-filenames t] > ["Display Location of Bookmark" bookmark-bmenu-locate t] > "---" >@@ -1636,6 +1659,7 @@ unique numeric suffixes \"<2>\", \"<3>\", etc." > ["Rename Bookmark" bookmark-bmenu-rename t] > ["Relocate Bookmark's File" bookmark-bmenu-relocate t] > ["Mark Bookmark for Deletion" bookmark-bmenu-delete t] >+ ["Mark all Bookmarks for Deletion" bookmark-bmenu-delete-all t] > ["Delete Marked Bookmarks" bookmark-bmenu-execute-deletions t]) > ("Annotations" > ["Show Annotation for Current Bookmark" bookmark-bmenu-show-annotati= on t] >@@ -1748,6 +1772,7 @@ Letters do not insert themselves; instead, they are = commands. > Bookmark names preceded by a \"*\" have annotations. > \\ > \\[bookmark-bmenu-mark] -- mark bookmark to be displayed. >+\\[bookmark-bmenu-mark-all] -- mark all listed bookmarks to be displayed. > \\[bookmark-bmenu-select] -- select bookmark of line point is on. > Also show bookmarks marked using m in other windows. > \\[bookmark-bmenu-toggle-filenames] -- toggle displaying of filenames (th= ey may obscure long bookmark names). >@@ -1764,13 +1789,15 @@ Bookmark names preceded by a \"*\" have annotation= s. > \\[bookmark-bmenu-relocate] -- relocate this bookmark's file (prompts for= new file). > \\[bookmark-bmenu-delete] -- mark this bookmark to be deleted, and move d= own. > \\[bookmark-bmenu-delete-backwards] -- mark this bookmark to be deleted, = and move up. >-\\[bookmark-bmenu-execute-deletions] -- delete bookmarks marked with `\\[= bookmark-bmenu-delete]'. >+\\[bookmark-bmenu-delete-all] -- mark all listed bookmarks as to be delet= ed. >+\\[bookmark-bmenu-execute-deletions] -- delete bookmarks marked with `\\[= bookmark-bmenu-delete]' or `\\[bookmark-bmenu-delete-all]'. > \\[bookmark-bmenu-save] -- save the current bookmark list in the default = file. > With a prefix arg, prompts for a file to save in. > \\[bookmark-bmenu-load] -- load in a file of bookmarks (prompts for file.) > \\[bookmark-bmenu-unmark] -- remove all kinds of marks from current line. > With prefix argument, also move up one line. > \\[bookmark-bmenu-backup-unmark] -- back up a line and remove marks. >+\\[bookmark-bmenu-unmark-all] -- remove all kinds of marks from all liste= d bookmarks. > \\[bookmark-bmenu-show-annotation] -- show the annotation, if it exists, = for the current bookmark > in another buffer. > \\[bookmark-bmenu-show-all-annotations] -- show the annotations of all bo= okmarks in another buffer. >@@ -1937,9 +1964,23 @@ If the annotation does not exist, do nothing." > (bookmark-bmenu-ensure-position)))) >=20 >=20 >+(defun bookmark-bmenu-mark-all () >+ "Mark all listed bookmarks to be displayed by \\\\[bookmark-bmenu-select]." >+ (interactive) >+ (save-excursion >+ (goto-char (point-min)) >+ (bookmark-bmenu-ensure-position) >+ (with-buffer-modified-unmodified >+ (let ((inhibit-read-only t)) >+ (while (not (eobp)) >+ (delete-char 1) >+ (insert ?>) >+ (forward-line 1)))))) >+ >+ > (defun bookmark-bmenu-select () > "Select this line's bookmark; also display bookmarks marked with `>'. >-You can mark bookmarks with the \\\\[bookmark-bm= enu-mark] command." >+You can mark bookmarks with the \\\\[bookmark-bm= enu-mark] or \\\\[bookmark-bmenu-mark-all] command= s." > (interactive) > (let ((bmrk (bookmark-bmenu-bookmark)) > (menu (current-buffer)) >@@ -2108,6 +2149,20 @@ Optional BACKUP means move up." > (bookmark-bmenu-ensure-position)) >=20 >=20 >+(defun bookmark-bmenu-unmark-all () >+ "Cancel all requested operations on all listed bookmarks." >+ (interactive) >+ (save-excursion >+ (goto-char (point-min)) >+ (bookmark-bmenu-ensure-position) >+ (with-buffer-modified-unmodified >+ (let ((inhibit-read-only t)) >+ (while (not (eobp)) >+ (delete-char 1) >+ (insert " ") >+ (forward-line 1)))))) >+ >+ > (defun bookmark-bmenu-delete () > "Mark bookmark on this line to be deleted. > To carry out the deletions that you've marked, use \\\\[bookmark-bmenu-execute-deletions]." >@@ -2133,6 +2188,22 @@ To carry out the deletions that you've marked, use = \\\\ > (bookmark-bmenu-ensure-position)) >=20 >=20 >+(defun bookmark-bmenu-delete-all () >+ "Mark all listed bookmarks as to be deleted. >+To remove all deletion marks, use \\\\[bookmark-= bmenu-unmark-all]. >+To carry out the deletions that you've marked, use \\\\[bookmark-bmenu-execute-deletions]." >+ (interactive) >+ (save-excursion >+ (goto-char (point-min)) >+ (bookmark-bmenu-ensure-position) >+ (with-buffer-modified-unmodified >+ (let ((inhibit-read-only t)) >+ (while (not (eobp)) >+ (delete-char 1) >+ (insert ?D) >+ (forward-line 1)))))) >+ >+ > (defun bookmark-bmenu-execute-deletions () > "Delete bookmarks flagged `D'." > (interactive) >@@ -2292,6 +2363,9 @@ strings returned are not." > (bindings--define-key map [delete] > '(menu-item "Delete Bookmark..." bookmark-delete > :help "Delete a bookmark from the bookmark list")) >+ (bindings--define-key map [delete-all] >+ '(menu-item "Delete all Bookmarks..." bookmark-delete-all >+ :help "Delete all bookmarks from the bookmark list")) > (bindings--define-key map [rename] > '(menu-item "Rename Bookmark..." bookmark-rename > :help "Change the name of a bookmark")) >diff --git a/test/lisp/bookmark-resources/test-list.bmk b/test/lisp/bookma= rk-resources/test-list.bmk >new file mode 100644 >index 0000000000..696d64979b >--- /dev/null >+++ b/test/lisp/bookmark-resources/test-list.bmk >@@ -0,0 +1,20 @@ >+;;;; Emacs Bookmark Format Version 1 ;;;; -*- coding: utf-8-emacs -*- >+;;; This format is meant to be slightly human-readable; >+;;; nevertheless, you probably don't want to edit it. >+;;; -*- End Of Bookmark File Format Version Stamp -*- >+(("name-0" >+ (filename . "/some/file-0") >+ (front-context-string . "abc") >+ (rear-context-string . "def") >+ (position . 3)) >+("name-1" >+ (filename . "/some/file-1") >+ (front-context-string . "abc") >+ (rear-context-string . "def") >+ (position . 3)) >+("name-2" >+ (filename . "/some/file-2") >+ (front-context-string . "abc") >+ (rear-context-string . "def") >+ (position . 3)) >+) >diff --git a/test/lisp/bookmark-tests.el b/test/lisp/bookmark-tests.el >index b9c6ff9c54..c5959e46d8 100644 >--- a/test/lisp/bookmark-tests.el >+++ b/test/lisp/bookmark-tests.el >@@ -83,6 +83,70 @@ the lexically-bound variable `buffer'." > ,@body) > (kill-buffer buffer)))) >=20 >+(defvar bookmark-tests-bookmark-file-list >+ (expand-file-name "test-list.bmk" bookmark-tests-data-dir) >+ "Bookmark file used for testing a list of bookmarks.") >+ >+;; The values below should match `bookmark-tests-bookmark-file-list' >+;; content. We cache these values to speed up tests. >+(eval-and-compile ; needed by `with-bookmark-test-list' macro >+ (defvar bookmark-tests-bookmark-list-0 '("name-0" >+ (filename . "/some/file-0") >+ (front-context-string . "ghi") >+ (rear-context-string . "jkl") >+ (position . 4)) >+ "Cached value used in bookmark-tests.el.")) >+ >+;; The values below should match `bookmark-tests-bookmark-file-list' >+;; content. We cache these values to speed up tests. >+(eval-and-compile ; needed by `with-bookmark-test-list' macro >+ (defvar bookmark-tests-bookmark-list-1 '("name-1" >+ (filename . "/some/file-1") >+ (front-context-string . "mno") >+ (rear-context-string . "pqr") >+ (position . 5)) >+ "Cached value used in bookmark-tests.el.")) >+ >+;; The values below should match `bookmark-tests-bookmark-file-list' >+;; content. We cache these values to speed up tests. >+(eval-and-compile ; needed by `with-bookmark-test-list' macro >+ (defvar bookmark-tests-bookmark-list-2 '("name-2" >+ (filename . "/some/file-2") >+ (front-context-string . "stu") >+ (rear-context-string . "vwx") >+ (position . 6)) >+ "Cached value used in bookmark-tests.el.")) >+ >+(defvar bookmark-tests-cache-timestamp-list >+ (cons bookmark-tests-bookmark-file-list >+ (nth 5 (file-attributes >+ bookmark-tests-bookmark-file-list))) >+ "Cached value used in bookmark-tests.el.") >+ >+(defmacro with-bookmark-test-list (&rest body) >+ "Create environment for testing bookmark.el and evaluate BODY. >+Ensure a clean environment for testing, and do not change user >+data when running tests interactively." >+ `(with-temp-buffer >+ (let ((bookmark-alist (quote (,(copy-sequence bookmark-tests-bookmar= k-list-0) >+ ,(copy-sequence bookmark-tests-bookmar= k-list-1) >+ ,(copy-sequence bookmark-tests-bookmar= k-list-2)))) >+ (bookmark-default-file bookmark-tests-bookmark-file-list) >+ (bookmark-bookmarks-timestamp bookmark-tests-cache-timestamp-l= ist) >+ bookmark-save-flag) >+ ,@body))) >+ >+(defmacro with-bookmark-test-file-list (&rest body) >+ "Create environment for testing bookmark.el and evaluate BODY. >+Same as `with-bookmark-test-list' but also opens the resource file >+example.txt in a buffer, which can be accessed by callers through >+the lexically-bound variable `buffer'." >+ `(let ((buffer (find-file-noselect bookmark-tests-example-file))) >+ (unwind-protect >+ (with-bookmark-test-list >+ ,@body) >+ (kill-buffer buffer)))) >+ > (ert-deftest bookmark-tests-all-names () > (with-bookmark-test > (should (equal (bookmark-all-names) '("name"))))) >@@ -95,6 +159,30 @@ the lexically-bound variable `buffer'." > (with-bookmark-test > (should (equal (bookmark-get-bookmark-record "name") (cdr bookmark-tes= ts-bookmark))))) >=20 >+(ert-deftest bookmark-tests-all-names-list () >+ (with-bookmark-test-list >+ (should (equal (bookmark-all-names) '("name-0" >+ "name-1" >+ "name-2"))))) >+ >+(ert-deftest bookmark-tests-get-bookmark-list () >+ (with-bookmark-test-list >+ (should (equal (bookmark-get-bookmark "name-0") >+ bookmark-tests-bookmark-list-0)) >+ (should (equal (bookmark-get-bookmark "name-1") >+ bookmark-tests-bookmark-list-1)) >+ (should (equal (bookmark-get-bookmark "name-2") >+ bookmark-tests-bookmark-list-2)))) >+ >+(ert-deftest bookmark-tests-get-bookmark-record-list () >+ (with-bookmark-test-list >+ (should (equal (bookmark-get-bookmark-record "name-0") >+ (cdr bookmark-tests-bookmark-list-0))) >+ (should (equal (bookmark-get-bookmark-record "name-1") >+ (cdr bookmark-tests-bookmark-list-1))) >+ (should (equal (bookmark-get-bookmark-record "name-2") >+ (cdr bookmark-tests-bookmark-list-2))))) >+ > (ert-deftest bookmark-tests-record-getters-and-setters-new () > (with-temp-buffer > (let* ((buffer-file-name "test") >@@ -130,6 +218,19 @@ the lexically-bound variable `buffer'." > ;; calling twice gives same record > (should (equal (bookmark-make-record) record)))))) >=20 >+(ert-deftest bookmark-tests-make-record-list () >+ (with-bookmark-test-file-list >+ (let* ((record `("example.txt" (filename . ,bookmark-tests-example-fil= e) >+ (front-context-string . "is text file is ") >+ (rear-context-string) >+ (position . 3) >+ (defaults "example.txt")))) >+ (with-current-buffer buffer >+ (goto-char 3) >+ (should (equal (bookmark-make-record) record)) >+ ;; calling twice gives same record >+ (should (equal (bookmark-make-record) record)))))) >+ > (ert-deftest bookmark-tests-make-record-function () > (with-bookmark-test > (let ((buffer-file-name "test")) >@@ -267,6 +368,11 @@ the lexically-bound variable `buffer'." > (bookmark-delete "name") > (should (equal bookmark-alist nil)))) >=20 >+(ert-deftest bookmark-tests-delete-all () >+ (with-bookmark-test-list >+ (bookmark-delete-all t) >+ (should (equal bookmark-alist nil)))) >+ > (defmacro with-bookmark-test-save-load (&rest body) > "Create environment for testing bookmark.el and evaluate BODY. > Same as `with-bookmark-test' but also sets a temporary >@@ -340,6 +446,18 @@ testing `bookmark-bmenu-list'." > ,@body) > (kill-buffer bookmark-bmenu-buffer))))) >=20 >+(defmacro with-bookmark-bmenu-test-list (&rest body) >+ "Create environment for testing `bookmark-bmenu-list' and evaluate BODY. >+Same as `with-bookmark-test-list' but with additions suitable for >+testing `bookmark-bmenu-list'." >+ `(with-bookmark-test-list >+ (let ((bookmark-bmenu-buffer "*Bookmark List - Testing*")) >+ (unwind-protect >+ (save-window-excursion >+ (bookmark-bmenu-list) >+ ,@body) >+ (kill-buffer bookmark-bmenu-buffer))))) >+ > (ert-deftest bookmark-test-bmenu-edit-annotation/show-annotation () > (with-bookmark-bmenu-test > (bookmark-set-annotation "name" "foo") >@@ -402,6 +520,52 @@ testing `bookmark-bmenu-list'." > (beginning-of-line) > (should (bookmark-bmenu-any-marks)))) >=20 >+(ert-deftest bookmark-test-bmenu-mark-all () >+ (with-bookmark-bmenu-test-list >+ (let ((here (point-max))) >+ ;; Expect to not move the point >+ (goto-char here) >+ (bookmark-bmenu-mark-all) >+ (should (equal here (point))) >+ ;; Verify that all bookmarks are marked >+ (goto-char (point-min)) >+ (bookmark-bmenu-ensure-position) >+ (should (looking-at "^> ")) >+ (should (equal bookmark-tests-bookmark-list-0 >+ (bookmark-get-bookmark (bookmark-bmenu-bookmark)))) >+ (forward-line 1) >+ (should (looking-at "^> ")) >+ (should (equal bookmark-tests-bookmark-list-1 >+ (bookmark-get-bookmark (bookmark-bmenu-bookmark)))) >+ (forward-line 1) >+ (should (looking-at "^> ")) >+ (should (equal bookmark-tests-bookmark-list-2 >+ (bookmark-get-bookmark (bookmark-bmenu-bookmark))))))) >+ >+(ert-deftest bookmark-test-bmenu-any-marks-list () >+ (with-bookmark-bmenu-test-list >+ ;; Mark just the second item >+ (goto-char (point-min)) >+ (bookmark-bmenu-ensure-position) >+ (forward-line 1) >+ (bookmark-bmenu-mark) >+ ;; Verify that only the second item is marked >+ (goto-char (point-min)) >+ (bookmark-bmenu-ensure-position) >+ (should (looking-at "^ ")) >+ (should (equal bookmark-tests-bookmark-list-0 >+ (bookmark-get-bookmark (bookmark-bmenu-bookmark)))) >+ (forward-line 1) >+ (should (looking-at "^> ")) >+ (should (equal bookmark-tests-bookmark-list-1 >+ (bookmark-get-bookmark (bookmark-bmenu-bookmark)))) >+ (forward-line 1) >+ (should (looking-at "^ ")) >+ (should (equal bookmark-tests-bookmark-list-2 >+ (bookmark-get-bookmark (bookmark-bmenu-bookmark)))) >+ ;; There should be at least one mark >+ (should (bookmark-bmenu-any-marks)))) >+ > (ert-deftest bookmark-test-bmenu-unmark () > (with-bookmark-bmenu-test > (bookmark-bmenu-mark) >@@ -410,12 +574,63 @@ testing `bookmark-bmenu-list'." > (beginning-of-line) > (should (looking-at "^ ")))) >=20 >+(ert-deftest bookmark-test-bmenu-unmark-all () >+ (with-bookmark-bmenu-test-list >+ (bookmark-bmenu-mark-all) >+ (let ((here (point-max))) >+ ;; Expect to not move the point >+ (goto-char here) >+ (bookmark-bmenu-unmark-all) >+ (should (equal here (point))) >+ ;; Verify that all bookmarks are unmarked >+ (goto-char (point-min)) >+ (bookmark-bmenu-ensure-position) >+ (should (looking-at "^ ")) >+ (should (equal bookmark-tests-bookmark-list-0 >+ (bookmark-get-bookmark (bookmark-bmenu-bookmark)))) >+ (forward-line 1) >+ (should (looking-at "^ ")) >+ (should (equal bookmark-tests-bookmark-list-1 >+ (bookmark-get-bookmark (bookmark-bmenu-bookmark)))) >+ (forward-line 1) >+ (should (looking-at "^ ")) >+ (should (equal bookmark-tests-bookmark-list-2 >+ (bookmark-get-bookmark (bookmark-bmenu-bookmark))))))) >+ > (ert-deftest bookmark-test-bmenu-delete () > (with-bookmark-bmenu-test > (bookmark-bmenu-delete) > (bookmark-bmenu-execute-deletions) > (should (equal (length bookmark-alist) 0)))) >=20 >+(ert-deftest bookmark-test-bmenu-delete-all () >+ (with-bookmark-bmenu-test-list >+ ;; Verify that unmarked bookmarks aren't deleted >+ (bookmark-bmenu-execute-deletions) >+ (should-not (eq bookmark-alist nil)) >+ (let ((here (point-max))) >+ ;; Expect to not move the point >+ (goto-char here) >+ (bookmark-bmenu-delete-all) >+ (should (equal here (point))) >+ ;; Verify that all bookmarks are marked for deletion >+ (goto-char (point-min)) >+ (bookmark-bmenu-ensure-position) >+ (should (looking-at "^D ")) >+ (should (equal bookmark-tests-bookmark-list-0 >+ (bookmark-get-bookmark (bookmark-bmenu-bookmark)))) >+ (forward-line 1) >+ (should (looking-at "^D ")) >+ (should (equal bookmark-tests-bookmark-list-1 >+ (bookmark-get-bookmark (bookmark-bmenu-bookmark)))) >+ (forward-line 1) >+ (should (looking-at "^D ")) >+ (should (equal bookmark-tests-bookmark-list-2 >+ (bookmark-get-bookmark (bookmark-bmenu-bookmark)))) >+ ;; Verify that all bookmarks are deleted >+ (bookmark-bmenu-execute-deletions) >+ (should (eq bookmark-alist nil))))) >+ > (ert-deftest bookmark-test-bmenu-locate () > (let (msg) > (cl-letf (((symbol-function 'message) --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQJIBAEBCgAyFiEEsgfAWXyjn8Fyi3xbCKC3XMXtg0UFAl8sqhMUHGtmb2dlbEBy ZWQtYmVhbi5jb20ACgkQCKC3XMXtg0VPhRAAl02M6Wz3j5SBHSjDGEtgriUuIsMW nyRSTFOlbHlRviCAQg89b3MKEWtqUNTd4/yODV16hzSNJk5ucfbSsyRQln9sabRU nBwGNrZujjoGPViaOeY3oLeS4y/JlyEWgX7GGiPksn1qEz46wBCYcDA/Chi/8Ij3 YNcmTrzFVJW2V+z3mvtspMQuIoNhcUMLPXEEiS9uu072Axs71KZbCwAuZUqvg3TE VUaTt/A9Lc2wNq5uPjDpeeMpDmZQrKaUPM4olkKqF2fuImeg9wZdyFcko1bHM1tk mgcDZgJgEe0c3C0E6zQixY5i3oC4jbzRhZIsYRTj0w3BrnvK4hP5JK+sF1ZTyzTZ 7vRQC2GXTt221gB0yOoZL1auL9qz+FfnAFyel7UXm68mU8f5LE9Sz7yNXwT4eprn EHKzEU61aWe8kXFIaOE5dxW8AWmBzVOk2GV5OoGbFoR8y+M5WVcecdBZ2uXXbgp8 vN5IPpm/Qb+6HUNCEBFzsraPl9f7x05dYkO4s7wZioLdrgJ9BlnyG94we8m2+R8h HF8wSRDQEsOAQrbGK80nc5+Xf+TRcl0eRoox5PV21nj389hVMxJPY7VP2Iwm2vop RoMvu/Z4AZs9ffnTK4A+4pPS57Wwmh49mYTnWCrFss8Eq8wF3u307cJHRxDvfYH5 nDaxb1B3+FM+VSU= =5xlx -----END PGP SIGNATURE----- --=-=-=--