📄 testpreprocessor.cpp
字号:
"#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 + -