diff --git a/Makefile b/Makefile index 4d5d2849e..f6ff9f2f8 100644 --- a/Makefile +++ b/Makefile @@ -216,6 +216,7 @@ TESTOBJ = test/options.o \ test/testother.o \ test/testpath.o \ test/testpathmatch.o \ + test/testplatform.o \ test/testpostfixoperator.o \ test/testpreprocessor.o \ test/testrunner.o \ @@ -567,6 +568,9 @@ test/testpath.o: test/testpath.cpp lib/path.h lib/config.h test/testsuite.h lib/ test/testpathmatch.o: test/testpathmatch.cpp lib/pathmatch.h lib/config.h test/testsuite.h lib/errorlogger.h lib/suppressions.h $(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CFG) $(CXXFLAGS) $(UNDEF_STRICT_ANSI) -c -o test/testpathmatch.o test/testpathmatch.cpp +test/testplatform.o: test/testplatform.cpp lib/errorlogger.h lib/config.h lib/suppressions.h lib/platform.h test/testsuite.h + $(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CFG) $(CXXFLAGS) $(UNDEF_STRICT_ANSI) -c -o test/testplatform.o test/testplatform.cpp + 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 $(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CFG) $(CXXFLAGS) $(UNDEF_STRICT_ANSI) -c -o test/testpostfixoperator.o test/testpostfixoperator.cpp diff --git a/test/testfiles.pri b/test/testfiles.pri index ad9192243..c6eecd214 100644 --- a/test/testfiles.pri +++ b/test/testfiles.pri @@ -34,6 +34,7 @@ SOURCES += $${BASEPATH}/test64bit.cpp \ $${BASEPATH}/testother.cpp \ $${BASEPATH}/testpath.cpp \ $${BASEPATH}/testpathmatch.cpp \ + $${BASEPATH}/testplatform.cpp \ $${BASEPATH}/testpostfixoperator.cpp \ $${BASEPATH}/testpreprocessor.cpp \ $${BASEPATH}/testrunner.cpp \ diff --git a/test/testplatform.cpp b/test/testplatform.cpp new file mode 100644 index 000000000..67c779ded --- /dev/null +++ b/test/testplatform.cpp @@ -0,0 +1,328 @@ +/* + * Cppcheck - A tool for static C/C++ code analysis + * Copyright (C) 2007-2018 Cppcheck team. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "errorlogger.h" +#include "platform.h" +#include "testsuite.h" + +#include + + +class TestPlatform : public TestFixture { +public: + TestPlatform() : TestFixture("TestPlatform") { } + +private: + void run() { + TEST_CASE(empty); + TEST_CASE(valid_config_native_1); + TEST_CASE(valid_config_native_2); + TEST_CASE(valid_config_file_1); + TEST_CASE(valid_config_file_2); + TEST_CASE(valid_config_file_3); + TEST_CASE(valid_config_file_4); + TEST_CASE(invalid_config_file_1); + // TEST_CASE(empty_elements); // TODO: Trac issue #8409 + } + + static bool readPlatform(cppcheck::Platform& platform, const char* xmldata) { + tinyxml2::XMLDocument doc; + doc.Parse(xmldata); + return platform.loadFromXmlDocument(&doc); + } + + void empty() const { + // An empty platform file does not change values, only the type. + const char xmldata[] = "\n"; + cppcheck::Platform platform; + ASSERT(platform.platform(cppcheck::Platform::Win64)); + ASSERT(readPlatform(platform, xmldata)); + ASSERT_EQUALS(cppcheck::Platform::PlatformFile, platform.platformType); + ASSERT(!platform.isWindowsPlatform()); + ASSERT_EQUALS(8, platform.char_bit); + ASSERT_EQUALS('\0', platform.defaultSign); + ASSERT_EQUALS(1, platform.sizeof_bool); + ASSERT_EQUALS(2, platform.sizeof_short); + ASSERT_EQUALS(4, platform.sizeof_int); + ASSERT_EQUALS(4, platform.sizeof_long); + ASSERT_EQUALS(8, platform.sizeof_long_long); + } + + void valid_config_native_1() { + // Verify if native Win32A platform is loaded correctly + cppcheck::Platform platform; + ASSERT(platform.platform(cppcheck::Platform::Win32A)); + ASSERT_EQUALS(cppcheck::Platform::Win32A, platform.platformType); + ASSERT(platform.isWindowsPlatform()); + ASSERT_EQUALS('\0', platform.defaultSign); + ASSERT_EQUALS(8, platform.char_bit); + ASSERT_EQUALS(1, platform.sizeof_bool); + ASSERT_EQUALS(2, platform.sizeof_short); + ASSERT_EQUALS(4, platform.sizeof_int); + ASSERT_EQUALS(4, platform.sizeof_long); + ASSERT_EQUALS(8, platform.sizeof_long_long); + ASSERT_EQUALS(16, platform.short_bit); + ASSERT_EQUALS(32, platform.int_bit); + ASSERT_EQUALS(32, platform.long_bit); + ASSERT_EQUALS(64, platform.long_long_bit); + } + + void valid_config_native_2() { + // Verify if native Unix64 platform is loaded correctly + cppcheck::Platform platform; + ASSERT(platform.platform(cppcheck::Platform::Unix64)); + ASSERT_EQUALS(cppcheck::Platform::Unix64, platform.platformType); + ASSERT(!platform.isWindowsPlatform()); + ASSERT_EQUALS('\0', platform.defaultSign); + ASSERT_EQUALS(8, platform.char_bit); + ASSERT_EQUALS(4, platform.sizeof_int); + ASSERT_EQUALS(32, platform.int_bit); + ASSERT_EQUALS(8, platform.sizeof_long); + ASSERT_EQUALS(64, platform.long_bit); + } + + void valid_config_file_1() { + // Valid platform configuration with all possible values specified. + // Similar to the avr8 platform file. + const char xmldata[] = "\n" + "\n" + " 8\n" + " unsigned\n" + " \n" + " 1\n" + " 2\n" + " 2\n" + " 4\n" + " 8\n" + " 4\n" + " 4\n" + " 4\n" + " 2\n" + " 2\n" + " 2\n" + " \n" + " "; + cppcheck::Platform platform; + ASSERT(readPlatform(platform, xmldata)); + ASSERT_EQUALS(platform.PlatformFile, platform.platformType); + ASSERT(!platform.isWindowsPlatform()); + ASSERT_EQUALS(8, platform.char_bit); + ASSERT_EQUALS('u', platform.defaultSign); + ASSERT_EQUALS(1, platform.sizeof_bool); + ASSERT_EQUALS(2, platform.sizeof_short); + ASSERT_EQUALS(2, platform.sizeof_int); + ASSERT_EQUALS(4, platform.sizeof_long); + ASSERT_EQUALS(8, platform.sizeof_long_long); + ASSERT_EQUALS(4, platform.sizeof_float); + ASSERT_EQUALS(4, platform.sizeof_double); + ASSERT_EQUALS(4, platform.sizeof_long_double); + ASSERT_EQUALS(2, platform.sizeof_pointer); + ASSERT_EQUALS(2, platform.sizeof_size_t); + ASSERT_EQUALS(2, platform.sizeof_wchar_t); + ASSERT_EQUALS(16, platform.short_bit); + ASSERT_EQUALS(16, platform.int_bit); + ASSERT_EQUALS(32, platform.long_bit); + ASSERT_EQUALS(64, platform.long_long_bit); + } + + void valid_config_file_2() { + // Valid platform configuration with all possible values specified and + // char_bit > 8. + const char xmldata[] = "\n" + "\n" + " 20\n" + " signed\n" + " \n" + " 1\n" + " 2\n" + " 3\n" + " 4\n" + " 5\n" + " 6\n" + " 7\n" + " 8\n" + " 9\n" + " 10\n" + " 11\n" + " \n" + " "; + cppcheck::Platform platform; + ASSERT(readPlatform(platform, xmldata)); + ASSERT_EQUALS(platform.PlatformFile, platform.platformType); + ASSERT(!platform.isWindowsPlatform()); + ASSERT_EQUALS(20, platform.char_bit); + ASSERT_EQUALS('s', platform.defaultSign); + ASSERT_EQUALS(1, platform.sizeof_bool); + ASSERT_EQUALS(2, platform.sizeof_short); + ASSERT_EQUALS(3, platform.sizeof_int); + ASSERT_EQUALS(4, platform.sizeof_long); + ASSERT_EQUALS(5, platform.sizeof_long_long); + ASSERT_EQUALS(6, platform.sizeof_float); + ASSERT_EQUALS(7, platform.sizeof_double); + ASSERT_EQUALS(8, platform.sizeof_long_double); + ASSERT_EQUALS(9, platform.sizeof_pointer); + ASSERT_EQUALS(10, platform.sizeof_size_t); + ASSERT_EQUALS(11, platform.sizeof_wchar_t); + ASSERT_EQUALS(40, platform.short_bit); + ASSERT_EQUALS(60, platform.int_bit); + ASSERT_EQUALS(80, platform.long_bit); + ASSERT_EQUALS(100, platform.long_long_bit); + } + + void valid_config_file_3() { + // Valid platform configuration without any usable information. + // Similar like an empty file. + const char xmldata[] = "\n" + "\n" + " 8\n" + " unsigned\n" + " \n" + " 1\n" + " 2\n" + " 3\n" + " 4\n" + " 5\n" + " 6\n" + " 7\n" + " 8\n" + " 9\n" + " 10\n" + " 11\n" + " \n" + " "; + cppcheck::Platform platform; + ASSERT(platform.platform(cppcheck::Platform::Win64)); + ASSERT(readPlatform(platform, xmldata)); + ASSERT_EQUALS(platform.PlatformFile, platform.platformType); + ASSERT(!platform.isWindowsPlatform()); + ASSERT_EQUALS(8, platform.char_bit); + ASSERT_EQUALS('\0', platform.defaultSign); + ASSERT_EQUALS(1, platform.sizeof_bool); + ASSERT_EQUALS(2, platform.sizeof_short); + ASSERT_EQUALS(4, platform.sizeof_int); + ASSERT_EQUALS(4, platform.sizeof_long); + ASSERT_EQUALS(8, platform.sizeof_long_long); + } + + void valid_config_file_4() { + // Valid platform configuration with all possible values specified and + // set to 0. + const char xmldata[] = "\n" + "\n" + " 0\n" + " z\n" + " \n" + " 0\n" + " 0\n" + " 0\n" + " 0\n" + " 0\n" + " 0\n" + " 0\n" + " 0\n" + " 0\n" + " 0\n" + " 0\n" + " \n" + " "; + cppcheck::Platform platform; + ASSERT(readPlatform(platform, xmldata)); + ASSERT_EQUALS(platform.PlatformFile, platform.platformType); + ASSERT(!platform.isWindowsPlatform()); + ASSERT_EQUALS(0, platform.char_bit); + ASSERT_EQUALS('z', platform.defaultSign); + ASSERT_EQUALS(0, platform.sizeof_bool); + ASSERT_EQUALS(0, platform.sizeof_short); + ASSERT_EQUALS(0, platform.sizeof_int); + ASSERT_EQUALS(0, platform.sizeof_long); + ASSERT_EQUALS(0, platform.sizeof_long_long); + ASSERT_EQUALS(0, platform.sizeof_float); + ASSERT_EQUALS(0, platform.sizeof_double); + ASSERT_EQUALS(0, platform.sizeof_long_double); + ASSERT_EQUALS(0, platform.sizeof_pointer); + ASSERT_EQUALS(0, platform.sizeof_size_t); + ASSERT_EQUALS(0, platform.sizeof_wchar_t); + ASSERT_EQUALS(0, platform.short_bit); + ASSERT_EQUALS(0, platform.int_bit); + ASSERT_EQUALS(0, platform.long_bit); + ASSERT_EQUALS(0, platform.long_long_bit); + } + + void invalid_config_file_1() { + // Invalid XML file: mismatching elements "boolt" vs "bool". + const char xmldata[] = "\n" + "\n" + " 8\n" + " unsigned\n" + " \n" + " 1\n" + " 2\n" + " 2\n" + " 4\n" + " 8\n" + " 4\n" + " 4\n" + " 4\n" + " 2\n" + " 2\n" + " 2\n" + " \n" + " "; + cppcheck::Platform platform; + ASSERT(!readPlatform(platform, xmldata)); + } + +#if 0 // @TODO: Enable when Trac issue #8409 has been fixed + void empty_elements() { + // Valid platform configuration without any usable information. + // Similar like an empty file. + const char xmldata[] = "\n" + "\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " "; + cppcheck::Platform platform; + ASSERT(platform.platform(cppcheck::Platform::Win64)); + ASSERT(readPlatform(platform, xmldata)); + ASSERT_EQUALS(platform.PlatformFile, platform.platformType); + ASSERT(!platform.isWindowsPlatform()); + ASSERT_EQUALS(8, platform.char_bit); + ASSERT_EQUALS('\0', platform.defaultSign); + ASSERT_EQUALS(1, platform.sizeof_bool); + ASSERT_EQUALS(2, platform.sizeof_short); + ASSERT_EQUALS(4, platform.sizeof_int); + ASSERT_EQUALS(4, platform.sizeof_long); + ASSERT_EQUALS(8, platform.sizeof_long_long); + } +#endif +}; + +REGISTER_TEST(TestPlatform) diff --git a/test/testrunner.vcxproj b/test/testrunner.vcxproj index 2f8c82760..2ebed85cf 100644 --- a/test/testrunner.vcxproj +++ b/test/testrunner.vcxproj @@ -59,6 +59,7 @@ + diff --git a/test/testrunner.vcxproj.filters b/test/testrunner.vcxproj.filters index 7c74d5c08..5509962ff 100644 --- a/test/testrunner.vcxproj.filters +++ b/test/testrunner.vcxproj.filters @@ -202,6 +202,9 @@ Source Files + + Source Files +