ert-tests.el 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955
  1. ;;; ert-tests.el --- ERT's self-tests
  2. ;; Copyright (C) 2007-2008, 2010-2012 Free Software Foundation, Inc.
  3. ;; Author: Christian Ohler <ohler@gnu.org>
  4. ;; This file is part of GNU Emacs.
  5. ;; This program is free software: you can redistribute it and/or
  6. ;; modify it under the terms of the GNU General Public License as
  7. ;; published by the Free Software Foundation, either version 3 of the
  8. ;; License, or (at your option) any later version.
  9. ;;
  10. ;; This program is distributed in the hope that it will be useful, but
  11. ;; WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13. ;; General Public License for more details.
  14. ;;
  15. ;; You should have received a copy of the GNU General Public License
  16. ;; along with this program. If not, see `http://www.gnu.org/licenses/'.
  17. ;;; Commentary:
  18. ;; This file is part of ERT, the Emacs Lisp Regression Testing tool.
  19. ;; See ert.el or the texinfo manual for more details.
  20. ;;; Code:
  21. (eval-when-compile
  22. (require 'cl))
  23. (require 'ert)
  24. ;;; Self-test that doesn't rely on ERT, for bootstrapping.
  25. ;; This is used to test that bodies actually run.
  26. (defvar ert--test-body-was-run)
  27. (ert-deftest ert-test-body-runs ()
  28. (setq ert--test-body-was-run t))
  29. (defun ert-self-test ()
  30. "Run ERT's self-tests and make sure they actually ran."
  31. (let ((window-configuration (current-window-configuration)))
  32. (let ((ert--test-body-was-run nil))
  33. ;; The buffer name chosen here should not compete with the default
  34. ;; results buffer name for completion in `switch-to-buffer'.
  35. (let ((stats (ert-run-tests-interactively "^ert-" " *ert self-tests*")))
  36. (assert ert--test-body-was-run)
  37. (if (zerop (ert-stats-completed-unexpected stats))
  38. ;; Hide results window only when everything went well.
  39. (set-window-configuration window-configuration)
  40. (error "ERT self-test failed"))))))
  41. (defun ert-self-test-and-exit ()
  42. "Run ERT's self-tests and exit Emacs.
  43. The exit code will be zero if the tests passed, nonzero if they
  44. failed or if there was a problem."
  45. (unwind-protect
  46. (progn
  47. (ert-self-test)
  48. (kill-emacs 0))
  49. (unwind-protect
  50. (progn
  51. (message "Error running tests")
  52. (backtrace))
  53. (kill-emacs 1))))
  54. ;;; Further tests are defined using ERT.
  55. (ert-deftest ert-test-nested-test-body-runs ()
  56. "Test that nested test bodies run."
  57. (lexical-let ((was-run nil))
  58. (let ((test (make-ert-test :body (lambda ()
  59. (setq was-run t)))))
  60. (assert (not was-run))
  61. (ert-run-test test)
  62. (assert was-run))))
  63. ;;; Test that pass/fail works.
  64. (ert-deftest ert-test-pass ()
  65. (let ((test (make-ert-test :body (lambda ()))))
  66. (let ((result (ert-run-test test)))
  67. (assert (ert-test-passed-p result)))))
  68. (ert-deftest ert-test-fail ()
  69. (let ((test (make-ert-test :body (lambda () (ert-fail "failure message")))))
  70. (let ((result (let ((ert-debug-on-error nil))
  71. (ert-run-test test))))
  72. (assert (ert-test-failed-p result) t)
  73. (assert (equal (ert-test-result-with-condition-condition result)
  74. '(ert-test-failed "failure message"))
  75. t))))
  76. (ert-deftest ert-test-fail-debug-with-condition-case ()
  77. (let ((test (make-ert-test :body (lambda () (ert-fail "failure message")))))
  78. (condition-case condition
  79. (progn
  80. (let ((ert-debug-on-error t))
  81. (ert-run-test test))
  82. (assert nil))
  83. ((error)
  84. (assert (equal condition '(ert-test-failed "failure message")) t)))))
  85. (ert-deftest ert-test-fail-debug-with-debugger-1 ()
  86. (let ((test (make-ert-test :body (lambda () (ert-fail "failure message")))))
  87. (let ((debugger (lambda (&rest debugger-args)
  88. (assert nil))))
  89. (let ((ert-debug-on-error nil))
  90. (ert-run-test test)))))
  91. (ert-deftest ert-test-fail-debug-with-debugger-2 ()
  92. (let ((test (make-ert-test :body (lambda () (ert-fail "failure message")))))
  93. (block nil
  94. (let ((debugger (lambda (&rest debugger-args)
  95. (return-from nil nil))))
  96. (let ((ert-debug-on-error t))
  97. (ert-run-test test))
  98. (assert nil)))))
  99. (ert-deftest ert-test-fail-debug-nested-with-debugger ()
  100. (let ((test (make-ert-test :body (lambda ()
  101. (let ((ert-debug-on-error t))
  102. (ert-fail "failure message"))))))
  103. (let ((debugger (lambda (&rest debugger-args)
  104. (assert nil nil "Assertion a"))))
  105. (let ((ert-debug-on-error nil))
  106. (ert-run-test test))))
  107. (let ((test (make-ert-test :body (lambda ()
  108. (let ((ert-debug-on-error nil))
  109. (ert-fail "failure message"))))))
  110. (block nil
  111. (let ((debugger (lambda (&rest debugger-args)
  112. (return-from nil nil))))
  113. (let ((ert-debug-on-error t))
  114. (ert-run-test test))
  115. (assert nil nil "Assertion b")))))
  116. (ert-deftest ert-test-error ()
  117. (let ((test (make-ert-test :body (lambda () (error "Error message")))))
  118. (let ((result (let ((ert-debug-on-error nil))
  119. (ert-run-test test))))
  120. (assert (ert-test-failed-p result) t)
  121. (assert (equal (ert-test-result-with-condition-condition result)
  122. '(error "Error message"))
  123. t))))
  124. (ert-deftest ert-test-error-debug ()
  125. (let ((test (make-ert-test :body (lambda () (error "Error message")))))
  126. (condition-case condition
  127. (progn
  128. (let ((ert-debug-on-error t))
  129. (ert-run-test test))
  130. (assert nil))
  131. ((error)
  132. (assert (equal condition '(error "Error message")) t)))))
  133. ;;; Test that `should' works.
  134. (ert-deftest ert-test-should ()
  135. (let ((test (make-ert-test :body (lambda () (should nil)))))
  136. (let ((result (let ((ert-debug-on-error nil))
  137. (ert-run-test test))))
  138. (assert (ert-test-failed-p result) t)
  139. (assert (equal (ert-test-result-with-condition-condition result)
  140. '(ert-test-failed ((should nil) :form nil :value nil)))
  141. t)))
  142. (let ((test (make-ert-test :body (lambda () (should t)))))
  143. (let ((result (ert-run-test test)))
  144. (assert (ert-test-passed-p result) t))))
  145. (ert-deftest ert-test-should-value ()
  146. (should (eql (should 'foo) 'foo))
  147. (should (eql (should 'bar) 'bar)))
  148. (ert-deftest ert-test-should-not ()
  149. (let ((test (make-ert-test :body (lambda () (should-not t)))))
  150. (let ((result (let ((ert-debug-on-error nil))
  151. (ert-run-test test))))
  152. (assert (ert-test-failed-p result) t)
  153. (assert (equal (ert-test-result-with-condition-condition result)
  154. '(ert-test-failed ((should-not t) :form t :value t)))
  155. t)))
  156. (let ((test (make-ert-test :body (lambda () (should-not nil)))))
  157. (let ((result (ert-run-test test)))
  158. (assert (ert-test-passed-p result)))))
  159. (ert-deftest ert-test-should-with-macrolet ()
  160. (let ((test (make-ert-test :body (lambda ()
  161. (macrolet ((foo () `(progn t nil)))
  162. (should (foo)))))))
  163. (let ((result (let ((ert-debug-on-error nil))
  164. (ert-run-test test))))
  165. (should (ert-test-failed-p result))
  166. (should (equal
  167. (ert-test-result-with-condition-condition result)
  168. '(ert-test-failed ((should (foo))
  169. :form (progn t nil)
  170. :value nil)))))))
  171. (ert-deftest ert-test-should-error ()
  172. ;; No error.
  173. (let ((test (make-ert-test :body (lambda () (should-error (progn))))))
  174. (let ((result (let ((ert-debug-on-error nil))
  175. (ert-run-test test))))
  176. (should (ert-test-failed-p result))
  177. (should (equal (ert-test-result-with-condition-condition result)
  178. '(ert-test-failed
  179. ((should-error (progn))
  180. :form (progn)
  181. :value nil
  182. :fail-reason "did not signal an error"))))))
  183. ;; A simple error.
  184. (should (equal (should-error (error "Foo"))
  185. '(error "Foo")))
  186. ;; Error of unexpected type.
  187. (let ((test (make-ert-test :body (lambda ()
  188. (should-error (error "Foo")
  189. :type 'singularity-error)))))
  190. (let ((result (ert-run-test test)))
  191. (should (ert-test-failed-p result))
  192. (should (equal
  193. (ert-test-result-with-condition-condition result)
  194. '(ert-test-failed
  195. ((should-error (error "Foo") :type 'singularity-error)
  196. :form (error "Foo")
  197. :condition (error "Foo")
  198. :fail-reason
  199. "the error signaled did not have the expected type"))))))
  200. ;; Error of the expected type.
  201. (let* ((error nil)
  202. (test (make-ert-test
  203. :body (lambda ()
  204. (setq error
  205. (should-error (signal 'singularity-error nil)
  206. :type 'singularity-error))))))
  207. (let ((result (ert-run-test test)))
  208. (should (ert-test-passed-p result))
  209. (should (equal error '(singularity-error))))))
  210. (ert-deftest ert-test-should-error-subtypes ()
  211. (should-error (signal 'singularity-error nil)
  212. :type 'singularity-error
  213. :exclude-subtypes t)
  214. (let ((test (make-ert-test
  215. :body (lambda ()
  216. (should-error (signal 'arith-error nil)
  217. :type 'singularity-error)))))
  218. (let ((result (ert-run-test test)))
  219. (should (ert-test-failed-p result))
  220. (should (equal
  221. (ert-test-result-with-condition-condition result)
  222. '(ert-test-failed
  223. ((should-error (signal 'arith-error nil)
  224. :type 'singularity-error)
  225. :form (signal arith-error nil)
  226. :condition (arith-error)
  227. :fail-reason
  228. "the error signaled did not have the expected type"))))))
  229. (let ((test (make-ert-test
  230. :body (lambda ()
  231. (should-error (signal 'arith-error nil)
  232. :type 'singularity-error
  233. :exclude-subtypes t)))))
  234. (let ((result (ert-run-test test)))
  235. (should (ert-test-failed-p result))
  236. (should (equal
  237. (ert-test-result-with-condition-condition result)
  238. '(ert-test-failed
  239. ((should-error (signal 'arith-error nil)
  240. :type 'singularity-error
  241. :exclude-subtypes t)
  242. :form (signal arith-error nil)
  243. :condition (arith-error)
  244. :fail-reason
  245. "the error signaled did not have the expected type"))))))
  246. (let ((test (make-ert-test
  247. :body (lambda ()
  248. (should-error (signal 'singularity-error nil)
  249. :type 'arith-error
  250. :exclude-subtypes t)))))
  251. (let ((result (ert-run-test test)))
  252. (should (ert-test-failed-p result))
  253. (should (equal
  254. (ert-test-result-with-condition-condition result)
  255. '(ert-test-failed
  256. ((should-error (signal 'singularity-error nil)
  257. :type 'arith-error
  258. :exclude-subtypes t)
  259. :form (signal singularity-error nil)
  260. :condition (singularity-error)
  261. :fail-reason
  262. "the error signaled was a subtype of the expected type")))))
  263. ))
  264. (defmacro ert--test-my-list (&rest args)
  265. "Don't use this. Instead, call `list' with ARGS, it does the same thing.
  266. This macro is used to test if macroexpansion in `should' works."
  267. `(list ,@args))
  268. (ert-deftest ert-test-should-failure-debugging ()
  269. "Test that `should' errors contain the information we expect them to."
  270. (loop for (body expected-condition) in
  271. `((,(lambda () (let ((x nil)) (should x)))
  272. (ert-test-failed ((should x) :form x :value nil)))
  273. (,(lambda () (let ((x t)) (should-not x)))
  274. (ert-test-failed ((should-not x) :form x :value t)))
  275. (,(lambda () (let ((x t)) (should (not x))))
  276. (ert-test-failed ((should (not x)) :form (not t) :value nil)))
  277. (,(lambda () (let ((x nil)) (should-not (not x))))
  278. (ert-test-failed ((should-not (not x)) :form (not nil) :value t)))
  279. (,(lambda () (let ((x t) (y nil)) (should-not
  280. (ert--test-my-list x y))))
  281. (ert-test-failed
  282. ((should-not (ert--test-my-list x y))
  283. :form (list t nil)
  284. :value (t nil))))
  285. (,(lambda () (let ((x t)) (should (error "Foo"))))
  286. (error "Foo")))
  287. do
  288. (let ((test (make-ert-test :body body)))
  289. (condition-case actual-condition
  290. (progn
  291. (let ((ert-debug-on-error t))
  292. (ert-run-test test))
  293. (assert nil))
  294. ((error)
  295. (should (equal actual-condition expected-condition)))))))
  296. (ert-deftest ert-test-deftest ()
  297. (should (equal (macroexpand '(ert-deftest abc () "foo" :tags '(bar)))
  298. '(progn
  299. (ert-set-test 'abc
  300. (make-ert-test :name 'abc
  301. :documentation "foo"
  302. :tags '(bar)
  303. :body (lambda ())))
  304. (push '(ert-deftest . abc) current-load-list)
  305. 'abc)))
  306. (should (equal (macroexpand '(ert-deftest def ()
  307. :expected-result ':passed))
  308. '(progn
  309. (ert-set-test 'def
  310. (make-ert-test :name 'def
  311. :expected-result-type ':passed
  312. :body (lambda ())))
  313. (push '(ert-deftest . def) current-load-list)
  314. 'def)))
  315. ;; :documentation keyword is forbidden
  316. (should-error (macroexpand '(ert-deftest ghi ()
  317. :documentation "foo"))))
  318. (ert-deftest ert-test-record-backtrace ()
  319. (let ((test (make-ert-test :body (lambda () (ert-fail "foo")))))
  320. (let ((result (ert-run-test test)))
  321. (should (ert-test-failed-p result))
  322. (with-temp-buffer
  323. (ert--print-backtrace (ert-test-failed-backtrace result))
  324. (goto-char (point-min))
  325. (end-of-line)
  326. (let ((first-line (buffer-substring-no-properties (point-min) (point))))
  327. (should (equal first-line " signal(ert-test-failed (\"foo\"))")))))))
  328. (ert-deftest ert-test-messages ()
  329. :tags '(:causes-redisplay)
  330. (let* ((message-string "Test message")
  331. (messages-buffer (get-buffer-create "*Messages*"))
  332. (test (make-ert-test :body (lambda () (message "%s" message-string)))))
  333. (with-current-buffer messages-buffer
  334. (let ((result (ert-run-test test)))
  335. (should (equal (concat message-string "\n")
  336. (ert-test-result-messages result)))))))
  337. (ert-deftest ert-test-running-tests ()
  338. (let ((outer-test (ert-get-test 'ert-test-running-tests)))
  339. (should (equal (ert-running-test) outer-test))
  340. (let (test1 test2 test3)
  341. (setq test1 (make-ert-test
  342. :name "1"
  343. :body (lambda ()
  344. (should (equal (ert-running-test) outer-test))
  345. (should (equal ert--running-tests
  346. (list test1 test2 test3
  347. outer-test)))))
  348. test2 (make-ert-test
  349. :name "2"
  350. :body (lambda ()
  351. (should (equal (ert-running-test) outer-test))
  352. (should (equal ert--running-tests
  353. (list test3 test2 outer-test)))
  354. (ert-run-test test1)))
  355. test3 (make-ert-test
  356. :name "3"
  357. :body (lambda ()
  358. (should (equal (ert-running-test) outer-test))
  359. (should (equal ert--running-tests
  360. (list test3 outer-test)))
  361. (ert-run-test test2))))
  362. (should (ert-test-passed-p (ert-run-test test3))))))
  363. (ert-deftest ert-test-test-result-expected-p ()
  364. "Test `ert-test-result-expected-p' and (implicitly) `ert-test-result-type-p'."
  365. ;; passing test
  366. (let ((test (make-ert-test :body (lambda ()))))
  367. (should (ert-test-result-expected-p test (ert-run-test test))))
  368. ;; unexpected failure
  369. (let ((test (make-ert-test :body (lambda () (ert-fail "failed")))))
  370. (should-not (ert-test-result-expected-p test (ert-run-test test))))
  371. ;; expected failure
  372. (let ((test (make-ert-test :body (lambda () (ert-fail "failed"))
  373. :expected-result-type ':failed)))
  374. (should (ert-test-result-expected-p test (ert-run-test test))))
  375. ;; `not' expected type
  376. (let ((test (make-ert-test :body (lambda ())
  377. :expected-result-type '(not :failed))))
  378. (should (ert-test-result-expected-p test (ert-run-test test))))
  379. (let ((test (make-ert-test :body (lambda ())
  380. :expected-result-type '(not :passed))))
  381. (should-not (ert-test-result-expected-p test (ert-run-test test))))
  382. ;; `and' expected type
  383. (let ((test (make-ert-test :body (lambda ())
  384. :expected-result-type '(and :passed :failed))))
  385. (should-not (ert-test-result-expected-p test (ert-run-test test))))
  386. (let ((test (make-ert-test :body (lambda ())
  387. :expected-result-type '(and :passed
  388. (not :failed)))))
  389. (should (ert-test-result-expected-p test (ert-run-test test))))
  390. ;; `or' expected type
  391. (let ((test (make-ert-test :body (lambda ())
  392. :expected-result-type '(or (and :passed :failed)
  393. :passed))))
  394. (should (ert-test-result-expected-p test (ert-run-test test))))
  395. (let ((test (make-ert-test :body (lambda ())
  396. :expected-result-type '(or (and :passed :failed)
  397. nil (not t)))))
  398. (should-not (ert-test-result-expected-p test (ert-run-test test)))))
  399. ;;; Test `ert-select-tests'.
  400. (ert-deftest ert-test-select-regexp ()
  401. (should (equal (ert-select-tests "^ert-test-select-regexp$" t)
  402. (list (ert-get-test 'ert-test-select-regexp)))))
  403. (ert-deftest ert-test-test-boundp ()
  404. (should (ert-test-boundp 'ert-test-test-boundp))
  405. (should-not (ert-test-boundp (make-symbol "ert-not-a-test"))))
  406. (ert-deftest ert-test-select-member ()
  407. (should (equal (ert-select-tests '(member ert-test-select-member) t)
  408. (list (ert-get-test 'ert-test-select-member)))))
  409. (ert-deftest ert-test-select-test ()
  410. (should (equal (ert-select-tests (ert-get-test 'ert-test-select-test) t)
  411. (list (ert-get-test 'ert-test-select-test)))))
  412. (ert-deftest ert-test-select-symbol ()
  413. (should (equal (ert-select-tests 'ert-test-select-symbol t)
  414. (list (ert-get-test 'ert-test-select-symbol)))))
  415. (ert-deftest ert-test-select-and ()
  416. (let ((test (make-ert-test
  417. :name nil
  418. :body nil
  419. :most-recent-result (make-ert-test-failed
  420. :condition nil
  421. :backtrace nil
  422. :infos nil))))
  423. (should (equal (ert-select-tests `(and (member ,test) :failed) t)
  424. (list test)))))
  425. (ert-deftest ert-test-select-tag ()
  426. (let ((test (make-ert-test
  427. :name nil
  428. :body nil
  429. :tags '(a b))))
  430. (should (equal (ert-select-tests `(tag a) (list test)) (list test)))
  431. (should (equal (ert-select-tests `(tag b) (list test)) (list test)))
  432. (should (equal (ert-select-tests `(tag c) (list test)) '()))))
  433. ;;; Tests for utility functions.
  434. (ert-deftest ert-test-proper-list-p ()
  435. (should (ert--proper-list-p '()))
  436. (should (ert--proper-list-p '(1)))
  437. (should (ert--proper-list-p '(1 2)))
  438. (should (ert--proper-list-p '(1 2 3)))
  439. (should (ert--proper-list-p '(1 2 3 4)))
  440. (should (not (ert--proper-list-p 'a)))
  441. (should (not (ert--proper-list-p '(1 . a))))
  442. (should (not (ert--proper-list-p '(1 2 . a))))
  443. (should (not (ert--proper-list-p '(1 2 3 . a))))
  444. (should (not (ert--proper-list-p '(1 2 3 4 . a))))
  445. (let ((a (list 1)))
  446. (setf (cdr (last a)) a)
  447. (should (not (ert--proper-list-p a))))
  448. (let ((a (list 1 2)))
  449. (setf (cdr (last a)) a)
  450. (should (not (ert--proper-list-p a))))
  451. (let ((a (list 1 2 3)))
  452. (setf (cdr (last a)) a)
  453. (should (not (ert--proper-list-p a))))
  454. (let ((a (list 1 2 3 4)))
  455. (setf (cdr (last a)) a)
  456. (should (not (ert--proper-list-p a))))
  457. (let ((a (list 1 2)))
  458. (setf (cdr (last a)) (cdr a))
  459. (should (not (ert--proper-list-p a))))
  460. (let ((a (list 1 2 3)))
  461. (setf (cdr (last a)) (cdr a))
  462. (should (not (ert--proper-list-p a))))
  463. (let ((a (list 1 2 3 4)))
  464. (setf (cdr (last a)) (cdr a))
  465. (should (not (ert--proper-list-p a))))
  466. (let ((a (list 1 2 3)))
  467. (setf (cdr (last a)) (cddr a))
  468. (should (not (ert--proper-list-p a))))
  469. (let ((a (list 1 2 3 4)))
  470. (setf (cdr (last a)) (cddr a))
  471. (should (not (ert--proper-list-p a))))
  472. (let ((a (list 1 2 3 4)))
  473. (setf (cdr (last a)) (cdddr a))
  474. (should (not (ert--proper-list-p a)))))
  475. (ert-deftest ert-test-parse-keys-and-body ()
  476. (should (equal (ert--parse-keys-and-body '(foo)) '(nil (foo))))
  477. (should (equal (ert--parse-keys-and-body '(:bar foo)) '((:bar foo) nil)))
  478. (should (equal (ert--parse-keys-and-body '(:bar foo a (b)))
  479. '((:bar foo) (a (b)))))
  480. (should (equal (ert--parse-keys-and-body '(:bar foo :a (b)))
  481. '((:bar foo :a (b)) nil)))
  482. (should (equal (ert--parse-keys-and-body '(bar foo :a (b)))
  483. '(nil (bar foo :a (b)))))
  484. (should-error (ert--parse-keys-and-body '(:bar foo :a))))
  485. (ert-deftest ert-test-run-tests-interactively ()
  486. :tags '(:causes-redisplay)
  487. (let ((passing-test (make-ert-test :name 'passing-test
  488. :body (lambda () (ert-pass))))
  489. (failing-test (make-ert-test :name 'failing-test
  490. :body (lambda () (ert-fail
  491. "failure message")))))
  492. (let ((ert-debug-on-error nil))
  493. (let* ((buffer-name (generate-new-buffer-name " *ert-test-run-tests*"))
  494. (messages nil)
  495. (mock-message-fn
  496. (lambda (format-string &rest args)
  497. (push (apply #'format format-string args) messages))))
  498. (save-window-excursion
  499. (unwind-protect
  500. (let ((case-fold-search nil))
  501. (ert-run-tests-interactively
  502. `(member ,passing-test ,failing-test) buffer-name
  503. mock-message-fn)
  504. (should (equal messages `(,(concat
  505. "Ran 2 tests, 1 results were "
  506. "as expected, 1 unexpected"))))
  507. (with-current-buffer buffer-name
  508. (goto-char (point-min))
  509. (should (equal
  510. (buffer-substring (point-min)
  511. (save-excursion
  512. (forward-line 4)
  513. (point)))
  514. (concat
  515. "Selector: (member <passing-test> <failing-test>)\n"
  516. "Passed: 1\n"
  517. "Failed: 1 (1 unexpected)\n"
  518. "Total: 2/2\n")))))
  519. (when (get-buffer buffer-name)
  520. (kill-buffer buffer-name))))))))
  521. (ert-deftest ert-test-special-operator-p ()
  522. (should (ert--special-operator-p 'if))
  523. (should-not (ert--special-operator-p 'car))
  524. (should-not (ert--special-operator-p 'ert--special-operator-p))
  525. (let ((b (ert--gensym)))
  526. (should-not (ert--special-operator-p b))
  527. (fset b 'if)
  528. (should (ert--special-operator-p b))))
  529. (ert-deftest ert-test-list-of-should-forms ()
  530. (let ((test (make-ert-test :body (lambda ()
  531. (should t)
  532. (should (null '()))
  533. (should nil)
  534. (should t)))))
  535. (let ((result (let ((ert-debug-on-error nil))
  536. (ert-run-test test))))
  537. (should (equal (ert-test-result-should-forms result)
  538. '(((should t) :form t :value t)
  539. ((should (null '())) :form (null nil) :value t)
  540. ((should nil) :form nil :value nil)))))))
  541. (ert-deftest ert-test-list-of-should-forms-observers-should-not-stack ()
  542. (let ((test (make-ert-test
  543. :body (lambda ()
  544. (let ((test2 (make-ert-test
  545. :body (lambda ()
  546. (should t)))))
  547. (let ((result (ert-run-test test2)))
  548. (should (ert-test-passed-p result))))))))
  549. (let ((result (let ((ert-debug-on-error nil))
  550. (ert-run-test test))))
  551. (should (ert-test-passed-p result))
  552. (should (eql (length (ert-test-result-should-forms result))
  553. 1)))))
  554. (ert-deftest ert-test-list-of-should-forms-no-deep-copy ()
  555. (let ((test (make-ert-test :body (lambda ()
  556. (let ((obj (list 'a)))
  557. (should (equal obj '(a)))
  558. (setf (car obj) 'b)
  559. (should (equal obj '(b))))))))
  560. (let ((result (let ((ert-debug-on-error nil))
  561. (ert-run-test test))))
  562. (should (ert-test-passed-p result))
  563. (should (equal (ert-test-result-should-forms result)
  564. '(((should (equal obj '(a))) :form (equal (b) (a)) :value t
  565. :explanation nil)
  566. ((should (equal obj '(b))) :form (equal (b) (b)) :value t
  567. :explanation nil)
  568. ))))))
  569. (ert-deftest ert-test-remprop ()
  570. (let ((x (ert--gensym)))
  571. (should (equal (symbol-plist x) '()))
  572. ;; Remove nonexistent property on empty plist.
  573. (ert--remprop x 'b)
  574. (should (equal (symbol-plist x) '()))
  575. (put x 'a 1)
  576. (should (equal (symbol-plist x) '(a 1)))
  577. ;; Remove nonexistent property on nonempty plist.
  578. (ert--remprop x 'b)
  579. (should (equal (symbol-plist x) '(a 1)))
  580. (put x 'b 2)
  581. (put x 'c 3)
  582. (put x 'd 4)
  583. (should (equal (symbol-plist x) '(a 1 b 2 c 3 d 4)))
  584. ;; Remove property that is neither first nor last.
  585. (ert--remprop x 'c)
  586. (should (equal (symbol-plist x) '(a 1 b 2 d 4)))
  587. ;; Remove last property from a plist of length >1.
  588. (ert--remprop x 'd)
  589. (should (equal (symbol-plist x) '(a 1 b 2)))
  590. ;; Remove first property from a plist of length >1.
  591. (ert--remprop x 'a)
  592. (should (equal (symbol-plist x) '(b 2)))
  593. ;; Remove property when there is only one.
  594. (ert--remprop x 'b)
  595. (should (equal (symbol-plist x) '()))))
  596. (ert-deftest ert-test-remove-if-not ()
  597. (let ((list (list 'a 'b 'c 'd))
  598. (i 0))
  599. (let ((result (ert--remove-if-not (lambda (x)
  600. (should (eql x (nth i list)))
  601. (incf i)
  602. (member i '(2 3)))
  603. list)))
  604. (should (equal i 4))
  605. (should (equal result '(b c)))
  606. (should (equal list '(a b c d)))))
  607. (should (equal '()
  608. (ert--remove-if-not (lambda (x) (should nil)) '()))))
  609. (ert-deftest ert-test-remove* ()
  610. (let ((list (list 'a 'b 'c 'd))
  611. (key-index 0)
  612. (test-index 0))
  613. (let ((result
  614. (ert--remove* 'foo list
  615. :key (lambda (x)
  616. (should (eql x (nth key-index list)))
  617. (prog1
  618. (list key-index x)
  619. (incf key-index)))
  620. :test
  621. (lambda (a b)
  622. (should (eql a 'foo))
  623. (should (equal b (list test-index
  624. (nth test-index list))))
  625. (incf test-index)
  626. (member test-index '(2 3))))))
  627. (should (equal key-index 4))
  628. (should (equal test-index 4))
  629. (should (equal result '(a d)))
  630. (should (equal list '(a b c d)))))
  631. (let ((x (cons nil nil))
  632. (y (cons nil nil)))
  633. (should (equal (ert--remove* x (list x y))
  634. ;; or (list x), since we use `equal' -- the
  635. ;; important thing is that only one element got
  636. ;; removed, this proves that the default test is
  637. ;; `eql', not `equal'
  638. (list y)))))
  639. (ert-deftest ert-test-set-functions ()
  640. (let ((c1 (cons nil nil))
  641. (c2 (cons nil nil))
  642. (sym (make-symbol "a")))
  643. (let ((e '())
  644. (a (list 'a 'b sym nil "" "x" c1 c2))
  645. (b (list c1 'y 'b sym 'x)))
  646. (should (equal (ert--set-difference e e) e))
  647. (should (equal (ert--set-difference a e) a))
  648. (should (equal (ert--set-difference e a) e))
  649. (should (equal (ert--set-difference a a) e))
  650. (should (equal (ert--set-difference b e) b))
  651. (should (equal (ert--set-difference e b) e))
  652. (should (equal (ert--set-difference b b) e))
  653. (should (equal (ert--set-difference a b) (list 'a nil "" "x" c2)))
  654. (should (equal (ert--set-difference b a) (list 'y 'x)))
  655. ;; We aren't testing whether this is really using `eq' rather than `eql'.
  656. (should (equal (ert--set-difference-eq e e) e))
  657. (should (equal (ert--set-difference-eq a e) a))
  658. (should (equal (ert--set-difference-eq e a) e))
  659. (should (equal (ert--set-difference-eq a a) e))
  660. (should (equal (ert--set-difference-eq b e) b))
  661. (should (equal (ert--set-difference-eq e b) e))
  662. (should (equal (ert--set-difference-eq b b) e))
  663. (should (equal (ert--set-difference-eq a b) (list 'a nil "" "x" c2)))
  664. (should (equal (ert--set-difference-eq b a) (list 'y 'x)))
  665. (should (equal (ert--union e e) e))
  666. (should (equal (ert--union a e) a))
  667. (should (equal (ert--union e a) a))
  668. (should (equal (ert--union a a) a))
  669. (should (equal (ert--union b e) b))
  670. (should (equal (ert--union e b) b))
  671. (should (equal (ert--union b b) b))
  672. (should (equal (ert--union a b) (list 'a 'b sym nil "" "x" c1 c2 'y 'x)))
  673. (should (equal (ert--union b a) (list c1 'y 'b sym 'x 'a nil "" "x" c2)))
  674. (should (equal (ert--intersection e e) e))
  675. (should (equal (ert--intersection a e) e))
  676. (should (equal (ert--intersection e a) e))
  677. (should (equal (ert--intersection a a) a))
  678. (should (equal (ert--intersection b e) e))
  679. (should (equal (ert--intersection e b) e))
  680. (should (equal (ert--intersection b b) b))
  681. (should (equal (ert--intersection a b) (list 'b sym c1)))
  682. (should (equal (ert--intersection b a) (list c1 'b sym))))))
  683. (ert-deftest ert-test-gensym ()
  684. ;; Since the expansion of `should' calls `ert--gensym' and thus has a
  685. ;; side-effect on `ert--gensym-counter', we have to make sure all
  686. ;; macros in our test body are expanded before we rebind
  687. ;; `ert--gensym-counter' and run the body. Otherwise, the test would
  688. ;; fail if run interpreted.
  689. (let ((body (byte-compile
  690. '(lambda ()
  691. (should (equal (symbol-name (ert--gensym)) "G0"))
  692. (should (equal (symbol-name (ert--gensym)) "G1"))
  693. (should (equal (symbol-name (ert--gensym)) "G2"))
  694. (should (equal (symbol-name (ert--gensym "foo")) "foo3"))
  695. (should (equal (symbol-name (ert--gensym "bar")) "bar4"))
  696. (should (equal ert--gensym-counter 5))))))
  697. (let ((ert--gensym-counter 0))
  698. (funcall body))))
  699. (ert-deftest ert-test-coerce-to-vector ()
  700. (let* ((a (vector))
  701. (b (vector 1 a 3))
  702. (c (list))
  703. (d (list b a)))
  704. (should (eql (ert--coerce-to-vector a) a))
  705. (should (eql (ert--coerce-to-vector b) b))
  706. (should (equal (ert--coerce-to-vector c) (vector)))
  707. (should (equal (ert--coerce-to-vector d) (vector b a)))))
  708. (ert-deftest ert-test-string-position ()
  709. (should (eql (ert--string-position ?x "") nil))
  710. (should (eql (ert--string-position ?a "abc") 0))
  711. (should (eql (ert--string-position ?b "abc") 1))
  712. (should (eql (ert--string-position ?c "abc") 2))
  713. (should (eql (ert--string-position ?d "abc") nil))
  714. (should (eql (ert--string-position ?A "abc") nil)))
  715. (ert-deftest ert-test-mismatch ()
  716. (should (eql (ert--mismatch "" "") nil))
  717. (should (eql (ert--mismatch "" "a") 0))
  718. (should (eql (ert--mismatch "a" "a") nil))
  719. (should (eql (ert--mismatch "ab" "a") 1))
  720. (should (eql (ert--mismatch "Aa" "aA") 0))
  721. (should (eql (ert--mismatch '(a b c) '(a b d)) 2)))
  722. (ert-deftest ert-test-string-first-line ()
  723. (should (equal (ert--string-first-line "") ""))
  724. (should (equal (ert--string-first-line "abc") "abc"))
  725. (should (equal (ert--string-first-line "abc\n") "abc"))
  726. (should (equal (ert--string-first-line "foo\nbar") "foo"))
  727. (should (equal (ert--string-first-line " foo\nbar\nbaz\n") " foo")))
  728. (ert-deftest ert-test-explain-equal ()
  729. (should (equal (ert--explain-equal nil 'foo)
  730. '(different-atoms nil foo)))
  731. (should (equal (ert--explain-equal '(a a) '(a b))
  732. '(list-elt 1 (different-atoms a b))))
  733. (should (equal (ert--explain-equal '(1 48) '(1 49))
  734. '(list-elt 1 (different-atoms (48 "#x30" "?0")
  735. (49 "#x31" "?1")))))
  736. (should (equal (ert--explain-equal 'nil '(a))
  737. '(different-types nil (a))))
  738. (should (equal (ert--explain-equal '(a b c) '(a b c d))
  739. '(proper-lists-of-different-length 3 4 (a b c) (a b c d)
  740. first-mismatch-at 3)))
  741. (let ((sym (make-symbol "a")))
  742. (should (equal (ert--explain-equal 'a sym)
  743. `(different-symbols-with-the-same-name a ,sym)))))
  744. (ert-deftest ert-test-explain-equal-improper-list ()
  745. (should (equal (ert--explain-equal '(a . b) '(a . c))
  746. '(cdr (different-atoms b c)))))
  747. (ert-deftest ert-test-explain-equal-keymaps ()
  748. ;; This used to be very slow.
  749. (should (equal (make-keymap) (make-keymap)))
  750. (should (equal (make-sparse-keymap) (make-sparse-keymap))))
  751. (ert-deftest ert-test-significant-plist-keys ()
  752. (should (equal (ert--significant-plist-keys '()) '()))
  753. (should (equal (ert--significant-plist-keys '(a b c d e f c g p q r nil s t))
  754. '(a c e p s))))
  755. (ert-deftest ert-test-plist-difference-explanation ()
  756. (should (equal (ert--plist-difference-explanation
  757. '(a b c nil) '(a b))
  758. nil))
  759. (should (equal (ert--plist-difference-explanation
  760. '(a b c t) '(a b))
  761. '(different-properties-for-key c (different-atoms t nil))))
  762. (should (equal (ert--plist-difference-explanation
  763. '(a b c t) '(c nil a b))
  764. '(different-properties-for-key c (different-atoms t nil))))
  765. (should (equal (ert--plist-difference-explanation
  766. '(a b c (foo . bar)) '(c (foo . baz) a b))
  767. '(different-properties-for-key c
  768. (cdr
  769. (different-atoms bar baz))))))
  770. (ert-deftest ert-test-abbreviate-string ()
  771. (should (equal (ert--abbreviate-string "foo" 4 nil) "foo"))
  772. (should (equal (ert--abbreviate-string "foo" 3 nil) "foo"))
  773. (should (equal (ert--abbreviate-string "foo" 3 nil) "foo"))
  774. (should (equal (ert--abbreviate-string "foo" 2 nil) "fo"))
  775. (should (equal (ert--abbreviate-string "foo" 1 nil) "f"))
  776. (should (equal (ert--abbreviate-string "foo" 0 nil) ""))
  777. (should (equal (ert--abbreviate-string "bar" 4 t) "bar"))
  778. (should (equal (ert--abbreviate-string "bar" 3 t) "bar"))
  779. (should (equal (ert--abbreviate-string "bar" 3 t) "bar"))
  780. (should (equal (ert--abbreviate-string "bar" 2 t) "ar"))
  781. (should (equal (ert--abbreviate-string "bar" 1 t) "r"))
  782. (should (equal (ert--abbreviate-string "bar" 0 t) "")))
  783. (ert-deftest ert-test-explain-equal-string-properties ()
  784. (should
  785. (equal (ert--explain-equal-including-properties #("foo" 0 1 (a b))
  786. "foo")
  787. '(char 0 "f"
  788. (different-properties-for-key a (different-atoms b nil))
  789. context-before ""
  790. context-after "oo")))
  791. (should (equal (ert--explain-equal-including-properties
  792. #("foo" 1 3 (a b))
  793. #("goo" 0 1 (c d)))
  794. '(array-elt 0 (different-atoms (?f "#x66" "?f")
  795. (?g "#x67" "?g")))))
  796. (should
  797. (equal (ert--explain-equal-including-properties
  798. #("foo" 0 1 (a b c d) 1 3 (a b))
  799. #("foo" 0 1 (c d a b) 1 2 (a foo)))
  800. '(char 1 "o" (different-properties-for-key a (different-atoms b foo))
  801. context-before "f" context-after "o"))))
  802. (ert-deftest ert-test-equal-including-properties ()
  803. (should (equal-including-properties "foo" "foo"))
  804. (should (ert-equal-including-properties "foo" "foo"))
  805. (should (equal-including-properties #("foo" 0 3 (a b))
  806. (propertize "foo" 'a 'b)))
  807. (should (ert-equal-including-properties #("foo" 0 3 (a b))
  808. (propertize "foo" 'a 'b)))
  809. (should (equal-including-properties #("foo" 0 3 (a b c d))
  810. (propertize "foo" 'a 'b 'c 'd)))
  811. (should (ert-equal-including-properties #("foo" 0 3 (a b c d))
  812. (propertize "foo" 'a 'b 'c 'd)))
  813. (should-not (equal-including-properties #("foo" 0 3 (a b c e))
  814. (propertize "foo" 'a 'b 'c 'd)))
  815. (should-not (ert-equal-including-properties #("foo" 0 3 (a b c e))
  816. (propertize "foo" 'a 'b 'c 'd)))
  817. ;; This is bug 6581.
  818. (should-not (equal-including-properties #("foo" 0 3 (a (t)))
  819. (propertize "foo" 'a (list t))))
  820. (should (ert-equal-including-properties #("foo" 0 3 (a (t)))
  821. (propertize "foo" 'a (list t)))))
  822. (ert-deftest ert-test-stats-set-test-and-result ()
  823. (let* ((test-1 (make-ert-test :name 'test-1
  824. :body (lambda () nil)))
  825. (test-2 (make-ert-test :name 'test-2
  826. :body (lambda () nil)))
  827. (test-3 (make-ert-test :name 'test-2
  828. :body (lambda () nil)))
  829. (stats (ert--make-stats (list test-1 test-2) 't))
  830. (failed (make-ert-test-failed :condition nil
  831. :backtrace nil
  832. :infos nil)))
  833. (should (eql 2 (ert-stats-total stats)))
  834. (should (eql 0 (ert-stats-completed stats)))
  835. (should (eql 0 (ert-stats-completed-expected stats)))
  836. (should (eql 0 (ert-stats-completed-unexpected stats)))
  837. (ert--stats-set-test-and-result stats 0 test-1 (make-ert-test-passed))
  838. (should (eql 2 (ert-stats-total stats)))
  839. (should (eql 1 (ert-stats-completed stats)))
  840. (should (eql 1 (ert-stats-completed-expected stats)))
  841. (should (eql 0 (ert-stats-completed-unexpected stats)))
  842. (ert--stats-set-test-and-result stats 0 test-1 failed)
  843. (should (eql 2 (ert-stats-total stats)))
  844. (should (eql 1 (ert-stats-completed stats)))
  845. (should (eql 0 (ert-stats-completed-expected stats)))
  846. (should (eql 1 (ert-stats-completed-unexpected stats)))
  847. (ert--stats-set-test-and-result stats 0 test-1 nil)
  848. (should (eql 2 (ert-stats-total stats)))
  849. (should (eql 0 (ert-stats-completed stats)))
  850. (should (eql 0 (ert-stats-completed-expected stats)))
  851. (should (eql 0 (ert-stats-completed-unexpected stats)))
  852. (ert--stats-set-test-and-result stats 0 test-3 failed)
  853. (should (eql 2 (ert-stats-total stats)))
  854. (should (eql 1 (ert-stats-completed stats)))
  855. (should (eql 0 (ert-stats-completed-expected stats)))
  856. (should (eql 1 (ert-stats-completed-unexpected stats)))
  857. (ert--stats-set-test-and-result stats 1 test-2 (make-ert-test-passed))
  858. (should (eql 2 (ert-stats-total stats)))
  859. (should (eql 2 (ert-stats-completed stats)))
  860. (should (eql 1 (ert-stats-completed-expected stats)))
  861. (should (eql 1 (ert-stats-completed-unexpected stats)))
  862. (ert--stats-set-test-and-result stats 0 test-1 (make-ert-test-passed))
  863. (should (eql 2 (ert-stats-total stats)))
  864. (should (eql 2 (ert-stats-completed stats)))
  865. (should (eql 2 (ert-stats-completed-expected stats)))
  866. (should (eql 0 (ert-stats-completed-unexpected stats)))))
  867. (provide 'ert-tests)
  868. ;;; ert-tests.el ends here