Skip to content

Commit d609a27

Browse files
committed
Refactoring mock getter
1 parent 93072b6 commit d609a27

File tree

9 files changed

+130
-154
lines changed

9 files changed

+130
-154
lines changed

src/ArduinoFake.h

Lines changed: 38 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -18,31 +18,28 @@
1818

1919
#include "arduino/Arduino.h"
2020

21-
#define ArduinoFakeGetFunction() ArduinoFakeGetter(Function)
22-
#define ArduinoFakeGetSerial() ArduinoFakeGetter(Serial)
23-
#define ArduinoFakeGetStream() ArduinoFakeGetter(Stream)
24-
#define ArduinoFakeGetClient() ArduinoFakeGetter(Client)
25-
#define ArduinoFakeGetPrint() ArduinoFakeGetter(Print)
26-
#define ArduinoFakeGet() ArduinoFakeGetter(Function)
27-
28-
#define ArduinoFake(mock) ArduinoFakeGet##mock()
29-
30-
#define ArduinoFakeGetter(mock) \
31-
getArduinoFakeContext()->Mocks->mock
21+
#define ArduinoFake(mock) _ArduinoFakeGet##mock()
3222

3323
#define ArduinoFakeReset() \
3424
getArduinoFakeContext()->reset()
3525

3626
#define ArduinoFakeInstance(mock, ...) \
3727
getArduinoFakeContext()->mock(__VA_ARGS__)
3828

39-
#define ArduinoFakeInstanceFake(mock, ...) \
40-
getArduinoFakeContext()->mock(__VA_ARGS__)
29+
#define ArduinoFakeMock(mock) \
30+
new mock##FakeProxy(ArduinoFakeInstance(mock))
4131

42-
#define ArduinoFakeMock(mock, ...) \
43-
new mock##FakeProxy(ArduinoFakeInstance(mock, __VA_ARGS__))
32+
#define _ArduinoFakeGetMock(mock) \
33+
getArduinoFakeContext()->Mocks->mock
34+
35+
#define _ArduinoFakeGetFunction() _ArduinoFakeGetMock(Function)
36+
#define _ArduinoFakeGetSerial() _ArduinoFakeGetMock(Serial)
37+
#define _ArduinoFakeGetStream() _ArduinoFakeGetMock(Stream)
38+
#define _ArduinoFakeGetClient() _ArduinoFakeGetMock(Client)
39+
#define _ArduinoFakeGetPrint() _ArduinoFakeGetMock(Print)
40+
#define _ArduinoFakeGet() _ArduinoFakeGetMock(Function)
4441

