summaryrefslogtreecommitdiff
path: root/elpa/irony-20220110.849/server/test/elisp
diff options
context:
space:
mode:
Diffstat (limited to 'elpa/irony-20220110.849/server/test/elisp')
-rw-r--r--elpa/irony-20220110.849/server/test/elisp/CMakeLists.txt47
-rw-r--r--elpa/irony-20220110.849/server/test/elisp/irony-cdb-json.el87
-rw-r--r--elpa/irony-20220110.849/server/test/elisp/irony-iotask.el249
-rw-r--r--elpa/irony-20220110.849/server/test/elisp/irony.el121
-rw-r--r--elpa/irony-20220110.849/server/test/elisp/test-config.el14
5 files changed, 518 insertions, 0 deletions
diff --git a/elpa/irony-20220110.849/server/test/elisp/CMakeLists.txt b/elpa/irony-20220110.849/server/test/elisp/CMakeLists.txt
new file mode 100644
index 0000000..8877a89
--- /dev/null
+++ b/elpa/irony-20220110.849/server/test/elisp/CMakeLists.txt
@@ -0,0 +1,47 @@
+# On MS-Windows, emacs_dir is a special environment variable, which
+# indicates the full path of the directory in which Emacs is
+# installed.
+#
+# There is no standard location that I know of for Emacs on Windows so
+# using this special environment variable will at least help people
+# who build the server from inside Emacs.
+if(DEFINED ENV{emacs_dir})
+ list(APPEND EMACS_EXECUTABLE_HINTS $ENV{emacs_dir}/bin)
+endif()
+
+find_program(EMACS_EXECUTABLE emacs
+ HINTS ${EMACS_EXECUTABLE_HINTS})
+
+if (EMACS_EXECUTABLE)
+ message(STATUS "Found emacs: ${EMACS_EXECUTABLE}")
+else()
+ message(WARNING "emacs not found: elisp tests will be skipped!")
+ return()
+endif()
+
+#
+# add_ert_test(<FileName>)
+#
+# Create a test which run the given Elisp script using the Emacs ERT testing
+# framework.
+#
+# The target is deduced from the ``FileName`` argument, e.g: the file foo.el
+# will be the target 'check-foo-el'.
+#
+# FIXME: assumes MELPA is configured...
+function(add_ert_test test_file)
+ get_filename_component(name ${test_file} NAME_WE)
+ add_test(check-${name}-el
+ ${EMACS_EXECUTABLE} -Q --batch
+ -l package
+ --eval "(package-initialize)"
+ --eval "(unless (require 'cl-lib nil t) (package-refresh-contents) (package-install 'cl-lib))"
+ -l ${CMAKE_CURRENT_SOURCE_DIR}/${test_file}
+ -f ert-run-tests-batch-and-exit)
+
+ set_tests_properties(check-${name}-el PROPERTIES TIMEOUT 15)
+endfunction()
+
+add_ert_test(irony.el)
+add_ert_test(irony-iotask.el)
+add_ert_test(irony-cdb-json.el)
diff --git a/elpa/irony-20220110.849/server/test/elisp/irony-cdb-json.el b/elpa/irony-20220110.849/server/test/elisp/irony-cdb-json.el
new file mode 100644
index 0000000..a810dae
--- /dev/null
+++ b/elpa/irony-20220110.849/server/test/elisp/irony-cdb-json.el
@@ -0,0 +1,87 @@
+;; -*-no-byte-compile: t; -*-
+(load
+ (concat (file-name-directory (or load-file-name buffer-file-name))
+ "test-config"))
+
+(require 'irony-cdb-json)
+(require 'cl-lib)
+
+(defconst irony-cdb/compile-command
+ '((file . "../src/file.cc")
+ (directory . "/home/user/project/build")
+ (command . "/usr/bin/clang++ -DSOMEDEF=1 -c -o file.o /home/user/project/src/file.cc")))
+
+(ert-deftest cdb/parse/simple/path-is-absolute ()
+ (should
+ (equal "/home/user/project/src/file.cc"
+ (nth 0 (irony-cdb-json--transform-compile-command
+ irony-cdb/compile-command)))))
+
+(ert-deftest cdb/parse/simple/compile-options ()
+ (should
+ (equal '("-DSOMEDEF=1")
+ (nth 1 (irony-cdb-json--transform-compile-command
+ irony-cdb/compile-command)))))
+
+(ert-deftest cdb/parse/simple/invocation-directory ()
+ (should
+ (equal "/home/user/project/build"
+ (nth 2 (irony-cdb-json--transform-compile-command
+ irony-cdb/compile-command)))))
+
+(ert-deftest cdb/choose-closest-path/chooses-closest ()
+ (should
+ (equal "/tmp/a/cdb"
+ (irony-cdb--choose-closest-path "/tmp/a/1"
+ '("/tmp/a/cdb" "/tmp/cdb")))))
+
+(ert-deftest cdb/choose-closest-path/chooses-closest2 ()
+ (should
+ (equal "/tmp/a/cdb"
+ (irony-cdb--choose-closest-path "/tmp/a/1"
+ '("/tmp/cdb" "/tmp/a/cdb")))))
+
+(ert-deftest cdb/choose-closest-path/prefers-deeper ()
+ (should
+ (equal "/tmp/a/build/cdb"
+ (irony-cdb--choose-closest-path "/tmp/a/1"
+ '("/tmp/a/build/cdb" "/tmp/cdb")))))
+
+(ert-deftest cdb/choose-closest-path/prefers-deeper2 ()
+ (should
+ (equal "/tmp/a/build/cdb"
+ (irony-cdb--choose-closest-path "/tmp/a/1"
+ '("/tmp/cdb" "/tmp/a/build/cdb")))))
+
+(ert-deftest cdb/choose-closest-path/will-survive-garbage ()
+ (should
+ (equal nil
+ (irony-cdb--choose-closest-path "/tmp/a/1"
+ 'ordures))))
+
+; http://endlessparentheses.com/understanding-letf-and-how-it-replaces-flet.html
+(ert-deftest cdb/locate-db/choose-among-candidates ()
+ (should
+ (equal "/foo/build/cdb"
+ (cl-letf (((symbol-function 'locate-dominating-file)
+ (lambda (file name)
+ (cond
+ ((string= name "./cdb") "/") ; found /cdb
+ ((string= name "build/cdb") "/foo/") ; found /foo/build/cdb
+ ))))
+ (irony-cdb--locate-dominating-file-with-dirs "/foo/bar/qux.cpp"
+ "cdb"
+ '("." "build" "out/x86_64"))))))
+
+(ert-deftest cdb/locate-dominating-file-with-dirs/children-first ()
+ (should
+ (equal "/tmp/foo/bar/out/x86_64/cdb"
+ (cl-letf (((symbol-function 'locate-dominating-file)
+ (lambda (file name)
+ (cond
+ ((string= name "./cdb") "/tmp/foo/") ; found /tmp/foo/cdb
+ ((string= name "out/x86_64/cdb") "/tmp/foo/bar/") ;found /tmp/foo/bar/out/x86_64/cdb
+ ))))
+ (irony-cdb--locate-dominating-file-with-dirs "/tmp/foo/bar/qux.cpp"
+ "cdb"
+ '("." "out/x86_64" ))))))
diff --git a/elpa/irony-20220110.849/server/test/elisp/irony-iotask.el b/elpa/irony-20220110.849/server/test/elisp/irony-iotask.el
new file mode 100644
index 0000000..7ef213b
--- /dev/null
+++ b/elpa/irony-20220110.849/server/test/elisp/irony-iotask.el
@@ -0,0 +1,249 @@
+;; -*-no-byte-compile: t; -*-
+(load (concat (file-name-directory (or load-file-name
+ buffer-file-name))
+ "test-config"))
+
+;; load irony-iotask
+;;
+;; XXX: No idea why this is necessary, test-config already adds the directory to
+;; the load-path so irony is found...
+(unless (require 'irony-iotask nil t)
+ (let ((irony-iotask-dir (expand-file-name "../../.." test-dir)))
+ (add-to-list 'load-path irony-iotask-dir)
+ (require 'irony-iotask)))
+
+(defun irony-iotask-echo-process-exit-filter (process output)
+ (when (buffer-live-p (process-buffer process))
+ (with-current-buffer (process-buffer process)
+ (goto-char (process-mark process))
+ (insert output)
+ (set-marker (process-mark process) (point))
+ (when (>= (buffer-size) (length "exit\n"))
+ (should (string= (buffer-string) "exit\n"))
+ (erase-buffer)))))
+
+;; Note: these tests use process communication with the standard I/O streams.
+;; The subprocess used for this communication is Emacs.
+;;
+;; The following article provides useful information for using Elisp as a
+;; scripting language, Emacs as an interpreter, it details how the standard I/O
+;; streams works in Elisp scripts:
+;; - http://www.lunaryorn.com/2014/08/12/emacs-script-pitfalls.html
+
+(defmacro irony-iotask/with-echo-process (&rest body)
+ "Start an Emacs process that runs the given PROCESS-SCRIPT.
+
+The process is setup with `irony-iotask-setup-process'.
+
+It's possible to schedule some iotasks in the BODY for testing.
+
+There is an exposed variable named `process' available for use in
+BODY.
+
+Elisp is used as a scripting language because it should be
+available on all OSes irony-iotask support."
+ (declare (indent 1))
+ `(let ((process-connection-type nil)
+ (process-adaptive-read-buffering nil)
+ process)
+ (setq process
+ (start-process "emacs-irony-test"
+ "*emacs-irony-test*"
+ (expand-file-name invocation-name
+ invocation-directory)
+ "-Q"
+ "--batch"
+ "--eval"
+ (prin1-to-string
+ '(let ((msg))
+ (while (not (equal msg "exit"))
+ (setq msg (read-from-minibuffer ""))
+ (message msg))))))
+ (unwind-protect
+ (progn
+ (irony-iotask-setup-process process)
+ ,@body)
+ ;; the iotask process filter does not clean the process buffer
+ ;; at the end of a request, but at the begining of a new one
+ (with-current-buffer (process-buffer process)
+ (erase-buffer))
+ (set-process-filter process #'irony-iotask-echo-process-exit-filter)
+ (process-send-string process "exit\n")
+ ;; wait for the process to finish normally, or kill it if it doesn't
+ (with-timeout (1 (kill-process process))
+ (while (process-live-p process)
+ (sit-for 0.05)))
+ ;; start with a clean buffer,
+ ;; Emacs 24.3 seems to keep some
+ (kill-buffer (process-buffer process))
+ (delete-process process))))
+
+;; irony-iotask-result
+
+(ert-deftest irony-iotask-result/ready-p-value ()
+ (let ((result (irony-iotask-result-create)))
+ (should-not (irony-iotask-result-valid-p result))
+ (irony-iotask-result-set-value result 1)
+ (should (irony-iotask-result-valid-p result))))
+
+(ert-deftest irony-iotask-result/ready-p-error ()
+ (let ((result (irony-iotask-result-create)))
+ (should-not (irony-iotask-result-valid-p result))
+ (irony-iotask-result-set-error result 'irony-iotask-error (list "blah"))
+ (should (irony-iotask-result-valid-p result))))
+
+(ert-deftest irony-iotask-result/set-value ()
+ (let ((result (irony-iotask-result-create)))
+ (irony-iotask-result-set-value result 'blah)
+ (should (eq (irony-iotask-result-get result) 'blah))))
+
+(irony--define-error 'irony-iotask-result/test-error
+ "Irony I/O task sample error")
+
+(ert-deftest irony-iotask-result/set-error ()
+ (let ((result (irony-iotask-result-create)))
+ (irony-iotask-result-set-error result 'irony-iotask-result/test-error)
+ (should-error (irony-iotask-result-get result)
+ :type 'irony-iotask-result/test-error)))
+
+(ert-deftest irony-iotask-result/set-error-data ()
+ (let ((result (irony-iotask-result-create)))
+ (irony-iotask-result-set-error result
+ 'irony-iotask-result/test-error
+ 'foo 'bar 'baz 'qux)
+ (condition-case err
+ (irony-iotask-result-get result)
+ (irony-iotask-result/test-error
+ (should (equal (cdr err) '(foo bar baz qux)))))))
+
+(ert-deftest irony-iotask-result/get-empty ()
+ (let ((result (irony-iotask-result-create)))
+ (should-error (irony-iotask-result-get result)
+ :type 'irony-iotask-result-get-error)))
+
+;; task
+
+(irony-iotask-define-task irony-iotask/task-start-t
+ "doc"
+ :start (lambda (&optional value)
+ (irony-iotask-set-result (or value 42))))
+
+(ert-deftest irony-iotask/task-start/simple ()
+ (let ((task (irony-iotask-package-task irony-iotask/task-start-t)))
+ (irony-iotask/with-echo-process
+ (should (equal 42 (irony-iotask-run process task))))))
+
+(ert-deftest irony-iotask/task-start/with-arguments ()
+ (let ((task (irony-iotask-package-task irony-iotask/task-start-t 43)))
+ (irony-iotask/with-echo-process
+ (should (equal 43 (irony-iotask-run process task))))))
+
+(irony-iotask-define-task irony-iotask/task-update-t
+ "doc"
+ :start (lambda (&optional hello)
+ (irony-iotask-send-string (format "%s\n" (or hello "hello"))))
+ :update (lambda (&optional hello)
+ (setq hello (or hello "hello"))
+ (when (string= (buffer-string) (format "%s\n" hello))
+ (irony-iotask-set-result (format "%s ok" hello)))))
+
+(ert-deftest irony-iotask-schedule/task-update/simple ()
+ (let ((task (irony-iotask-package-task irony-iotask/task-update-t)))
+ (irony-iotask/with-echo-process
+ (should (string= "hello ok" (irony-iotask-run process task))))))
+
+(ert-deftest irony-iotask-schedule/task-update/with-arguments ()
+ (let ((task (irony-iotask-package-task irony-iotask/task-update-t "bonjour")))
+ (irony-iotask/with-echo-process
+ (should (string= "bonjour ok" (irony-iotask-run process task))))))
+
+(irony-iotask-define-task irony-iotask/task-invalid-msg-t
+ "doc"
+ :start (lambda ()
+ (irony-iotask-send-string "ping\n"))
+ :update (lambda ()
+ (when (string= (buffer-string) "ping\n")
+ (throw 'invalid-msg t))))
+
+(ert-deftest irony-iotask-schedule/task-update/invalid-msg ()
+ (let ((task (irony-iotask-package-task irony-iotask/task-invalid-msg-t)))
+ (irony-iotask/with-echo-process
+ (should-error (irony-iotask-run process task)
+ :type 'irony-iotask-bad-data))))
+
+(ert-deftest irony-iotask-chain/simple ()
+ (let ((task (irony-iotask-chain
+ (irony-iotask-package-task irony-iotask/task-update-t "hi")
+ (irony-iotask-package-task irony-iotask/task-update-t "hej"))))
+ (irony-iotask/with-echo-process
+ (should (equal "hej ok" (irony-iotask-run process task))))))
+
+(defvar irony-iotask/task-finish-var nil)
+(defvar irony-iotask/task-on-var nil)
+(irony-iotask-define-task irony-iotask/task-finish-t
+ "doc"
+ :start (lambda ()
+ (irony-iotask-put :text "how")
+ (irony-iotask-send-string "hello\n"))
+ :update (lambda ()
+ (cond
+ ((string= (buffer-string) "hello\n")
+ (irony-iotask-put :text (concat (irony-iotask-get :text) " are"))
+ (irony-iotask-set-result t))
+ ((>= (buffer-size) (1+ (length "hello\n")))
+ (throw 'invalid-msg t))))
+ :on-success (lambda ()
+ (setq irony-iotask/task-on-var "success"))
+ :finish (lambda ()
+ (setq irony-iotask/task-finish-var (concat (irony-iotask-get :text)
+ " you?"))))
+
+(ert-deftest irony-iotask-schedule/task-finish/simple ()
+ (let ((task (irony-iotask-package-task irony-iotask/task-finish-t)))
+ (irony-iotask/with-echo-process
+ (setq irony-iotask/task-finish-var nil)
+ (irony-iotask-run process task)
+ (should (equal "how are you?" irony-iotask/task-finish-var)))))
+
+(ert-deftest irony-iotask-schedule/task-on-success/simple ()
+ (let ((task (irony-iotask-package-task irony-iotask/task-finish-t)))
+ (irony-iotask/with-echo-process
+ (setq irony-iotask/task-on-var nil)
+ (irony-iotask-run process task)
+ (should (equal "success" irony-iotask/task-on-var)))))
+
+(irony-iotask-define-task irony-iotask/task-on-error-t
+ "doc"
+ :start (lambda ()
+ (irony-iotask-set-error 'irony-iotask-error))
+ :on-error (lambda ()
+ (setq irony-iotask/task-on-var "error")))
+
+(ert-deftest irony-iotask-schedule/task-on-error/simple ()
+ (let ((task (irony-iotask-package-task irony-iotask/task-on-error-t)))
+ (irony-iotask/with-echo-process
+ (setq irony-iotask/task-on-var nil)
+ (ignore-errors
+ (irony-iotask-run process task))
+ (should (equal "error" irony-iotask/task-on-var)))))
+
+(ert-deftest irony-iotask-schedule/callback/recalls-schedule ()
+ (let ((task (irony-iotask-package-task irony-iotask/task-update-t "a")))
+ (irony-iotask/with-echo-process
+ (lexical-let ((run-process process)
+ results)
+ (irony-iotask-schedule process task
+ (lambda (result)
+ (setq results (list result))
+ (irony-iotask-schedule
+ run-process
+ (irony-iotask-package-task
+ irony-iotask/task-update-t "b")
+ (lambda (result)
+ (setq results (append results (list result)))))))
+ (should (with-local-quit
+ (while (< (length results) 2)
+ (accept-process-output process 0.05))
+ t))
+ (should (string= "a ok" (irony-iotask-result-get (nth 0 results))))
+ (should (string= "b ok" (irony-iotask-result-get (nth 1 results))))))))
diff --git a/elpa/irony-20220110.849/server/test/elisp/irony.el b/elpa/irony-20220110.849/server/test/elisp/irony.el
new file mode 100644
index 0000000..fe2378b
--- /dev/null
+++ b/elpa/irony-20220110.849/server/test/elisp/irony.el
@@ -0,0 +1,121 @@
+;; -*-no-byte-compile: t; -*-
+(load (concat (file-name-directory (or load-file-name
+ buffer-file-name))
+ "test-config"))
+
+(ert-deftest irony/buffer-size-in-bytes ()
+ (with-temp-buffer
+ ;; this smiley takes 3 bytes apparently
+ (insert "☺")
+ (should (equal 3 (irony--buffer-size-in-bytes)))
+ (erase-buffer)
+ (insert "☺\n")
+ (should (equal 4 (irony--buffer-size-in-bytes)))
+ (erase-buffer)
+ (insert "\t")
+ (should (equal 1 (irony--buffer-size-in-bytes)))))
+
+(ert-deftest irony/find-server-executable/does-not-exists ()
+ (let ((irony-server-install-prefix "/does/not/exists")
+ (exec-path nil))
+ (should-error (irony--find-server-executable)
+ :type 'irony-server-error)))
+
+(ert-deftest irony/split-command-line/just-spaces ()
+ (let ((cmd-line "clang -Wall -Wextra"))
+ (should (equal
+ '("clang" "-Wall" "-Wextra")
+ (irony--split-command-line cmd-line)))))
+
+(ert-deftest irony/split-command-line/start-with-space ()
+ (let ((cmd-line " clang -Wall -Wextra"))
+ (should (equal
+ '("clang" "-Wall" "-Wextra")
+ (irony--split-command-line cmd-line)))))
+
+(ert-deftest irony/split-command-line/end-with-space ()
+ (let ((cmd-line "clang -Wall -Wextra "))
+ (should (equal
+ '("clang" "-Wall" "-Wextra")
+ (irony--split-command-line cmd-line)))))
+
+(ert-deftest irony/split-command-line/space-everywhere ()
+ (let ((cmd-line " \t clang \t -Wall \t -Wextra\t"))
+ (should (equal
+ '("clang" "-Wall" "-Wextra")
+ (irony--split-command-line cmd-line)))))
+
+(ert-deftest irony/split-command-line/with-quotes ()
+ (let ((cmd-line "clang -Wall -Wextra \"-I/tmp/dir with spaces\""))
+ (should (equal
+ '("clang" "-Wall" "-Wextra" "-I/tmp/dir with spaces")
+ (irony--split-command-line cmd-line)))))
+
+(ert-deftest irony/split-command-line/with-quotes ()
+ "Test if files are removed from the arguments list.
+
+https://github.com/Sarcasm/irony-mode/issues/101"
+ (let ((cmd-line "g++ -DFOO=\\\"\\\""))
+ (should (equal
+ '("g++" "-DFOO=\"\"")
+ (irony--split-command-line cmd-line)))))
+
+(ert-deftest irony/split-command-line/start-with-quotes ()
+ (let ((cmd-line "\"cl ang\" -Wall -Wextra \"-I/tmp/dir with spaces\""))
+ (should (equal
+ '("cl ang" "-Wall" "-Wextra" "-I/tmp/dir with spaces")
+ (irony--split-command-line cmd-line)))))
+
+(ert-deftest irony/split-command-line/quotes-in-word ()
+ (let ((cmd-line "clang -Wall -Wextra -I\"/tmp/dir with spaces\""))
+ (should (equal
+ '("clang" "-Wall" "-Wextra" "-I/tmp/dir with spaces")
+ (irony--split-command-line cmd-line)))))
+
+(ert-deftest irony/split-command-line/ill-end-quote ()
+ (let ((cmd-line "clang -Wall -Wextra\""))
+ (should-error (irony--split-command-line cmd-line)
+ :type 'irony-parse-error)))
+
+(ert-deftest irony/split-command-line/backslash-1 ()
+ (let ((cmd-line "clang\\ -Wall"))
+ (should (equal
+ '("clang -Wall")
+ (irony--split-command-line cmd-line)))))
+
+(ert-deftest irony/split-command-line/backslash-2 ()
+ (let ((cmd-line "\\\\\\ clang\\ -Wall\\"))
+ (should (equal
+ '("\\ clang -Wall\\")
+ (irony--split-command-line cmd-line)))))
+
+(ert-deftest irony/extract-working-directory-option/not-specified ()
+ (let ((compile-flags '("-Wall")))
+ (should
+ (not (irony--extract-working-directory-option compile-flags)))))
+
+(ert-deftest irony/extract-working-directory-option/specified-1 ()
+ (let ((compile-flags '("-working-directory" "/tmp/lol")))
+ (should (equal "/tmp/lol"
+ (irony--extract-working-directory-option compile-flags)))))
+
+(ert-deftest irony/extract-working-directory-option/specified-2 ()
+ (let ((compile-flags '("-Wall" "-working-directory=/tmp/lol" "-Wshadow")))
+ (should (equal "/tmp/lol"
+ (irony--extract-working-directory-option compile-flags)))))
+
+;; TODO: restore functionality
+;; (ert-deftest irony/include-directories-1 ()
+;; (let ((irony-compile-flags '("-Iinclude" "-I/tmp/foo"))
+;; (irony-compile-flags-work-dir "/tmp/blah/"))
+;; (should (equal
+;; '("/tmp/blah/include" "/tmp/foo")
+;; (irony-user-search-paths)))))
+
+;; (ert-deftest irony/include-directories-2 ()
+;; (let ((irony-compile-flags '("-Wextra" "-Iinclude" "-I" "foo" "-Wall"))
+;; (irony-compile-flags-work-dir "/tmp/blah/"))
+;; (should (equal
+;; '("/tmp/blah/include"
+;; "/tmp/blah/foo")
+;; (irony-user-search-paths)))))
diff --git a/elpa/irony-20220110.849/server/test/elisp/test-config.el b/elpa/irony-20220110.849/server/test/elisp/test-config.el
new file mode 100644
index 0000000..224cdd0
--- /dev/null
+++ b/elpa/irony-20220110.849/server/test/elisp/test-config.el
@@ -0,0 +1,14 @@
+;; -*-no-byte-compile: t; -*-
+(defvar test-dir (if load-file-name
+ (file-name-as-directory
+ (expand-file-name (concat (file-name-directory
+ load-file-name)))))
+ "Elisp test directory path.")
+
+;; load irony
+(unless (require 'irony nil t)
+ (let ((irony-dir (expand-file-name "../../.." test-dir)))
+ (add-to-list 'load-path irony-dir)
+ (require 'irony)))
+
+(require 'ert)