Skip to content

Commit 896b242

Browse files
committed
Add support for faking (Two|)Wire
1 parent 70801be commit 896b242

File tree

6 files changed

+296
-0
lines changed

6 files changed

+296
-0
lines changed

src/ArduinoFake.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "FunctionFake.h"
1616
#include "StreamFake.h"
1717
#include "SerialFake.h"
18+
#include "WireFake.h"
1819
#include "ClientFake.h"
1920
#include "PrintFake.h"
2021

@@ -34,6 +35,7 @@
3435

3536
#define _ArduinoFakeGetFunction() _ArduinoFakeGetMock(Function)
3637
#define _ArduinoFakeGetSerial() _ArduinoFakeGetMock(Serial)
38+
#define _ArduinoFakeGetWire() _ArduinoFakeGetMock(Wire)
3739
#define _ArduinoFakeGetStream() _ArduinoFakeGetMock(Stream)
3840
#define _ArduinoFakeGetClient() _ArduinoFakeGetMock(Client)
3941
#define _ArduinoFakeGetPrint() _ArduinoFakeGetMock(Print)
@@ -64,6 +66,7 @@ struct ArduinoFakeMocks
6466
{
6567
fakeit::Mock<FunctionFake> Function;
6668
fakeit::Mock<SerialFake> Serial;
69+
fakeit::Mock<WireFake> Wire;
6770
fakeit::Mock<StreamFake> Stream;
6871
fakeit::Mock<ClientFake> Client;
6972
fakeit::Mock<PrintFake> Print;
@@ -73,6 +76,7 @@ struct ArduinoFakeInstances
7376
{
7477
FunctionFake* Function;
7578
SerialFake* Serial;
79+
WireFake* Wire;
7680
StreamFake* Stream;
7781
ClientFake* Client;
7882
PrintFake* Print;
@@ -88,13 +92,15 @@ class ArduinoFakeContext
8892
_ArduinoFakeInstanceGetter1(Print)
8993
_ArduinoFakeInstanceGetter1(Stream)
9094
_ArduinoFakeInstanceGetter1(Serial)
95+
_ArduinoFakeInstanceGetter1(Wire)
9196
_ArduinoFakeInstanceGetter1(Client)
9297
_ArduinoFakeInstanceGetter1(Function)
9398

9499
_ArduinoFakeInstanceGetter2(Print, Print)
95100
_ArduinoFakeInstanceGetter2(Client, Client)
96101
_ArduinoFakeInstanceGetter2(Stream, Stream)
97102
_ArduinoFakeInstanceGetter2(Serial, Serial_)
103+
_ArduinoFakeInstanceGetter2(Wire, TwoWire)
98104

99105
ArduinoFakeContext()
100106
{
@@ -108,10 +114,12 @@ class ArduinoFakeContext
108114
this->Mocks->Function.Reset();
109115
this->Mocks->Stream.Reset();
110116
this->Mocks->Serial.Reset();
117+
this->Mocks->Wire.Reset();
111118
this->Mocks->Client.Reset();
112119
this->Mocks->Print.Reset();
113120

114121
Mapping[&::Serial] = this->Serial();
122+
Mapping[&::Wire] = this->Wire();
115123
}
116124
};
117125

src/WireFake.cpp

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
#include "ArduinoFake.h"
2+
#include "WireFake.h"
3+
4+
void TwoWire::begin(void) { ArduinoFakeInstance(Wire, this)->begin(); }
5+
6+
void TwoWire::begin(uint8_t address) {
7+
8+
ArduinoFakeInstance(Wire, this)->begin(address);
9+
}
10+
11+
void TwoWire::begin(int address) {
12+
ArduinoFakeInstance(Wire, this)->begin(address);
13+
}
14+
15+
void TwoWire::end(void) { ArduinoFakeInstance(Wire, this)->end(); }
16+
17+
void TwoWire::setClock(uint32_t clock) {
18+
ArduinoFakeInstance(Wire, this)->setClock(clock);
19+
}
20+
21+
void TwoWire::setWireTimeout(uint32_t timeout, bool reset_with_timeout) {
22+
ArduinoFakeInstance(Wire, this)->setWireTimeout(timeout, reset_with_timeout);
23+
}
24+
25+
bool TwoWire::getWireTimeoutFlag(void) {
26+
return ArduinoFakeInstance(Wire, this)->getWireTimeoutFlag();
27+
}
28+
29+
void TwoWire::clearWireTimeoutFlag(void) {
30+
ArduinoFakeInstance(Wire, this)->clearWireTimeoutFlag();
31+
}
32+
33+
uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity,
34+
uint32_t iaddress, uint8_t isize,
35+
uint8_t sendStop) {
36+
return ArduinoFakeInstance(Wire, this)
37+
->requestFrom(address, quantity, iaddress, isize, sendStop);
38+
}
39+
40+
uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity,
41+
uint8_t sendStop) {
42+
return ArduinoFakeInstance(Wire, this)
43+
->requestFrom(address, quantity, sendStop);
44+
}
45+
46+
uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity) {
47+
return ArduinoFakeInstance(Wire, this)->requestFrom(address, quantity);
48+
}
49+
50+
void TwoWire::beginTransmission(uint8_t address) {
51+
ArduinoFakeInstance(Wire, this)->beginTransmission(address);
52+
}
53+
54+
void TwoWire::beginTransmission(int address) {
55+
ArduinoFakeInstance(Wire, this)->beginTransmission(address);
56+
}
57+
58+
uint8_t TwoWire::endTransmission(bool sendStop) {
59+
60+
return ArduinoFakeInstance(Wire, this)->endTransmission(sendStop);
61+
}
62+
63+
uint8_t TwoWire::endTransmission(void) {
64+
return ArduinoFakeInstance(Wire, this)->endTransmission();
65+
}
66+
67+
size_t TwoWire::write(uint8_t data) {
68+
return ArduinoFakeInstance(Wire, this)->write(data);
69+
}
70+
71+
size_t TwoWire::write(const uint8_t *data, size_t quantity) {
72+
return ArduinoFakeInstance(Wire, this)->write(data, quantity);
73+
}
74+
75+
int TwoWire::available(void) {
76+
return ArduinoFakeInstance(Wire, this)->available();
77+
}
78+
79+
int TwoWire::read(void) { return ArduinoFakeInstance(Wire, this)->read(); }
80+
81+
int TwoWire::peek(void) { return ArduinoFakeInstance(Wire, this)->peek(); }
82+
83+
void TwoWire::flush(void) { ArduinoFakeInstance(Wire, this)->flush(); }
84+
85+
void TwoWire::onReceive(void (*function)(int)) {
86+
ArduinoFakeInstance(Wire, this)->onReceive(function);
87+
}
88+
89+
void TwoWire::onRequest(void (*function)(void)) {
90+
ArduinoFakeInstance(Wire, this)->onRequest(function);
91+
}
92+
93+
TwoWire Wire = WireFakeProxy(ArduinoFakeInstance(Wire));

