51 string StringPrintf(
const char* format, ...) {
57 vsnprintf(buf, N, format, ap);
65 "usage: ninja_tests [options]\n" 68 " --gtest_filter=POSTIVE_PATTERN[-NEGATIVE_PATTERN]\n" 69 " Run tests whose names match the positive but not the negative pattern.\n" 70 " '*' matches any substring. (gtest's ':', '?' are not implemented).\n");
73 bool PatternMatchesString(
const char* pattern,
const char* str) {
76 case '-':
return *str ==
'\0';
77 case '*':
return (*str !=
'\0' && PatternMatchesString(pattern, str + 1)) ||
78 PatternMatchesString(pattern + 1, str);
79 default:
return *pattern == *str &&
80 PatternMatchesString(pattern + 1, str + 1);
84 bool TestMatchesFilter(
const char* test,
const char* filter) {
86 const char*
const dash = strchr(filter,
'-');
87 const char* pos = dash == filter ?
"*" : filter;
88 const char* neg = dash ? dash + 1 :
"";
89 return PatternMatchesString(pos, test) && !PatternMatchesString(neg, test);
92 bool ReadFlags(
int* argc,
char*** argv,
const char** test_filter) {
93 enum { OPT_GTEST_FILTER = 1 };
94 const option kLongOptions[] = {
100 while ((opt =
getopt_long(*argc, *argv,
"h", kLongOptions, NULL)) != -1) {
102 case OPT_GTEST_FILTER:
103 if (strchr(
optarg,
'?') == NULL && strchr(
optarg,
':') == NULL) {
123 StringPrintf(
"*** Failure in %s:%d\n%s\n", file, line, error));
129 int main(
int argc,
char **argv) {
130 int tests_started = 0;
132 const char* test_filter =
"*";
133 if (!ReadFlags(&argc, &argv, &test_filter))
136 int nactivetests = 0;
137 for (
int i = 0; i <
ntests; i++)
138 if ((
tests[i].should_run = TestMatchesFilter(
tests[i].name, test_filter)))
142 for (
int i = 0; i <
ntests; i++) {
143 if (!
tests[i].should_run)
continue;
148 StringPrintf(
"[%d/%d] %s", tests_started, nactivetests,
tests[i].name),
159 return passed ? EXIT_SUCCESS : EXIT_FAILURE;
static RegisteredTest tests[10000]
void RegisterTest(testing::Test *(*factory)(), const char *name)
void PrintOnNewLine(const string &to_print)
Prints a string on a new line, not overprinting previous output.
static LinePrinter printer
int main(int argc, char **argv)
int getopt_long(int argc, char **argv, const char *shortopts, const GETOPT_LONG_OPTION_T *longopts, int *longind)
bool Check(bool condition, const char *file, int line, const char *error)
Prints lines of text, possibly overprinting previously printed lines if the terminal supports it...
void Print(string to_print, LineType type)
Overprints the current line.
testing::Test * g_current_test
#define required_argument
testing::Test *(* factory)()