llvm-capstone/clang/tools/clang-format/clang-format-test.el
Philipp Stephani ce2f6b413f Use UTF-8 for all communication with clang-format
Summary: Instead of picking the buffer file coding system, always use utf-8-unix for communicating with clang-format.  This is fine because clang-format never actually reads the file to be formatted, only standard input.  This is a bit simpler (process coding system is now a constant) and potentially faster, as utf-8-unix is Emacs's internal coding system.  Also add an end-to-end test that actually invokes clang-format.

Reviewers: klimek

Reviewed By: klimek

Differential Revision: https://reviews.llvm.org/D28904

llvm-svn: 292593
2017-01-20 09:37:50 +00:00

127 lines
4.9 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.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;;; clang-format-test.el --- unit tests for clang-format.el -*- lexical-binding: t; -*-
;; Copyright (C) 2017 Google Inc.
;; Author: Philipp Stephani <phst@google.com>
;; This file is distributed under the University of Illinois Open Source
;; License. See LICENSE.TXT for details.
;;; Commentary:
;; Unit tests for clang-format.el.
;;; 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"
"-style" "file"
;; 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