129 lines
5.2 KiB
EmacsLisp
129 lines
5.2 KiB
EmacsLisp
;;; clang-format-test.el --- unit tests for clang-format.el -*- lexical-binding: t; -*-
|
||
|
||
;; Copyright (C) 2017 Google Inc.
|
||
|
||
;; Author: Philipp Stephani <phst@google.com>
|
||
|
||
;; Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||
;; See https://llvm.org/LICENSE.txt for license information.
|
||
;; SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||
|
||
;;; Commentary:
|
||
|
||
;; Unit tests for clang-format.el. Not run by lit, run as:
|
||
;; emacs -Q -batch -l clang/tools/clang-format/clang-format.el -l clang/tools/clang-format/clang-format-test.el -f ert-run-tests-batch-and-exit
|
||
|
||
;;; Code:
|
||
|
||
(require 'clang-format)
|
||
|
||
(require 'cl-lib)
|
||
(require 'ert)
|
||
(require 'pcase)
|
||
|
||
(ert-deftest clang-format-buffer--buffer-encoding ()
|
||
"Tests that encoded text is handled properly."
|
||
(cl-letf* ((call-process-args nil)
|
||
((symbol-function 'call-process-region)
|
||
(lambda (&rest args)
|
||
(push args call-process-args)
|
||
(pcase-exhaustive args
|
||
(`(,_start ,_end ,_program ,_delete (,stdout ,_stderr)
|
||
,_display . ,_args)
|
||
(with-current-buffer stdout
|
||
(insert "<?xml version='1.0'?>
|
||
<replacements xml:space='preserve' incomplete_format='false'>
|
||
<replacement offset='4' length='0'> </replacement>
|
||
<replacement offset='10' length='0'> </replacement>
|
||
</replacements>
|
||
"))
|
||
0)))))
|
||
(with-temp-buffer
|
||
(let ((buffer-file-name "foo.cpp")
|
||
(buffer-file-coding-system 'utf-8-with-signature-dos)
|
||
(default-process-coding-system 'latin-1-unix))
|
||
(insert "ä =ö;\nü= ß;\n")
|
||
(goto-char (point-min))
|
||
(end-of-line)
|
||
(clang-format-buffer))
|
||
(should (equal (buffer-string) "ä = ö;\nü = ß;\n"))
|
||
(should (eolp))
|
||
(should (equal (buffer-substring (point) (point-max))
|
||
"\nü = ß;\n")))
|
||
(should-not (cdr call-process-args))
|
||
(pcase-exhaustive call-process-args
|
||
(`((,start ,end ,_program ,delete (,_stdout ,_stderr) ,display . ,args))
|
||
(should-not start)
|
||
(should-not end)
|
||
(should-not delete)
|
||
(should-not display)
|
||
(should (equal args
|
||
'("-output-replacements-xml" "-assume-filename" "foo.cpp"
|
||
"-fallback-style" "none"
|
||
;; Beginning of buffer, no byte-order mark.
|
||
"-offset" "0"
|
||
;; We have two lines with 2×2 bytes for the umlauts,
|
||
;; 1 byte for the line ending, and 3 bytes for the
|
||
;; other ASCII characters each.
|
||
"-length" "16"
|
||
;; Length of a single line (without line ending).
|
||
"-cursor" "7")))))))
|
||
|
||
(ert-deftest clang-format-buffer--process-encoding ()
|
||
"Tests that text is sent to the clang-format process in the
|
||
right encoding."
|
||
(cl-letf* ((hexdump (executable-find "hexdump"))
|
||
(original-call-process-region
|
||
(symbol-function 'call-process-region))
|
||
(call-process-inputs nil)
|
||
;; We redirect the input to hexdump so that we have guaranteed
|
||
;; ASCII output.
|
||
((symbol-function 'call-process-region)
|
||
(lambda (&rest args)
|
||
(pcase-exhaustive args
|
||
(`(,start ,end ,_program ,_delete (,stdout ,_stderr)
|
||
,_display . ,_args)
|
||
(with-current-buffer stdout
|
||
(insert "<?xml version='1.0'?>
|
||
<replacements xml:space='preserve' incomplete_format='false'>
|
||
</replacements>
|
||
"))
|
||
(let ((stdin (current-buffer)))
|
||
(with-temp-buffer
|
||
(prog1
|
||
(let ((stdout (current-buffer)))
|
||
(with-current-buffer stdin
|
||
(funcall original-call-process-region
|
||
start end hexdump nil stdout nil
|
||
"-v" "-e" "/1 \"%02x \"")))
|
||
(push (buffer-string) call-process-inputs)))))))))
|
||
(skip-unless hexdump)
|
||
(with-temp-buffer
|
||
(let ((buffer-file-name "foo.cpp")
|
||
(buffer-file-coding-system 'utf-8-with-signature-dos)
|
||
(default-process-coding-system 'latin-1-unix))
|
||
(insert "ä\n")
|
||
(clang-format-buffer))
|
||
(should (equal (buffer-string) "ä\n"))
|
||
(should (eobp)))
|
||
(should (equal call-process-inputs '("c3 a4 0a ")))))
|
||
|
||
(ert-deftest clang-format-buffer--end-to-end ()
|
||
"End-to-end test for ‘clang-format-buffer’.
|
||
Actually calls the clang-format binary."
|
||
(skip-unless (file-executable-p clang-format-executable))
|
||
(with-temp-buffer
|
||
(let ((buffer-file-name "foo.cpp")
|
||
(buffer-file-coding-system 'utf-8-with-signature-dos)
|
||
(default-process-coding-system 'latin-1-unix))
|
||
(insert "ä =ö;\nü= ß;\n")
|
||
(goto-char (point-min))
|
||
(end-of-line)
|
||
(clang-format-buffer))
|
||
(should (equal (buffer-string) "ä = ö;\nü = ß;\n"))
|
||
(should (eolp))
|
||
(should (equal (buffer-substring (point) (point-max))
|
||
"\nü = ß;\n"))))
|
||
|
||
;;; clang-format-test.el ends here
|