1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-24 07:20:37 +00:00
emacs/test/manual/image-tests.el
Po Lu ecf08f0621 Merge from savannah/emacs-29
dc4e6b1329 ; Update copyright years in more files
64b3777631 ; Run set-copyright from admin.el
8e1c56ae46 ; Add 2024 to copyright years

# Conflicts:
#	doc/misc/modus-themes.org
#	doc/misc/texinfo.tex
#	etc/NEWS
#	etc/refcards/ru-refcard.tex
#	etc/themes/modus-operandi-theme.el
#	etc/themes/modus-themes.el
#	etc/themes/modus-vivendi-theme.el
#	lib/alloca.in.h
#	lib/binary-io.h
#	lib/c-ctype.h
#	lib/c-strcasecmp.c
#	lib/c-strncasecmp.c
#	lib/careadlinkat.c
#	lib/cloexec.c
#	lib/close-stream.c
#	lib/diffseq.h
#	lib/dup2.c
#	lib/filemode.h
#	lib/fpending.c
#	lib/fpending.h
#	lib/fsusage.c
#	lib/getgroups.c
#	lib/getloadavg.c
#	lib/gettext.h
#	lib/gettime.c
#	lib/gettimeofday.c
#	lib/group-member.c
#	lib/malloc.c
#	lib/md5-stream.c
#	lib/md5.c
#	lib/md5.h
#	lib/memmem.c
#	lib/memrchr.c
#	lib/nanosleep.c
#	lib/save-cwd.h
#	lib/sha1.c
#	lib/sig2str.c
#	lib/stdlib.in.h
#	lib/strtoimax.c
#	lib/strtol.c
#	lib/strtoll.c
#	lib/time_r.c
#	lib/xalloc-oversized.h
#	lisp/auth-source-pass.el
#	lisp/emacs-lisp/lisp-mnt.el
#	lisp/emacs-lisp/timer.el
#	lisp/info-look.el
#	lisp/jit-lock.el
#	lisp/loadhist.el
#	lisp/mail/rmail.el
#	lisp/net/ntlm.el
#	lisp/net/webjump.el
#	lisp/progmodes/asm-mode.el
#	lisp/progmodes/project.el
#	lisp/progmodes/sh-script.el
#	lisp/textmodes/flyspell.el
#	lisp/textmodes/reftex-toc.el
#	lisp/textmodes/reftex.el
#	lisp/textmodes/tex-mode.el
#	lisp/url/url-gw.el
#	m4/alloca.m4
#	m4/clock_time.m4
#	m4/d-type.m4
#	m4/dirent_h.m4
#	m4/dup2.m4
#	m4/euidaccess.m4
#	m4/fchmodat.m4
#	m4/filemode.m4
#	m4/fsusage.m4
#	m4/getgroups.m4
#	m4/getloadavg.m4
#	m4/getrandom.m4
#	m4/gettime.m4
#	m4/gettimeofday.m4
#	m4/gnulib-common.m4
#	m4/group-member.m4
#	m4/inttypes.m4
#	m4/malloc.m4
#	m4/manywarnings.m4
#	m4/mempcpy.m4
#	m4/memrchr.m4
#	m4/mkostemp.m4
#	m4/mktime.m4
#	m4/nproc.m4
#	m4/nstrftime.m4
#	m4/pathmax.m4
#	m4/pipe2.m4
#	m4/pselect.m4
#	m4/pthread_sigmask.m4
#	m4/readlink.m4
#	m4/realloc.m4
#	m4/sig2str.m4
#	m4/ssize_t.m4
#	m4/stat-time.m4
#	m4/stddef_h.m4
#	m4/stdint.m4
#	m4/stdio_h.m4
#	m4/stdlib_h.m4
#	m4/stpcpy.m4
#	m4/strnlen.m4
#	m4/strtoimax.m4
#	m4/strtoll.m4
#	m4/time_h.m4
#	m4/timegm.m4
#	m4/timer_time.m4
#	m4/timespec.m4
#	m4/unistd_h.m4
#	m4/warnings.m4
#	nt/configure.bat
#	nt/preprep.c
#	test/lisp/register-tests.el
2024-01-02 10:28:14 +08:00

