From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: "J.P." Newsgroups: gmane.emacs.bugs Subject: bug#60936: 30.0.50; ERC >5.5: Add erc-fill style based on visual-line-mode Date: Mon, 03 Jul 2023 06:14:31 -0700 Message-ID: <87zg4dm91k.fsf__19941.212928255$1688390142$gmane$org@neverwas.me> References: <87tu0nao77.fsf@neverwas.me> <87jzvny7ez.fsf@neverwas.me> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="25132"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Cc: emacs-erc@gnu.org To: 60936@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Mon Jul 03 15:15:34 2023 Return-path: Envelope-to: geb-bug-gnu-emacs@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 1qGJOv-0006JA-Kt for geb-bug-gnu-emacs@m.gmane-mx.org; Mon, 03 Jul 2023 15:15:34 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qGJOW-0003YR-II; Mon, 03 Jul 2023 09:15:08 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qGJOR-0003Vc-5X for bug-gnu-emacs@gnu.org; Mon, 03 Jul 2023 09:15:03 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qGJOQ-0006Ul-PZ for bug-gnu-emacs@gnu.org; Mon, 03 Jul 2023 09:15:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1qGJOP-0000rT-Ve for bug-gnu-emacs@gnu.org; Mon, 03 Jul 2023 09:15:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: "J.P." Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 03 Jul 2023 13:15:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 60936 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 60936-submit@debbugs.gnu.org id=B60936.16883900893275 (code B ref 60936); Mon, 03 Jul 2023 13:15:01 +0000 Original-Received: (at 60936) by debbugs.gnu.org; 3 Jul 2023 13:14:49 +0000 Original-Received: from localhost ([127.0.0.1]:33472 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qGJOA-0000qg-Po for submit@debbugs.gnu.org; Mon, 03 Jul 2023 09:14:49 -0400 Original-Received: from mail-108-mta165.mxroute.com ([136.175.108.165]:33525) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qGJO4-0000qR-Ev for 60936@debbugs.gnu.org; Mon, 03 Jul 2023 09:14:45 -0400 Original-Received: from mail-111-mta2.mxroute.com ([136.175.111.2] filter006.mxroute.com) (Authenticated sender: mN4UYu2MZsgR) by mail-108-mta165.mxroute.com (ZoneMTA) with ESMTPSA id 1891be40033000aa88.001 for <60936@debbugs.gnu.org> (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384); Mon, 03 Jul 2023 13:14:34 +0000 X-Zone-Loop: dd0ffb3dc3e2b94c67588d883e925970b6e3e6a228ef X-Originating-IP: [136.175.111.2] DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=neverwas.me ; s=x; h=Content-Type:MIME-Version:Message-ID:Date:References:In-Reply-To: Subject:Cc:To:From:Sender:Reply-To:Content-Transfer-Encoding:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=zBq3pPyB6xFC7QnpNGVKxeJdz1+qMsHDWE0YZsjYWQg=; b=fARfRTppMp/J+gyhw5WoTuMJwQ AgwLNVHoWNHiFxALWJCh0C6MYzXWDZpS0WfAZ+1SrbEE/peenkizB/XwecnAP3okWyJAwVhtZzDDe E/jodm7x91SPcwdt0RXISRoYGKahnxBggqVN4OH+FGxQpy865NWIquKWBSF2QYjnlwuseOpFkBAQE OozuWtMarsNcGVlkF/NC0Ea/8W3hq/YJXtWBmHzZhiv0VaaxZIoEyN67RvHEtvr9UhmWji0Y24ehx tHx93XHlH58HrtLaGzn6umyHH1TYzvsanj8Ntg39hdEnxHdP9dJW76pvnmndlcRR9LxXWNgk3q3Vx mIvxnOAw==; In-Reply-To: <87jzvny7ez.fsf@neverwas.me> (J. P.'s message of "Wed, 28 Jun 2023 07:43:00 -0700") X-Authenticated-Id: masked@neverwas.me X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:264525 Archived-At: --=-=-= Content-Type: text/plain "J.P." writes: > A commit associated with this bug > > d880a08f "Cement ordering of essential hook members in ERC" > > introduced a regression that basically nullifies the `match' module when > a certain `erc-stamp' option is customized to a certain value. To > reproduce from Emacs -Q: > > - Set `erc-insert-timestamp-function' to `erc-insert-timestamp-left' > > - Connect to any server > > - Find the first mention of your nickname in the text of some early > numeric (often something like "Welcome to FooNet ") > > - Notice that it appears in plain `erc-notice-face' rather than > `erc-current-nick-face' (a "match" face) > > The attached patch should fix the issue. Thanks to Libera.Chat user jrm > for reporting this bug. Actually, the veracity of that claim is unclear and most likely bogus. What is clear is that this approach is unsustainable because related bugs are bound to crop up in the near future (if they haven't already). Basically, in trying to code defensively around possibly encountering unexpected text before inserted messages (such as leading stamps, white space, decorations, etc.), my attempted solution traded superficial robustness for a new dimension of complexity that's almost certainly unsustainable. (This outcome was more or less predicted in the justification for d880a08f "Cement ...", which this fix rather callously contravened the spirit of.) Anyway, to address all this, I think we should: 1. Revert the previous attempted fix, which now exists on HEAD as commit 99d74dcd45938e2686d93eb5649800e14a88cd84 Author: F. Jason Park Date: Tue Jun 27 20:47:26 2023 -0700 Account for leading timestamps in erc-match lisp/erc/erc-match.el | 41 ++++++++---- test/lisp/erc/erc-scenarios-match.el | 120 +++++++++++++++++++++++++ 2 files changed, 149 insertions(+), 12 deletions(-) 2. Undo the change of ordering for `erc-add-timestamp' and `erc-match-message' in `erc-insert-modify-hook' (from d880a08f "Cement ..."). 3. Take an entirely different tack bent on including (rather than omitting) time stamps from invisible messages. If not yet obvious, the impetus for the poor decision (of mine) to switch the order of those hook members was to improve the toggling of invisible elements created by the `match' module (and potentially others), and also to make logs less ragged when they feature invisible messages. I'll go ahead and install the first of the attached patches (reverting the misguided fix) and continue to iterate on the second, which proposes the more comprehensive solution described in 3. Thanks. > While we're at it, I'm thinking the option `erc-fill-spaced-commands', > which has been on HEAD for a few months now, should be demoted to a > plain variable, maybe even an internal one, because there aren't any > obvious use cases for non-default values. Unless someone has a good > argument to the contrary, I will do this in an accompanying patch to be > installed along with this one. Thanks. I've decided to instead lump this in with bug#64301 (speaker labels). --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-Revert-Account-for-leading-timestamps-in-erc-match.patch >From 226d4371e0d022f5080859736fa9161966049f4f Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Sun, 2 Jul 2023 20:57:46 -0700 Subject: [PATCH 1/2] Revert "Account for leading timestamps in erc-match" This reverts commit 99d74dcd45938e2686d93eb5649800e14a88cd84 but keeps the test file test/lisp/erc/erc-scenarios-match.el. This also implements a partial alternative solution by undoing the reordering of insert hooks owned by the `stamp' and `match' modules. The reordering was performed as part of d880a08f9592e51ada5749d10b472396683fb6ee "Cement ordering of essential hook members in ERC". The intent was to address the problem of timestamps not being hidden in matched "fool" messages. However, a better approach is to incorporate timestamps into hidden messages by merging `invisible' properties. This will be handled by a future change, most likely lumped in with bug#64301. * erc/ERC-NEWS: Fix erroneous claim about relative hook ordering pre-5.6, which somewhat informs the confusion belying the original wrongheaded change. * lisp/erc/erc-match.el (erc-match-mode, erc-match-enable): Change hook depth for `erc-insert-modify-hook' member from 60 to 50. (erc-text-matched-hook): Retain portion of updated doc string instead of reverting. * lisp/erc/erc-stamp.el (erc-stamp-mode, erc-stamp-enable): Change depth for insert and send-hook members from 50 to 60. * test/lisp/erc/erc-scenarios-match.el (erc-scenarios-match--stamp-left-current-nick erc-scenarios-match--stamp-left-fools-invisible): Temporarily disable the latter and fix expected hook ordering. * test/lisp/erc/erc-tests.el (erc--essential-hook-ordering): Fix expected order of default insert hooks. (Bug#60936) --- etc/ERC-NEWS | 2 +- lisp/erc/erc-match.el | 36 ++++++++-------------------- lisp/erc/erc-stamp.el | 4 ++-- test/lisp/erc/erc-scenarios-match.el | 11 +++++---- test/lisp/erc/erc-tests.el | 4 ++-- 5 files changed, 22 insertions(+), 35 deletions(-) diff --git a/etc/ERC-NEWS b/etc/ERC-NEWS index 2f465e247d7..5665b760ea9 100644 --- a/etc/ERC-NEWS +++ b/etc/ERC-NEWS @@ -183,7 +183,7 @@ Luckily, ERC now leverages a feature introduced in Emacs 27, "hook depth," to secure the positions of a few key members of 'erc-insert-modify-hook' and 'erc-send-modify-hook'. So far, this includes the functions 'erc-button-add-buttons', 'erc-fill', -'erc-add-timestamp', and 'erc-match-message', which now appear in that +'erc-match-message', and 'erc-add-timestamp', which now appear in that order, when present, at depths beginning at 20 and ending below 80. Of most interest to module authors is the new relative positioning of the first two, 'erc-button-add-buttons' and 'erc-fill', which have diff --git a/lisp/erc/erc-match.el b/lisp/erc/erc-match.el index 204bf14a1cf..2b7fff87ff0 100644 --- a/lisp/erc/erc-match.el +++ b/lisp/erc/erc-match.el @@ -52,7 +52,7 @@ match `erc-current-nick-highlight-type'. For all these highlighting types, you can decide whether the entire message or only the sending nick is highlighted." - ((add-hook 'erc-insert-modify-hook #'erc-match-message 60) + ((add-hook 'erc-insert-modify-hook #'erc-match-message 50) (add-hook 'erc-mode-hook #'erc-match--modify-invisibility-spec) (unless erc--updating-modules-p (erc-buffer-do #'erc-match--modify-invisibility-spec)) @@ -237,10 +237,7 @@ erc-text-matched-hook ERC calls members with the arguments (MATCH-TYPE NUH MESSAGE), where MATCH-TYPE is one of the symbols `current-nick', `keyword', `pal', `dangerous-host', `fool', and NUH is an `erc-response' -sender, like bob!~bob@example.org. Users should keep in mind -that MESSAGE may not include decorations, such as white space or -time stamps, preceding the same text as inserted in the narrowed -buffer." +sender, like bob!~bob@example.org." :options '(erc-log-matches erc-hide-fools erc-beep-on-match) :type 'hook) @@ -462,19 +459,8 @@ erc-match-directed-at-fool-p (erc-list-match fools-end msg)))) (defun erc-match-message () - "Add faces to matching text in inserted message." - ;; Exclude leading whitespace, stamps, etc. - (let ((omin (point-min)) - (beg (or (and (not (get-text-property (point-min) 'erc-command)) - (next-single-property-change (point-min) 'erc-command)) - (point-min)))) - ;; FIXME when ERC no longer supports 28, use `with-restriction' - ;; with `:label' here instead of passing `omin'. - (save-restriction - (narrow-to-region beg (point-max)) - (erc-match--message omin)))) - -(defun erc-match--message (unrestricted-point-min) + "Mark certain keywords in a region. +Use this defun with `erc-insert-modify-hook'." ;; This needs some refactoring. (goto-char (point-min)) (let* ((to-match-nick-dep '("pal" "fool" "dangerous-host")) @@ -576,14 +562,12 @@ erc-match--message 'font-lock-face match-face))) ;; Else twiddle your thumbs. (t nil)) - ;; FIXME use `without-restriction' after dropping 28. - (save-restriction - (narrow-to-region unrestricted-point-min (point-max)) - (run-hook-with-args - 'erc-text-matched-hook (intern match-type) - (or nickuserhost - (concat "Server:" (erc-get-parsed-vector-type vector))) - message))))) + (run-hook-with-args + 'erc-text-matched-hook + (intern match-type) + (or nickuserhost + (concat "Server:" (erc-get-parsed-vector-type vector))) + message)))) (if nickuserhost (append to-match-nick-dep to-match-nick-indep) to-match-nick-indep))))) diff --git a/lisp/erc/erc-stamp.el b/lisp/erc/erc-stamp.el index aac51135a07..5035e60a87d 100644 --- a/lisp/erc/erc-stamp.el +++ b/lisp/erc/erc-stamp.el @@ -163,8 +163,8 @@ erc-timestamp-face (define-erc-module stamp timestamp "This mode timestamps messages in the channel buffers." ((add-hook 'erc-mode-hook #'erc-munge-invisibility-spec) - (add-hook 'erc-insert-modify-hook #'erc-add-timestamp 50) - (add-hook 'erc-send-modify-hook #'erc-add-timestamp 50) + (add-hook 'erc-insert-modify-hook #'erc-add-timestamp 60) + (add-hook 'erc-send-modify-hook #'erc-add-timestamp 60) (add-hook 'erc-mode-hook #'erc-stamp--recover-on-reconnect) (add-hook 'erc--pre-clear-functions #'erc-stamp--reset-on-clear) (unless erc--updating-modules-p diff --git a/test/lisp/erc/erc-scenarios-match.el b/test/lisp/erc/erc-scenarios-match.el index 49e6a3370fc..61368919d31 100644 --- a/test/lisp/erc/erc-scenarios-match.el +++ b/test/lisp/erc/erc-scenarios-match.el @@ -49,8 +49,9 @@ erc-scenarios-match--stamp-left-current-nick :port port :full-name "tester" :nick "tester") - (should (memq 'erc-match-message - (memq 'erc-add-timestamp erc-insert-modify-hook))) + ;; Module `timestamp' precedes `match' in insertion hooks. + (should (memq 'erc-add-timestamp + (memq 'erc-match-message erc-insert-modify-hook))) ;; The "match type" is `current-nick'. (funcall expect 5 "tester") (should (eq (get-text-property (1- (point)) 'font-lock-face) @@ -60,6 +61,7 @@ erc-scenarios-match--stamp-left-current-nick ;; some non-nil invisibility property spans the entire message. (ert-deftest erc-scenarios-match--stamp-left-fools-invisible () :tags '(:expensive-test) + (ert-skip "WIP: fix included in bug#64301") (erc-scenarios-common-with-cleanup ((erc-scenarios-common-dialog "join/legacy") (dumb-server (erc-d-run "localhost" t 'foonet)) @@ -84,8 +86,9 @@ erc-scenarios-match--stamp-left-fools-invisible :full-name "tester" :password "changeme" :nick "tester") - (should (memq 'erc-match-message - (memq 'erc-add-timestamp erc-insert-modify-hook))) + ;; Module `timestamp' precedes `match' in insertion hooks. + (should (memq 'erc-add-timestamp + (memq 'erc-match-message erc-insert-modify-hook))) (funcall expect 5 "This server is in debug mode"))) (ert-info ("Ensure lines featuring \"bob\" are invisible") diff --git a/test/lisp/erc/erc-tests.el b/test/lisp/erc/erc-tests.el index b751ef50520..80c7c708fc5 100644 --- a/test/lisp/erc/erc-tests.el +++ b/test/lisp/erc/erc-tests.el @@ -1851,8 +1851,8 @@ erc--essential-hook-ordering '( :erc-insert-modify-hook (erc-controls-highlight ; 0 erc-button-add-buttons ; 30 erc-fill ; 40 - erc-add-timestamp ; 50 - erc-match-message) ; 60 + erc-match-message ; 50 + erc-add-timestamp) ; 60 :erc-send-modify-hook ( erc-controls-highlight ; 0 erc-button-add-buttons ; 30 -- 2.41.0 --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0002-5.6-Respect-existing-invisibility-props-in-erc-stamp.patch >From 2518e294112df689cbcbb3428bd43acc38fd1a5b Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Sun, 2 Jul 2023 20:58:37 -0700 Subject: [PATCH 2/2] [5.6] Respect existing invisibility props in erc-stamp * lisp/erc/erc-match.el (erc-hide-fools): change `invisible' property to `erc-match' for all messages, not just those with offset bounds. * lisp/erc/erc-stamp.el (erc-stamp--invisible-property): Add new internal variable to hold existing `invisible' property merged with the one registered by this module. (erc-stamp--skip-when-invisible): Add new internal variable to act as escape hatch for pre ERC-5.6 behavior in which timestamps were not applied at all to invisible messages. This led to strange-looking, uneven logs, and it prevented other modules from offering toggle functionality for invisibility spec members registered to them. (erc-add-timestamp): Merge with existing `invisible' property, when present, instead of clobbering, but only when escape hatch `erc-stamp--skip-when-invisible' is nil. (erc-insert-timestamp-left, erc-format-timestamp): Use possibly merged `invisible' prop value. * test/lisp/erc/erc-scenarios-match.el (erc-scenarios-match--invisible-stamp): Move setup and core assertions for stamp-related tests into fixture. (erc-scenarios-match--stamp-left-fools-invisible): Fix temporarily disabled test and use fixture. (erc-scenarios-match--stamp-right-fools-invisible, erc-scenarios-match--stamp-right-invisible-fill-wrap): New test. --- lisp/erc/erc-match.el | 7 +- lisp/erc/erc-stamp.el | 18 ++- test/lisp/erc/erc-scenarios-match.el | 160 +++++++++++++++++++++++---- 3 files changed, 157 insertions(+), 28 deletions(-) diff --git a/lisp/erc/erc-match.el b/lisp/erc/erc-match.el index 2b7fff87ff0..468358536ae 100644 --- a/lisp/erc/erc-match.el +++ b/lisp/erc/erc-match.el @@ -669,10 +669,9 @@ erc-hide-fools (save-restriction (widen) (put-text-property (1- beg) (1- end) 'invisible 'erc-match))) - ;; The docs say `intangible' is deprecated, but this has been - ;; like this for ages. Should verify unneeded and remove if so. - (erc-put-text-properties (point-min) (point-max) - '(invisible intangible))))) + ;; Before ERC 5.6, this also used to add an `intangible' + ;; property, but the docs say it's now obsolete. + (put-text-property (point-min) (point-max) 'invisible 'erc-match)))) (defun erc-beep-on-match (match-type _nickuserhost _message) "Beep when text matches. diff --git a/lisp/erc/erc-stamp.el b/lisp/erc/erc-stamp.el index 5035e60a87d..cc9e0e13083 100644 --- a/lisp/erc/erc-stamp.el +++ b/lisp/erc/erc-stamp.el @@ -179,6 +179,12 @@ stamp (kill-local-variable 'erc-timestamp-last-inserted-left) (kill-local-variable 'erc-timestamp-last-inserted-right)))) +(defvar erc-stamp--invisible-property nil + "Existing `invisible' property value and/or symbol `timestamp'.") + +(defvar erc-stamp--skip-when-invisible nil + "Escape hatch for omitting stamps when first char is invisible.") + (defun erc-stamp--recover-on-reconnect () (when-let ((priors (or erc--server-reconnecting erc--target-priors))) (dolist (var '(erc-timestamp-last-inserted @@ -209,8 +215,11 @@ erc-add-timestamp (progn ; remove this `progn' on next major refactor (let* ((ct (erc-stamp--current-time)) (invisible (get-text-property (point-min) 'invisible)) + (erc-stamp--invisible-property + ;; FIXME on major version bump, make this `erc-' prefixed. + (if invisible `(timestamp ,@(ensure-list invisible)) 'timestamp)) (erc-stamp--current-time ct)) - (unless invisible + (unless (setq invisible (and erc-stamp--skip-when-invisible invisible)) (funcall erc-insert-timestamp-function (erc-format-timestamp ct erc-timestamp-format))) ;; FIXME this will error when advice has been applied. @@ -380,7 +389,7 @@ erc-insert-timestamp-left (s (if ignore-p (make-string len ? ) string))) (unless ignore-p (setq erc-timestamp-last-inserted string)) (erc-put-text-property 0 len 'field 'erc-timestamp s) - (erc-put-text-property 0 len 'invisible 'timestamp s) + (erc-put-text-property 0 len 'invisible erc-stamp--invisible-property s) (insert s))) (defun erc-insert-aligned (string pos) @@ -477,6 +486,8 @@ erc-insert-timestamp-right (put-text-property from (point) p v))) (erc-put-text-property from (point) 'field 'erc-timestamp) (erc-put-text-property from (point) 'rear-nonsticky t) + (erc-put-text-property from (point) 'invisible + erc-stamp--invisible-property) (when erc-timestamp-intangible (erc-put-text-property from (1+ (point)) 'cursor-intangible t))))) @@ -520,7 +531,8 @@ erc-format-timestamp (let ((ts (format-time-string format time erc-stamp--tz))) (erc-put-text-property 0 (length ts) 'font-lock-face 'erc-timestamp-face ts) - (erc-put-text-property 0 (length ts) 'invisible 'timestamp ts) + (erc-put-text-property 0 (length ts) 'invisible + erc-stamp--invisible-property ts) (erc-put-text-property 0 (length ts) 'isearch-open-invisible 'timestamp ts) ;; N.B. Later use categories instead of this harmless, but diff --git a/test/lisp/erc/erc-scenarios-match.el b/test/lisp/erc/erc-scenarios-match.el index 61368919d31..9fc744468f3 100644 --- a/test/lisp/erc/erc-scenarios-match.el +++ b/test/lisp/erc/erc-scenarios-match.el @@ -26,6 +26,7 @@ (require 'erc-stamp) (require 'erc-match) +(require 'erc-fill) ;; This defends against a regression in which all matching by the ;; `erc-match-message' fails when `erc-add-timestamp' precedes it in @@ -57,28 +58,20 @@ erc-scenarios-match--stamp-left-current-nick (should (eq (get-text-property (1- (point)) 'font-lock-face) 'erc-current-nick-face)))))) -;; This asserts that when stamps appear before a message, -;; some non-nil invisibility property spans the entire message. -(ert-deftest erc-scenarios-match--stamp-left-fools-invisible () - :tags '(:expensive-test) - (ert-skip "WIP: fix included in bug#64301") +;; When hacking on tests that use this fixture, it's best to run it +;; interactively, and check for wierdness before and after doing +;; M-: (remove-from-invisibility-spec 'erc-match) RET. +(defun erc-scenarios-match--invisible-stamp (hiddenp visiblep) (erc-scenarios-common-with-cleanup ((erc-scenarios-common-dialog "join/legacy") (dumb-server (erc-d-run "localhost" t 'foonet)) (port (process-contact dumb-server :service)) (erc-server-flood-penalty 0.1) - (erc-insert-timestamp-function 'erc-insert-timestamp-left) (erc-timestamp-only-if-changed-flag nil) (erc-fools '("bob")) (erc-text-matched-hook '(erc-hide-fools)) (erc-autojoin-channels-alist '((FooNet "#chan"))) - (expect (erc-d-t-make-expecter)) - (hiddenp (lambda () - (and (eq (field-at-pos (pos-bol)) 'erc-timestamp) - (get-text-property (pos-bol) 'invisible) - (>= (next-single-property-change (pos-bol) - 'invisible nil) - (pos-eol)))))) + (expect (erc-d-t-make-expecter))) (ert-info ("Connect") (with-current-buffer (erc :server "127.0.0.1" @@ -94,30 +87,155 @@ erc-scenarios-match--stamp-left-fools-invisible (ert-info ("Ensure lines featuring \"bob\" are invisible") (with-current-buffer (erc-d-t-wait-for 10 (get-buffer "#chan")) (should (funcall expect 10 " tester, welcome!")) - (should (funcall hiddenp)) + (ert-info (" tester, welcome!") (funcall hiddenp)) ;; Alice's is the only one visible. (should (funcall expect 10 " tester, welcome!")) - (should (eq (field-at-pos (pos-bol)) 'erc-timestamp)) - (should (get-text-property (pos-bol) 'invisible)) - (should-not (get-text-property (point) 'invisible)) + (ert-info (" tester, welcome!") (funcall visiblep)) (should (funcall expect 10 " alice: But, as it seems")) - (should (funcall hiddenp)) + (ert-info (" alice: But, as it seems") (funcall hiddenp)) (should (funcall expect 10 " bob: Well, this is the forest")) - (should (funcall hiddenp)) + (ert-info (" bob: Well, this is the forest") (funcall hiddenp)) (should (funcall expect 10 " bob: And will you")) - (should (funcall hiddenp)) + (ert-info (" bob: And will you") (funcall hiddenp)) (should (funcall expect 10 " alice: Live, and be prosperous")) - (should (funcall hiddenp)) + (ert-info (" alice: Live, and be prosperous") (funcall hiddenp)) (should (funcall expect 10 "ERC>")) (should-not (get-text-property (pos-bol) 'invisible)) (should-not (get-text-property (point) 'invisible)))))) +;; This asserts that when stamps appear before a message, registered +;; invisibility properties owned by modules span the entire message. +(ert-deftest erc-scenarios-match--stamp-left-fools-invisible () + :tags '(:expensive-test) + (let ((erc-insert-timestamp-function #'erc-insert-timestamp-left)) + (erc-scenarios-match--invisible-stamp + + (lambda () + ;; This is a time-stamped message. + (should (eq (field-at-pos (pos-bol)) 'erc-timestamp)) + + ;; Leading stamp has combined `invisible' property value. + (should (equal (get-text-property (pos-bol) 'invisible) + '(timestamp erc-match))) + + ;; Message proper has the `invisible' property `erc-match'. + (let ((msg-beg (next-single-property-change (pos-bol) 'invisible))) + (should (eq (get-text-property msg-beg 'invisible) 'erc-match)) + (should (>= (next-single-property-change msg-beg 'invisible nil) + (pos-eol))))) + + (lambda () + ;; This is a time-stamped message. + (should (eq (field-at-pos (pos-bol)) 'erc-timestamp)) + (should (get-text-property (pos-bol) 'invisible)) + + ;; The entire message proper is visible. + (let ((msg-beg (next-single-property-change (pos-bol) 'invisible))) + (should + (= (next-single-property-change msg-beg 'invisible nil (pos-eol)) + (pos-eol)))))))) + +(defun erc-scenarios-match--find-eol () + (save-excursion + (goto-char (next-single-property-change (point) 'erc-command)) + (pos-eol))) + +;; In most cases, `erc-hide-fools' makes line endings invisible. +(ert-deftest erc-scenarios-match--stamp-right-fools-invisible () + :tags '(:expensive-test) + (let ((erc-insert-timestamp-function #'erc-insert-timestamp-right)) + (erc-scenarios-match--invisible-stamp + + (lambda () + (let ((end (erc-scenarios-match--find-eol))) + ;; The end of the message is a newline. + (should (= ?\n (char-after end))) + + ;; Every message has a trailing time stamp. + (should (eq (field-at-pos (1- end)) 'erc-timestamp)) + + ;; Stamps have a combined `invisible' property value. + (should (equal (get-text-property (1- end) 'invisible) + '(timestamp erc-match))) + + ;; The final newline is hidden by `match', not `stamps' + (should (equal (get-text-property end 'invisible) 'erc-match)) + + ;; The message proper has the `invisible' property `erc-match', + ;; and it starts after the preceding newline. + (should (eq (get-text-property (pos-bol) 'invisible) 'erc-match)) + + ;; It ends just before the timestamp. + (let ((msg-end (next-single-property-change (pos-bol) 'invisible))) + (should (equal (get-text-property msg-end 'invisible) + '(timestamp erc-match))) + + ;; Stamp's `invisible' property extends throughout the stamp + ;; and ends before the trailing newline. + (should (= (next-single-property-change msg-end 'invisible) end))))) + + (lambda () + (let ((end (erc-scenarios-match--find-eol))) + ;; This message has a time stamp like all the others. + (should (eq (field-at-pos (1- end)) 'erc-timestamp)) + + ;; The entire message proper is visible. + (should-not (get-text-property (pos-bol) 'invisible)) + (let ((inv-beg (next-single-property-change (pos-bol) 'invisible))) + (should (eq (get-text-property inv-beg 'invisible) + 'timestamp)))))))) + +;; This asserts that when `erc-fill-wrap-mode' is enabled, ERC hides +;; the preceding message's line ending. +(ert-deftest erc-scenarios-match--stamp-right-invisible-fill-wrap () + :tags '(:expensive-test) + (let ((erc-insert-timestamp-function #'erc-insert-timestamp-right) + (erc-fill-function #'erc-fill-wrap)) + (erc-scenarios-match--invisible-stamp + + (lambda () + ;; Every message has a trailing time stamp. + (should (eq (field-at-pos (1- (pos-eol))) 'erc-timestamp)) + + ;; Stamps appear in the right margin. + (should (equal (car (get-text-property (1- (pos-eol)) 'display)) + '(margin right-margin))) + + ;; Stamps have a combined `invisible' property value. + (should (equal (get-text-property (1- (pos-eol)) 'invisible) + '(timestamp erc-match))) + + ;; The message proper has the `invisible' property `erc-match', + ;; which starts at the preceding newline... + (should (eq (get-text-property (1- (pos-bol)) 'invisible) 'erc-match)) + + ;; ... and ends just before the timestamp. + (let ((msgend (next-single-property-change (1- (pos-bol)) 'invisible))) + (should (equal (get-text-property msgend 'invisible) + '(timestamp erc-match))) + + ;; The newline before `erc-insert-marker' is still visible. + (should-not (get-text-property (pos-eol) 'invisible)) + (should (= (next-single-property-change msgend 'invisible) + (pos-eol))))) + + (lambda () + ;; This message has a time stamp like all the others. + (should (eq (field-at-pos (1- (pos-eol))) 'erc-timestamp)) + + ;; Unlike hidden messages, the preceding newline is visible. + (should-not (get-text-property (1- (pos-bol)) 'invisible)) + + ;; The entire message proper is visible. + (let ((inv-beg (next-single-property-change (1- (pos-bol)) 'invisible))) + (should (eq (get-text-property inv-beg 'invisible) 'timestamp))))))) + (eval-when-compile (require 'erc-join)) ;;; erc-scenarios-match.el ends here -- 2.41.0 --=-=-=--