Skip to content

Commit 3b68c91

Browse files
authored
testrunner: Add testplatform to verify platform loading (danmar#1176)
1 parent 7aefdeb commit 3b68c91

File tree

5 files changed

+337
-0
lines changed

5 files changed

+337
-0
lines changed

Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ TESTOBJ = test/options.o \
216216
test/testother.o \
217217
test/testpath.o \
218218
test/testpathmatch.o \
219+
test/testplatform.o \
219220
test/testpostfixoperator.o \
220221
test/testpreprocessor.o \
221222
test/testrunner.o \
@@ -567,6 +568,9 @@ test/testpath.o: test/testpath.cpp lib/path.h lib/config.h test/testsuite.h lib/
567568
test/testpathmatch.o: test/testpathmatch.cpp lib/pathmatch.h lib/config.h test/testsuite.h lib/errorlogger.h lib/suppressions.h
568569
$(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CFG) $(CXXFLAGS) $(UNDEF_STRICT_ANSI) -c -o test/testpathmatch.o test/testpathmatch.cpp
569570

571+
test/testplatform.o: test/testplatform.cpp lib/errorlogger.h lib/config.h lib/suppressions.h lib/platform.h test/testsuite.h
572+
$(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CFG) $(CXXFLAGS) $(UNDEF_STRICT_ANSI) -c -o test/testplatform.o test/testplatform.cpp
573+
570574
test/testpostfixoperator.o: test/testpostfixoperator.cpp lib/checkpostfixoperator.h lib/check.h lib/config.h lib/errorlogger.h lib/suppressions.h lib/settings.h lib/importproject.h lib/platform.h lib/utils.h lib/library.h lib/mathlib.h lib/standards.h lib/timer.h lib/token.h lib/valueflow.h lib/tokenize.h lib/tokenlist.h test/testsuite.h
571575
$(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CFG) $(CXXFLAGS) $(UNDEF_STRICT_ANSI) -c -o test/testpostfixoperator.o test/testpostfixoperator.cpp
572576

test/testfiles.pri

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ SOURCES += $${BASEPATH}/test64bit.cpp \
3434
$${BASEPATH}/testother.cpp \
3535
$${BASEPATH}/testpath.cpp \
3636
$${BASEPATH}/testpathmatch.cpp \
37+
$${BASEPATH}/testplatform.cpp \
3738
$${BASEPATH}/testpostfixoperator.cpp \
3839
$${BASEPATH}/testpreprocessor.cpp \
3940
$${BASEPATH}/testrunner.cpp \

test/testplatform.cpp

Lines changed: 328 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,328 @@
1+
/*
2+
* Cppcheck - A tool for static C/C++ code analysis
3+
* Copyright (C) 2007-2018 Cppcheck team.
4+
*
5+
* This program is free software: you can redistribute it and/or modify
6+
* it under the terms of the GNU General Public License as published by
7+
* the Free Software Foundation, either version 3 of the License, or
8+
* (at your option) any later version.
9+
*
10+
* This program is distributed in the hope that it will be useful,
11+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
* GNU General Public License for more details.
14+
*
15+
* You should have received a copy of the GNU General Public License
16+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
17+
*/
18+
19+
#include "errorlogger.h"
20+
#include "platform.h"
21+
#include "testsuite.h"
22+
23+
#include <tinyxml2.h>
24+
25+
26+
class TestPlatform : public TestFixture {
27+
public:
28+
TestPlatform() : TestFixture("TestPlatform") { }
29+
30+
private:
31+
void run() {
32+
TEST_CASE(empty);
33+
TEST_CASE(valid_config_native_1);
34+
TEST_CASE(valid_config_native_2);
35+
TEST_CASE(valid_config_file_1);
36+
TEST_CASE(valid_config_file_2);
37+
TEST_CASE(valid_config_file_3);
38+
TEST_CASE(valid_config_file_4);
39+
TEST_CASE(invalid_config_file_1);
40+
// TEST_CASE(empty_elements); // TODO: Trac issue #8409
41+
}
42+
43+
static bool readPlatform(cppcheck::Platform& platform, const char* xmldata) {
44+
tinyxml2::XMLDocument doc;
45+
doc.Parse(xmldata);
46+
return platform.loadFromXmlDocument(&doc);
47+
}
48+
49+
void empty() const {
50+
// An empty platform file does not change values, only the type.
51+
const char xmldata[] = "<?xml version=\"1.0\"?>\n<platform/>";
52+
cppcheck::Platform platform;
53+
ASSERT(platform.platform(cppcheck::Platform::Win64));
54+
ASSERT(readPlatform(platform, xmldata));
55+
ASSERT_EQUALS(cppcheck::Platform::PlatformFile, platform.platformType);
56+
ASSERT(!platform.isWindowsPlatform());
57+
ASSERT_EQUALS(8, platform.char_bit);
58+
ASSERT_EQUALS('\0', platform.defaultSign);
59+
ASSERT_EQUALS(1, platform.sizeof_bool);
60+
ASSERT_EQUALS(2, platform.sizeof_short);
61+
ASSERT_EQUALS(4, platform.sizeof_int);
62+
ASSERT_EQUALS(4, platform.sizeof_long);
63+
ASSERT_EQUALS(8, platform.sizeof_long_long);
64+
}
65+
66+
void valid_config_native_1() {
67+
// Verify if native Win32A platform is loaded correctly
68+
cppcheck::Platform platform;
69+
ASSERT(platform.platform(cppcheck::Platform::Win32A));
70+
ASSERT_EQUALS(cppcheck::Platform::Win32A, platform.platformType);
71+
ASSERT(platform.isWindowsPlatform());
72+
ASSERT_EQUALS('\0', platform.defaultSign);
73+
ASSERT_EQUALS(8, platform.char_bit);
74+
ASSERT_EQUALS(1, platform.sizeof_bool);
75+
ASSERT_EQUALS(2, platform.sizeof_short);
76+
ASSERT_EQUALS(4, platform.sizeof_int);
77+
ASSERT_EQUALS(4, platform.sizeof_long);
78+
ASSERT_EQUALS(8, platform.sizeof_long_long);
79+
ASSERT_EQUALS(16, platform.short_bit);
80+
ASSERT_EQUALS(32, platform.int_bit);
81+
ASSERT_EQUALS(32, platform.long_bit);
82+
ASSERT_EQUALS(64, platform.long_long_bit);
83+
}
84+
85+
void valid_config_native_2() {
86+
// Verify if native Unix64 platform is loaded correctly
87+
cppcheck::Platform platform;
88+
ASSERT(platform.platform(cppcheck::Platform::Unix64));
89+
ASSERT_EQUALS(cppcheck::Platform::Unix64, platform.platformType);
90+
ASSERT(!platform.isWindowsPlatform());
91+
ASSERT_EQUALS('\0', platform.defaultSign);
92+
ASSERT_EQUALS(8, platform.char_bit);
93+
ASSERT_EQUALS(4, platform.sizeof_int);
94+
ASSERT_EQUALS(32, platform.int_bit);
95+
ASSERT_EQUALS(8, platform.sizeof_long);
96+
ASSERT_EQUALS(64, platform.long_bit);
97+
}
98+
99+
void valid_config_file_1() {
100+
// Valid platform configuration with all possible values specified.
101+
// Similar to the avr8 platform file.
102+
const char xmldata[] = "<?xml version=\"1.0\"?>\n"
103+
"<platform>\n"
104+
" <char_bit>8</char_bit>\n"
105+
" <default-sign>unsigned</default-sign>\n"
106+
" <sizeof>\n"
107+
" <bool>1</bool>\n"
108+
" <short>2</short>\n"
109+
" <int>2</int>\n"
110+
" <long>4</long>\n"
111+
" <long-long>8</long-long>\n"
112+
" <float>4</float>\n"
113+
" <double>4</double>\n"
114+
" <long-double>4</long-double>\n"
115+
" <pointer>2</pointer>\n"
116+
" <size_t>2</size_t>\n"
117+
" <wchar_t>2</wchar_t>\n"
118+
" </sizeof>\n"
119+
" </platform>";
120+
cppcheck::Platform platform;
121+
ASSERT(readPlatform(platform, xmldata));
122+
ASSERT_EQUALS(platform.PlatformFile, platform.platformType);
123+
ASSERT(!platform.isWindowsPlatform());
124+
ASSERT_EQUALS(8, platform.char_bit);
125+
ASSERT_EQUALS('u', platform.defaultSign);
126+
ASSERT_EQUALS(1, platform.sizeof_bool);
127+
ASSERT_EQUALS(2, platform.sizeof_short);
128+
ASSERT_EQUALS(2, platform.sizeof_int);
129+
ASSERT_EQUALS(4, platform.sizeof_long);
130+
ASSERT_EQUALS(8, platform.sizeof_long_long);
131+
ASSERT_EQUALS(4, platform.sizeof_float);
132+
ASSERT_EQUALS(4, platform.sizeof_double);
133+
ASSERT_EQUALS(4, platform.sizeof_long_double);
134+
ASSERT_EQUALS(2, platform.sizeof_pointer);
135+
ASSERT_EQUALS(2, platform.sizeof_size_t);
136+
ASSERT_EQUALS(2, platform.sizeof_wchar_t);
137+
ASSERT_EQUALS(16, platform.short_bit);
138+
ASSERT_EQUALS(16, platform.int_bit);
139+
ASSERT_EQUALS(32, platform.long_bit);
140+
ASSERT_EQUALS(64, platform.long_long_bit);
141+
}
142+
143+
void valid_config_file_2() {
144+
// Valid platform configuration with all possible values specified and
145+
// char_bit > 8.
146+
const char xmldata[] = "<?xml version=\"1.0\"?>\n"
147+
"<platform>\n"
148+
" <char_bit>20</char_bit>\n"
149+
" <default-sign>signed</default-sign>\n"
150+
" <sizeof>\n"
151+
" <bool>1</bool>\n"
152+
" <short>2</short>\n"
153+
" <int>3</int>\n"
154+
" <long>4</long>\n"
155+
" <long-long>5</long-long>\n"
156+
" <float>6</float>\n"
157+
" <double>7</double>\n"
158+
" <long-double>8</long-double>\n"
159+
" <pointer>9</pointer>\n"
160+
" <size_t>10</size_t>\n"
161+
" <wchar_t>11</wchar_t>\n"
162+
" </sizeof>\n"
163+
" </platform>";
164+
cppcheck::Platform platform;
165+
ASSERT(readPlatform(platform, xmldata));
166+
ASSERT_EQUALS(platform.PlatformFile, platform.platformType);
167+
ASSERT(!platform.isWindowsPlatform());
168+
ASSERT_EQUALS(20, platform.char_bit);
169+
ASSERT_EQUALS('s', platform.defaultSign);
170+
ASSERT_EQUALS(1, platform.sizeof_bool);
171+
ASSERT_EQUALS(2, platform.sizeof_short);
172+
ASSERT_EQUALS(3, platform.sizeof_int);
173+
ASSERT_EQUALS(4, platform.sizeof_long);
174+
ASSERT_EQUALS(5, platform.sizeof_long_long);
175+
ASSERT_EQUALS(6, platform.sizeof_float);
176+
ASSERT_EQUALS(7, platform.sizeof_double);
177+
ASSERT_EQUALS(8, platform.sizeof_long_double);
178+
ASSERT_EQUALS(9, platform.sizeof_pointer);
179+
ASSERT_EQUALS(10, platform.sizeof_size_t);
180+
ASSERT_EQUALS(11, platform.sizeof_wchar_t);
181+
ASSERT_EQUALS(40, platform.short_bit);
182+
ASSERT_EQUALS(60, platform.int_bit);
183+
ASSERT_EQUALS(80, platform.long_bit);
184+
ASSERT_EQUALS(100, platform.long_long_bit);
185+
}
186+
187+
void valid_config_file_3() {
188+
// Valid platform configuration without any usable information.
189+
// Similar like an empty file.
190+
const char xmldata[] = "<?xml version=\"1.0\"?>\n"
191+
"<platform>\n"
192+
" <char_bit1>8</char_bit1>\n"
193+
" <default-sign1>unsigned</default-sign1>\n"
194+
" <sizeof1>\n"
195+
" <bool1>1</bool1>\n"
196+
" <short1>2</short1>\n"
197+
" <int1>3</int1>\n"
198+
" <long1>4</long1>\n"
199+
" <long-long1>5</long-long1>\n"
200+
" <float1>6</float1>\n"
201+
" <double1>7</double1>\n"
202+
" <long-double1>8</long-double1>\n"
203+
" <pointer1>9</pointer1>\n"
204+
" <size_t1>10</size_t1>\n"
205+
" <wchar_t1>11</wchar_t1>\n"
206+
" </sizeof1>\n"
207+
" </platform>";
208+
cppcheck::Platform platform;
209+
ASSERT(platform.platform(cppcheck::Platform::Win64));
210+
ASSERT(readPlatform(platform, xmldata));
211+
ASSERT_EQUALS(platform.PlatformFile, platform.platformType);
212+
ASSERT(!platform.isWindowsPlatform());
213+
ASSERT_EQUALS(8, platform.char_bit);
214+
ASSERT_EQUALS('\0', platform.defaultSign);
215+
ASSERT_EQUALS(1, platform.sizeof_bool);
216+
ASSERT_EQUALS(2, platform.sizeof_short);
217+
ASSERT_EQUALS(4, platform.sizeof_int);
218+
ASSERT_EQUALS(4, platform.sizeof_long);
219+
ASSERT_EQUALS(8, platform.sizeof_long_long);
220+
}
221+
222+
void valid_config_file_4() {
223+
// Valid platform configuration with all possible values specified and
224+
// set to 0.
225+
const char xmldata[] = "<?xml version=\"1.0\"?>\n"
226+
"<platform>\n"
227+
" <char_bit>0</char_bit>\n"
228+
" <default-sign>z</default-sign>\n"
229+
" <sizeof>\n"
230+
" <bool>0</bool>\n"
231+
" <short>0</short>\n"
232+
" <int>0</int>\n"
233+
" <long>0</long>\n"
234+
" <long-long>0</long-long>\n"
235+
" <float>0</float>\n"
236+
" <double>0</double>\n"
237+
" <long-double>0</long-double>\n"
238+
" <pointer>0</pointer>\n"
239+
" <size_t>0</size_t>\n"
240+
" <wchar_t>0</wchar_t>\n"
241+
" </sizeof>\n"
242+
" </platform>";
243+
cppcheck::Platform platform;
244+
ASSERT(readPlatform(platform, xmldata));
245+
ASSERT_EQUALS(platform.PlatformFile, platform.platformType);
246+
ASSERT(!platform.isWindowsPlatform());
247+
ASSERT_EQUALS(0, platform.char_bit);
248+
ASSERT_EQUALS('z', platform.defaultSign);
249+
ASSERT_EQUALS(0, platform.sizeof_bool);
250+
ASSERT_EQUALS(0, platform.sizeof_short);
251+
ASSERT_EQUALS(0, platform.sizeof_int);
252+
ASSERT_EQUALS(0, platform.sizeof_long);
253+
ASSERT_EQUALS(0, platform.sizeof_long_long);
254+
ASSERT_EQUALS(0, platform.sizeof_float);
255+
ASSERT_EQUALS(0, platform.sizeof_double);
256+
ASSERT_EQUALS(0, platform.sizeof_long_double);
257+
ASSERT_EQUALS(0, platform.sizeof_pointer);
258+
ASSERT_EQUALS(0, platform.sizeof_size_t);
259+
ASSERT_EQUALS(0, platform.sizeof_wchar_t);
260+
ASSERT_EQUALS(0, platform.short_bit);
261+
ASSERT_EQUALS(0, platform.int_bit);
262+
ASSERT_EQUALS(0, platform.long_bit);
263+
ASSERT_EQUALS(0, platform.long_long_bit);
264+
}
265+
266+
void invalid_config_file_1() {
267+
// Invalid XML file: mismatching elements "boolt" vs "bool".
268+
const char xmldata[] = "<?xml version=\"1.0\"?>\n"
269+
"<platform>\n"
270+
" <char_bit>8</char_bit>\n"
271+
" <default-sign>unsigned</default-sign>\n"
272+
" <sizeof>\n"
273+
" <boolt>1</bool>\n"
274+
" <short>2</short>\n"
275+
" <int>2</int>\n"
276+
" <long>4</long>\n"
277+
" <long-long>8</long-long>\n"
278+
" <float>4</float>\n"
279+
" <double>4</double>\n"
280+
" <long-double>4</long-double>\n"
281+
" <pointer>2</pointer>\n"
282+
" <size_t>2</size_t>\n"
283+
" <wchar_t>2</wchar_t>\n"
284+
" </sizeof>\n"
285+
" </platform>";
286+
cppcheck::Platform platform;
287+
ASSERT(!readPlatform(platform, xmldata));
288+
}
289+
290+
#if 0 // @TODO: Enable when Trac issue #8409 has been fixed
291+
void empty_elements() {
292+
// Valid platform configuration without any usable information.
293+
// Similar like an empty file.
294+
const char xmldata[] = "<?xml version=\"1.0\"?>\n"
295+
"<platform>\n"
296+
" <char_bit></char_bit>\n"
297+
" <default-sign></default-sign>\n"
298+
" <sizeof>\n"
299+
" <bool></bool>\n"
300+
" <short></short>\n"
301+
" <int></int>\n"
302+
" <long></long>\n"
303+
" <long-long></long-long>\n"
304+
" <float></float>\n"
305+
" <double></double>\n"
306+
" <long-double></long-double>\n"
307+
" <pointer></pointer>\n"
308+
" <size_t></size_t>\n"
309+
" <wchar_t></wchar_t>\n"
310+
" </sizeof>\n"
311+
" </platform>";
312+
cppcheck::Platform platform;
313+
ASSERT(platform.platform(cppcheck::Platform::Win64));
314+
ASSERT(readPlatform(platform, xmldata));
315+
ASSERT_EQUALS(platform.PlatformFile, platform.platformType);
316+
ASSERT(!platform.isWindowsPlatform());
317+
ASSERT_EQUALS(8, platform.char_bit);
318+
ASSERT_EQUALS('\0', platform.defaultSign);
319+
ASSERT_EQUALS(1, platform.sizeof_bool);
320+
ASSERT_EQUALS(2, platform.sizeof_short);
321+
ASSERT_EQUALS(4, platform.sizeof_int);
322+
ASSERT_EQUALS(4, platform.sizeof_long);
323+
ASSERT_EQUALS(8, platform.sizeof_long_long);
324+
}
325+
#endif
326+
};
327+
328+
REGISTER_TEST(TestPlatform)

test/testrunner.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
<ClCompile Include="testother.cpp" />
6060
<ClCompile Include="testpath.cpp" />
6161
<ClCompile Include="testpathmatch.cpp" />
62+
<ClCompile Include="testplatform.cpp" />
6263
<ClCompile Include="testpostfixoperator.cpp" />
6364
<ClCompile Include="testpreprocessor.cpp" />
6465
<ClCompile Include="testrunner.cpp" />

test/testrunner.vcxproj.filters

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,9 @@
202202
<ClCompile Include="testimportproject.cpp">
203203
<Filter>Source Files</Filter>
204204
</ClCompile>
205+
<ClCompile Include="testplatform.cpp">
206+
<Filter>Source Files</Filter>
207+
</ClCompile>
205208
</ItemGroup>
206209
<ItemGroup>
207210
<ClInclude Include="options.h">

0 commit comments

Comments
 (0)