Skip to content

Commit 14550e2

Browse files
Merge pull request firmata#35 from mmurdoch/unit-tests
Add print version and digital write unit tests
2 parents ff365d4 + 9521b53 commit 14550e2

File tree

1 file changed

+180
-0
lines changed

1 file changed

+180
-0
lines changed
Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
#include <ArduinoUnit.h>
2+
#include <Firmata.h>
3+
4+
TestSuite suite;
5+
6+
void setup()
7+
{
8+
Serial.begin(9600);
9+
}
10+
11+
void loop()
12+
{
13+
suite.run();
14+
}
15+
16+
class InMemoryStream : public Stream
17+
{
18+
public:
19+
virtual ~InMemoryStream()
20+
{
21+
}
22+
23+
size_t write(uint8_t val)
24+
{
25+
_bytesWritten += (char) val;
26+
27+
return size_t(1);
28+
}
29+
30+
void flush()
31+
{
32+
}
33+
34+
const String& bytesWritten()
35+
{
36+
return _bytesWritten;
37+
}
38+
39+
void nextByte(byte b)
40+
{
41+
_nextByte = b;
42+
}
43+
44+
int available()
45+
{
46+
return 1;
47+
}
48+
49+
int read()
50+
{
51+
return _nextByte;
52+
}
53+
54+
int peek()
55+
{
56+
return _nextByte;
57+
}
58+
59+
private:
60+
String _bytesWritten;
61+
byte _nextByte;
62+
};
63+
64+
void assertStringsEqual(Test& __test__, const char* expected, const String& actual)
65+
{
66+
size_t expectedLength = strlen(expected);
67+
assertEquals(expectedLength, actual.length());
68+
for (size_t i = 0; i < strlen(expected); i++)
69+
{
70+
assertEquals(expected[i], actual[i]);
71+
}
72+
}
73+
74+
test(beginPrintsVersion)
75+
{
76+
InMemoryStream stream;
77+
78+
Firmata.begin(stream);
79+
80+
char expected[] =
81+
{
82+
0xF9, // Version reporting identifier
83+
2, // Major version number
84+
3, // Minor version number
85+
0
86+
};
87+
assertStringsEqual(__test__, expected, stream.bytesWritten());
88+
}
89+
90+
void processMessage(const byte* message, size_t length)
91+
{
92+
InMemoryStream stream;
93+
Firmata.begin(stream);
94+
95+
for (size_t i = 0; i < length; i++)
96+
{
97+
stream.nextByte(message[i]);
98+
Firmata.processInput();
99+
}
100+
}
101+
102+
byte _digitalPort;
103+
int _digitalPortValue;
104+
void writeToDigitalPort(byte port, int value)
105+
{
106+
_digitalPort = port;
107+
_digitalPortValue = value;
108+
}
109+
110+
test(processWriteDigital_0)
111+
{
112+
Firmata.attach(DIGITAL_MESSAGE, writeToDigitalPort);
113+
114+
byte message[] = { DIGITAL_MESSAGE, 0, 0 };
115+
processMessage(message, 3);
116+
117+
assertEquals(0, _digitalPortValue);
118+
}
119+
120+
test(processWriteDigital_127)
121+
{
122+
Firmata.attach(DIGITAL_MESSAGE, writeToDigitalPort);
123+
124+
byte message[] = { DIGITAL_MESSAGE, 127, 0 };
125+
processMessage(message, 3);
126+
127+
assertEquals(127, _digitalPortValue);
128+
}
129+
130+
test(processWriteDigitalStripsTopBit)
131+
{
132+
Firmata.attach(DIGITAL_MESSAGE, writeToDigitalPort);
133+
134+
byte message[] = { DIGITAL_MESSAGE, B11111111, 0 };
135+
processMessage(message, 3);
136+
137+
assertEquals(B01111111, _digitalPortValue);
138+
}
139+
140+
test(processWriteDigital_128)
141+
{
142+
Firmata.attach(DIGITAL_MESSAGE, writeToDigitalPort);
143+
144+
byte message[] = { DIGITAL_MESSAGE, 0, 1 };
145+
processMessage(message, 3);
146+
147+
assertEquals(128, _digitalPortValue);
148+
}
149+
150+
test(processWriteLargestDigitalValue)
151+
{
152+
Firmata.attach(DIGITAL_MESSAGE, writeToDigitalPort);
153+
154+
byte message[] = { DIGITAL_MESSAGE, 0x7F, 0x7F };
155+
processMessage(message, 3);
156+
157+
// Maximum of 14 bits can be set (B0011111111111111)
158+
assertEquals(0x3FFF, _digitalPortValue);
159+
}
160+
161+
test(defaultDigitalWritePortIsZero)
162+
{
163+
Firmata.attach(DIGITAL_MESSAGE, writeToDigitalPort);
164+
165+
byte message[] = { DIGITAL_MESSAGE, 0, 0 };
166+
processMessage(message, 3);
167+
168+
assertEquals(0, _digitalPort);
169+
}
170+
171+
test(specifiedDigitalWritePort)
172+
{
173+
Firmata.attach(DIGITAL_MESSAGE, writeToDigitalPort);
174+
175+
byte message[] = { DIGITAL_MESSAGE + 1, 0, 0 };
176+
processMessage(message, 3);
177+
178+
assertEquals(1, _digitalPort);
179+
}
180+

0 commit comments

Comments
 (0)