aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/ChangeLog6
-rw-r--r--test/automated/finalizer-tests.el78
2 files changed, 84 insertions, 0 deletions
diff --git a/test/ChangeLog b/test/ChangeLog
index cf1b2c13d7e..684e98f880e 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,3 +1,9 @@
12015-03-02 Daniel Colascione <dancol@dancol.org>
2
3 * automated/finalizer-tests.el (finalizer-basic)
4 (finalizer-circular-reference, finalizer-cross-reference)
5 (finalizer-error): New tests.
6
12015-03-01 Michael Albinus <michael.albinus@gmx.de> 72015-03-01 Michael Albinus <michael.albinus@gmx.de>
2 8
3 * automated/vc-tests.el (vc-test--create-repo): Add check for 9 * automated/vc-tests.el (vc-test--create-repo): Add check for
diff --git a/test/automated/finalizer-tests.el b/test/automated/finalizer-tests.el
new file mode 100644
index 00000000000..5308f01085b
--- /dev/null
+++ b/test/automated/finalizer-tests.el
@@ -0,0 +1,78 @@
1;;; finalizer-tests.el --- Finalizer tests -*- lexical-binding: t -*-
2
3;; Copyright (C) 2015 Free Software Foundation, Inc.
4
5;; Author: Daniel Colascione <dancol@dancol.org>
6;; Keywords:
7
8;; This program is free software; you can redistribute it and/or modify
9;; it under the terms of the GNU General Public License as published by
10;; the Free Software Foundation, either version 3 of the License, or
11;; (at your option) any later version.
12
13;; This program is distributed in the hope that it will be useful,
14;; but WITHOUT ANY WARRANTY; without even the implied warranty of
15;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16;; GNU General Public License for more details.
17
18;; You should have received a copy of the GNU General Public License
19;; along with this program. If not, see <http://www.gnu.org/licenses/>.
20
21;;; Commentary:
22
23;;
24
25;;; Code:
26
27(require 'ert)
28(require 'cl-lib)
29
30(ert-deftest finalizer-basic ()
31 "Test that finalizers run at all."
32 (skip-unless gc-precise-p)
33 (let* ((finalized nil)
34 (finalizer (make-finalizer (lambda () (setf finalized t)))))
35 (garbage-collect)
36 (should (equal finalized nil))
37 (setf finalizer nil)
38 (garbage-collect)
39 (should (equal finalized t))))
40
41(ert-deftest finalizer-circular-reference ()
42 "Test references from a callback to a finalizer."
43 (skip-unless gc-precise-p)
44 (let ((finalized nil))
45 (let* ((value nil)
46 (finalizer (make-finalizer (lambda () (setf finalized value)))))
47 (setf value finalizer)
48 (setf finalizer nil))
49 (garbage-collect)
50 (should finalized)))
51
52(ert-deftest finalizer-cross-reference ()
53 "Test that between-finalizer references do not prevent collection."
54 (skip-unless gc-precise-p)
55 (let ((d nil) (fc 0))
56 (let* ((f1-data (cons nil nil))
57 (f2-data (cons nil nil))
58 (f1 (make-finalizer
59 (lambda () (cl-incf fc) (setf d f1-data))))
60 (f2 (make-finalizer
61 (lambda () (cl-incf fc) (setf d f2-data)))))
62 (setcar f1-data f2)
63 (setcar f2-data f1))
64 (garbage-collect)
65 (should (equal fc 2))))
66
67(ert-deftest finalizer-error ()
68 "Test that finalizer errors are suppressed"
69 (skip-unless gc-precise-p)
70 (make-finalizer (lambda () (error "ABCDEF")))
71 (garbage-collect)
72 (with-current-buffer "*Messages*"
73 (save-excursion
74 (goto-char (point-max))
75 (forward-line -1)
76 (should (equal
77 (buffer-substring (point) (point-at-eol))
78 "finalizer failed: (error \"ABCDEF\")")))))