297 lines
10 KiB
EmacsLisp
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;;; image-tests.el --- tests for image.c -*- lexical-binding: t; -*-
;; Copyright (C) 2021-2024 Free Software Foundation, Inc.
;; Author: Stefan Kangas <stefankangas@gmail.com>
;; Keywords: internal
;; 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 <https://www.gnu.org/licenses/>.
;;; Commentary:
;; These tests will only run in a GUI session. You must run them
;; manually in an interactive session with, for example, `M-x
;; eval-buffer' followed by `M-x ert'.
;;
;; To run them from the command line instead, try:
;; ./src/emacs -Q -l test/manual/image-tests.el -eval "(ert t)"
;;; Code:
(require 'ert)
(defmacro image-skip-unless (format &rest condition)
`(skip-unless (and (and (display-images-p)
(image-type-available-p ,format))
,@condition)))
(defconst image-tests--images
`((gif . ,(expand-file-name "test/data/image/black.gif"
source-directory))
(jpeg . ,(expand-file-name "test/data/image/black.jpg"
source-directory))
(svg . ,(find-image '((:file "splash.svg" :type svg))))
(png . ,(find-image '((:file "splash.png" :type png))))
(pbm . ,(find-image '((:file "splash.pbm" :type pbm))))
(tiff . ,(expand-file-name
"nextstep/GNUstep/Emacs.base/Resources/emacs.tiff"
source-directory))
(webp . ,(expand-file-name "test/data/image/black.webp"
source-directory))
(xbm . ,(find-image '((:file "gnus/gnus.xbm" :type xbm))))
(xpm . ,(find-image '((:file "splash.xpm" :type xpm))))))
;;;; Load image
(defmacro image-tests-make-load-image-test (type)
`(ert-deftest ,(intern (format "image-tests-load-image/%s"
(eval type t)))
()
(image-skip-unless ,type)
(let* ((img (cdr (assq ,type image-tests--images)))
(file (if (listp img)
(plist-get (cdr img) :file)
img)))
(find-file file))
(should (equal major-mode 'image-mode))
;; Cleanup
(kill-buffer (current-buffer))))
(image-tests-make-load-image-test 'gif)
(image-tests-make-load-image-test 'jpeg)
(image-tests-make-load-image-test 'pbm)
(image-tests-make-load-image-test 'png)
(image-tests-make-load-image-test 'svg)
(image-tests-make-load-image-test 'tiff)
(image-tests-make-load-image-test 'webp)
(image-tests-make-load-image-test 'xbm)
(image-tests-make-load-image-test 'xpm)
(ert-deftest image-tests-load-image/svg-too-big ()
(image-skip-unless svg)
(with-temp-buffer
(let* ((max-image-size 0)
(messages-buffer-name (buffer-name (current-buffer)))
(img (cdr (assq 'svg image-tests--images)))
(file (if (listp img)
(plist-get (cdr img) :file)
img)))
(save-excursion (find-file file))
(should (string-match-p "invalid image size" (buffer-string)))
;; no annoying newlines
(should-not (string-match-p "^[ \t\n\r]+$" (buffer-string)))
;; no annoying double error reporting
(should-not (string-match-p "error parsing" (buffer-string))))))
(ert-deftest image-tests-load-image/svg-invalid ()
(image-skip-unless svg)
(with-temp-buffer
(let ((messages-buffer-name (buffer-name (current-buffer))))
(with-temp-buffer
(pop-to-buffer (current-buffer))
(insert (propertize " "
'display '(image :data
"invalid foo bar"
:type svg)))
(redisplay))
;; librsvg error: "... Start tag expected, '<' not found [3 times]"
(should (string-match-p "[Ee]rror.+Start tag expected" (buffer-string)))
;; no annoying newlines
(should-not (string-match-p "^[ \t\n\r]+$" (buffer-string))))))
;;;; image-test-size
(declare-function image-size "image.c" (spec &optional pixels frame))
(ert-deftest image-tests-image-size/gif ()
(image-skip-unless 'gif)
(pcase (image-size (create-image (cdr (assq 'gif image-tests--images))))
(`(,a . ,b)
(should (floatp a))
(should (floatp b)))))
(ert-deftest image-tests-image-size/jpeg ()
(image-skip-unless 'jpeg)
(pcase (image-size (create-image (cdr (assq 'jpeg image-tests--images))))
(`(,a . ,b)
(should (floatp a))
(should (floatp b)))))
(ert-deftest image-tests-image-size/pbm ()
(image-skip-unless 'pbm)
(pcase (image-size (cdr (assq 'pbm image-tests--images)))
(`(,a . ,b)
(should (floatp a))
(should (floatp b)))))
(ert-deftest image-tests-image-size/png ()
(image-skip-unless 'png)
(pcase (image-size (cdr (assq 'png image-tests--images)))
(`(,a . ,b)
(should (floatp a))
(should (floatp b)))))
(ert-deftest image-tests-image-size/svg ()
(image-skip-unless 'svg)
(pcase (image-size (cdr (assq 'svg image-tests--images)))
(`(,a . ,b)
(should (floatp a))
(should (floatp b)))))
(ert-deftest image-tests-image-size/tiff ()
(image-skip-unless 'tiff)
(pcase (image-size (create-image (cdr (assq 'tiff image-tests--images))))
(`(,a . ,b)
(should (floatp a))
(should (floatp b)))))
(ert-deftest image-tests-image-size/webp ()
(image-skip-unless 'webp)
(pcase (image-size (create-image (cdr (assq 'webp image-tests--images))))
(`(,a . ,b)
(should (floatp a))
(should (floatp b)))))
(ert-deftest image-tests-image-size/xbm ()
(image-skip-unless 'xbm)
(pcase (image-size (cdr (assq 'xbm image-tests--images)))
(`(,a . ,b)
(should (floatp a))
(should (floatp b)))))
(ert-deftest image-tests-image-size/xpm ()
(image-skip-unless 'xpm)
(pcase (image-size (cdr (assq 'xpm image-tests--images)))
(`(,a . ,b)
(should (floatp a))
(should (floatp b)))))
(ert-deftest image-tests-image-size/error-on-invalid-spec ()
(skip-unless (display-images-p))
(should-error (image-size 'invalid-spec)))
;;;; image-mask-p
(declare-function image-mask-p "image.c" (spec &optional frame))
(ert-deftest image-tests-image-mask-p/gif ()
(image-skip-unless 'gif)
(should-not (image-mask-p (create-image
(cdr (assq 'gif image-tests--images))))))
(ert-deftest image-tests-image-mask-p/jpeg ()
(image-skip-unless 'jpeg)
(should-not (image-mask-p (create-image
(cdr (assq 'jpeg image-tests--images))))))
(ert-deftest image-tests-image-mask-p/pbm ()
(image-skip-unless 'pbm)
(should-not (image-mask-p (cdr (assq 'pbm image-tests--images)))))
(ert-deftest image-tests-image-mask-p/png ()
(image-skip-unless 'png)
(should-not (image-mask-p (cdr (assq 'png image-tests--images)))))
(ert-deftest image-tests-image-mask-p/svg ()
(image-skip-unless 'svg)
(should-not (image-mask-p (cdr (assq 'svg image-tests--images)))))
(ert-deftest image-tests-image-mask-p/tiff ()
(image-skip-unless 'tiff)
(should-not (image-mask-p (create-image
(cdr (assq 'tiff image-tests--images))))))
(ert-deftest image-tests-image-mask-p/webp ()
(image-skip-unless 'webp)
(should-not (image-mask-p (create-image
(cdr (assq 'webp image-tests--images))))))
(ert-deftest image-tests-image-mask-p/xbm ()
(image-skip-unless 'xbm)
(should-not (image-mask-p (cdr (assq 'xbm image-tests--images)))))
(ert-deftest image-tests-image-mask-p/xpm ()
(image-skip-unless 'xpm)
(should-not (image-mask-p (cdr (assq 'xpm image-tests--images)))))
(ert-deftest image-tests-image-mask-p/error-on-invalid-spec ()
(skip-unless (display-images-p))
(should-error (image-mask-p 'invalid-spec)))
;;;; image-metadata
(declare-function image-metadata "image.c" (spec &optional frame))
;; TODO: These tests could be expanded with files that actually
;; contain metadata.
(ert-deftest image-tests-image-metadata/gif ()
(image-skip-unless 'gif
;; FIXME: Why is this failing on macOS?
(not (eq system-type 'darwin))
(not (bound-and-true-p w32-use-native-image-API)))
(should (memq 'delay
(image-metadata
(create-image (cdr (assq 'gif image-tests--images)))))))
(ert-deftest image-tests-image-metadata/jpeg ()
(image-skip-unless 'jpeg)
(should-not (image-metadata
(create-image (cdr (assq 'jpeg image-tests--images))))))
(ert-deftest image-tests-image-metadata/pbm ()
(image-skip-unless 'pbm)
(should-not (image-metadata (cdr (assq 'pbm image-tests--images)))))
(ert-deftest image-tests-image-metadata/png ()
(image-skip-unless 'png)
(should-not (image-metadata (cdr (assq 'png image-tests--images)))))
(ert-deftest image-tests-image-metadata/svg ()
(image-skip-unless 'svg)
(should-not (image-metadata (cdr (assq 'svg image-tests--images)))))
(ert-deftest image-tests-image-metadata/tiff ()
(image-skip-unless 'tiff)
(should-not (image-metadata
(create-image (cdr (assq 'tiff image-tests--images))))))
(ert-deftest image-tests-image-metadata/webp ()
(image-skip-unless 'webp
;; FIXME: Why is this failing on macOS?
(not (eq system-type 'darwin)))
(should (memq 'delay
(image-metadata
(create-image (cdr (assq 'webp image-tests--images)))))))
(ert-deftest image-tests-image-metadata/xbm ()
(image-skip-unless 'xbm)
(should-not (image-metadata (cdr (assq 'xbm image-tests--images)))))
(ert-deftest image-tests-image-metadata/xpm ()
(image-skip-unless 'xpm)
(should-not (image-metadata (cdr (assq 'xpm image-tests--images)))))
(ert-deftest image-tests-image-metadata/nil-on-invalid-spec ()
(skip-unless (display-images-p))
(should-not (image-metadata 'invalid-spec)))
;;; image-size-tests.el ends here