;;; proced-tests.el --- Test suite for proced.el -*- lexical-binding: t -*- ;; Copyright (C) 2022 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 'cl-lib) (require 'ert) (require 'proced) (require 'thingatpt) (defconst proced--mock-process-attributes '((args . "/sbin/init") (pmem . 0.03338765170917735) (pcpu . 0.008040037401062874) (etime 0 20149 160000 0) (rss . 10964) (vsize . 164524) (start 25704 42324 637481 508000) (thcount . 1) (nice . 0) (pri . 20) (ctime 0 873 550000 0) (cstime 0 16 30000 0) (cutime 0 857 520000 0) (time 0 1 620000 0) (stime 0 1 360000 0) (utime 0 0 260000 0) (cmajflt . 3931) (cminflt . 425816) (majflt . 162) (minflt . 25825) (tpgid . -1) (ttname . "") (sess . 1) (pgrp . 1) (ppid . 0) (state . "S") (comm . "systemd") (group . "root") (egid . 0) (user . "root") (euid . 0)) "A mocked list of process attributes.") (defconst proced--mock-pid 34123) (cl-defmacro proced--within-buffer (format filter processes &body body) "Execute BODY within a proced buffer using format FORMAT and filter FILTER. Also use PROCESSES as a mocked list of processes." `(let ((proced-format ,format) (proced-filter ,filter) (proced-auto-update-flag nil) (inhibit-message t)) (cl-letf (((symbol-function 'list-system-processes) (lambda (&rest args) (mapcar #'car ,processes))) ((symbol-function 'process-attributes) (lambda (process) (alist-get process ,processes)))) (proced) (unwind-protect (with-current-buffer "*Proced*" ,@body) (kill-buffer "*Proced*"))))) (defun proced--assert-pid-in-buffer (pid) "Fail unless PID exists in the current buffer." (should (string-match-p (number-to-string pid) (buffer-substring-no-properties (point-min) (point-max))))) (defun proced--move-to-column (attribute) "Move to the column under ATTRIBUTE in the current proced buffer." (move-to-column (string-match attribute proced-header-line))) (ert-deftest proced-format-test () (dolist (format '(short medium long verbose)) (proced--within-buffer format 'all `((,proced--mock-pid . ,proced--mock-process-attributes)) (proced--assert-pid-in-buffer proced--mock-pid)))) (ert-deftest proced-update-test () (proced--within-buffer 'short 'all `((,proced--mock-pid . ,proced--mock-process-attributes)) (proced-update) (proced--assert-pid-in-buffer proced--mock-pid))) (ert-deftest proced-revert-test () (proced--within-buffer 'short 'all `((,proced--mock-pid . ,proced--mock-process-attributes)) (proced-revert) (proced--assert-pid-in-buffer proced--mock-pid))) (ert-deftest proced-color-test () (let ((proced-enable-color-flag t)) (proced--within-buffer 'short 'all `((,proced--mock-pid . ,proced--mock-process-attributes)) (proced--assert-pid-in-buffer proced--mock-pid)))) (ert-deftest proced-refine-test () (proced--within-buffer 'medium 'all `((,proced--mock-pid . ,proced--mock-process-attributes) (,(1+ proced--mock-pid) . ,proced--mock-process-attributes)) ;; When refining on PID for process A, a process is kept if and only ;; if its PID are the same as process A, which more or less guarentees ;; the refinement will remove some processes. (proced--move-to-column "PID") (let ((pid (word-at-point))) (proced-refine) (while (not (eobp)) (proced--move-to-column "PID") (should (string= pid (word-at-point))) (forward-line))))) (ert-deftest proced-refine-with-update-test () (proced--within-buffer 'medium 'all `((,proced--mock-pid . ,proced--mock-process-attributes) (,(1+ proced--mock-pid) . ,proced--mock-process-attributes)) (proced--move-to-column "PID") (let ((pid (word-at-point))) (proced-refine) (proced-update t) (while (not (eobp)) (proced--move-to-column "PID") (should (string= pid (word-at-point))) (forward-line))))) (ert-deftest proced-update-preserves-pid-at-point-test () (proced--within-buffer 'medium 'all `((,proced--mock-pid . ,proced--mock-process-attributes) (,(1+ proced--mock-pid) . ,proced--mock-process-attributes)) (goto-char (point-min)) (search-forward (number-to-string proced--mock-pid)) (proced--move-to-column "PID") (save-window-excursion (let ((pid (proced-pid-at-point)) (new-window (split-window)) (old-window (get-buffer-window))) (select-window new-window) (with-current-buffer "*Proced*" (proced-update t t)) (select-window old-window) (should (= pid (proced-pid-at-point))))))) (provide 'proced-tests) ;;; proced-tests.el ends here