forked from FabioBatSilva/ArduinoFake
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathArduinoFake.h
145 lines (122 loc) · 4.11 KB
/
ArduinoFake.h
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
#pragma once
// clang-format off
#if !defined(UBRRH) && !defined(UBRR0H) && !defined(USBCON)
#define USBCON
#endif
#include <unordered_map>
#include <cstring>
#include <cstdint>
#include <stdexcept>
#include "fakeit.hpp"
#include "arduino/Arduino.h"
#include "Function.h"
#include "Stream.h"
#include "Serial.h"
#include "Wire.h"
#include "Client.h"
#include "Print.h"
#include "SPI.h"
#include "EEPROM.h"
#define ArduinoFake(mock) _ArduinoFakeGet##mock()
#define ArduinoFakeReset() \
getArduinoFakeContext()->reset()
#define ArduinoFakeInstance(mock, ...) \
getArduinoFakeContext()->mock(__VA_ARGS__)
#define ArduinoFakeMock(mock) \
new mock##FakeProxy(ArduinoFakeInstance(mock))
#define _ArduinoFakeGetMock(mock) \
getArduinoFakeContext()->Mocks->mock
#define _ArduinoFakeGetFunction() _ArduinoFakeGetMock(Function)
#define _ArduinoFakeGetSerial() _ArduinoFakeGetMock(Serial)
#define _ArduinoFakeGetWire() _ArduinoFakeGetMock(Wire)
#define _ArduinoFakeGetSPI() _ArduinoFakeGetMock(SPI)
#define _ArduinoFakeGetEEPROM() _ArduinoFakeGetMock(EEPROM)
#define _ArduinoFakeGetStream() _ArduinoFakeGetMock(Stream)
#define _ArduinoFakeGetClient() _ArduinoFakeGetMock(Client)
#define _ArduinoFakeGetPrint() _ArduinoFakeGetMock(Print)
#define _ArduinoFakeGet() _ArduinoFakeGetMock(Function)
#define _ArduinoFakeInstanceGetter1(mock) \
mock##Fake* mock() \
{ \
if (!this->Instances->mock){ \
this->Instances->mock = &this->Mocks->mock.get(); \
} \
return this->Instances->mock; \
}
#define _ArduinoFakeInstanceGetter2(name, clazz) \
name##Fake* name(class clazz* instance) \
{ \
if (Mapping[instance]) { \
return (name##Fake*) Mapping[instance]; \
} \
if (dynamic_cast<name##FakeProxy*>(instance)) { \
return dynamic_cast<name##FakeProxy*>(instance)->get##name##Fake(); \
} \
throw std::runtime_error("Unknown instance"); \
}
struct ArduinoFakeMocks
{
fakeit::Mock<FunctionFake> Function;
fakeit::Mock<SerialFake> Serial;
fakeit::Mock<WireFake> Wire;
fakeit::Mock<StreamFake> Stream;
fakeit::Mock<ClientFake> Client;
fakeit::Mock<PrintFake> Print;
fakeit::Mock<SPIFake> SPI;
fakeit::Mock<EEPROMFake> EEPROM;
};
struct ArduinoFakeInstances
{
FunctionFake* Function;
SerialFake* Serial;
WireFake* Wire;
StreamFake* Stream;
ClientFake* Client;
PrintFake* Print;
SPIFake* SPI;
EEPROMFake* EEPROM;
};
class ArduinoFakeContext
{
public:
ArduinoFakeInstances* Instances = new ArduinoFakeInstances();
ArduinoFakeMocks* Mocks = new ArduinoFakeMocks();
std::unordered_map<void*, void*> Mapping;
_ArduinoFakeInstanceGetter1(Print)
_ArduinoFakeInstanceGetter1(Stream)
_ArduinoFakeInstanceGetter1(Serial)
_ArduinoFakeInstanceGetter1(Wire)
_ArduinoFakeInstanceGetter1(Client)
_ArduinoFakeInstanceGetter1(Function)
_ArduinoFakeInstanceGetter1(SPI)
_ArduinoFakeInstanceGetter1(EEPROM)
_ArduinoFakeInstanceGetter2(Print, Print)
_ArduinoFakeInstanceGetter2(Client, Client)
_ArduinoFakeInstanceGetter2(Stream, Stream)
_ArduinoFakeInstanceGetter2(Serial, Serial_)
_ArduinoFakeInstanceGetter2(Wire, TwoWire)
_ArduinoFakeInstanceGetter2(SPI, SPIClass)
_ArduinoFakeInstanceGetter2(EEPROM, EEPROMClass)
ArduinoFakeContext()
{
this->reset();
}
void reset(void)
{
this->Instances = new ArduinoFakeInstances();
this->Mocks->Function.Reset();
this->Mocks->Stream.Reset();
this->Mocks->Serial.Reset();
this->Mocks->Wire.Reset();
this->Mocks->Client.Reset();
this->Mocks->Print.Reset();
this->Mocks->SPI.Reset();
this->Mocks->EEPROM.Reset();
Mapping[&::Serial] = this->Serial();
Mapping[&::Wire] = this->Wire();
Mapping[&::SPI] = this->SPI();
Mapping[&::EEPROM] = this->EEPROM();
}
};
ArduinoFakeContext* getArduinoFakeContext();
// clang-format on