Skip to content

Commit 99d350b

Browse files
committed
Fix issue firmata#36
Includes unit test coverage. Adds an unsetFirmwareVersion() method to FirmataClass to make unit test independent from other tests.
1 parent bf19913 commit 99d350b

File tree

3 files changed

+37
-21
lines changed

3 files changed

+37
-21
lines changed

Firmata.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ void FirmataClass::endSysex(void)
4949
FirmataClass::FirmataClass()
5050
{
5151
firmwareVersionCount = 0;
52+
firmwareVersionVector = 0;
5253
systemReset();
5354
}
5455

@@ -126,6 +127,9 @@ void FirmataClass::setFirmwareNameAndVersion(const char *name, byte major, byte
126127
firmwareVersionCount = strlen(name) + 2;
127128
filename = name;
128129
}
130+
131+
free(firmwareVersionVector);
132+
129133
firmwareVersionVector = (byte *) malloc(firmwareVersionCount);
130134
firmwareVersionVector[firmwareVersionCount] = 0;
131135
firmwareVersionVector[0] = major;
@@ -136,6 +140,13 @@ void FirmataClass::setFirmwareNameAndVersion(const char *name, byte major, byte
136140
// (char)major, (char)minor, firmwareVersionVector);
137141
}
138142

143+
void FirmataClass::unsetFirmwareVersion()
144+
{
145+
firmwareVersionCount = 0;
146+
free(firmwareVersionVector);
147+
firmwareVersionVector = 0;
148+
}
149+
139150
//------------------------------------------------------------------------------
140151
// Serial Receive Handling
141152

@@ -179,7 +190,7 @@ void FirmataClass::processInput(void)
179190
int command;
180191

181192
// TODO make sure it handles -1 properly
182-
193+
183194
if (parsingSysex) {
184195
if(inputData == END_SYSEX) {
185196
//stop sysex byte

Firmata.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ class FirmataClass
9898
void printFirmwareVersion(void);
9999
//void setFirmwareVersion(byte major, byte minor); // see macro below
100100
void setFirmwareNameAndVersion(const char *name, byte major, byte minor);
101+
void unsetFirmwareVersion();
101102
/* serial receive handling */
102103
int available(void);
103104
void processInput(void);

test/unit/firmata_test/firmata_test.ino

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,24 @@ void assertStringsEqual(Test& __test__, const char* expected, const String& actu
1717
{
1818
size_t expectedLength = strlen(expected);
1919
assertEquals(expectedLength, actual.length());
20-
for (size_t i = 0; i < strlen(expected); i++)
20+
for (size_t i = 0; i < expectedLength; i++)
2121
{
2222
assertEquals(expected[i], actual[i]);
2323
}
2424
}
2525

26+
test(setFirmwareVersionDoesNotLeakMemory)
27+
{
28+
Firmata.setFirmwareVersion(1, 0);
29+
int initialMemory = freeMemory();
30+
31+
Firmata.setFirmwareVersion(1, 0);
32+
33+
assertEquals(0, initialMemory - freeMemory());
34+
35+
Firmata.unsetFirmwareVersion();
36+
}
37+
2638
test(beginPrintsVersion)
2739
{
2840
FakeStream stream;
@@ -59,8 +71,14 @@ void writeToDigitalPort(byte port, int value)
5971
_digitalPortValue = value;
6072
}
6173

74+
void setupDigitalPort() {
75+
_digitalPort = 0;
76+
_digitalPortValue = 0;
77+
}
78+
6279
test(processWriteDigital_0)
6380
{
81+
setupDigitalPort();
6482
Firmata.attach(DIGITAL_MESSAGE, writeToDigitalPort);
6583

6684
byte message[] = { DIGITAL_MESSAGE, 0, 0 };
@@ -71,6 +89,7 @@ test(processWriteDigital_0)
7189

7290
test(processWriteDigital_127)
7391
{
92+
setupDigitalPort();
7493
Firmata.attach(DIGITAL_MESSAGE, writeToDigitalPort);
7594

7695
byte message[] = { DIGITAL_MESSAGE, 127, 0 };
@@ -79,18 +98,9 @@ test(processWriteDigital_127)
7998
assertEquals(127, _digitalPortValue);
8099
}
81100

82-
test(processWriteDigitalStripsTopBit)
83-
{
84-
Firmata.attach(DIGITAL_MESSAGE, writeToDigitalPort);
85-
86-
byte message[] = { DIGITAL_MESSAGE, B11111111, 0 };
87-
processMessage(message, 3);
88-
89-
assertEquals(B01111111, _digitalPortValue);
90-
}
91-
92101
test(processWriteDigital_128)
93102
{
103+
setupDigitalPort();
94104
Firmata.attach(DIGITAL_MESSAGE, writeToDigitalPort);
95105

96106
byte message[] = { DIGITAL_MESSAGE, 0, 1 };
@@ -101,6 +111,7 @@ test(processWriteDigital_128)
101111

102112
test(processWriteLargestDigitalValue)
103113
{
114+
setupDigitalPort();
104115
Firmata.attach(DIGITAL_MESSAGE, writeToDigitalPort);
105116

106117
byte message[] = { DIGITAL_MESSAGE, 0x7F, 0x7F };
@@ -112,6 +123,7 @@ test(processWriteLargestDigitalValue)
112123

113124
test(defaultDigitalWritePortIsZero)
114125
{
126+
setupDigitalPort();
115127
Firmata.attach(DIGITAL_MESSAGE, writeToDigitalPort);
116128

117129
byte message[] = { DIGITAL_MESSAGE, 0, 0 };
@@ -122,6 +134,7 @@ test(defaultDigitalWritePortIsZero)
122134

123135
test(specifiedDigitalWritePort)
124136
{
137+
setupDigitalPort();
125138
Firmata.attach(DIGITAL_MESSAGE, writeToDigitalPort);
126139

127140
byte message[] = { DIGITAL_MESSAGE + 1, 0, 0 };
@@ -130,12 +143,3 @@ test(specifiedDigitalWritePort)
130143
assertEquals(1, _digitalPort);
131144
}
132145

133-
test(setFirmwareVersionDoesNotLeakMemory)
134-
{
135-
Firmata.setFirmwareVersion(1, 0);
136-
int initialMemory = freeMemory();
137-
138-
Firmata.setFirmwareVersion(1, 0);
139-
140-
assertEquals(0, initialMemory - freeMemory());
141-
}

0 commit comments

Comments
 (0)