1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-01-05 11:21:04 -08:00
emacs/test/src/fileio-tests.el
Paul Eggert ba05d005e5 Update copyright year to 2021
Run "TZ=UTC0 admin/update-copyright".
2021-01-01 01:13:56 -08:00

163 lines
7 KiB
EmacsLisp

;;; unit tests for src/fileio.c -*- lexical-binding: t; -*-
;; Copyright 2017-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 <https://www.gnu.org/licenses/>.
(require 'ert)
(defun try-link (target link)
(make-symbolic-link target link)
(let* ((read-link (file-symlink-p link))
(failure (unless (string-equal target read-link)
(list 'string-equal target read-link))))
(delete-file link)
failure))
(defun fileio-tests--symlink-failure ()
(let* ((dir (make-temp-file "fileio" t))
(link (expand-file-name "link" dir)))
(unwind-protect
(let (failure
(char 0))
(while (and (not failure) (< char 127))
(setq char (1+ char))
(when (and (eq system-type 'cygwin) (eq char 92))
(setq char (1+ char)))
(setq failure (try-link (string char) link)))
(or failure
(try-link "/:" link)))
(delete-directory dir t))))
(ert-deftest fileio-tests--odd-symlink-chars ()
"Check that any non-NULL ASCII character can appear in a symlink.
Also check that an encoding error can appear in a symlink."
;; Some Windows versions don't support symlinks, and those which do
;; will pop up UAC elevation prompts, so we disable this test on
;; MS-Windows.
(skip-unless (not (eq system-type 'windows-nt)))
(should (equal nil (fileio-tests--symlink-failure))))
(ert-deftest fileio-tests--directory-file-name ()
(should (equal (directory-file-name "/") "/"))
(should (equal (directory-file-name "//") "//"))
(should (equal (directory-file-name "///") "/"))
(should (equal (directory-file-name "////") "/"))
(should (equal (directory-file-name "/abc") "/abc"))
(should (equal (directory-file-name "/abc/") "/abc"))
(should (equal (directory-file-name "/abc//") "/abc")))
(ert-deftest fileio-tests--directory-file-name-dos-nt ()
"Like fileio-tests--directory-file-name, but for DOS_NT systems."
(skip-unless (memq system-type '(ms-dos windows-nt)))
(should (equal (directory-file-name "d:/") "d:/"))
(should (equal (directory-file-name "d://") "d:/"))
(should (equal (directory-file-name "d:///") "d:/"))
(should (equal (directory-file-name "d:////") "d:/"))
(should (equal (directory-file-name "d:/abc") "d:/abc"))
(should (equal (directory-file-name "d:/abc/") "d:/abc"))
(should (equal (directory-file-name "d:/abc//") "d:/abc")))
(ert-deftest fileio-tests--file-name-as-directory ()
(should (equal (file-name-as-directory "") "./"))
(should (equal (file-name-as-directory "/") "/"))
(should (equal (file-name-as-directory "//") "//"))
(should (equal (file-name-as-directory "///") "///"))
(should (equal (file-name-as-directory "////") "////"))
(should (equal (file-name-as-directory "/abc") "/abc/"))
(should (equal (file-name-as-directory "/abc/") "/abc/"))
(should (equal (file-name-as-directory "/abc//") "/abc//")))
(ert-deftest fileio-tests--file-name-as-directory-dos-nt ()
"Like fileio-tests--file-name-as-directory, but for DOS_NT systems."
(skip-unless (memq system-type '(ms-dos windows-nt)))
(should (equal (file-name-as-directory "d:/") "d:/"))
(should (equal (file-name-as-directory "d:\\") "d:/"))
(should (equal (file-name-as-directory "d://") "d://"))
(should (equal (file-name-as-directory "d:///") "d:///"))
(should (equal (file-name-as-directory "d:////") "d:////"))
(should (equal (file-name-as-directory "d:\\\\\\\\") "d:////"))
(should (equal (file-name-as-directory "d:/abc") "d:/abc/"))
(should (equal (file-name-as-directory "D:\\abc") "d:/abc/"))
(should (equal (file-name-as-directory "d:/abc/") "d:/abc/"))
(should (equal (file-name-as-directory "D:\\abc/") "d:/abc/"))
(should (equal (file-name-as-directory "D:/abc//") "d:/abc//")))
(ert-deftest fileio-tests--relative-HOME ()
"Test that expand-file-name works even when HOME is relative."
(let ((process-environment (copy-sequence process-environment)))
(setenv "HOME" "a/b/c")
(should (equal (expand-file-name "~/foo")
(expand-file-name "a/b/c/foo")))
(when (memq system-type '(ms-dos windows-nt))
;; Test expansion of drive-relative file names.
(setenv "HOME" "x:foo")
(should (equal (expand-file-name "~/bar") "x:/foo/bar")))))
(ert-deftest fileio-tests--insert-file-interrupt ()
(let ((text "-*- coding: binary -*-\n\xc3\xc3help")
f)
(unwind-protect
(progn
(setq f (make-temp-file "ftifi"))
(write-region text nil f nil 'silent)
(with-temp-buffer
(catch 'toto
(let ((set-auto-coding-function (lambda (&rest _) (throw 'toto nil))))
(insert-file-contents f)))
(goto-char (point-min))
(unless (eobp)
(forward-line 1)
(let ((c1 (char-after)))
(forward-char 1)
(should (equal c1 (char-before)))
(should (equal c1 (char-after)))))))
(if f (delete-file f)))))
(ert-deftest fileio-tests--relative-default-directory ()
"Test expand-file-name when default-directory is relative."
(let ((default-directory "some/relative/name"))
(should (file-name-absolute-p (expand-file-name "foo"))))
(let* ((default-directory "~foo")
(name (expand-file-name "bar")))
(should (and (file-name-absolute-p name)
(not (eq (aref name 0) ?~))))))
(ert-deftest fileio-tests--file-name-absolute-p ()
"Test file-name-absolute-p."
(dolist (suffix '("" "/" "//" "/foo" "/foo/" "/foo//" "/foo/bar"))
(unless (string-equal suffix "")
(should (file-name-absolute-p suffix)))
(should (file-name-absolute-p (concat "~" suffix)))
(when (user-full-name user-login-name)
(should (file-name-absolute-p (concat "~" user-login-name suffix))))
(unless (user-full-name "nosuchuser")
(should (not (file-name-absolute-p (concat "~nosuchuser" suffix)))))))
(ert-deftest fileio-tests--circular-after-insert-file-functions ()
"Test after-insert-file-functions as a circular list."
(let ((f (make-temp-file "fileio"))
(after-insert-file-functions (list 'identity)))
(setcdr after-insert-file-functions after-insert-file-functions)
(write-region "hello\n" nil f nil 'silent)
(should-error (insert-file-contents f) :type 'circular-list)
(delete-file f)))
(ert-deftest fileio-tests/null-character ()
(should-error (file-exists-p "/foo\0bar")
:type 'wrong-type-argument))
;;; fileio-tests.el ends here