30 lines
1.2 KiB
Racket
30 lines
1.2 KiB
Racket
|
#lang imperative-syndicate/test-implementation
|
||
|
;; Box-and-client
|
||
|
|
||
|
(test-case
|
||
|
[(message-struct set-box (new-value))
|
||
|
(assertion-struct box-state (value))
|
||
|
|
||
|
(spawn (field [current-value 0])
|
||
|
(assert (box-state (current-value)))
|
||
|
(stop-when-true (= (current-value) 3)
|
||
|
(displayln "box: terminating"))
|
||
|
(on (message (set-box $new-value))
|
||
|
(printf "box: taking on new-value ~v\n" new-value)
|
||
|
(current-value new-value)))
|
||
|
|
||
|
(spawn (stop-when (retracted (observe (set-box _)))
|
||
|
(displayln "client: box has gone"))
|
||
|
(on (asserted (box-state $v))
|
||
|
(printf "client: learned that box's value is now ~v\n" v)
|
||
|
(send! (set-box (+ v 1)))))]
|
||
|
no-crashes
|
||
|
(expected-output "client: learned that box's value is now 0"
|
||
|
"box: taking on new-value 1"
|
||
|
"client: learned that box's value is now 1"
|
||
|
"box: taking on new-value 2"
|
||
|
"client: learned that box's value is now 2"
|
||
|
"box: taking on new-value 3"
|
||
|
"box: terminating"
|
||
|
"client: box has gone"))
|