Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 97f5b5f

Browse filesBrowse files
committed
Arduino mocking
1 parent 1f0b90c commit 97f5b5f
Copy full SHA for 97f5b5f
Expand file treeCollapse file tree

20 files changed

+1551
-0
lines changed

‎README.md

Copy file name to clipboard
+25Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,26 @@
11
# ArduinoFake
2+
3+
`ArduinoFake` is a simple mocking framework for Arduino.
4+
`ArduinoFake` is based on [FakeIt](https://github.com/eranpeer/FakeIt) and can be used for testing both your arduino project natively.
5+
6+
7+
## Quickstart
8+
9+
### Includes
10+
11+
You should include the following header in your test file:
12+
13+
```c++
14+
#include <ArduinoFake.h>
15+
```
16+
17+
### Stubbing
18+
19+
Assuming we have the following arduino code:
20+
21+
```c++
22+
void setup()
23+
{
24+
25+
}
26+
```

‎src/ArduinoFake.cpp

Copy file name to clipboard
+12Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#include "ArduinoFake.h"
2+
3+
ArduinoFakeContext* arduinoFakeContext;
4+
5+
ArduinoFakeContext* getArduinoFakeContext()
6+
{
7+
if (!arduinoFakeContext) {
8+
arduinoFakeContext = new ArduinoFakeContext();
9+
}
10+
11+
return arduinoFakeContext;
12+
}

‎src/ArduinoFake.h

Copy file name to clipboard
+107Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
#ifndef ARDUINO_FAKE_H
2+
#define ARDUINO_FAKE_H
3+
4+
#if !defined(UBRRH) && !defined(UBRR0H) && !defined(USBCON)
5+
#define USBCON
6+
#endif
7+
8+
#include <HardwareSerialFake.h>
9+
#include <FunctionFake.h>
10+
#include <StreamFake.h>
11+
#include <SerialFake.h>
12+
#include <PrintFake.h>
13+
14+
#define ArduinoFakeGetHardwareSerial() ArduinoFakeGetter(HardwareSerial)
15+
#define ArduinoFakeGetFunction() ArduinoFakeGetter(Function)
16+
#define ArduinoFakeGetSerial() ArduinoFakeGetter(Serial)
17+
#define ArduinoFakeGetStream() ArduinoFakeGetter(Stream)
18+
#define ArduinoFakeGetPrint() ArduinoFakeGetter(Print)
19+
#define ArduinoFakeGet() ArduinoFakeGetter(Function)
20+
21+
#define ArduinoFake(mock) ArduinoFakeGet##mock()
22+
23+
#define ArduinoFakeGetter(mock) \
24+
getArduinoFakeContext()->Mocks->mock
25+
26+
#define ArduinoFakeReset() \
27+
getArduinoFakeContext()->reset()
28+
29+
#define ArduinoFakeInstance(mock, ...) \
30+
getArduinoFakeContext()->mock(__VA_ARGS__)
31+
32+
#define ArduinoFakeReturnInstaceOf(var, mock) \
33+
if (std::strstr(typeid(*var).name(), #mock)) { \
34+
return this->mock(); \
35+
}
36+
37+
#define ArduinoFakeSingleInstanceGetter(mock) \
38+
mock##Fake* mock() \
39+
{ \
40+
if (!this->Instances->mock){ \
41+
this->Instances->mock = &this->Mocks->mock.get(); \
42+
} \
43+
return this->Instances->mock; \
44+
}
45+
46+
struct ArduinoFakeMocks
47+
{
48+
fakeit::Mock<HardwareSerialFake> HardwareSerial;
49+
fakeit::Mock<FunctionFake> Function;
50+
fakeit::Mock<SerialFake> Serial;
51+
fakeit::Mock<StreamFake> Stream;
52+
fakeit::Mock<PrintFake> Print;
53+
};
54+
55+
struct ArduinoFakeInstances
56+
{
57+
HardwareSerialFake* HardwareSerial;
58+
FunctionFake* Function;
59+
SerialFake* Serial;
60+
StreamFake* Stream;
61+
PrintFake* Print;
62+
};
63+
64+
class ArduinoFakeContext
65+
{
66+
public:
67+
ArduinoFakeMocks* Mocks = new ArduinoFakeMocks();
68+
ArduinoFakeInstances* Instances = new ArduinoFakeInstances();
69+
70+
ArduinoFakeSingleInstanceGetter(Print)
71+
ArduinoFakeSingleInstanceGetter(Stream)
72+
ArduinoFakeSingleInstanceGetter(Serial)
73+
ArduinoFakeSingleInstanceGetter(Function)
74+
ArduinoFakeSingleInstanceGetter(HardwareSerial)
75+
76+
PrintFake* Print(class Print* p)
77+
{
78+
ArduinoFakeReturnInstaceOf(p, HardwareSerial)
79+
ArduinoFakeReturnInstaceOf(p, Serial)
80+
ArduinoFakeReturnInstaceOf(p, Stream)
81+
82+
return this->Print();
83+
}
84+
85+
StreamFake* Stream(class Stream* s)
86+
{
87+
ArduinoFakeReturnInstaceOf(s, HardwareSerial)
88+
ArduinoFakeReturnInstaceOf(s, Serial)
89+
90+
return this->Stream();
91+
}
92+
93+
void reset(void)
94+
{
95+
this->Instances = new ArduinoFakeInstances();
96+
97+
this->Mocks->HardwareSerial.Reset();
98+
this->Mocks->Function.Reset();
99+
this->Mocks->Stream.Reset();
100+
this->Mocks->Serial.Reset();
101+
this->Mocks->Print.Reset();
102+
}
103+
};
104+
105+
ArduinoFakeContext* getArduinoFakeContext();
106+
107+
#endif // ARDUINO_FAKE_H

‎src/FunctionFake.cpp

Copy file name to clipboard
+105Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
#include "FunctionFake.h"
2+
#include "ArduinoFake.h"
3+
4+
void pinMode(uint8_t pin, uint8_t mode)
5+
{
6+
ArduinoFakeInstance(Function)->pinMode(pin, mode);
7+
}
8+
9+
void digitalWrite(uint8_t pin, uint8_t val)
10+
{
11+
ArduinoFakeInstance(Function)->digitalWrite(pin, val);
12+
}
13+
14+
int digitalRead(uint8_t pin)
15+
{
16+
return ArduinoFakeInstance(Function)->digitalRead(pin);
17+
}
18+
19+
int analogRead(uint8_t pin)
20+
{
21+
return ArduinoFakeInstance(Function)->analogRead(pin);
22+
}
23+
24+
void analogWrite(uint8_t pin, int val)
25+
{
26+
ArduinoFakeInstance(Function)->analogWrite(pin, val);
27+
}
28+
29+
void analogReference(uint8_t mode)
30+
{
31+
ArduinoFakeInstance(Function)->analogReference(mode);
32+
}
33+
34+
unsigned long millis(void)
35+
{
36+
return ArduinoFakeInstance(Function)->millis();
37+
}
38+
39+
unsigned long micros(void)
40+
{
41+
return ArduinoFakeInstance(Function)->micros();
42+
}
43+
44+
void delay(unsigned long value)
45+
{
46+
ArduinoFakeInstance(Function)->delay(value);
47+
}
48+
49+
void delayMicroseconds(unsigned int us)
50+
{
51+
ArduinoFakeInstance(Function)->delayMicroseconds(us);
52+
}
53+
54+
unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout)
55+
{
56+
return ArduinoFakeInstance(Function)->pulseIn(pin, state, timeout);
57+
}
58+
59+
unsigned long pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout)
60+
{
61+
return ArduinoFakeInstance(Function)->pulseInLong(pin, state, timeout);
62+
}
63+
64+
void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val)
65+
{
66+
ArduinoFakeInstance(Function)->shiftOut(dataPin, clockPin, bitOrder, val);
67+
}
68+
69+
uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder) {
70+
return ArduinoFakeInstance(Function)->shiftIn(dataPin, clockPin, bitOrder);
71+
}
72+
73+
void detachInterrupt(uint8_t interruptNum) {
74+
ArduinoFakeInstance(Function)->detachInterrupt(interruptNum);
75+
}
76+
77+
void tone(uint8_t pin, unsigned int frequency, unsigned long duration)
78+
{
79+
ArduinoFakeInstance(Function)->tone(pin, frequency, duration);
80+
}
81+
82+
void noTone(uint8_t pin)
83+
{
84+
ArduinoFakeInstance(Function)->noTone(pin);
85+
}
86+
87+
long random(long max)
88+
{
89+
return ArduinoFakeInstance(Function)->random(max);
90+
}
91+
92+
long random(long min, long max)
93+
{
94+
return ArduinoFakeInstance(Function)->random(min, max);
95+
}
96+
97+
void randomSeed(unsigned long seed)
98+
{
99+
return ArduinoFakeInstance(Function)->randomSeed(seed);
100+
}
101+
102+
long map(long value, long fromLow, long fromHigh, long toLow, long toHigh)
103+
{
104+
return ArduinoFakeInstance(Function)->map(value, fromLow, fromHigh, toLow, toHigh);
105+
}

