Skip to content

Commit 36e6e12

Browse files
authored
improved test coverage of throwing code (#666)
1 parent c44d686 commit 36e6e12

1 file changed

Lines changed: 101 additions & 2 deletions

File tree

test.cpp

Lines changed: 101 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,11 +132,11 @@ static std::string readfile(const char code[], std::size_t size, simplecpp::Outp
132132
return makeTokenList(code,size,files,std::string(),outputList).stringify();
133133
}
134134

135-
static std::string preprocess(const char code[], const simplecpp::DUI &dui, simplecpp::OutputList *outputList, std::list<simplecpp::MacroUsage> *macroUsage = nullptr, std::list<simplecpp::IfCond> *ifCond = nullptr, const std::string &file = std::string())
135+
static std::string preprocess(const char code[], std::size_t size, const simplecpp::DUI &dui, simplecpp::OutputList *outputList, std::list<simplecpp::MacroUsage> *macroUsage = nullptr, std::list<simplecpp::IfCond> *ifCond = nullptr, const std::string &file = std::string())
136136
{
137137
std::vector<std::string> files;
138138
simplecpp::FileDataCache cache;
139-
simplecpp::TokenList tokens = makeTokenList(code,files, file);
139+
simplecpp::TokenList tokens = makeTokenList(code, size, files, file);
140140
if (dui.removeComments)
141141
tokens.removeComments();
142142
simplecpp::TokenList tokens2(files);
@@ -145,6 +145,11 @@ static std::string preprocess(const char code[], const simplecpp::DUI &dui, simp
145145
return tokens2.stringify();
146146
}
147147

148+
static std::string preprocess(const char code[], const simplecpp::DUI &dui, simplecpp::OutputList *outputList, std::list<simplecpp::MacroUsage> *macroUsage = nullptr, std::list<simplecpp::IfCond> *ifCond = nullptr, const std::string &file = std::string())
149+
{
150+
return preprocess(code, strlen(code), dui, outputList, macroUsage, ifCond, file);
151+
}
152+
148153
static std::string preprocess(const char code[])
149154
{
150155
return preprocess(code, simplecpp::DUI(), nullptr);
@@ -165,6 +170,11 @@ static std::string preprocess(const char code[], simplecpp::OutputList *outputLi
165170
return preprocess(code, simplecpp::DUI(), outputList);
166171
}
167172

173+
static std::string preprocess(const char code[], std::size_t size, simplecpp::OutputList *outputList)
174+
{
175+
return preprocess(code, size, simplecpp::DUI(), outputList);
176+
}
177+
168178
static std::string preprocess(const char code[], std::list<simplecpp::IfCond> *ifCond)
169179
{
170180
return preprocess(code, simplecpp::DUI(), nullptr, nullptr, ifCond);
@@ -916,6 +926,24 @@ static void define_invalid_2()
916926
ASSERT_EQUALS("file0,1,syntax_error,Failed to parse #define, bad macro syntax\n", toString(outputList));
917927
}
918928

929+
static void define_invalid_3()
930+
{
931+
const char code[] = "#define R()\n"
932+
"R";
933+
simplecpp::OutputList outputList;
934+
ASSERT_EQUALS("", preprocess(code, &outputList));
935+
ASSERT_EQUALS("file0,2,syntax_error,failed to expand 'R', Wrong number of parameters for macro 'R'.\n", toString(outputList));
936+
}
937+
938+
static void define_invalid_4()
939+
{
940+
const char code[] = "#define X(...)\n"
941+
"X";
942+
simplecpp::OutputList outputList;
943+
ASSERT_EQUALS("", preprocess(code, &outputList));
944+
ASSERT_EQUALS("file0,2,syntax_error,failed to expand 'X', Wrong number of parameters for macro 'X'.\n", toString(outputList));
945+
}
946+
919947
static void define_define_1()
920948
{
921949
const char code[] = "#define A(x) (x+1)\n"
@@ -1345,6 +1373,30 @@ static void define_ifdef()
13451373

13461374
}
13471375

1376+
static void if_invalid_1()
1377+
{
1378+
const char code[] = "#if'\\u'";
1379+
simplecpp::OutputList outputList;
1380+
ASSERT_EQUALS("", preprocess(code, &outputList));
1381+
ASSERT_EQUALS("file0,1,syntax_error,failed to evaluate #if condition, expected digit\n", toString(outputList));
1382+
}
1383+
1384+
static void if_invalid_2()
1385+
{
1386+
const char code[] = "#if-0xBBB4444444444444%~B";
1387+
simplecpp::OutputList outputList;
1388+
ASSERT_EQUALS("", preprocess(code, &outputList));
1389+
ASSERT_EQUALS("file0,1,syntax_error,failed to evaluate #if condition, division overflow\n", toString(outputList));
1390+
}
1391+
1392+
static void if_invalid_3()
1393+
{
1394+
const char code[] = "#if@u'\\udefa'";
1395+
simplecpp::OutputList outputList;
1396+
ASSERT_EQUALS("", preprocess(code, &outputList));
1397+
ASSERT_EQUALS("file0,1,syntax_error,failed to evaluate #if condition, surrogate code points not allowed in universal character names\n", toString(outputList));
1398+
}
1399+
13481400
static void pragma_backslash()
13491401
{
13501402
const char code[] = "#pragma comment (longstring, \\\n"
@@ -2036,6 +2088,42 @@ static void has_include_6()
20362088
ASSERT_EQUALS("\n\nA", preprocess(code, dui));
20372089
}
20382090

2091+
static void define_has_include_invalid_1()
2092+
{
2093+
const char code[] = "#define A)__has_include\n"
2094+
"#if\u000BA";
2095+
simplecpp::OutputList outputList;
2096+
ASSERT_EQUALS("", preprocess(code, &outputList));
2097+
ASSERT_EQUALS("file0,2,syntax_error,failed to evaluate #if condition, missing __has_include argument\n", toString(outputList));
2098+
}
2099+
2100+
static void define_has_include_invalid_2()
2101+
{
2102+
const char code[] = "#define f __has_include\n"
2103+
"#if#f<";
2104+
simplecpp::OutputList outputList;
2105+
ASSERT_EQUALS("", preprocess(code, &outputList));
2106+
ASSERT_EQUALS("file0,2,syntax_error,failed to evaluate #if condition, missing __has_include argument\n", toString(outputList));
2107+
}
2108+
2109+
static void define_has_include_invalid_3()
2110+
{
2111+
const char code[] = "#define\u0000X\u0007__has_include(\n"
2112+
"#if%X&";
2113+
simplecpp::OutputList outputList;
2114+
ASSERT_EQUALS("", preprocess(code, sizeof(code), &outputList));
2115+
ASSERT_EQUALS("file0,2,syntax_error,failed to evaluate #if condition, invalid __has_include expression\n", toString(outputList));
2116+
}
2117+
2118+
static void define_has_include_invalid_4()
2119+
{
2120+
const char code[] = "#define\u0000X\u0000__has_include<2\n"
2121+
"#if*X";
2122+
simplecpp::OutputList outputList;
2123+
ASSERT_EQUALS("", preprocess(code, sizeof(code), &outputList));
2124+
ASSERT_EQUALS("file0,2,syntax_error,failed to evaluate #if condition, invalid __has_include expression\n", toString(outputList));
2125+
}
2126+
20392127
static void strict_ansi_1()
20402128
{
20412129
const char code[] = "#if __STRICT_ANSI__\n"
@@ -4010,6 +4098,8 @@ static void runTests(int argc, char **argv, Input input)
40104098
TEST_CASE(define23); // #40
40114099
TEST_CASE(define_invalid_1);
40124100
TEST_CASE(define_invalid_2);
4101+
TEST_CASE(define_invalid_3);
4102+
TEST_CASE(define_invalid_4);
40134103
TEST_CASE(define_define_1);
40144104
TEST_CASE(define_define_2);
40154105
TEST_CASE(define_define_3);
@@ -4055,6 +4145,10 @@ static void runTests(int argc, char **argv, Input input)
40554145
// UB: #ifdef as macro parameter
40564146
TEST_CASE(define_ifdef);
40574147

4148+
TEST_CASE(if_invalid_1);
4149+
TEST_CASE(if_invalid_2);
4150+
TEST_CASE(if_invalid_3);
4151+
40584152
TEST_CASE(dollar);
40594153

40604154
TEST_CASE(error1);
@@ -4117,6 +4211,11 @@ static void runTests(int argc, char **argv, Input input)
41174211
TEST_CASE(has_include_5);
41184212
TEST_CASE(has_include_6);
41194213

4214+
TEST_CASE(define_has_include_invalid_1);
4215+
TEST_CASE(define_has_include_invalid_2);
4216+
TEST_CASE(define_has_include_invalid_3);
4217+
TEST_CASE(define_has_include_invalid_4);
4218+
41204219
TEST_CASE(strict_ansi_1);
41214220
TEST_CASE(strict_ansi_2);
41224221
TEST_CASE(strict_ansi_3);

0 commit comments

Comments
 (0)