|  | ;;; 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 |