‎src/FunctionFake.h

Copy file name to clipboard
+45Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#ifndef FUNCTION_FAKE_H
2+
#define FUNCTION_FAKE_H
3+
4+
#include <fakeit/fakeit.hpp>
5+
#include <arduino/Arduino.h>
6+
7+
struct FunctionFake
8+
{
9+
virtual void init(void) = 0;
10+
virtual void loop(void) = 0;
11+
virtual void setup(void) = 0;
12+
13+
virtual void pinMode(uint8_t, uint8_t) = 0;
14+
virtual void digitalWrite(uint8_t, uint8_t) = 0;
15+
virtual int digitalRead(uint8_t) = 0;
16+
17+
virtual int analogRead(uint8_t) = 0;
18+
virtual void analogReference(uint8_t) = 0;
19+
virtual void analogWrite(uint8_t, int) = 0;
20+
21+
virtual unsigned long millis(void) = 0;
22+
virtual unsigned long micros(void) = 0;
23+
24+
virtual void delay(unsigned long) = 0;
25+
virtual void delayMicroseconds(unsigned int) = 0;
26+
27+
virtual unsigned long pulseIn(uint8_t, uint8_t, unsigned long) = 0;
28+
virtual unsigned long pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout) = 0;
29+
30+
virtual void shiftOut(uint8_t, uint8_t, uint8_t, uint8_t) = 0;
31+
virtual uint8_t shiftIn(uint8_t, uint8_t, uint8_t) = 0;
32+
33+
virtual void detachInterrupt(uint8_t) = 0;
34+
35+
virtual void tone(uint8_t _pin, unsigned int frequency, unsigned long duration) = 0;
36+
virtual void noTone(uint8_t _pin) = 0;
37+
38+
virtual long random(long) = 0;
39+
virtual long random(long, long) = 0;
40+
virtual void randomSeed(unsigned long) = 0;
41+
42+
virtual long map(long, long, long, long, long) = 0;
43+
};
44+
45+
#endif // FUNCTION_FAKE_H