45-
#define ArduinoFakeSingleInstanceGetter(mock) \
42+
#define _ArduinoFakeInstanceGetter1(mock) \
4643
mock##Fake* mock() \
4744
{ \
4845
if (!this->Instances->mock){ \
@@ -51,6 +48,18 @@
5148
return this->Instances->mock; \
5249
}
5350

51+
#define _ArduinoFakeInstanceGetter2(name, clazz) \
52+
name##Fake* name(class clazz* instance) \
53+
{ \
54+
if (Mapping[instance]) { \
55+
return (name##Fake*) Mapping[instance]; \
56+
} \
57+
if (dynamic_cast<name##FakeProxy*>(instance)) { \
58+
return dynamic_cast<name##FakeProxy*>(instance)->get##name##Fake(); \
59+
} \
60+
throw std::runtime_error("Unknown instance"); \
61+
}
62+
5463
struct ArduinoFakeMocks
5564
{
5665
fakeit::Mock<FunctionFake> Function;
@@ -76,42 +85,20 @@ class ArduinoFakeContext
7685
ArduinoFakeMocks* Mocks = new ArduinoFakeMocks();
7786
std::map<void*, void*> Mapping;
7887

79-
ArduinoFakeSingleInstanceGetter(Print)
80-
ArduinoFakeSingleInstanceGetter(Stream)
81-
ArduinoFakeSingleInstanceGetter(Serial)
82-
ArduinoFakeSingleInstanceGetter(Client)
83-
ArduinoFakeSingleInstanceGetter(Function)
88+
_ArduinoFakeInstanceGetter1(Print)
89+
_ArduinoFakeInstanceGetter1(Stream)
90+
_ArduinoFakeInstanceGetter1(Serial)
91+
_ArduinoFakeInstanceGetter1(Client)
92+
_ArduinoFakeInstanceGetter1(Function)
8493

85-
ArduinoFakeContext()
86-
{
87-
Mapping[&::Serial] = this->Serial();
88-
}
89-
90-
PrintFake* Print(class Print* p)
91-
{
92-
if (!Mapping[p]) {
93-
throw std::runtime_error("Unknown Print instance");
94-
}
95-
96-
return (PrintFake*) Mapping[p];
97-
}
98-
99-
StreamFake* Stream(class Stream* s)
100-
{
101-
if (!Mapping[s]) {
102-
throw std::runtime_error("Unknown Stream instance");
103-
}
94+
_ArduinoFakeInstanceGetter2(Print, Print)
95+
_ArduinoFakeInstanceGetter2(Client, Client)
96+
_ArduinoFakeInstanceGetter2(Stream, Stream)
97+
_ArduinoFakeInstanceGetter2(Serial, Serial_)
10498

105-
return (StreamFake*) Mapping[s];
106-
}
107-
108-
SerialFake* Serial(class Serial_* s)
99+
ArduinoFakeContext()
109100
{
110-
if (!Mapping[s]) {
111-
throw std::runtime_error("Unknown Serial instance");
112-
}
113-
114-
return (SerialFake*) Mapping[s];
101+
this->reset();
115102
}
116103

117104
void reset(void)
@@ -123,6 +110,8 @@ class ArduinoFakeContext
123110
this->Mocks->Serial.Reset();
124111
this->Mocks->Client.Reset();
125112
this->Mocks->Print.Reset();
113+
114+
Mapping[&::Serial] = this->Serial();
126115
}
127116
};
128117

src/ClientFake.cpp

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,68 +2,59 @@
22
#include "ClientFake.h"
33
#include <stdexcept>
44

5-
ClientFake* getClientFakeProxy(Client* client)
6-
{
7-
if (ClientFakeProxy* p = dynamic_cast<ClientFakeProxy*>(client)) {
8-
return p->clientFake;
9-
}
10-
11-
throw std::runtime_error("Invalid fake instance");
12-
}
13-
145
int Client::connect(IPAddress ip, uint16_t port)
156
{
16-
return getClientFakeProxy(this)->connect(ip, port);
7+
return ArduinoFakeInstance(Client, this)->connect(ip, port);
178
}
189

1910
int Client::connect(const char *host, uint16_t port)
2011
{
21-
return getClientFakeProxy(this)->connect(host, port);
12+
return ArduinoFakeInstance(Client, this)->connect(host, port);
2213
}
2314

2415
size_t Client::write(uint8_t value)
2516
{
26-
return getClientFakeProxy(this)->write(value);
17+
return ArduinoFakeInstance(Client, this)->write(value);
2718
}
2819

2920
size_t Client::write(const uint8_t *buf, size_t size)
3021
{
31-
return getClientFakeProxy(this)->write(buf, size);
22+
return ArduinoFakeInstance(Client, this)->write(buf, size);
3223
}
3324

3425
int Client::available()
3526
{
36-
return getClientFakeProxy(this)->available();
27+
return ArduinoFakeInstance(Client, this)->available();
3728
}
3829

3930
int Client::read()
4031
{
41-
return getClientFakeProxy(this)->read();
32+
return ArduinoFakeInstance(Client, this)->read();
4233
}
4334

4435
int Client::read(uint8_t *buf, size_t size)
4536
{
46-
return getClientFakeProxy(this)->read(buf, size);
37+
return ArduinoFakeInstance(Client, this)->read(buf, size);
4738
}
4839

4940
int Client::peek()
5041
{
51-
return getClientFakeProxy(this)->peek();
42+
return ArduinoFakeInstance(Client, this)->peek();
5243
}
5344

5445
void Client::flush()
5546
{
56-
return getClientFakeProxy(this)->flush();
47+
return ArduinoFakeInstance(Client, this)->flush();
5748
}
5849

5950
void Client::stop()
6051
{
61-
return getClientFakeProxy(this)->stop();
52+
return ArduinoFakeInstance(Client, this)->stop();
6253
}
6354

6455
uint8_t Client::connected()
6556
{
66-
return getClientFakeProxy(this)->connected();
57+
return ArduinoFakeInstance(Client, this)->connected();
6758
}
6859

6960
Client::operator bool()

src/ClientFake.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,10 @@ struct ClientFake : public StreamFake
3131

3232
class ClientFakeProxy : public StreamFakeProxy, public Client
3333
{
34-
public:
34+
private:
3535
ClientFake* clientFake;
3636

37+
public:
3738
ClientFakeProxy(ClientFake* fake) : StreamFakeProxy(fake)
3839
{
3940
clientFake = fake;
@@ -95,4 +96,9 @@ class ClientFakeProxy : public StreamFakeProxy, public Client
9596
}
9697

9798
virtual operator bool();
99+
100+
ClientFake* getClientFake()
101+
{
102+
return clientFake;
103+
}
98104
};

src/PrintFake.cpp

Lines changed: 25 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,136 +1,127 @@
11
#include "ArduinoFake.h"
22
#include "PrintFake.h"
33

4-
PrintFake* getPrintFakeProxy(Print* print)
5-
{
6-
if (PrintFakeProxy* p = dynamic_cast<PrintFakeProxy*>(print)) {
7-
return p->printFake;
8-
}
9-
10-
return ArduinoFakeInstance(Print, print);
11-
}
12-
134
size_t Print::write(const uint8_t *buffer, size_t size)
145
{
15-
return getPrintFakeProxy(this)->write(buffer, size);
6+
return ArduinoFakeInstance(Print, this)->write(buffer, size);
167
}
178

189
size_t Print::print(const __FlashStringHelper *ifsh)
1910
{
20-
return getPrintFakeProxy(this)->print(ifsh);
11+
return ArduinoFakeInstance(Print, this)->print(ifsh);
2112
}
2213

2314
size_t Print::print(const String &s)
2415
{
25-
return getPrintFakeProxy(this)->print(s);
16+
return ArduinoFakeInstance(Print, this)->print(s);
2617
}
2718

2819
size_t Print::print(const char str[])
2920
{
30-
return getPrintFakeProxy(this)->print(str);
21+
return ArduinoFakeInstance(Print, this)->print(str);
3122
}
3223

3324
size_t Print::write(uint8_t u)
3425
{
35-
return getPrintFakeProxy(this)->write(u);
26+
return ArduinoFakeInstance(Print, this)->write(u);
3627
}
3728

3829
size_t Print::print(char c)
3930
{
40-
return getPrintFakeProxy(this)->print(c);
31+
return ArduinoFakeInstance(Print, this)->print(c);
4132
}
4233

4334
size_t Print::print(unsigned char b, int base)
4435
{
45-
return getPrintFakeProxy(this)->print(b, base);
36+
return ArduinoFakeInstance(Print, this)->print(b, base);
4637
}
4738

4839
size_t Print::print(int n, int base)
4940
{
50-
return getPrintFakeProxy(this)->print(n, base);
41+
return ArduinoFakeInstance(Print, this)->print(n, base);
5142
}
5243

5344
size_t Print::print(unsigned int n, int base)
5445
{
55-
return getPrintFakeProxy(this)->print(n, base);
46+
return ArduinoFakeInstance(Print, this)->print(n, base);
5647
}
5748

5849
size_t Print::print(long n, int base)
5950
{
60-
return getPrintFakeProxy(this)->print(n, base);
51+
return ArduinoFakeInstance(Print, this)->print(n, base);
6152
}
6253

6354
size_t Print::print(unsigned long n, int base)
6455
{
65-
return getPrintFakeProxy(this)->print(n, base);
56+
return ArduinoFakeInstance(Print, this)->print(n, base);
6657
}
6758

6859
size_t Print::print(double n, int digits)
6960
{
70-
return getPrintFakeProxy(this)->print(n, digits);
61+
return ArduinoFakeInstance(Print, this)->print(n, digits);
7162
}
7263

7364
size_t Print::print(const Printable& x)
7465
{
75-
return getPrintFakeProxy(this)->print(x);
66+
return ArduinoFakeInstance(Print, this)->print(x);
7667
}
7768

7869
size_t Print::println(const __FlashStringHelper *ifsh)
7970
{
80-
return getPrintFakeProxy(this)->println(ifsh);
71+
return ArduinoFakeInstance(Print, this)->println(ifsh);
8172
}
8273

8374
size_t Print::println(void)
8475
{
85-
return getPrintFakeProxy(this)->println();
76+
return ArduinoFakeInstance(Print, this)->println();
8677
}
8778

8879
size_t Print::println(const String &s)
8980
{
90-
return getPrintFakeProxy(this)->println(s);
81+
return ArduinoFakeInstance(Print, this)->println(s);
9182
}
9283

9384
size_t Print::println(const char c[])
9485
{
95-
return getPrintFakeProxy(this)->println(c);
86+
return ArduinoFakeInstance(Print, this)->println(c);
9687
}
9788

9889
size_t Print::println(char c)
9990
{
100-
return getPrintFakeProxy(this)->println(c);
91+
return ArduinoFakeInstance(Print, this)->println(c);
10192
}
10293

10394
size_t Print::println(unsigned char b, int base)
10495
{
105-
return getPrintFakeProxy(this)->println(b, base);
96+
return ArduinoFakeInstance(Print, this)->println(b, base);
10697
}
10798

10899
size_t Print::println(int num, int base)
109100
{
110-
return getPrintFakeProxy(this)->println(num, base);
101+
return ArduinoFakeInstance(Print, this)->println(num, base);
111102
}
112103

113104
size_t Print::println(unsigned int num, int base)
114105
{
115-
return getPrintFakeProxy(this)->println(num, base);
106+
return ArduinoFakeInstance(Print, this)->println(num, base);
116107
}
117108

118109
size_t Print::println(long num, int base)
119110
{
120-
return getPrintFakeProxy(this)->println(num, base);
111+
return ArduinoFakeInstance(Print, this)->println(num, base);
121112
}
122113

123114
size_t Print::println(unsigned long num, int base)
124115
{
125-
return getPrintFakeProxy(this)->println(num, base);
116+
return ArduinoFakeInstance(Print, this)->println(num, base);
126117
}
127118

128119
size_t Print::println(double num, int digits)
129120
{
130-
return getPrintFakeProxy(this)->println(num, digits);
121+
return ArduinoFakeInstance(Print, this)->println(num, digits);
131122
}
132123

133124
size_t Print::println(const Printable& x)
134125
{
135-
return getPrintFakeProxy(this)->println(x);
126+
return ArduinoFakeInstance(Print, this)->println(x);
136127
}

0 commit comments

Comments
 (0)