Skip to content

Commit df29445

Browse files
committed
[core][utest] add Print test cases
1 parent e92b774 commit df29445

8 files changed

+495
-0
lines changed

core/utest/Print/mock/PrintMock.h

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* Copyright (c) 2020 Arduino. All rights reserved.
3+
*
4+
* SPDX-License-Identifier: LGPL-2.1-or-later
5+
*/
6+
7+
#ifndef PRINT_MOCK_H_
8+
#define PRINT_MOCK_H_
9+
10+
/**************************************************************************************
11+
* INCLUDE
12+
**************************************************************************************/
13+
14+
#include <WString.h>
15+
16+
#include <Print.h>
17+
18+
/**************************************************************************************
19+
* CLASS DECLARATION
20+
**************************************************************************************/
21+
22+
class PrintMock : public Print
23+
{
24+
public:
25+
String _str;
26+
size_t write(uint8_t b) { _str += static_cast<char>(b); return 1;};
27+
void mock_setWriteError() { setWriteError(); }
28+
void mock_setWriteError(int err) { setWriteError(err); }
29+
};
30+
31+
#endif /* PRINT_MOCK_H_ */

core/utest/Print/mock/PrintableMock.h

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* Copyright (c) 2020 Arduino. All rights reserved.
3+
*
4+
* SPDX-License-Identifier: LGPL-2.1-or-later
5+
*/
6+
7+
#ifndef PRINTABLE_MOCK_H_
8+
#define PRINTABLE_MOCK_H_
9+
10+
/**************************************************************************************
11+
* CLASS DECLARATION
12+
**************************************************************************************/
13+
14+
class PrintableMock : public Printable
15+
{
16+
public:
17+
int _i;
18+
virtual size_t printTo(Print& p) const override
19+
{
20+
size_t written = 0;
21+
written += p.print("PrintableMock i = ");
22+
written += p.print(_i);
23+
return written;
24+
}
25+
};
26+
27+
#endif /* PRINTABLE_MOCK_H_ */
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/*
2+
* Copyright (c) 2020 Arduino. All rights reserved.
3+
*
4+
* SPDX-License-Identifier: LGPL-2.1-or-later
5+
*/
6+
7+
/**************************************************************************************
8+
* TEST CODE
9+
**************************************************************************************/
10+
11+
TEST_CASE ("Print::availableForWrite() should return 0 if not overwritten by derived class", "[Print-availableForWrite-01]")
12+
{
13+
PrintMock mock;
14+
REQUIRE(mock.availableForWrite() == 0);
15+
}
+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/*
2+
* Copyright (c) 2020 Arduino. All rights reserved.
3+
*
4+
* SPDX-License-Identifier: LGPL-2.1-or-later
5+
*/
6+
7+
/**************************************************************************************
8+
* TEST CODE
9+
**************************************************************************************/
10+
11+
TEST_CASE ("Clear write error should set the error code back to 0", "[Print-clearWriteError-01]")
12+
{
13+
PrintMock mock;
14+
mock.mock_setWriteError(5);
15+
mock.clearWriteError();
16+
REQUIRE(mock.getWriteError() == 0);
17+
}
+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*
2+
* Copyright (c) 2020 Arduino. All rights reserved.
3+
*
4+
* SPDX-License-Identifier: LGPL-2.1-or-later
5+
*/
6+
7+
/**************************************************************************************
8+
* TEST CODE
9+
**************************************************************************************/
10+
11+
TEST_CASE ("No write error has been set", "[Print-getWriteError-01]")
12+
{
13+
PrintMock mock;
14+
REQUIRE(mock.getWriteError() == 0);
15+
}
16+
17+
TEST_CASE ("A write error has been set", "[Print-getWriteError-02]")
18+
{
19+
PrintMock mock;
20+
mock.mock_setWriteError(5);
21+
REQUIRE(mock.getWriteError() == 5);
22+
}

core/utest/Print/test_print.cpp