src/WireFake.h

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#pragma once
2+
#include "ArduinoFake.h"
3+
#include "StreamFake.h"
4+
#include "arduino/Wire.h"
5+
6+
struct WireFake : public StreamFake {
7+
virtual void begin() = 0;
8+
virtual void begin(uint8_t) = 0;
9+
virtual void begin(int) = 0;
10+
virtual void end() = 0;
11+
virtual void setClock(uint32_t) = 0;
12+
virtual void setWireTimeout(uint32_t timeout = 25000,
13+
bool reset_with_timeout = false) = 0;
14+
virtual bool getWireTimeoutFlag(void) = 0;
15+
virtual void clearWireTimeoutFlag(void) = 0;
16+
virtual void beginTransmission(uint8_t) = 0;
17+
virtual void beginTransmission(int) = 0;
18+
virtual uint8_t endTransmission(void) = 0;
19+
virtual uint8_t endTransmission(bool) = 0;
20+
virtual uint8_t requestFrom(uint8_t, uint8_t) = 0;
21+
virtual uint8_t requestFrom(uint8_t, uint8_t, uint8_t) = 0;
22+
virtual uint8_t requestFrom(uint8_t, uint8_t, uint32_t, uint8_t, uint8_t) = 0;
23+
virtual size_t write(uint8_t) = 0;
24+
virtual size_t write(const uint8_t *, size_t) = 0;
25+
virtual int available(void) = 0;
26+
virtual int read(void) = 0;
27+
virtual int peek(void) = 0;
28+
virtual void flush(void) = 0;
29+
virtual void onReceive(void (*)(int)) = 0;
30+
virtual void onRequest(void (*)(void)) = 0;
31+
};
32+
33+
class WireFakeProxy : public StreamFakeProxy, public TwoWire {
34+
private:
35+
WireFake *wireFake;
36+
37+
public:
38+
WireFakeProxy(WireFake *fake) : StreamFakeProxy(fake) { wireFake = fake; }
39+
40+
WireFake *getWireFake() { return wireFake; }
41+
};

