-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgadgets_test.go
204 lines (187 loc) · 5.15 KB
/
gadgets_test.go
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
package gogadgets_test
import (
"fmt"
"math/rand"
"time"
"github.com/cswank/gogadgets"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
func init() {
rand.Seed(time.Now().Unix())
}
var _ = Describe("gadgets", func() {
Describe("commands", func() {
It("parses a command", func() {
val, unit, err := gogadgets.ParseCommand("fill tank to 5 liters")
Expect(err).To(BeNil())
Expect(val).To(Equal(5.0))
Expect(unit).To(Equal("liters"))
})
It("parses an off command", func() {
val, unit, err := gogadgets.ParseCommand("turn on lab led to -50 %")
Expect(err).To(BeNil())
Expect(val).To(Equal(-50.0))
Expect(unit).To(Equal("%"))
})
It("parses a time command", func() {
val, unit, err := gogadgets.ParseCommand("turn on lab led for 1.1 minutes")
Expect(err).To(BeNil())
Expect(val).To(Equal(1.1))
Expect(unit).To(Equal("minutes"))
})
})
Describe("start", func() {
It("starts a gadget and turns it on and off", func() {
location := "lab"
name := "led"
g := gogadgets.Gadget{
Location: location,
Name: name,
Direction: "output",
OnCommands: []string{fmt.Sprintf("turn on %s %s", location, name)},
OffCommands: []string{fmt.Sprintf("turn off %s %s", location, name)},
Output: &FakeOutput{},
UID: fmt.Sprintf("%s %s", location, name),
}
input := make(chan gogadgets.Message)
output := make(chan gogadgets.Message)
go g.Start(input, output)
update := <-output
Expect(update.Value.Value).To(BeFalse())
msg := gogadgets.Message{
Type: "command",
Body: "turn on lab led",
}
input <- msg
update = <-output
Expect(update.Value.Value).To(BeTrue())
Expect(update.Value.Output["gpio"]).To(BeTrue())
msg = gogadgets.Message{
Type: "command",
Body: "turn off lab led",
}
input <- msg
update = <-output
Expect(update.Value.Value).To(BeFalse())
Expect(update.Value.Output["gpio"]).To(BeFalse())
msg = gogadgets.Message{
Type: "command",
Body: "shutdown",
}
input <- msg
update = <-output
})
It("starts a gadgets that has a trigger", func() {
location := "tank"
name := "valve"
g := gogadgets.Gadget{
Location: location,
Name: name,
Operator: ">=",
OnCommands: []string{fmt.Sprintf("fill %s", location)},
OffCommands: []string{fmt.Sprintf("stop filling %s", location)},
Output: &FakeOutput{},
UID: fmt.Sprintf("%s %s", location, name),
}
input := make(chan gogadgets.Message)
output := make(chan gogadgets.Message)
go g.Start(input, output)
update := <-output
Expect(update.Value.Value).To(BeFalse())
msg := gogadgets.Message{
Type: "command",
Body: "fill tank to 4.4 liters",
}
input <- msg
update = <-output
Expect(update.Value.Value).To(BeTrue())
//make a message that should trigger the trigger and stop the device
msg = gogadgets.Message{
Sender: "tank volume",
Type: gogadgets.UPDATE,
Location: "tank",
Name: "volume",
Value: gogadgets.Value{
Units: "liters",
Value: 4.4,
},
}
input <- msg
update = <-output
Expect(update.Value.Value).To(BeFalse())
})
It("starts a gadget that has a time trigger", func() {
location := "lab"
name := "led"
g := gogadgets.Gadget{
Location: location,
Name: name,
OnCommands: []string{"turn on lab led"},
Operator: ">=",
OffCommands: []string{"turn off lab led"},
Output: &FakeOutput{},
UID: fmt.Sprintf("%s %s", location, name),
}
input := make(chan gogadgets.Message)
output := make(chan gogadgets.Message)
go g.Start(input, output)
update := <-output
Expect(update.Value.Value).To(BeFalse())
msg := gogadgets.Message{
Type: "command",
Body: "turn on lab led for 0.01 seconds",
}
input <- msg
update = <-output
Expect(update.Value.Value).To(BeTrue())
Expect(update.TargetValue).ToNot(BeNil())
Expect(update.TargetValue.Value).To(Equal(0.01))
//wait for a second
update = <-output
Expect(update.Value.Value).To(BeFalse())
})
It("starts a gadget with a time trigger that gets interrupted", func() {
location := "lab"
name := "led"
g := gogadgets.Gadget{
Location: location,
Name: name,
OnCommands: []string{"turn on lab led"},
OffCommands: []string{"turn off lab led"},
Output: &FakeOutput{},
UID: fmt.Sprintf("%s %s", location, name),
}
input := make(chan gogadgets.Message)
output := make(chan gogadgets.Message)
go g.Start(input, output)
update := <-output
Expect(update.Value.Value).To(BeFalse())
msg := gogadgets.Message{
Type: "command",
Body: "turn on lab led for 30 seconds",
}
input <- msg
update = <-output
Expect(update.Value.Value).To(BeTrue())
msg = gogadgets.Message{
Type: "command",
Body: "turn on lab led",
}
input <- msg
<-output
msg = gogadgets.Message{
Type: "update",
Body: "",
}
input <- msg
msg = gogadgets.Message{
Type: "command",
Body: "turn off lab led",
}
input <- msg
update = <-output
Expect(update.Value.Value).To(BeFalse())
})
})
})