Home > Mobile >  Google test error: '*' can only follow a repeatable token
Google test error: '*' can only follow a repeatable token

Time:07-13

Trying to create some unit tests with EXPECT_EXIT where the error message contains a '*'. The test fails but not with expected error. What am I missing here?

Here a very simple example to reproduce the issue:

void test_Death() {
    std::cerr << "*Error\n";
    exit(EXIT_FAILURE);
}

TEST(ErrorWithStar, Star) {
    EXPECT_EXIT(test_Death(), testing::ExitedWithCode(EXIT_FAILURE), "*Error\n");
}

The result is:

Message:

#1 - Failed
Syntax error at index 0 in simple regular expression "*Error
": '*' can only follow a repeatable token.
Running main() from c:\a\1\s\thirdparty\googletest\googletest\src\gtest_main.cc
#2 - Death test: test_Death()
    Result: died but not with expected error.
  Expected: *Error

Actual msg:
[  DEATH   ] *Error
[  DEATH   ]

I am using Microsoft Visual Studio Community 2019 Version 16.11.13. I added a Google Test project to my solution, created all links etc. It is working perfectly for everything else, but not for messages containing a '*'.

What is meant by "'*' can only follow a repeatable token."?

CodePudding user response:

The character * is reserved by the regular expression grammar to indicate matching zero or more of the previous tokens or groups.

Some simple examples:

  • .* matches zero or more of any character
  • a* matches zero or more of the character a
  • [A-F]* matches zero or more of the characters A through to F

The error is occurring because you have a * at the beginning of the string, where there is no preceding character, group etc to be repeated. This is essentially a syntax error in the regular expression grammar, and the error message tells you so.

What you actually want is a literal *, not the one that belongs to the grammar. To achieve this, you must escape it with a \. And because strings in C also use that for an escape character, you must escape the backslash too. So you need two backslashes before the * (or use a raw string literal).

In a pinch, the solution should be:

EXPECT_EXIT(test_Death(), testing::ExitedWithCode(EXIT_FAILURE), "\\*Error\n");
  • Related