📄 testtokenize.cpp
字号:
/* * Cppcheck - A tool for static C/C++ code analysis * Copyright (C) 2007-2009 Daniel Marjamäki, Reijo Tomperi, Nicolas Le Cam, * Leandro Penz, Kimmo Varis, Vesa Pikki * * 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 <http://www.gnu.org/licenses/ */// The preprocessor that c++check uses is a bit special. Instead of generating// the code for a known configuration, it generates the code for each configuration.#include <cstring>#include "testsuite.h"#include "../src/tokenize.h"extern std::ostringstream errout;class TestTokenizer : public TestFixture{public: TestTokenizer() : TestFixture("TestTokenizer") { } class OurTokenizer : public Tokenizer { public: void simplifyCasts() { Tokenizer::simplifyCasts(); } bool simplifyIfAddBraces() { return Tokenizer::simplifyIfAddBraces(); } bool simplifyKnownVariables() { return Tokenizer::simplifyKnownVariables(); } std::vector<const Token *> &getFunctionList() { return _functionList; } };private: void run() { TEST_CASE(longtok); TEST_CASE(removeCast1); TEST_CASE(inlineasm); TEST_CASE(dupfuncname); TEST_CASE(const_and_volatile_functions); TEST_CASE(ifAddBraces1); TEST_CASE(ifAddBraces2); TEST_CASE(ifAddBraces3); TEST_CASE(ifAddBraces4); TEST_CASE(numeric_true_condition); TEST_CASE(simplifyKnownVariables1); TEST_CASE(simplifyKnownVariables2); TEST_CASE(simplifyKnownVariables3); TEST_CASE(simplifyKnownVariables4); TEST_CASE(simplifyKnownVariables5); TEST_CASE(simplifyKnownVariables6); TEST_CASE(simplifyKnownVariables7); TEST_CASE(simplifyKnownVariables8); TEST_CASE(multiCompare); TEST_CASE(match1); TEST_CASE(match2); TEST_CASE(varid1); TEST_CASE(varid2); TEST_CASE(varid3); TEST_CASE(varid4); TEST_CASE(varid5); // TODO TEST_CASE(varid6); // Function parameters aren't handled well yet TEST_CASE(varid7); TEST_CASE(varidReturn); TEST_CASE(file1); TEST_CASE(file2); TEST_CASE(file3); TEST_CASE(doublesharp); TEST_CASE(macrodoublesharp); TEST_CASE(simplify_function_parameters); TEST_CASE(reduce_redundant_paranthesis); // Ticket #61 TEST_CASE(simplify_numeric_condition); TEST_CASE(tokenize_double); TEST_CASE(tokenize_strings); TEST_CASE(simplify_constants); TEST_CASE(simplify_constants2); } bool cmptok(const char *expected[], const Token *actual) { unsigned int i = 0; for (; expected[i] && actual; ++i, actual = actual->next()) { if (strcmp(expected[i], actual->aaaa()) != 0) return false; } return (expected[i] == NULL && actual == NULL); } std::string tokenizeAndStringify(const char code[]) { // tokenize.. Tokenizer tokenizer; std::istringstream istr(code); tokenizer.tokenize(istr, "test.cpp"); std::ostringstream ostr; for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next()) { ostr << tok->str(); // Append newlines if (tok->next()) { if (tok->linenr() != tok->next()->linenr()) { for (unsigned int i = tok->linenr();i < tok->next()->linenr();++i) ostr << "\n"; } else { ostr << " "; } } } return ostr.str(); } void longtok() { std::string filedata(10000, 'a'); // tokenize.. Tokenizer tokenizer; std::istringstream istr(filedata); tokenizer.tokenize(istr, "test.cpp"); // Expected result.. ASSERT_EQUALS(std::string(10000, 'a'), std::string(tokenizer.tokens()->aaaa())); } // Dont remove "(int *)".. void removeCast1() { const char code[] = "int *f(int *);"; // tokenize.. OurTokenizer tokenizer; std::istringstream istr(code); tokenizer.tokenize(istr, "test.cpp"); tokenizer.simplifyCasts(); std::ostringstream ostr; for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next()) ostr << " " << tok->str(); ASSERT_EQUALS(std::string(" int * f ( int * ) ;"), ostr.str()); } void inlineasm() { const char filedata[] = "void foo()\n" "{\n" " __asm\n" " {\n" " jmp $jump1\n" " $jump1:\n" " }\n" "}\n"; // tokenize.. Tokenizer tokenizer; std::istringstream istr(filedata); tokenizer.tokenize(istr, "test.cpp"); // Expected result.. const char *expected[] = { "void", "foo", "(", ")", "{", "}", 0 }; // Compare.. ASSERT_EQUALS(true, cmptok(expected, tokenizer.tokens())); } void dupfuncname() { const char code[] = "void a()\n" "{ }\n" "void a(int i)\n" "{ }\n" "void b()\n" "{ }\n"; // tokenize.. OurTokenizer tokenizer; std::istringstream istr(code); tokenizer.tokenize(istr, "test.cpp"); tokenizer.fillFunctionList(); ASSERT_EQUALS(1, static_cast<unsigned int>(tokenizer.getFunctionList().size())); ASSERT_EQUALS(std::string("b"), tokenizer.getFunctionList()[0]->aaaa()); } void const_and_volatile_functions() { const char code[] = "class B\n\ {\n\ public:\n\ void a();\n\ void b() const;\n\ void c() volatile;\n\ };\n\ \n\ void B::a()\n\ {}\n\ \n\ void B::b() const\n\ {}\n\ \n\ void B::c() volatile\n\ {}\n"; // tokenize.. OurTokenizer tokenizer; std::istringstream istr(code); tokenizer.tokenize(istr, "test.cpp"); tokenizer.fillFunctionList(); ASSERT_EQUALS(3, static_cast<unsigned int>(tokenizer.getFunctionList().size())); if (tokenizer.getFunctionList().size() == 3) { ASSERT_EQUALS(std::string("a"), tokenizer.getFunctionList()[0]->str()); ASSERT_EQUALS(std::string("b"), tokenizer.getFunctionList()[1]->str()); ASSERT_EQUALS(std::string("c"), tokenizer.getFunctionList()[2]->str()); } } void numeric_true_condition() { const char code[] = "void f()\n" "{\n" " if (5==5);\n" "}\n"; // tokenize.. Tokenizer tokenizer; std::istringstream istr(code); tokenizer.tokenize(istr, "test.cpp"); tokenizer.simplifyTokenList(); std::ostringstream ostr; for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next()) ostr << " " << tok->str(); ASSERT_EQUALS(std::string(" void f ( ) { { ; } }"), ostr.str()); } void ifAddBraces1() { const char code[] = "void f()\n" "{\n" " if (a);\n" " else ;\n" "}\n"; // tokenize.. OurTokenizer tokenizer; std::istringstream istr(code); tokenizer.tokenize(istr, "test.cpp"); ASSERT_EQUALS(true, tokenizer.simplifyIfAddBraces()); std::ostringstream ostr; for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next()) ostr << " " << tok->str(); ASSERT_EQUALS(std::string(" void f ( ) { if ( a ) { ; } else { ; } }"), ostr.str()); } void ifAddBraces2() { const char code[] = "void f()\n" "{\n" " if (a) if (b) { }\n" "}\n"; // tokenize.. OurTokenizer tokenizer; std::istringstream istr(code); tokenizer.tokenize(istr, "test.cpp"); ASSERT_EQUALS(true, tokenizer.simplifyIfAddBraces()); std::ostringstream ostr; for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next()) ostr << " " << tok->str(); ASSERT_EQUALS(std::string(" void f ( ) { if ( a ) { if ( b ) { } } }"), ostr.str()); } void ifAddBraces3() { const char code[] = "void f()\n" "{\n" " if (a) for (;;) { }\n" "}\n"; // tokenize.. OurTokenizer tokenizer; std::istringstream istr(code); tokenizer.tokenize(istr, "test.cpp"); ASSERT_EQUALS(true, tokenizer.simplifyIfAddBraces()); std::ostringstream ostr; for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next()) ostr << " " << tok->str(); ASSERT_EQUALS(std::string(" void f ( ) { if ( a ) { for ( ; ; ) { } } }"), ostr.str()); } void ifAddBraces4() { const char code[] = "char * foo ()\n" "{\n" " char *str = malloc(10);\n" " if (somecondition)\n" " for ( ; ; )\n" " { }\n" " return str;\n" "}\n"; // tokenize.. OurTokenizer tokenizer; std::istringstream istr(code); tokenizer.tokenize(istr, "test.cpp"); ASSERT_EQUALS(true, tokenizer.simplifyIfAddBraces()); std::ostringstream ostr; for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next()) ostr << " " << tok->str(); ASSERT_EQUALS(std::string(" char * foo ( ) { char * str = malloc ( 10 ) ; if ( somecondition ) { for ( ; ; ) { } } return str ; }"), ostr.str()); } void simplifyKnownVariables1() { const char code[] = "void f()\n" "{\n" " int a = 10;\n" " if (a);\n" "}\n"; // tokenize.. OurTokenizer tokenizer; std::istringstream istr(code); tokenizer.tokenize(istr, "test.cpp"); tokenizer.setVarId(); tokenizer.simplifyKnownVariables(); std::ostringstream ostr; for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next()) ostr << " " << tok->str(); ASSERT_EQUALS(std::string(" void f ( ) { int a = 10 ; if ( 10 ) ; }"), ostr.str()); } void simplifyKnownVariables2() { const char code[] = "void f()\n"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -