⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testpreprocessor.cpp

📁 cppcheck is a static C/C++ code analyzer that checks for memory leaks, mismatching allocation-deallo
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                                "#ifdef WIN32\n"                                "#endif\n"                                "*/\n";        // Preprocess => actual result..        std::istringstream istr(filedata);        std::map<std::string, std::string> actual;        Preprocessor preprocessor;        preprocessor.preprocess(istr, actual, "file.c");        // Compare results..        ASSERT_EQUALS("\n\n\n\n", actual[""]);        ASSERT_EQUALS(1, static_cast<unsigned int>(actual.size()));    }    void if0()    {        const char filedata[] = " # if /* comment */  0 // comment\n"                                "#ifdef WIN32\n"                                "#endif\n"                                "#endif\n";        // Preprocess => actual result..        std::istringstream istr(filedata);        std::map<std::string, std::string> actual;        Preprocessor preprocessor;        preprocessor.preprocess(istr, actual, "file.c");        // Compare results..        ASSERT_EQUALS("\n\n\n\n", actual[""]);        ASSERT_EQUALS(1, static_cast<unsigned int>(actual.size()));    }    void if1()    {        const char filedata[] = " # if /* comment */  1 // comment\n"                                "ABC\n"                                " # endif \n";        // Preprocess => actual result..        std::istringstream istr(filedata);        std::map<std::string, std::string> actual;        Preprocessor preprocessor;        preprocessor.preprocess(istr, actual, "file.c");        // Compare results..        ASSERT_EQUALS("\nABC\n\n", actual[""]);        ASSERT_EQUALS(1, static_cast<unsigned int>(actual.size()));    }    void elif()    {        const char filedata[] = "#if DEF1\n"                                "ABC\n"                                "#elif DEF2\n"                                "DEF\n"                                "#endif\n";        // Preprocess => actual result..        std::istringstream istr(filedata);        std::map<std::string, std::string> actual;        Preprocessor preprocessor;        preprocessor.preprocess(istr, actual, "file.c");        // Compare results..        ASSERT_EQUALS("\n\n\n\n\n", actual[""]);        ASSERT_EQUALS("\nABC\n\n\n\n", actual["DEF1"]);        ASSERT_EQUALS("\n\n\nDEF\n\n", actual["DEF2"]);        ASSERT_EQUALS(3, static_cast<unsigned int>(actual.size()));    }    void if_cond1()    {        const char filedata[] = "#if LIBVER>100\n"                                "    A\n"                                "#else\n"                                "    B\n"                                "#endif\n";        // Preprocess => actual result..        std::istringstream istr(filedata);        std::map<std::string, std::string> actual;        Preprocessor preprocessor;        preprocessor.preprocess(istr, actual, "file.c");        // Compare results..        ASSERT_EQUALS("\n\n\nB\n\n", actual[""]);        ASSERT_EQUALS("\nA\n\n\n\n", actual["LIBVER>100"]);        ASSERT_EQUALS(2, static_cast<unsigned int>(actual.size()));    }    void multiline1()    {        const char filedata[] = "#define str \"abc\"     \\\n"                                "            \"def\"       \n"                                "abcdef = str;\n";        // Preprocess => actual result..        std::istringstream istr(filedata);        Preprocessor preprocessor;        ASSERT_EQUALS("#define str \"abc\"  \"def\" \n\nabcdef = str;\n", preprocessor.read(istr));    }    void multiline2()    {        const char filedata[] = "#define sqr(aa) aa * \\\n"                                "                aa\n"                                "sqr(5);\n";        // Preprocess => actual result..        std::istringstream istr(filedata);        Preprocessor preprocessor;        ASSERT_EQUALS("#define sqr(aa) aa *  aa\n\nsqr(5);\n", preprocessor.read(istr));    }    void multiline3()    {        const char filedata[] = "const char *str = \"abc\\\n"                                "def\\\n"                                "ghi\"\n";        // Preprocess => actual result..        std::istringstream istr(filedata);        Preprocessor preprocessor;        ASSERT_EQUALS("const char *str = \"abcdefghi\"\n\n\n", preprocessor.read(istr));    }    void if_defined()    {        const char filedata[] = "#if defined(AAA)\n"                                "#endif\n";        // Expected result..        std::string expected("#ifdef AAA\n#endif\n");        // Compare result..        ASSERT_EQUALS(expected, OurPreprocessor::replaceIfDefined(filedata));    }    void macro_simple1()    {        const char filedata[] = "#define AAA(aa) f(aa)\n"                                "AAA(5);\n";        ASSERT_EQUALS("\nf(5);\n", OurPreprocessor::expandMacros(filedata));    }    void macro_simple2()    {        const char filedata[] = "#define min(x,y) x<y?x:y\n"                                "min(a(),b());\n";        ASSERT_EQUALS("\na()<b()?a():b();\n", OurPreprocessor::expandMacros(filedata));    }    void macro_simple3()    {        const char filedata[] = "#define A 4\n"                                "A AA\n";        ASSERT_EQUALS("\n4 AA\n", OurPreprocessor::expandMacros(filedata));    }    void macro_simple4()    {        const char filedata[] = "#define TEMP_1 if( temp > 0 ) return 1;\n"                                "TEMP_1\n";        ASSERT_EQUALS("\nif( temp > 0 ) return 1;\n", OurPreprocessor::expandMacros(filedata));    }    void macro_simple5()    {        const char filedata[] = "#define ABC if( temp > 0 ) return 1;\n"                                "\n"                                "void foo()\n"                                "{\n"                                "    int temp = 0;\n"                                "    ABC\n"                                "}\n";        ASSERT_EQUALS("\n\nvoid foo()\n{\n    int temp = 0;\n    if( temp > 0 ) return 1;\n}\n", OurPreprocessor::expandMacros(filedata));    }    void macro_simple6()    {        const char filedata[] = "#define ABC (a+b+c)\n"                                "ABC";        ASSERT_EQUALS("\n(a+b+c)", OurPreprocessor::expandMacros(filedata));    }    void macro_simple7()    {        const char filedata[] = "#define ABC(str) str\n"                                "ABC(\"(\")";        ASSERT_EQUALS("\n\"(\"", OurPreprocessor::expandMacros(filedata));    }    void macro_simple8()    {        const char filedata[] = "#define ABC 123\n"                                "#define ABCD 1234\n"                                "ABC ABCD";        ASSERT_EQUALS("\n\n123 1234", OurPreprocessor::expandMacros(filedata));    }    void macro_mismatch()    {        const char filedata[] = "#define AAA(aa,bb) f(aa)\n"                                "AAA(5);\n";        ASSERT_EQUALS("\nAAA(5);\n", OurPreprocessor::expandMacros(filedata));    }    void string1()    {        const char filedata[] = "int main()"                                "{"                                "    const char *a = \"#define A\n\";"                                "}";        // Preprocess => actual result..        std::istringstream istr(filedata);        std::map<std::string, std::string> actual;        Preprocessor preprocessor;        preprocessor.preprocess(istr, actual, "file.c");        // Compare results..        ASSERT_EQUALS(1, static_cast<unsigned int>(actual.size()));        ASSERT_EQUALS("int main(){ const char *a = \"#define A\n\";}\n", actual[""]);    }    void string2()    {        const char filedata[] = "#define AAA 123\n"                                "str = \"AAA\"";        // Compare results..        ASSERT_EQUALS("\nstr = \"AAA\"", OurPreprocessor::expandMacros(filedata));    }    void preprocessor_undef()    {        const char filedata[] = "#define AAA int a;\n"                                "#undef AAA\n"                                "#define AAA char b=0;\n"                                "AAA\n";        // Compare results..        ASSERT_EQUALS("\n\n\nchar b=0;\n", OurPreprocessor::expandMacros(filedata));    }    void defdef()    {        const char filedata[] = "#define AAA 123\n"                                "#define AAA 456\n"                                "#define AAA 789\n"                                "AAA\n";        // Compare results..        ASSERT_EQUALS("\n\n\n789\n", OurPreprocessor::expandMacros(filedata));    }    void preprocessor_doublesharp()    {        const char filedata[] = "#define TEST(var,val) var = val\n"                                "TEST(foo,20);\n";        // Compare results..        ASSERT_EQUALS("\nfoo=20;\n", OurPreprocessor::expandMacros(filedata));        const char filedata2[] = "#define TEST(var,val) var##_##val = val\n"                                 "TEST(foo,20);\n";        // Compare results..        ASSERT_EQUALS("\nfoo_20=20;\n", OurPreprocessor::expandMacros(filedata2));    }    void preprocessor_include_in_str()    {        const char filedata[] = "int main()\n"                                "{\n"                                "const char *a = \"#include <string>\n\";\n"                                "return 0;\n"                                "}\n";        // Preprocess => actual result..        std::istringstream istr(filedata);        std::map<std::string, std::string> actual;        Preprocessor preprocessor;        preprocessor.preprocess(istr, actual, "file.c");        // Compare results..        ASSERT_EQUALS(1, static_cast<unsigned int>(actual.size()));        ASSERT_EQUALS("int main()\n{\nconst char *a = \"#include <string>\n\";\nreturn 0;\n}\n", actual[""]);    }    void fmt1()    {        const char filedata[] = "#define DBG(fmt...) printf(fmt)\n"                                "DBG(\"[0x%lx-0x%lx)\", pstart, pend);";        // Preprocess..        std::string actual = OurPreprocessor::expandMacros(filedata);        ASSERT_EQUALS("\nprintf(\"[0x%lx-0x%lx)\", pstart, pend);", actual);    }    void fmt2()    {        const char filedata[] = "#define DBG(fmt, args...) printf(fmt, ## args)\n"                                "DBG(\"hello\");";        // Preprocess..        std::string actual = OurPreprocessor::expandMacros(filedata);        ASSERT_EQUALS("\nprintf(\"hello\");", actual);    }    void multi_character_character()    {        const char filedata[] = "#define FOO 'ABCD'\n"                                "int main()\n"                                "{\n"                                "if( FOO == 0 );\n"                                "return 0;\n"                                "}\n";        // Preprocess => actual result..        std::istringstream istr(filedata);        std::map<std::string, std::string> actual;        Preprocessor preprocessor;        preprocessor.preprocess(istr, actual, "file.c");        // Compare results..        ASSERT_EQUALS(1, static_cast<unsigned int>(actual.size()));        ASSERT_EQUALS("\nint main()\n{\nif( 'ABCD' == 0 );\nreturn 0;\n}\n", actual[""]);    }    void stringify()    {        const char filedata[] = "#define STRINGIFY(x) #x\n"                                "STRINGIFY(abc)";        // expand macros..        std::string actual = OurPreprocessor::expandMacros(filedata);        ASSERT_EQUALS("\n\"abc\"", actual);    }};REGISTER_TEST(TestPreprocessor)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -