Skip to content

Commit 09f240f

Browse files
committed
improve tests and check for memory leaks
1 parent e3977a1 commit 09f240f

File tree

2 files changed

+123
-48
lines changed

2 files changed

+123
-48
lines changed

test/encoder_test/encoder_test.ino

Lines changed: 114 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
// overide interrupt macro (for unit tests only)
1313
#define IS_PIN_INTERRUPT(p) ((p) == 2 || (p) == 3)
1414

15-
1615
FakeStream stream;
1716

1817
void setup()
@@ -22,68 +21,139 @@ void setup()
2221
Serial.begin(57600); // must match port configuration
2322
}
2423

25-
void loop()
24+
test(attachEncoder)
2625
{
27-
Test::run();
26+
int initial_memory = freeMemory();
27+
28+
EncoderFirmata *encoder = new EncoderFirmata();
29+
byte encoderNum = 0, pin1 = 2, pin2 = 3;
30+
31+
assertFalse(encoder->isEncoderAttached(encoderNum));
32+
33+
encoder->attachEncoder(encoderNum, pin1, pin2);
34+
35+
assertTrue(encoder->isEncoderAttached(encoderNum));
36+
37+
delete encoder;
38+
assertEqual(0, initialMemory - freeMemory()); // no memory leak
2839
}
2940

30-
test(fullTest)
41+
test(detachEncoder)
3142
{
32-
Serial.print(F("BT mem.: "));
33-
Serial.println(freeMemory());
43+
assertTestPass(attachEncoder);
44+
int initial_memory = freeMemory();
3445

35-
EncoderFirmata encoder;
46+
EncoderFirmata *encoder = new EncoderFirmata();
47+
byte encoderNum = 0, pin1 = 2, pin2 = 3;
48+
encoder->attachEncoder(encoderNum, pin1, pin2);
3649

37-
assertTrue(encoder.handlePinMode(2, INPUT)); // 2 is interrupt
38-
assertFalse(encoder.handlePinMode(1, INPUT)); // 1 is NOT intterrupt
50+
encoder->detachEncoder(encoderNum);
51+
assertFalse(encoder->isEncoderAttached(encoderNum));
52+
53+
delete encoder;
54+
assertEqual(0, initialMemory - freeMemory()); // no memory leak
55+
}
3956

40-
byte encoderNum = 0, pin1 = 2, pin2 = 3;
57+
test(handlePinModes)
58+
{
59+
int initial_memory = freeMemory();
4160

42-
byte attachEncoderMessage[] = { ENCODER_ATTACH, encoderNum, pin1, pin2 };
43-
byte detachEncoderMessage[] = { ENCODER_DETACH, encoderNum };
61+
EncoderFirmata *encoder = new EncoderFirmata();
4462

45-
assertFalse(encoder.isEncoderAttached(encoderNum));
46-
47-
assertTrue(encoder.handleSysex(ENCODER_DATA, 0, attachEncoderMessage));
48-
49-
assertTrue(encoder.isEncoderAttached(encoderNum));
50-
51-
assertTrue(encoder.handleSysex(ENCODER_DATA, 0, detachEncoderMessage));
52-
assertFalse(encoder.isEncoderAttached(encoderNum));
63+
assertTrue(encoder->handlePinMode(2, INPUT)); // 2 is interrupt
64+
assertFalse(encoder->handlePinMode(1, INPUT)); // 1 is NOT interrupt
65+
66+
delete encoder;
67+
assertEqual(0, initialMemory - freeMemory()); // no memory leak
68+
}
5369

54-
encoder.handleSysex(ENCODER_DATA, 0, attachEncoderMessage);
55-
assertTrue(encoder.isEncoderAttached(encoderNum));
56-
//report encoder position
57-
byte reportPosition[] = {ENCODER_REPORT_POSITION, encoderNum};
70+
test(reportEncoderPosition)
71+
{
72+
assertTestPass(attachEncoder);
73+
int initial_memory = freeMemory();
74+
75+
EncoderFirmata *encoder = new EncoderFirmata();
76+
byte encoderNum = 0, pin1 = 2, pin2 = 3;
77+
encoder->attachEncoder(encoderNum, pin1, pin2);
78+
5879
stream.flush();
59-
assertTrue(encoder.handleSysex(ENCODER_DATA, 0, reportPosition));
80+
encoder->reportPosition(encoderNum);
6081
assertEqual(stream.bytesWritten().length(), 6);
82+
83+
delete encoder;
84+
assertEqual(0, initialMemory - freeMemory()); // no memory leak
85+
}
6186

62-
byte reportPositions[] = {ENCODER_REPORT_POSITIONS};
87+
test(reportEncodersPositions)
88+
{
89+
assertTestPass(attachEncoder);
90+
int initial_memory = freeMemory();
91+
92+
EncoderFirmata *encoder = new EncoderFirmata();
93+
byte encoderNum = 0, pin1 = 2, pin2 = 3;
94+
encoder->attachEncoder(encoderNum, pin1, pin2);
95+
6396
stream.flush();
64-
assertTrue(encoder.handleSysex(ENCODER_DATA, 0, reportPositions));
97+
encoder->reportPositions();
6598
assertEqual(stream.bytesWritten().length(), 9);
99+
100+
delete encoder;
101+
assertEqual(0, initialMemory - freeMemory()); // no memory leak
102+
}
66103

104+
test(enableAutomaticReports)
105+
{
106+
int initial_memory = freeMemory();
107+
108+
EncoderFirmata *encoder = new EncoderFirmata();
109+
assertFalse(encoder->isReportingEnabled());
110+
encoder->toggleAutoReport(true);
111+
assertTrue(encoder->isReportingEnabled());
112+
encoder->toggleAutoReport(false);
113+
assertFalse(encoder->isReportingEnabled());
114+
115+
delete encoder;
116+
assertEqual(0, initialMemory - freeMemory()); // no memory leak
117+
}
67118

68-
// check that auto-report is disable by default
69-
assertFalse(encoder.autoReport);
119+
test(fullReport)
120+
{
121+
assertTestPass(enableAutomaticReports);
122+
int initial_memory = freeMemory();
123+
124+
EncoderFirmata *encoder = new EncoderFirmata();
125+
70126
stream.flush();
71-
encoder.report();
72-
assertTrue(stream.bytesWritten().length()==0);
73-
127+
encoder->report();
128+
assertEqual(stream.bytesWritten().length(), 0); // reports disable
129+
130+
encoder->toggleAutoReport(true);
74131

75-
// simulate logical reset
76-
encoder.reset();
77-
assertFalse(encoder.isEncoderAttached(encoderNum));
78-
79-
// Enable auto reports
80-
byte enableReportsMessage[] = {ENCODER_REPORT_AUTO, 0x01};
81-
assertTrue(encoder.handleSysex(ENCODER_DATA, 0, enableReportsMessage));
82-
assertTrue(encoder.autoReport);
83132
stream.flush();
84-
encoder.report();
85-
assertEqual(stream.bytesWritten().length(), 3); // i.e : no encoder attached, message is empty (expt sysex start/end and ENCODER_DATA message)
133+
encoder->report();
134+
assertEqual(stream.bytesWritten().length(), 3); // reports enable
135+
136+
delete encoder;
137+
assertEqual(0, initialMemory - freeMemory()); // no memory leak
138+
}
86139

87-
Serial.print(F("AT mem.: "));
88-
Serial.println(freeMemory());
140+
test(resetEncoder)
141+
{
142+
assertTestPass(attachEncoder);
143+
int initial_memory = freeMemory();
144+
145+
EncoderFirmata *encoder = new EncoderFirmata();
146+
byte encoderNum = 0, pin1 = 2, pin2 = 3;
147+
encoder->attachEncoder(encoderNum, pin1, pin2);
148+
149+
encoder->reset();
150+
assertFalse(encoder->isEncoderAttached(encoderNum));
151+
152+
delete encoder;
153+
assertEqual(0, initialMemory - freeMemory()); // no memory leak
154+
}
155+
156+
void loop()
157+
{
158+
Test::run();
89159
}

utility/EncoderFirmata.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,20 +37,25 @@ EncoderFirmata::EncoderFirmata()
3737
}
3838
EncoderFirmata::~EncoderFirmata()
3939
{
40+
byte encoder;
41+
for(encoder=0; encoder<MAX_ENCODERS; encoder++)
42+
{
43+
detachEncoder(encoder);
44+
}
4045
delete[] encoders;
4146
}
4247

4348
void EncoderFirmata::attachEncoder(byte encoderNum, byte pinANum, byte pinBNum)
4449
{
4550
if (isEncoderAttached(encoderNum))
4651
{
47-
Firmata.sendString("Encoder Warning: encoder is already attached. Operation cancelled.");
52+
Firmata.sendString(F("Encoder Warning: encoder is already attached. Operation cancelled."));
4853
return;
4954
}
5055

5156
if (!IS_PIN_INTERRUPT(pinANum) || !IS_PIN_INTERRUPT(pinBNum))
5257
{
53-
Firmata.sendString("Encoder Warning: For better performences, you should only use Interrput pins." );
58+
Firmata.sendString(F("Encoder Warning: For better performences, you should only use Interrput pins."));
5459
}
5560
encoders[encoderNum] = new Encoder(pinANum, pinBNum);
5661
}
@@ -165,7 +170,7 @@ boolean EncoderFirmata::handleSysex(byte command, byte argc, byte *argv)
165170
return true;
166171
}
167172

168-
Firmata.sendString("Encoder Error: Invalid command");
173+
Firmata.sendString(F("Encoder Error: Invalid command"));
169174
}
170175
return false;
171176
}
@@ -192,7 +197,7 @@ boolean EncoderFirmata::isEncoderAttached(byte encoderNum)
192197
{
193198
if (encoderNum>=MAX_ENCODERS)
194199
{
195-
Firmata.sendString("Encoder Error: encoder number should be less than 5. Operation cancelled.");
200+
Firmata.sendString(F("Encoder Error: encoder number should be less than 5. Operation cancelled."));
196201
return false;
197202
}
198203
if (encoders[encoderNum])

0 commit comments

Comments
 (0)