+186
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
/*
2+
* Copyright (c) 2020 Arduino. All rights reserved.
3+
*
4+
* SPDX-License-Identifier: LGPL-2.1-or-later
5+
*/
6+
7+
/**************************************************************************************
8+
* TEST CODE
9+
**************************************************************************************/
10+
11+
TEST_CASE ("Print::print(char)", "[Print-print-01]")
12+
{
13+
PrintMock mock;
14+
15+
mock.print('A');
16+
17+
REQUIRE(mock._str == "A");
18+
}
19+
20+
TEST_CASE ("Print::print(const String &)", "[Print-print-02]")
21+
{
22+
PrintMock mock;
23+
String const str("Test String");
24+
25+
mock.print(str);
26+
27+
REQUIRE(mock._str == "Test String");
28+
}
29+
30+
TEST_CASE ("Print::print(const char str[])", "[Print-print-03]")
31+
{
32+
PrintMock mock;
33+
const char str[] = "Test String";
34+
35+
mock.print(str);
36+
37+
REQUIRE(mock._str == "Test String");
38+
}
39+
40+
TEST_CASE ("Print::print(int, int = DEC|HEX|OCT|BIN)", "[Print-print-04]")
41+
{
42+
PrintMock mock;
43+
44+
int const val = -1;
45+
46+
WHEN("DEC") { mock.print(val, DEC); REQUIRE(mock._str == "-1"); }
47+
WHEN("HEX") { mock.print(val, HEX); REQUIRE(mock._str == "FFFFFFFFFFFFFFFF"); }
48+
WHEN("OCT") { mock.print(val, OCT); REQUIRE(mock._str == "1777777777777777777777"); }
49+
WHEN("BIN") { mock.print(val, BIN); REQUIRE(mock._str == "1111111111111111111111111111111111111111111111111111111111111111"); }
50+
}
51+
52+
TEST_CASE ("Print::print(unsigned int, int = DEC|HEX|OCT|BIN)", "[Print-print-05]")
53+
{
54+
PrintMock mock;
55+
56+
unsigned int const val = 17;
57+
58+
WHEN("DEC") { mock.print(val, DEC); REQUIRE(mock._str == "17"); }
59+
WHEN("HEX") { mock.print(val, HEX); REQUIRE(mock._str == "11"); }
60+
WHEN("OCT") { mock.print(val, OCT); REQUIRE(mock._str == "21"); }
61+
WHEN("BIN") { mock.print(val, BIN); REQUIRE(mock._str == "10001"); }
62+
}
63+
64+
TEST_CASE ("Print::print(long, int = DEC|HEX|OCT|BIN)", "[Print-print-06]")
65+
{
66+
PrintMock mock;
67+
68+
long const val = -1;
69+
70+
WHEN("DEC") { mock.print(val, DEC); REQUIRE(mock._str == "-1"); }
71+
WHEN("HEX") { mock.print(val, HEX); REQUIRE(mock._str == "FFFFFFFFFFFFFFFF"); }
72+
WHEN("OCT") { mock.print(val, OCT); REQUIRE(mock._str == "1777777777777777777777"); }
73+
WHEN("BIN") { mock.print(val, BIN); REQUIRE(mock._str == "1111111111111111111111111111111111111111111111111111111111111111"); }
74+
}
75+
76+
TEST_CASE ("Print::print(unsigned long, int = DEC|HEX|OCT|BIN)", "[Print-print-07]")
77+
{
78+
PrintMock mock;
79+
80+
unsigned long const val = 17;
81+
82+
WHEN("DEC") { mock.print(val, DEC); REQUIRE(mock._str == "17"); }
83+
WHEN("HEX") { mock.print(val, HEX); REQUIRE(mock._str == "11"); }
84+
WHEN("OCT") { mock.print(val, OCT); REQUIRE(mock._str == "21"); }
85+
WHEN("BIN") { mock.print(val, BIN); REQUIRE(mock._str == "10001"); }
86+
}
87+
88+
TEST_CASE ("Print::print(long long, int = DEC|HEX|OCT|BIN)", "[Print-print-08]")
89+
{
90+
PrintMock mock;
91+
92+
long long const val = -1;
93+
94+
WHEN("DEC") { mock.print(val, DEC); REQUIRE(mock._str == "-1"); }
95+
WHEN("HEX") { mock.print(val, HEX); REQUIRE(mock._str == "FFFFFFFFFFFFFFFF"); }
96+
WHEN("OCT") { mock.print(val, OCT); REQUIRE(mock._str == "1777777777777777777777"); }
97+
WHEN("BIN") { mock.print(val, BIN); REQUIRE(mock._str == "1111111111111111111111111111111111111111111111111111111111111111"); }
98+
}
99+
100+
TEST_CASE ("Print::print(unsigned long long, int = DEC|HEX|OCT|BIN)", "[Print-print-09]")
101+
{
102+
PrintMock mock;
103+
104+
GIVEN("a value of zero ...")
105+
{
106+
unsigned long long const val = 0;
107+
108+
WHEN("DEC") { mock.print(val, DEC); REQUIRE(mock._str == "0"); }
109+
WHEN("HEX") { mock.print(val, HEX); REQUIRE(mock._str == "0"); }
110+
WHEN("OCT") { mock.print(val, OCT); REQUIRE(mock._str == "0"); }
111+
WHEN("BIN") { mock.print(val, BIN); REQUIRE(mock._str == "0"); }
112+
}
113+
GIVEN("a non-zero value ...")
114+
{
115+
unsigned long long const val = 17;
116+
117+
WHEN("DEC") { mock.print(val, DEC); REQUIRE(mock._str == "17"); }
118+
WHEN("HEX") { mock.print(val, HEX); REQUIRE(mock._str == "11"); }
119+
WHEN("OCT") { mock.print(val, OCT); REQUIRE(mock._str == "21"); }
120+
WHEN("BIN") { mock.print(val, BIN); REQUIRE(mock._str == "10001"); }
121+
}
122+
}
123+
124+
TEST_CASE ("Print::print(double, int = 2)", "[Print-print-10]")
125+
{
126+
PrintMock mock;
127+
128+
WHEN ("val is a positive floating point value")
129+
{
130+
double const val = 3.1459;
131+
WHEN("digits = 0") { mock.print(val, 0); REQUIRE(mock._str == "3"); }
132+
WHEN("digits = 1") { mock.print(val, 1); REQUIRE(mock._str == "3.1"); }
133+
WHEN("digits = 2 (default)") { mock.print(val); REQUIRE(mock._str == "3.15"); }
134+
WHEN("digits = 3") { mock.print(val, 3); REQUIRE(mock._str == "3.146"); }
135+
WHEN("digits = 4") { mock.print(val, 4); REQUIRE(mock._str == "3.1459"); }
136+
WHEN("digits = 5") { mock.print(val, 5); REQUIRE(mock._str == "3.14590"); }
137+
}
138+
139+
WHEN ("digits are negative")
140+
{
141+
double const val = 3.1459;
142+
WHEN("digits = -1") { mock.print(val, -1); REQUIRE(mock._str == "3.15"); }
143+
}
144+
145+
WHEN ("val is a negative floating point value")
146+
{
147+
double const val = -3.1459;
148+
WHEN("digits = 2 (default)") { mock.print(val); REQUIRE(mock._str == "-3.15"); }
149+
}
150+
151+
WHEN ("val is NAN") { mock.print(NAN); REQUIRE(mock._str == "nan"); }
152+
WHEN ("val is INFINITY") { mock.print(INFINITY); REQUIRE(mock._str == "inf"); }
153+
}
154+
155+
TEST_CASE ("Print::print(Printable)", "[Print-print-11]")
156+
{
157+
PrintMock mock;
158+
159+
PrintableMock printable;
160+
printable._i = 1;
161+
162+
mock.print(printable);
163+
164+
REQUIRE(mock._str == "PrintableMock i = 1");
165+
}
166+
167+
TEST_CASE ("Print::print(unsigned char, int)", "[Print-print-12]")
168+
{
169+
PrintMock mock;
170+
171+
WHEN("DEC") { mock.print('A', DEC); REQUIRE(mock._str == "65"); }
172+
WHEN("HEX") { mock.print('A', HEX); REQUIRE(mock._str == "41"); }
173+
WHEN("OCT") { mock.print('A', OCT); REQUIRE(mock._str == "101"); }
174+
WHEN("BIN") { mock.print('A', BIN); REQUIRE(mock._str == "1000001"); }
175+
}
176+
177+
TEST_CASE ("Testing Print::print(const __FlashStringHelper *)", "[Print-print-13]")
178+
{
179+
#undef F
180+
#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))
181+
PrintMock mock;
182+
183+
mock.print(F("Hello flash string"));
184+
185+
REQUIRE(mock._str == "Hello flash string");
186+
}

0 commit comments

Comments
 (0)