‎src/HardwareSerialFake.cpp

Copy file name to clipboard
+42Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#include "ArduinoFake.h"
2+
#include "HardwareSerialFake.h"
3+
4+
void HardwareSerial::begin(unsigned long baud, byte config)
5+
{
6+
return ArduinoFakeInstance(HardwareSerial)->begin(baud, config);
7+
}
8+
9+
void HardwareSerial::end()
10+
{
11+
return ArduinoFakeInstance(HardwareSerial)->end();
12+
}
13+
14+
int HardwareSerial::available(void)
15+
{
16+
return ArduinoFakeInstance(HardwareSerial)->available();
17+
}
18+
19+
int HardwareSerial::peek(void)
20+
{
21+
return ArduinoFakeInstance(HardwareSerial)->peek();
22+
}
23+
24+
int HardwareSerial::read(void)
25+
{
26+
return ArduinoFakeInstance(HardwareSerial)->read();
27+
}
28+
29+
int HardwareSerial::availableForWrite(void)
30+
{
31+
return ArduinoFakeInstance(HardwareSerial)->availableForWrite();
32+
}
33+
34+
void HardwareSerial::flush()
35+
{
36+
ArduinoFakeInstance(HardwareSerial)->flush();
37+
}
38+
39+
size_t HardwareSerial::write(uint8_t c)
40+
{
41+
return ArduinoFakeInstance(HardwareSerial)->write(c);
42+
}

‎src/HardwareSerialFake.h

Copy file name to clipboard
+20Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#ifndef HARDWARE_SERIAL_FAKE_H
2+
#define HARDWARE_SERIAL_FAKE_H
3+
4+
#include "ArduinoFake.h"
5+
#include "StreamFake.h"
6+
#include "arduino/HardwareSerial.h"
7+
8+
struct HardwareSerialFake : public StreamFake
9+
{
10+
virtual void begin(unsigned long, uint8_t) = 0;
11+
virtual void end() = 0;
12+
virtual int available(void) = 0;
13+
virtual int peek(void) = 0;
14+
virtual int read(void) = 0;
15+
virtual int availableForWrite(void) = 0;
16+
virtual void flush(void) = 0;
17+
virtual size_t write(uint8_t) = 0;
18+
};
19+
20+
#endif // HARDWARE_SERIAL_FAKE_H

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.