Changeset View
Changeset View
Standalone View
Standalone View
llvm/unittests/Support/FileCheckTest.cpp
Show First 20 Lines • Show All 718 Lines • ▼ Show 20 Lines | TEST_F(FileCheckTest, ParseNumericSubstitutionBlock) { | ||||
// Valid implicit format conflict in presence of explicit formats. | // Valid implicit format conflict in presence of explicit formats. | ||||
EXPECT_THAT_EXPECTED(Tester.parseSubst("%X,FOO+VAR_LOWER_HEX"), Succeeded()); | EXPECT_THAT_EXPECTED(Tester.parseSubst("%X,FOO+VAR_LOWER_HEX"), Succeeded()); | ||||
// Implicit format conflict. | // Implicit format conflict. | ||||
expectDiagnosticError( | expectDiagnosticError( | ||||
"implicit format conflict between 'FOO' (%u) and " | "implicit format conflict between 'FOO' (%u) and " | ||||
"'VAR_LOWER_HEX' (%x), need an explicit format specifier", | "'VAR_LOWER_HEX' (%x), need an explicit format specifier", | ||||
Tester.parseSubst("FOO+VAR_LOWER_HEX").takeError()); | Tester.parseSubst("FOO+VAR_LOWER_HEX").takeError()); | ||||
// Simple parenthesized expressions: | |||||
EXPECT_THAT_EXPECTED(Tester.parseSubst("(1)"), Succeeded()); | |||||
EXPECT_THAT_EXPECTED(Tester.parseSubst("(1+1)"), Succeeded()); | |||||
EXPECT_THAT_EXPECTED(Tester.parseSubst("(1)+1"), Succeeded()); | |||||
EXPECT_THAT_EXPECTED(Tester.parseSubst("((1)+1)"), Succeeded()); | |||||
EXPECT_THAT_EXPECTED(Tester.parseSubst("((1)+X)"), Succeeded()); | |||||
EXPECT_THAT_EXPECTED(Tester.parseSubst("((X)+Y)"), Succeeded()); | |||||
expectDiagnosticError("missing operand in expression", | |||||
Tester.parseSubst("(").takeError()); | |||||
expectDiagnosticError("missing ')' at end of nested expression", | |||||
Tester.parseSubst("(1").takeError()); | |||||
expectDiagnosticError("missing operand in expression", | |||||
Tester.parseSubst("(1+").takeError()); | |||||
expectDiagnosticError("missing ')' at end of nested expression", | |||||
Tester.parseSubst("(1+1").takeError()); | |||||
expectDiagnosticError("missing ')' at end of nested expression", | |||||
Tester.parseSubst("((1+2+3").takeError()); | |||||
expectDiagnosticError("missing ')' at end of nested expression", | |||||
Tester.parseSubst("((1+2)+3").takeError()); | |||||
jhenderson: Do you think it might make sense for a test case for more closing parentheses than opening ones? | |||||
// Test missing operation between operands: | |||||
expectDiagnosticError("unsupported operation '('", | |||||
Tester.parseSubst("(1)(2)").takeError()); | |||||
expectDiagnosticError("unsupported operation '('", | |||||
Tester.parseSubst("2(X)").takeError()); | |||||
// Test more closing than opening parentheses. The diagnostic messages are | |||||
// not ideal, but for now simply check that we reject invalid input. | |||||
Not Done ReplyInline ActionsIf you plan on improving the situation, perhaps move the second sentence to a TODO comment on the next line. jhenderson: If you plan on improving the situation, perhaps move the second sentence to a TODO comment on… | |||||
I don't have any immediate plans since I have lots of other things on my TODO list. arichardson: I don't have any immediate plans since I have lots of other things on my TODO list. | |||||
expectDiagnosticError("invalid operand format ')'", | |||||
Tester.parseSubst(")").takeError()); | |||||
expectDiagnosticError("unsupported operation ')'", | |||||
Tester.parseSubst("1)").takeError()); | |||||
expectDiagnosticError("unsupported operation ')'", | |||||
Tester.parseSubst("(1+2))").takeError()); | |||||
expectDiagnosticError("unsupported operation ')'", | |||||
Tester.parseSubst("(2))").takeError()); | |||||
expectDiagnosticError("unsupported operation ')'", | |||||
Tester.parseSubst("(1))(").takeError()); | |||||
} | } | ||||
TEST_F(FileCheckTest, ParsePattern) { | TEST_F(FileCheckTest, ParsePattern) { | ||||
PatternTester Tester; | PatternTester Tester; | ||||
// Invalid space in string substitution. | // Invalid space in string substitution. | ||||
EXPECT_TRUE(Tester.parsePattern("[[ BAR]]")); | EXPECT_TRUE(Tester.parsePattern("[[ BAR]]")); | ||||
▲ Show 20 Lines • Show All 104 Lines • ▼ Show 20 Lines | TEST_F(FileCheckTest, Match) { | ||||
Tester.initNextPattern(); | Tester.initNextPattern(); | ||||
// Check that @LINE matches the later (given the calls to initNextPattern()) | // Check that @LINE matches the later (given the calls to initNextPattern()) | ||||
// line number. | // line number. | ||||
EXPECT_FALSE(Tester.parsePattern("[[#@LINE]]")); | EXPECT_FALSE(Tester.parsePattern("[[#@LINE]]")); | ||||
EXPECT_THAT_EXPECTED(Tester.match(std::to_string(Tester.getLineNumber())), | EXPECT_THAT_EXPECTED(Tester.match(std::to_string(Tester.getLineNumber())), | ||||
Succeeded()); | Succeeded()); | ||||
} | } | ||||
TEST_F(FileCheckTest, MatchParen) { | |||||
PatternTester Tester; | |||||
// Check simple parenthesized expressions | |||||
Tester.initNextPattern(); | |||||
ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR:]]")); | |||||
expectNotFoundError(Tester.match("FAIL").takeError()); | |||||
expectNotFoundError(Tester.match("").takeError()); | |||||
EXPECT_THAT_EXPECTED(Tester.match("18"), Succeeded()); | |||||
Tester.initNextPattern(); | |||||
ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR + (2 + 2)]]")); | |||||
expectNotFoundError(Tester.match("21").takeError()); | |||||
EXPECT_THAT_EXPECTED(Tester.match("22"), Succeeded()); | |||||
Tester.initNextPattern(); | |||||
ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR + (2)]]")); | |||||
EXPECT_THAT_EXPECTED(Tester.match("20"), Succeeded()); | |||||
Tester.initNextPattern(); | |||||
ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR+(2)]]")); | |||||
EXPECT_THAT_EXPECTED(Tester.match("20"), Succeeded()); | |||||
Tester.initNextPattern(); | |||||
ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR+(NUMVAR)]]")); | |||||
EXPECT_THAT_EXPECTED(Tester.match("36"), Succeeded()); | |||||
// Check nested parenthesized expressions: | |||||
Tester.initNextPattern(); | |||||
ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR+(2+(2))]]")); | |||||
EXPECT_THAT_EXPECTED(Tester.match("22"), Succeeded()); | |||||
Tester.initNextPattern(); | |||||
ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR+(2+(NUMVAR))]]")); | |||||
EXPECT_THAT_EXPECTED(Tester.match("38"), Succeeded()); | |||||
Tester.initNextPattern(); | |||||
ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR+((((NUMVAR))))]]")); | |||||
EXPECT_THAT_EXPECTED(Tester.match("36"), Succeeded()); | |||||
Tester.initNextPattern(); | |||||
ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR+((((NUMVAR)))-1)-1]]")); | |||||
EXPECT_THAT_EXPECTED(Tester.match("34"), Succeeded()); | |||||
// Parentheses can also be the first character after the '#': | |||||
Tester.initNextPattern(); | |||||
ASSERT_FALSE(Tester.parsePattern("[[#(NUMVAR)]]")); | |||||
EXPECT_THAT_EXPECTED(Tester.match("18"), Succeeded()); | |||||
Tester.initNextPattern(); | |||||
ASSERT_FALSE(Tester.parsePattern("[[#(NUMVAR+2)]]")); | |||||
EXPECT_THAT_EXPECTED(Tester.match("20"), Succeeded()); | |||||
} | |||||
TEST_F(FileCheckTest, Substitution) { | TEST_F(FileCheckTest, Substitution) { | ||||
SourceMgr SM; | SourceMgr SM; | ||||
FileCheckPatternContext Context; | FileCheckPatternContext Context; | ||||
EXPECT_THAT_ERROR(Context.defineCmdlineVariables({"FOO=BAR"}, SM), | EXPECT_THAT_ERROR(Context.defineCmdlineVariables({"FOO=BAR"}, SM), | ||||
Succeeded()); | Succeeded()); | ||||
// Substitution of an undefined string variable fails and error holds that | // Substitution of an undefined string variable fails and error holds that | ||||
// variable's name. | // variable's name. | ||||
▲ Show 20 Lines • Show All 200 Lines • Show Last 20 Lines |
Do you think it might make sense for a test case for more closing parentheses than opening ones? E.g. ")" or "())" or maybe even "())("?
Perhaps also something like "(1)(2)" and "2(X)" too with no operation between the operands?