1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
import do_setup from require 'spec.test_setup'
import EvtStream, RTNode, Scope, SimpleRegistry, T from require 'alv'
import Op, Builtin from require 'alv.base'
setup do_setup
describe 'EvtStream', ->
it 'stringifies well', ->
number = EvtStream T.num
assert.is.equal "<num! nil>", tostring number
number\set 4
assert.is.equal "<num! 4>", tostring number
bool = EvtStream T.bool
bool\set true
assert.is.equal "<bool! true>", tostring bool
COPILOT\next_tick!
bool\set false
assert.is.equal "<bool! false>", tostring bool
describe ':unwrap', ->
it 'returns the set value', ->
stream = EvtStream T.num
assert.is.nil stream\unwrap!
stream\set 3.14
assert.is.equal 3.14, stream\unwrap!
it 'returns nil if not dirty', ->
stream = EvtStream T.num
assert.is.nil stream\unwrap!
stream\set 3.14
COPILOT\next_tick!
assert.is.nil stream\unwrap!
test 'can assert the type', ->
assert.is.nil (EvtStream T.num)\unwrap T.num
assert.is.nil (EvtStream T.str)\unwrap T.str
assert.is.nil (EvtStream T.sym)\unwrap T.sym
assert.has_error -> (EvtStream T.num)\unwrap T.sym
assert.has_error -> (EvtStream T.str)\unwrap T.num
assert.has_error -> (EvtStream T.sym)\unwrap T.str
test 'has __call shorthand', ->
stream = EvtStream T.num
assert.is.nil stream!
stream\set 3.14
assert.is.equal 3.14, stream!
describe ':set', ->
it 'sets the value', ->
stream = EvtStream T.num
assert.is.false stream\dirty!
stream\set 4
assert.is.equal 4, stream\unwrap!
assert.is.true stream\dirty!
COPILOT\next_tick!
assert.is.false stream\dirty!
stream\set 3
assert.is.equal 3, stream\unwrap!
assert.is.true stream\dirty!
it 'ignores nil values', ->
stream = EvtStream T.num
assert.is.nil stream\unwrap!
assert.is.false stream\dirty!
stream\set!
assert.is.nil stream\unwrap!
assert.is.false stream\dirty!
stream\set nil
assert.is.nil stream\unwrap!
assert.is.false stream\dirty!
stream\set false
assert.is.equal false, stream\unwrap!
assert.is.true stream\dirty!
it 'errors when set twice', ->
stream = EvtStream T.num
stream\set 1
assert.has.error -> stream\set 2
assert.is.equal 1, stream\unwrap!
it 'resets on the next tick', ->
stream = EvtStream T.num
stream\set 1
COPILOT\next_tick!
assert.is.false stream\dirty!
stream\set 2
assert.is.equal 2, stream\unwrap!
assert.is.true stream\dirty!
describe ':fork', ->
it 'is clean', ->
a = EvtStream T.num
b = EvtStream T.str
b\set 'asdf'
aa, bb = a\fork!, b\fork!
assert.is.nil aa!
assert.is.nil bb!
assert.is.false aa\dirty!
assert.is.false bb\dirty!
it 'leaves the original', ->
a = EvtStream T.num
b = EvtStream T.str
b\set 'asdf'
aa, bb = a\fork!, b\fork!
assert.is.nil a!
assert.is.equal 'asdf', b!
assert.is.false a\dirty!
assert.is.true b\dirty!
it 'isolates the original from the fork', ->
a = EvtStream T.num
b = EvtStream T.str
aa, bb = a\fork!, b\fork!
a\set 1
bb\set 2
assert.is.equal 1, a!
assert.is.true a\dirty!
assert.is.nil aa!
assert.is.false aa\dirty!
assert.is.equal 2, bb!
assert.is.true bb\dirty!
assert.is.nil b!
assert.is.false b\dirty!
|