src/arduino/Wire.h

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#ifndef TwoWire_h
2+
#define TwoWire_h
3+
4+
#include "Stream.h"
5+
#include <inttypes.h>
6+
7+
class TwoWire : public Stream {
8+
public:
9+
void begin();
10+
void begin(uint8_t);
11+
void begin(int);
12+
void end();
13+
void setClock(uint32_t);
14+
void setWireTimeout(uint32_t timeout = 25000,
15+
bool reset_with_timeout = false);
16+
bool getWireTimeoutFlag(void);
17+
void clearWireTimeoutFlag(void);
18+
void beginTransmission(uint8_t);
19+
void beginTransmission(int);
20+
uint8_t endTransmission(void);
21+
uint8_t endTransmission(bool);
22+
uint8_t requestFrom(uint8_t, uint8_t);
23+
uint8_t requestFrom(uint8_t, uint8_t, uint8_t);
24+
uint8_t requestFrom(uint8_t, uint8_t, uint32_t, uint8_t, uint8_t);
25+
virtual size_t write(uint8_t);
26+
virtual size_t write(const uint8_t *, size_t);
27+
virtual int available(void);
28+
virtual int read(void);
29+
virtual int peek(void);
30+
virtual void flush(void);
31+
void onReceive(void (*)(int));
32+
void onRequest(void (*)(void));
33+
34+
inline size_t write(unsigned long n) { return write((uint8_t)n); }
35+
inline size_t write(long n) { return write((uint8_t)n); }
36+
inline size_t write(unsigned int n) { return write((uint8_t)n); }
37+
inline size_t write(int n) { return write((uint8_t)n); }
38+
using Print::write;
39+
};
40+
41+
extern TwoWire Wire;
42+
43+
#endif

test/main.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ using namespace fakeit;
99
#include "test_print.h"
1010
#include "test_stream.h"
1111
#include "test_serial.h"
12+
#include "test_wire.h"
1213
#include "test_client.h"
1314
#include "test_arduino_string.h"
1415
#include "test_include.h"
@@ -36,6 +37,7 @@ int main(int argc, char **argv)
3637
RUN_TEST_GROUP(PrintTest);
3738
RUN_TEST_GROUP(StreamTest);
3839
RUN_TEST_GROUP(SerialTest);
40+
RUN_TEST_GROUP(WireTest);
3941
RUN_TEST_GROUP(ClientTest);
4042
RUN_TEST_GROUP(IncludeTest);
4143

