;;; xdisp-tests.el --- tests for xdisp.c functions -*- lexical-binding: t -*- ;; Copyright (C) 2020-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 'ert) (defmacro xdisp-tests--in-minibuffer (&rest body) (declare (debug t) (indent 0)) `(catch 'result (minibuffer-with-setup-hook (lambda () (let ((redisplay-skip-initial-frame nil) (executing-kbd-macro nil)) ;Don't skip redisplay (throw 'result (progn . ,body)))) (let ((executing-kbd-macro t)) ;Force real minibuffer in `read-string'. (read-string "toto: "))))) (ert-deftest xdisp-tests--minibuffer-resizing () ;; bug#43519 (should (equal t (xdisp-tests--in-minibuffer (insert "hello") (let ((ol (make-overlay (point) (point))) (max-mini-window-height 1) (text "askdjfhaklsjdfhlkasjdfhklasdhflkasdhflkajsdhflkashdfkljahsdlfkjahsdlfkjhasldkfhalskdjfhalskdfhlaksdhfklasdhflkasdhflkasdhflkajsdhklajsdgh")) ;; (save-excursion (insert text)) ;; (sit-for 2) ;; (delete-region (point) (point-max)) (put-text-property 0 1 'cursor t text) (overlay-put ol 'after-string text) (redisplay 'force) ;; Make sure we do the see "hello" text. (prog1 (equal (window-start) (point-min)) ;; (list (window-start) (window-end) (window-width)) (delete-overlay ol))))))) (ert-deftest xdisp-tests--minibuffer-scroll () ;; bug#44070 (let ((posns (xdisp-tests--in-minibuffer (let ((max-mini-window-height 4)) (dotimes (_ 80) (insert "\nhello")) (goto-char (point-min)) (redisplay 'force) (goto-char (point-max)) ;; A simple edit like removing the last `o' shouldn't cause ;; the rest of the minibuffer's text to move. (list (progn (redisplay 'force) (window-start)) (progn (delete-char -1) (redisplay 'force) (window-start)) (progn (goto-char (point-min)) (redisplay 'force) (goto-char (point-max)) (redisplay 'force) (window-start))))))) (should (equal (nth 0 posns) (nth 1 posns))) (should (equal (nth 1 posns) (nth 2 posns))))) (ert-deftest xdisp-tests--window-text-pixel-size () ;; bug#45748 (with-temp-buffer (insert "xxx") (switch-to-buffer (current-buffer)) (let* ((char-width (frame-char-width)) (size (window-text-pixel-size nil t t)) (width-in-chars (/ (car size) char-width))) (should (equal width-in-chars 3))))) (ert-deftest xdisp-tests--window-text-pixel-size-leading-space () ;; bug#45748 (with-temp-buffer (insert " xx") (switch-to-buffer (current-buffer)) (let* ((char-width (frame-char-width)) (size (window-text-pixel-size nil t t)) (width-in-chars (/ (car size) char-width))) (should (equal width-in-chars 3))))) (ert-deftest xdisp-tests--window-text-pixel-size-trailing-space () ;; bug#45748 (with-temp-buffer (insert "xx ") (switch-to-buffer (current-buffer)) (let* ((char-width (frame-char-width)) (size (window-text-pixel-size nil t t)) (width-in-chars (/ (car size) char-width))) (should (equal width-in-chars 3))))) (ert-deftest xdisp-tests--find-directional-overrides-case-1 () (with-temp-buffer (insert "\ int main() { bool isAdmin = false; /*‮ }⁦if (isAdmin)⁩ ⁦ begin admins only */ printf(\"You are an admin.\\n\"); /* end admins only ‮ { ⁦*/ return 0; }") (goto-char (point-min)) (should (eq (bidi-find-overridden-directionality (point-min) (point-max) nil) 46)))) (ert-deftest xdisp-tests--find-directional-overrides-case-2 () (with-temp-buffer (insert "\ #define is_restricted_user(user) \\ !strcmp (user, \"root\") ? 0 : \\ !strcmp (user, \"admin\") ? 0 : \\ !strcmp (user, \"superuser‮⁦? 0 : 1⁩ ⁦\")⁩‬ int main () { printf (\"root: %d\\n\", is_restricted_user (\"root\")); printf (\"admin: %d\\n\", is_restricted_user (\"admin\")); printf (\"superuser: %d\\n\", is_restricted_user (\"superuser\")); printf (\"luser: %d\\n\", is_restricted_user (\"luser\")); printf (\"nobody: %d\\n\", is_restricted_user (\"nobody\")); }") (goto-char (point-min)) (should (eq (bidi-find-overridden-directionality (point-min) (point-max) nil) 138)))) (ert-deftest xdisp-tests--find-directional-overrides-case-3 () (with-temp-buffer (insert "\ #define is_restricted_user(user) \\ !strcmp (user, \"root\") ? 0 : \\ !strcmp (user, \"admin\") ? 0 : \\ !strcmp (user, \"superuser‮⁦? '#' : '!'⁩ ⁦\")⁩‬ int main () { printf (\"root: %d\\n\", is_restricted_user (\"root\")); printf (\"admin: %d\\n\", is_restricted_user (\"admin\")); printf (\"superuser: %d\\n\", is_restricted_user (\"superuser\")); printf (\"luser: %d\\n\", is_restricted_user (\"luser\")); printf (\"nobody: %d\\n\", is_restricted_user (\"nobody\")); }") (goto-char (point-min)) (should (eq (bidi-find-overridden-directionality (point-min) (point-max) nil) 138)))) (ert-deftest test-get-display-property () (with-temp-buffer (insert (propertize "foo" 'face 'bold 'display '(height 2.0))) (should (equal (get-display-property 2 'height) 2.0))) (with-temp-buffer (insert (propertize "foo" 'face 'bold 'display '((height 2.0) (space-width 2.0)))) (should (equal (get-display-property 2 'height) 2.0)) (should (equal (get-display-property 2 'space-width) 2.0))) (with-temp-buffer (insert (propertize "foo bar" 'face 'bold 'display '[(height 2.0) (space-width 20)])) (should (equal (get-display-property 2 'height) 2.0)) (should (equal (get-display-property 2 'space-width) 20)))) (ert-deftest test-messages-buffer-name () (should (equal (let ((messages-buffer-name "test-message")) (message "foo") (with-current-buffer messages-buffer-name (buffer-string))) "foo\n"))) (ert-deftest xdisp-tests--respect-inhibit-message () "It's borderline criminal that inhibit-message still clears echo area." (skip-unless (not noninteractive)) (let ((dont "dont clear me!")) (message dont) (let ((inhibit-message t)) (message "nice try") (should (equal (current-message) dont))))) ;;; xdisp-tests.el ends here