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.erc.general,gmane.emacs.bugs Subject: 29.0.50; Add command for refilling ERC buffers Date: Fri, 19 Nov 2021 02:39:50 -0800 Message-ID: <87bl2gjuo9.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="32279"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.60 (gnu/linux) Cc: emacs-erc@gnu.org To: bug-gnu-emacs@gnu.org Original-X-From: emacs-erc-bounces+sf-erc-help=m.gmane-mx.org@gnu.org Fri Nov 19 11:40:10 2021 Return-path: Envelope-to: sf-erc-help@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 1mo1JP-00084Z-7x for sf-erc-help@m.gmane-mx.org; Fri, 19 Nov 2021 11:40:07 +0100 Original-Received: from localhost ([::1]:55486 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mo1JO-0004lg-47 for sf-erc-help@m.gmane-mx.org; Fri, 19 Nov 2021 05:40:06 -0500 Original-Received: from eggs.gnu.org ([209.51.188.92]:34602) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mo1JI-0004lI-4u for emacs-erc@gnu.org; Fri, 19 Nov 2021 05:40:00 -0500 Original-Received: from mail-108-mta100.mxroute.com ([136.175.108.100]:39437) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1mo1JF-0003gZ-5L for emacs-erc@gnu.org; Fri, 19 Nov 2021 05:39:59 -0500 Original-Received: from filter004.mxroute.com ([149.28.56.236] filter004.mxroute.com) (Authenticated sender: mN4UYu2MZsgR) by mail-108-mta100.mxroute.com (ZoneMTA) with ESMTPSA id 17d37c7fc1a000177f.002 for (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES128-GCM-SHA256); Fri, 19 Nov 2021 10:39:52 +0000 X-Zone-Loop: 400c1e602aeb472d9689aa312ad451345a946d3012e9 X-Originating-IP: [149.28.56.236] 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: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:In-Reply-To: References:List-Id:List-Help:List-Unsubscribe:List-Subscribe:List-Post: List-Owner:List-Archive; bh=kjdJoIzB2vRNsiqimPxY6ekxiFb0l2/OJFgx8xqwN3w=; b=m 89eawOutbq1AVxhYRXYmyTQESvRahSewGeQEBZC4e3BDJJwhY2UK/T3mjAugxrKJ92Oy4xleEFhWo qQhoFz32AVfELWZJH7yfWpb8pmeiyJhJcTpcp05x8vN9gaD+oD/upzKfF2SiVbg0g0hdIMDccrbpF qy4rlu8lpnLREMLQ+haO6L4fHEiW/jQWlEURpd5eRrLVm9NvkYht8XNqr9MIlf0kB+7ckSGLPxUG7 zKUzFTn5CRGpbKYbr37Vaw5UyVGWMtJbeY8FF3IG1SzsKFterdKXu7fOwG1H+TUOT43wLM1Ra1IoB UkkXjSlIPykmeVbFmyGjVoHza28/8ACcg==; X-AuthUser: masked@neverwas.me X-Zone-Spam-Resolution: no action X-Zone-Spam-Status: No, score=-0.1, required=15, tests=[ARC_NA=0, RCPT_COUNT_TWO=0, FROM_HAS_DN=0, HAS_ATTACHMENT=0, FROM_EQ_ENVFROM=0, MIME_TRACE=0, MIME_GOOD=-0.1, TO_DN_NONE=0, MID_RHS_MATCH_FROM=0, RCVD_COUNT_ZERO=0, NEURAL_SPAM=0] Received-SPF: pass client-ip=136.175.108.100; envelope-from=jp@neverwas.me; helo=mail-108-mta100.mxroute.com X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-erc@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: General discussion about ERC List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-erc-bounces+sf-erc-help=m.gmane-mx.org@gnu.org Original-Sender: "emacs-erc" Xref: news.gmane.io gmane.emacs.erc.general:1667 gmane.emacs.bugs:220405 Archived-At: --=-=-= Content-Type: text/plain Tags: patch A recent bug entitled bug#51841: 27.2; erc-insert-marker has no value (opened by Libera user Bost) was in part brought about by confusion over whether ERC already offered this feature and perhaps applied it during major-mode setup. While I don't think erc-stamp and erc-fill currently provide sufficient support to rig up automated refilling in a reliable way (on window configuration change, for example), I agree that some means of doing so manually might occasionally come in handy. A related issue concerns the purpose and treatment of the option `erc-fill-prefix'. This one's a mystery to me and seems to have little meaningful bearing on anything. It does make an appearance in erc-button.el, but to what end I'm not entirely certain. Like a few other puzzlers, it was present in much the same form back when ERC was first ported to ye old CVS some twenty years ago (almost to the day) [1]. Anyway, I will continue to investigate this. Thanks. [1] https://gitlab.com/jpneverwas/og-erc/-/commit/9a819366bdf8a6f5a304916baa2d6a501eb3987b#4042b2fc4c564fbd556343d1ed666da630f85951_0_97 In GNU Emacs 29.0.50 (build 1, x86_64-redhat-linux-gnu, GTK+ Version 3.24.30, cairo version 1.17.4) of 2021-11-18 built on localhost Repository revision: 69f1bc43c026049ed2aab6a6368e2e9a5406b779 Repository branch: master Windowing system distributor 'The X.Org Foundation', version 11.0.12011000 System Description: Fedora 34 (Workstation Edition) Configured using: 'configure --enable-check-lisp-object-type --enable-checking=yes,glyphs --build=x86_64-redhat-linux-gnu --host=x86_64-redhat-linux-gnu --program-prefix= --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib64 --libexecdir=/usr/libexec --localstatedir=/var --sharedstatedir=/var/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-dbus --with-gif --with-jpeg --with-png --with-rsvg --with-tiff --with-xft --with-xpm --with-x-toolkit=gtk3 --with-gpm=no --with-xwidgets --with-modules --with-harfbuzz --with-cairo --with-json build_alias=x86_64-redhat-linux-gnu host_alias=x86_64-redhat-linux-gnu CC=gcc 'CFLAGS=-O0 -g3' LDFLAGS=-Wl,-z,relro PKG_CONFIG_PATH=:/usr/lib64/pkgconfig:/usr/share/pkgconfig' Configured features: ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GSETTINGS HARFBUZZ JPEG JSON LCMS2 LIBOTF LIBSELINUX LIBSYSTEMD LIBXML2 M17N_FLT MODULES NOTIFY INOTIFY PDUMPER PNG RSVG SECCOMP SOUND THREADS TIFF TOOLKIT_SCROLL_BARS WEBP X11 XDBE XIM XPM XWIDGETS GTK3 ZLIB Important settings: value of $LANG: en_US.UTF-8 value of $XMODIFIERS: @im=ibus locale-coding-system: utf-8-unix Major mode: Lisp Interaction Minor modes in effect: tooltip-mode: t global-eldoc-mode: t eldoc-mode: t show-paren-mode: t electric-indent-mode: t mouse-wheel-mode: t tool-bar-mode: t menu-bar-mode: t file-name-shadow-mode: t global-font-lock-mode: t font-lock-mode: t blink-cursor-mode: t auto-composition-mode: t auto-encryption-mode: t auto-compression-mode: t line-number-mode: t indent-tabs-mode: t transient-mark-mode: t Load-path shadows: None found. Features: (shadow sort mail-extr emacsbug message mailcap yank-media rmc puny dired dired-loaddefs rfc822 mml mml-sec epa derived epg rfc6068 epg-config gnus-util rmail rmail-loaddefs auth-source cl-seq eieio eieio-core cl-macs eieio-loaddefs password-cache json map text-property-search time-date seq gv subr-x byte-opt bytecomp byte-compile cconv mm-decode mm-bodies mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader sendmail rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mail-utils help-mode cl-loaddefs cl-lib iso-transl tooltip eldoc paren electric uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel term/x-win x-win term/common-win x-dnd tool-bar dnd fontset image regexp-opt fringe tabulated-list replace newcomment text-mode lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow isearch easymenu timer select scroll-bar mouse jit-lock font-lock syntax font-core term/tty-colors frame minibuffer cl-generic cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese composite emoji-zwj charscript charprop case-table epa-hook jka-cmpr-hook help simple abbrev obarray cl-preloaded nadvice button loaddefs faces cus-face macroexp files window text-properties overlay sha1 md5 base64 format env code-pages mule custom widget keymap hashtable-print-readable backquote threads xwidget-internal dbusbind inotify lcms2 dynamic-setting system-font-setting font-render-setting cairo move-toolbar gtk x-toolkit x multi-tty make-network-process emacs) Memory information: ((conses 16 53474 6237) (symbols 48 6794 1) (strings 32 19269 1625) (string-bytes 1 642335) (vectors 16 14025) (vector-slots 8 189932 12509) (floats 8 22 37) (intervals 56 262 0) (buffers 992 10)) --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-Add-command-to-refill-ERC-buffers.patch >From bb9850eee9e44555a67f8e838b12e315c0085f38 Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Tue, 16 Nov 2021 06:28:25 -0800 Subject: [PATCH 1/1] Add command to refill ERC buffers * lisp/erc/erc-fill.el (erc-fill-buffer, erc-fill--refill, erc-fill--refill-thread, erc-fill--remove-stamp-{left,right}, erc-fill--hack-csf): Add new command and helpers to refill ERC buffers. * lisp/erc/erc-fill-tests.el: Add new file containing tests for `erc-fill-buffer'. Add some support files to test against in lisp/erc/erc-fill-resources. --- lisp/erc/erc-fill.el | 115 ++++++++++ .../erc/erc-fill-resources/static-60.buffer | 21 ++ .../erc/erc-fill-resources/static-72.buffer | 17 ++ .../erc/erc-fill-resources/variable-60.buffer | 16 ++ .../erc/erc-fill-resources/variable-72.buffer | 16 ++ test/lisp/erc/erc-fill-tests.el | 206 ++++++++++++++++++ 6 files changed, 391 insertions(+) create mode 100644 test/lisp/erc/erc-fill-resources/static-60.buffer create mode 100644 test/lisp/erc/erc-fill-resources/static-72.buffer create mode 100644 test/lisp/erc/erc-fill-resources/variable-60.buffer create mode 100644 test/lisp/erc/erc-fill-resources/variable-72.buffer create mode 100644 test/lisp/erc/erc-fill-tests.el diff --git a/lisp/erc/erc-fill.el b/lisp/erc/erc-fill.el index 9f29b9dad9..3bf335d098 100644 --- a/lisp/erc/erc-fill.el +++ b/lisp/erc/erc-fill.el @@ -112,6 +112,121 @@ erc-fill-column "The column at which a filled paragraph is broken." :type 'integer) +(defun erc-fill--remove-stamp-right () + (goto-char (point-min)) + (let (changed) + (while + (when-let* ((nextf (next-single-property-change (point) 'field))) + (goto-char (field-end nextf t)) + ;; Sweep up residual phantom field remants + (delete-region nextf (field-end nextf t)) + (setq changed t))) + changed)) + +(defun erc-fill--remove-stamp-left () + "Remove at most one LEFT or one right timestamp, if any." + (goto-char (point-min)) + ;; FIXME actually, it may be a mistake to blow past white space + ;; without checking for intervening intervals that need cleaning up. + (when-let* ((beg (save-excursion (skip-syntax-forward ">-") (point))) + (nextf (when (eq 'erc-timestamp (field-at-pos beg)) + (field-beginning beg t))) + ((eq 'erc-timestamp (get-text-property nextf 'field)))) + (goto-char (field-end nextf t)) + (skip-syntax-forward "-") + (delete-region nextf (point)) + t)) + +(defun erc-fill--hack-csf (f) + ;; HACK until necessary additions to erc-stamp.el arrive (possibly + ;; with erc-v3 in #49860), there's no civilized way of detecting the + ;; bounds of a displayed message after initial insertion. + ;; + ;; These callback closures are used for that purpose, but they also + ;; contain the timestamp we need. An unforeseen benefit of this + ;; awkwardness is that it plays well with `text-property-not-all', + ;; which needs unique values to match against. That wouldn't be the + ;; case were we to use lisp time objects instead because successive + ;; messages might contain the exact same one. + (if (byte-code-function-p f) (aref (aref f 2) 0) (alist-get 'ct (cadr f)))) + +;; Enabling `erc-fill-mode' is ultimately destructive to preformatted +;; text (like ASCII art and figlets), which degenerate immediately +;; upon display. This is permanent because we don't store original +;; messages (though with IRCv3, it may be possible to request a +;; replacement from the server). +(defun erc-fill--refill () + (let ((m (make-marker)) + (reporter (unless noninteractive + (make-progress-reporter "filling" 0 (point-max)))) + (inhibit-read-only t) + (inhibit-point-motion-hooks t) + ;; + left-changed right-changed ct) ; cached current time + (cl-letf (((symbol-function #'erc-restore-text-properties) #'ignore) + ((symbol-function #'current-time) (lambda () ct))) + (while + (save-excursion + (goto-char (or (marker-position m) (set-marker m (point-min)))) + (when-let* + ((beg (if (get-text-property (point) 'cursor-sensor-functions) + (point) + (when-let* + ((max (min (point-max) (+ 512 (point)))) + (res (next-single-property-change + (point) 'cursor-sensor-functions nil max)) + ((/= res max))) ; otherwise, we're done. + res))) + (val (get-text-property beg 'cursor-sensor-functions)) + (beg (progn ; remove left padding, if any. + (goto-char beg) + (skip-syntax-forward "-") + (delete-region (min (line-beginning-position) beg) + (point)) + (point))) + ;; Don't expect output limited to IRC message length. + (end (text-property-not-all beg (point-max) + 'cursor-sensor-functions val))) + (save-restriction + (narrow-to-region beg end) + (setq left-changed (erc-fill--remove-stamp-left)) + ;; If NOSQUEEZE seems warranted, see note above. + (let ((fill-column (- (point-max) (point-min)))) + (fill-region (point-min) (point-max))) + (setq right-changed (erc-fill--remove-stamp-right)) + (erc-fill) + (when (setq ct (when (or left-changed right-changed) + (erc-fill--hack-csf (car val)))) + (when left-changed + (setq erc-timestamp-last-inserted-left nil)) + (when right-changed + (setq erc-timestamp-last-inserted-right nil)) + (erc-add-timestamp)) + (when reporter + (cl-incf (aref (cdr reporter) 2) ; max += d_new - d_old + (- (point-max) (point-min) end (- beg)))) + (set-marker m (goto-char (point-max)))))) + (when reporter + (progress-reporter-update reporter (point))) + (thread-yield))))) + +(defvar-local erc-fill--refill-thread nil + "A thread running a buffer-refill job.") + +(define-error 'erc-fill-canceled "ERC refill canceled" 'error) + +(defun erc-fill-buffer (force) + "Refill an ERC buffer. +With FORCE, cancel an active refill job if one exists." + (interactive "P") + (when (and erc-fill--refill-thread + (thread-live-p erc-fill--refill-thread)) + (if force + (thread-signal erc-fill--refill-thread + 'erc-fill-canceled (list (buffer-name))) + (user-error "Already refilling."))) + (setq erc-fill--refill-thread (make-thread #'erc-fill--refill "erc-fill"))) + ;;;###autoload (defun erc-fill () "Fill a region using the function referenced in `erc-fill-function'. diff --git a/test/lisp/erc/erc-fill-resources/static-60.buffer b/test/lisp/erc/erc-fill-resources/static-60.buffer new file mode 100644 index 0000000000..b33f11ae96 --- /dev/null +++ b/test/lisp/erc/erc-fill-resources/static-60.buffer @@ -0,0 +1,21 @@ + + + +[Tue Jan 1 1980] + *** #chan modes: +nt [00:00] + *** #chan was created on 2021-05-04 + 05:06:19 + lorem ipsum This buffer is for + text that is not saved, and for + Lisp evaluation. [00:01] + tester, welcome! Your name may or + may not be highlighted depending + on whether button's been loaded + by an earlier test. ERC needs + help! [00:03] + +[Wed Jan 2 1980] + tester, welcome! To create a + file, visit it with ? and enter + text in its buffer. +ERC> \ No newline at end of file diff --git a/test/lisp/erc/erc-fill-resources/static-72.buffer b/test/lisp/erc/erc-fill-resources/static-72.buffer new file mode 100644 index 0000000000..79ed88d112 --- /dev/null +++ b/test/lisp/erc/erc-fill-resources/static-72.buffer @@ -0,0 +1,17 @@ + + + +[Tue Jan 1 1980] + *** #chan modes: +nt [00:00] + *** #chan was created on 2021-05-04 05:06:19 + lorem ipsum This buffer is for text that is + not saved, and for Lisp evaluation. [00:01] + tester, welcome! Your name may or may not be + highlighted depending on whether button's + been loaded by an earlier test. ERC needs + help! [00:03] + +[Wed Jan 2 1980] + tester, welcome! To create a file, visit it + with ? and enter text in its buffer. +ERC> \ No newline at end of file diff --git a/test/lisp/erc/erc-fill-resources/variable-60.buffer b/test/lisp/erc/erc-fill-resources/variable-60.buffer new file mode 100644 index 0000000000..4bf2741af0 --- /dev/null +++ b/test/lisp/erc/erc-fill-resources/variable-60.buffer @@ -0,0 +1,16 @@ + + + +[Tue Jan 1 1980] +*** #chan modes: +nt [00:00] +*** #chan was created on 2021-05-04 05:06:19 + lorem ipsum This buffer is for text that is not saved, + and for Lisp evaluation. [00:01] + tester, welcome! Your name may or may not be + highlighted depending on whether button's been + loaded by an earlier test. ERC needs help! [00:03] + +[Wed Jan 2 1980] + tester, welcome! To create a file, visit it with ? and + enter text in its buffer. +ERC> \ No newline at end of file diff --git a/test/lisp/erc/erc-fill-resources/variable-72.buffer b/test/lisp/erc/erc-fill-resources/variable-72.buffer new file mode 100644 index 0000000000..de376cc15d --- /dev/null +++ b/test/lisp/erc/erc-fill-resources/variable-72.buffer @@ -0,0 +1,16 @@ + + + +[Tue Jan 1 1980] +*** #chan modes: +nt [00:00] +*** #chan was created on 2021-05-04 05:06:19 + lorem ipsum This buffer is for text that is not saved, and for + Lisp evaluation. [00:01] + tester, welcome! Your name may or may not be highlighted + depending on whether button's been loaded by an earlier + test. ERC needs help! [00:03] + +[Wed Jan 2 1980] + tester, welcome! To create a file, visit it with ? and enter text + in its buffer. +ERC> \ No newline at end of file diff --git a/test/lisp/erc/erc-fill-tests.el b/test/lisp/erc/erc-fill-tests.el new file mode 100644 index 0000000000..a7e3d78d74 --- /dev/null +++ b/test/lisp/erc/erc-fill-tests.el @@ -0,0 +1,206 @@ +;;; erc-fill-tests.el --- ERC message filling -*- lexical-binding: t -*- + +;; Copyright (C) 2020-2021 Free Software Foundation, Inc. + +;; This file is part of GNU Emacs. +;; +;; GNU Emacs is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published +;; by the Free Software Foundation, either version 3 of the License, +;; or (at your option) any later version. +;; +;; GNU Emacs is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;;; Code: + +(require 'ert-x) +(require 'erc-fill) + +(defun erc-fill-tests--insert (&rest strings) + (let ((inhibit-read-only t)) + (erc-parse-server-response erc-server-process (apply #'concat strings)))) + +(defun erc-fill-tests--setup-server-buffer () + (with-current-buffer (get-buffer-create "foonet") + (erc-mode) + (setq erc-server-process (start-process "true" (current-buffer) "true") + erc-server-current-nick "tester" + erc-server-users (make-hash-table :test #'equal)) + (set-process-query-on-exit-flag erc-server-process nil))) + +(defun erc-fill-tests--setup-channel-buffer () + (with-current-buffer (get-buffer-create "#chan") + (erc-mode) + (insert "\n\n") + (setq erc-input-marker (make-marker) + ;; Kludge to get around saving display prop + erc-timestamp-use-align-to nil + ;; Kludge to make whitespace compare equal without expanding + indent-tabs-mode nil + erc-insert-marker (make-marker) + erc-default-recipients '("#chan") + erc-channel-users (make-hash-table :test #'equal) + erc-server-process (with-current-buffer "foonet" + erc-server-process)) + (set-marker erc-insert-marker (point-max)) + (erc-display-prompt))) + +(defun erc-fill-tests--setup () + (advice-add 'format-time-string :filter-args + (lambda (args) (list (car args) (cadr args) 0)) '((name . ts))) + + (erc-stamp-mode +1) + + (erc-fill-tests--setup-server-buffer) + (erc-fill-tests--setup-channel-buffer) + (erc-fill-tests--populate)) + +(defun erc-fill-tests--populate () + (let* ((ts (+ (* 2 60 60 24) (* 60 60 24 365 10))) ; Jan 1 1980 + (ct (time-convert ts))) + + (cl-letf (((symbol-function 'current-time) (lambda () ct))) + (with-current-buffer "foonet" + (erc-fill-tests--insert ":irc.foonet.org 324 tester #chan +nt") + (erc-fill-tests--insert ":irc.foonet.org 329 tester #chan 1620104779") + + (setq ct (time-convert (cl-incf ts 60))) + (erc-fill-tests--insert + ":bob!~u@rz2v467q4rwhy.irc PRIVMSG #chan :lorem ipsum" + " This buffer is for text that is not saved, and for Lisp evaluation.") + + (setq ct (time-convert (cl-incf ts 120))) + (erc-fill-tests--insert + ":alice!~u@rz2v467q4rwhy.irc PRIVMSG #chan :tester, welcome!" + " Your name may or may not be highlighted depending on whether" + " button's been loaded by an earlier test. ERC needs help!") + + (setq ct (time-convert (cl-incf ts (* 60 60 24)))) + (erc-fill-tests--insert + ":bob!~u@rz2v467q4rwhy.irc PRIVMSG #chan :tester, welcome!" + " To create a file, visit it with ? and enter text in its buffer."))))) + +(defun erc-fill-tests--teardown () + ;; XXX when inspecting manually, must reactivate fill and stamp modes. + ;; Otherwise `erc-fill-buffer' won't work. + (dolist (buf '("variable-60.buffer" + "variable-72.buffer" + "static-60.buffer" + "static-72.buffer")) + (when (buffer-live-p buf) + (kill-buffer buf))) + (advice-remove 'format-time-string 'ts) + (let (erc-kill-server-hook + erc-kill-channel-hook) + (kill-buffer "#chan") + (kill-buffer "foonet")) + (should (= erc-fill-column 78))) + +(defun erc-fill-tests--compare (name) + ;; Git didn't allow committing with a trailing space after the + ;; prompt, hence this: + (equal (substring-no-properties (buffer-string) 0 -1) + (with-current-buffer (find-file-literally (ert-resource-file name)) + (buffer-string)))) + +(defun erc-fill-tests--await-fill () + (call-interactively #'erc-fill-buffer) + ;; This timeout silliness seemed a little more realistic than just: + ;; + ;; (thread-join erc-fill--refill-thread) + ;; + ;; Probably dumb, right?. + (with-timeout (3 (error "Failed")) + (while (thread-live-p erc-fill--refill-thread) + (sleep-for 0.01)))) + +(ert-deftest erc-fill-buffer () + (let* (erc-insert-pre-hook + erc-insert-modify-hook + erc-send-modify-hook + erc-mode-hook + erc-stamp-mode + erc-fill--refill-thread) + + (erc-fill-tests--setup) + + (with-current-buffer "#chan" + ;; These would get clobbered by the new thread if we let-bound + ;; them, and we can't set them globally, so best just fake it: + (setq-local erc-fill-mode t + erc-stamp-mode t + erc-fill-column 60) + (erc-fill-tests--await-fill) + (ert-info ("Baseline") + (should (erc-fill-tests--compare "variable-60.buffer"))) + + (ert-info ("Wider") + (setq erc-fill-column 72) + (erc-fill-tests--await-fill) + (should (erc-fill-tests--compare "variable-72.buffer"))) + + (ert-info ("Fancy") + (setq erc-fill-function #'erc-fill-static) + (erc-fill-tests--await-fill) + (should (erc-fill-tests--compare "static-72.buffer"))) + + (ert-info ("Fancy normal") + (setq erc-fill-column 60) + (erc-fill-tests--await-fill) + (should (erc-fill-tests--compare "static-60.buffer"))) + + (ert-info ("Again!") + (erc-fill-tests--await-fill) + (should (erc-fill-tests--compare "static-60.buffer"))) + + (ert-info ("Back home") + (setq erc-fill-function #'erc-fill-variable) + (erc-fill-tests--await-fill) + (should (erc-fill-tests--compare "variable-60.buffer"))))) + + (when noninteractive + (erc-fill-tests--teardown))) + +(ert-deftest erc-fill-buffer--interrupted () + (let* (erc-insert-pre-hook + erc-insert-modify-hook + erc-send-modify-hook + erc-mode-hook + erc-stamp-mode + erc-fill--refill-thread) + + (erc-fill-tests--setup) + + (with-current-buffer "#chan" + (setq-local erc-fill-mode t ; see note re these in prev test + erc-stamp-mode t + erc-fill-column 60) + (erc-fill-tests--await-fill) + (ert-info ("Baseline") + (should (erc-fill-tests--compare "variable-60.buffer"))) + + (ert-info ("Denied") + (setq erc-fill-column 72) + (call-interactively #'erc-fill-buffer) + (should-error (erc-fill-buffer nil)) + (thread-join erc-fill--refill-thread) + (should (erc-fill-tests--compare "variable-72.buffer"))) + + (ert-info ("Canceled") + (setq erc-fill-column 60) + (call-interactively #'erc-fill-buffer) + (sleep-for (cl-random 0.1)) + (erc-fill-buffer t) + (thread-join erc-fill--refill-thread) + (should (erc-fill-tests--compare "variable-60.buffer"))))) + + (when noninteractive + (erc-fill-tests--teardown))) + +;;; erc-fill-tests.el ends here -- 2.31.1 --=-=-=--