test/test_wire.h

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
#ifdef UNIT_TEST
2+
3+
namespace WireTest {
4+
void test_extends_stream(void) {
5+
TEST_ASSERT_NOT_EQUAL(ArduinoFakeInstance(Stream), ArduinoFakeInstance(Wire));
6+
7+
char print_char_var = 'A';
8+
char stream_char_var = 'B';
9+
10+
int print_int_var = 123;
11+
int stream_int_var = 321;
12+
13+
When(OverloadedMethod(ArduinoFake(Stream), print, size_t(char)))
14+
.AlwaysReturn();
15+
When(OverloadedMethod(ArduinoFake(Stream), print, size_t(int, int)))
16+
.AlwaysReturn();
17+
18+
When(OverloadedMethod(ArduinoFake(Wire), print, size_t(char))).AlwaysReturn();
19+
When(OverloadedMethod(ArduinoFake(Wire), print, size_t(int, int)))
20+
.AlwaysReturn();
21+
22+
Stream *stream = ArduinoFakeMock(Stream);
23+
TwoWire *wire = ArduinoFakeMock(Wire);
24+
25+
stream->print(stream_char_var);
26+
stream->print(stream_int_var, DEC);
27+
28+
wire->print(print_char_var);
29+
wire->print(print_int_var, DEC);
30+
31+
Verify(OverloadedMethod(ArduinoFake(Stream), print, size_t(char))
32+
.Using(stream_char_var))
33+
.Once();
34+
Verify(OverloadedMethod(ArduinoFake(Stream), print, size_t(int, int))
35+
.Using(stream_int_var, DEC))
36+
.Once();
37+
38+
Verify(OverloadedMethod(ArduinoFake(Wire), print, size_t(char))
39+
.Using(print_char_var))
40+
.Once();
41+
Verify(OverloadedMethod(ArduinoFake(Wire), print, size_t(int, int))
42+
.Using(print_int_var, DEC))
43+
.Once();
44+
}
45+
46+
void test_global_wire(void) {
47+
When(Method(ArduinoFake(Wire), available)).Return(1);
48+
When(OverloadedMethod(ArduinoFake(Wire), print, size_t(char))).Return(1);
49+
50+
TEST_ASSERT_EQUAL(1, Wire.available());
51+
TEST_ASSERT_EQUAL(1, Wire.print('A'));
52+
53+
Verify(Method(ArduinoFake(Wire), available)).Once();
54+
Verify(OverloadedMethod(ArduinoFake(Wire), print, size_t(char)).Using('A'))
55+
.Once();
56+
}
57+
58+
void test_basics(void) {
59+
60+
uint8_t device_addr = 0xab;
61+
uint8_t register_addr = 0xcd;
62+
int num_bytes_to_read = 1;
63+
bool send_stop = false;
64+
When(OverloadedMethod(ArduinoFake(Wire), begin, void(void))).AlwaysReturn();
65+
When(OverloadedMethod(ArduinoFake(Wire), beginTransmission, void(uint8_t)))
66+
.AlwaysReturn();
67+
When(OverloadedMethod(ArduinoFake(Wire), write, size_t(uint8_t)))
68+
.Return(true);
69+
When(OverloadedMethod(ArduinoFake(Wire), endTransmission, uint8_t(bool)))
70+
.Return(0);
71+
When(OverloadedMethod(ArduinoFake(Wire), requestFrom, uint8_t(uint8_t, uint8_t)))
72+
.Return(0);
73+
When(OverloadedMethod(ArduinoFake(Wire), available, int(void))).Return(1);
74+
When(OverloadedMethod(ArduinoFake(Wire), read, int(void))).Return(1);
75+
76+
Wire.begin();
77+
Wire.beginTransmission(device_addr);
78+
Wire.write(register_addr);
79+
Wire.endTransmission(send_stop);
80+
Wire.requestFrom(device_addr, num_bytes_to_read);
81+
if (Wire.available()) {
82+
Wire.read();
83+
}
84+
85+
Verify(OverloadedMethod(ArduinoFake(Wire), begin, void(void))).Exactly(1);
86+
Verify(OverloadedMethod(ArduinoFake(Wire), beginTransmission, void(uint8_t))
87+
.Using(device_addr))
88+
.Exactly(1);
89+
Verify(OverloadedMethod(ArduinoFake(Wire), write, size_t(uint8_t))
90+
.Using(register_addr))
91+
.Exactly(1);
92+
Verify(OverloadedMethod(ArduinoFake(Wire), endTransmission, uint8_t(bool))
93+
.Using(send_stop))
94+
.Exactly(1);
95+
Verify(OverloadedMethod(ArduinoFake(Wire), requestFrom, uint8_t(uint8_t, uint8_t))
96+
.Using(device_addr, num_bytes_to_read))
97+
.Exactly(1);
98+
Verify(OverloadedMethod(ArduinoFake(Wire), available, int(void))).Exactly(1);
99+
Verify(OverloadedMethod(ArduinoFake(Wire), read, int(void))).Exactly(1);
100+
}
101+
102+
void run_tests() {
103+
RUN_TEST(WireTest::test_extends_stream);
104+
RUN_TEST(WireTest::test_global_wire);
105+
RUN_TEST(WireTest::test_basics);
106+
}
107+
} // namespace WireTest
108+
109+
#endif

0 commit comments

Comments
 (0)