Add support for ':' in --gtest_filter to gn_unittests

For googletest, the ':' character can be used in either the posivite
or negative filter to separate a list of filters. Not having this in
gn_unittests is unexpected as it make it difficult to ignore multiple
tests suites (e.g. both ExecProcessTest and FormatTest fails when
building and running gn_unittests in Xcode).

Add the support for ':' by introducing another recursive function
PatternListMatchString and an early exit in PatternMatchesString.

Bug: none
Change-Id: I75709fb4c47981a1e9a9e4fb75295804ba87b38f
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/7061
Reviewed-by: Brett Wilson <brettw@chromium.org>
Commit-Queue: Brett Wilson <brettw@chromium.org>
diff --git a/src/util/test/gn_test.cc b/src/util/test/gn_test.cc
index 6b2e26d..32e3c01 100644
--- a/src/util/test/gn_test.cc
+++ b/src/util/test/gn_test.cc
@@ -55,6 +55,7 @@
   switch (*pattern) {
     case '\0':
     case '-':
+    case ':':
       return *str == '\0';
     case '*':
       return (*str != '\0' && PatternMatchesString(pattern, str + 1)) ||
@@ -64,13 +65,25 @@
   }
 }
 
+bool PatternListMatchString(const char* pattern, const char* str) {
+  const char* const colon = strchr(pattern, ':');
+  if (PatternMatchesString(pattern, str))
+    return true;
+
+  if (!colon)
+    return false;
+
+  return PatternListMatchString(colon + 1, str);
+}
+
 bool TestMatchesFilter(const char* test, const char* filter) {
   // Split --gtest_filter at '-' into positive and negative filters.
   const char* const dash = strchr(filter, '-');
   const char* pos =
       dash == filter ? "*" : filter;  // Treat '-test1' as '*-test1'
   const char* neg = dash ? dash + 1 : "";
-  return PatternMatchesString(pos, test) && !PatternMatchesString(neg, test);
+  return PatternListMatchString(pos, test) &&
+         !PatternListMatchString(neg, test);
 }
 
 #if defined(OS_WIN)