|
3 | 3 | (in-package #:thespis/test/basic)
|
4 | 4 |
|
5 | 5 | (deftest test-counter ()
|
| 6 | + "The most basic stateful usage." |
6 | 7 | (define-actor counter ((c 0)) (increment)
|
7 | 8 | (incf c increment))
|
8 | 9 |
|
|
19 | 20 | (close-actor actor)))
|
20 | 21 |
|
21 | 22 | (deftest test-lambda-rest ()
|
| 23 | + "Make sure lambda lists work." |
22 | 24 | (define-actor square-summer ((c 0)) (&rest args)
|
23 | 25 | (incf c (apply #'+ (mapcar (lambda (x) (* x x)) args))))
|
24 | 26 |
|
|
28 | 30 | (close-actor actor)))
|
29 | 31 |
|
30 | 32 | (deftest test-lambda-key ()
|
| 33 | + "Make sure lambda lists work." |
31 | 34 | (define-actor point-actor ((x 0) (y 0) (z 0))
|
32 | 35 | (&key (dx 0) (dy 0) (dz 0))
|
33 | 36 | (list
|
|
43 | 46 | (close-actor actor)))
|
44 | 47 |
|
45 | 48 | (deftest test-multiple-values ()
|
| 49 | + "Return multiple values on join." |
46 | 50 | (define-actor multivaluer ((prev 0)) (next)
|
47 | 51 | (multiple-value-prog1 (values prev next)
|
48 | 52 | (setf prev next)))
|
|
55 | 59 | (is (equal '(2 1) (multiple-value-list (join-actor actor))))))
|
56 | 60 |
|
57 | 61 | (deftest test-pong ()
|
| 62 | + "More complicated test, could be cleaner using the registry." |
58 | 63 | (let (pinger ponger (result 0))
|
59 | 64 | (define-actor pinger () (c)
|
60 | 65 | (incf result)
|
|
77 | 82 | (is (= 11 result))))
|
78 | 83 |
|
79 | 84 | (deftest test-self ()
|
| 85 | + "Make sure the actor can see itself." |
80 | 86 | (let ((result 0))
|
81 | 87 | (define-actor selfish-counter () ()
|
82 | 88 | (incf result)
|
|
90 | 96 | (is (= result 11)))))
|
91 | 97 |
|
92 | 98 | (deftest test-error-handling ()
|
| 99 | + "Custom error handling." |
93 | 100 | (define-actor failer () (x)
|
94 | 101 | (/ 1 x))
|
95 | 102 |
|
|
101 | 108 | (close-actor actor)))
|
102 | 109 |
|
103 | 110 | (deftest test-closed-actor ()
|
| 111 | + "Sending messages to a closed actor signals an error." |
104 | 112 | (define-actor closer () (x)
|
105 | 113 | x)
|
106 | 114 |
|
107 | 115 | (let ((actor (closer)))
|
108 | 116 | (close-actor actor)
|
109 |
| - (handler-case (send actor 'x) |
110 |
| - (error (c) (is (typep c 'simple-error)))))) |
| 117 | + (signals simple-error |
| 118 | + (send actor 'x)))) |
111 | 119 |
|
112 | 120 | (deftest test-redefine-actor ()
|
| 121 | + "Actors can change behavior while they are running." |
113 | 122 | (define-actor counter ((c 0)) (increment)
|
114 | 123 | (incf c increment))
|
115 | 124 |
|
116 | 125 | (let ((actor (counter)))
|
117 | 126 | (ask actor 1)
|
| 127 | + |
118 | 128 | (define-actor counter ((c 0)) (increment)
|
119 | 129 | (incf c (1- increment)))
|
| 130 | + |
120 | 131 | (send actor 3)
|
121 | 132 | (is (= 3 (ask actor 1)))
|
| 133 | + |
122 | 134 | (define-actor counter ((c 32)) (increment times)
|
123 | 135 | (incf c (* times increment)))
|
| 136 | + |
124 | 137 | (is (= 10 (ask actor 1 7)))
|
125 | 138 | (close-actor actor)))
|
126 | 139 |
|
127 | 140 | (deftest test-registry ()
|
| 141 | + "Make sure the global registry works." |
128 | 142 | (define-actor counter ((c 0)) (increment)
|
129 | 143 | (incf c increment))
|
130 | 144 |
|
131 | 145 | (counter :name :my-counter)
|
132 | 146 | (send :my-counter 1)
|
133 | 147 | (is (= 3 (ask :my-counter 2)))
|
134 |
| - (close-actor :my-counter)) |
| 148 | + (join-actor (close-actor :my-counter))) |
135 | 149 |
|
136 | 150 | (deftest test-close-and-join ()
|
| 151 | + "Make sure we can join globally registered actors after we close them." |
137 | 152 | (define-actor counter ((c 0)) (increment)
|
138 | 153 | (incf c increment))
|
139 | 154 |
|
140 | 155 | (counter :name :my-counter)
|
141 | 156 | (send :my-counter 1)
|
142 | 157 | (is (= 3 (ask :my-counter 2)))
|
143 | 158 | (close-and-join-actors :my-counter)
|
144 |
| - (is (eql nil (gethash :my-counter *registry*)))) |
| 159 | + (is (null (gethash :my-counter *registry*)))) |
| 160 | + |
| 161 | +(deftest test-destroy () |
| 162 | + "Make sure destroy works on globally registered actors." |
| 163 | + (define-actor echoer () (x) x) |
| 164 | + |
| 165 | + (echoer :name :echoer) |
| 166 | + (is (= 1 (ask :echoer 1))) |
| 167 | + (destroy-actor :echoer) |
| 168 | + (is (null (gethash :echoer *registry*)))) |
0 commit comments