1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// Use of this source code is governed by a BSD-style license that can be
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// found in the LICENSE file.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com#include "testing/gtest/include/gtest/gtest.h"
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com#include "tools/gn/pattern.h"
76806fe87e0b39e283291c1a1c7d1d864230aa2aatfarina@chromium.org
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comnamespace {
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstruct Case {
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  const char* pattern;
125da3f220034f89f3234b16b98bd86e7246941ffecommit-bot@chromium.org  const char* candidate;
135da3f220034f89f3234b16b98bd86e7246941ffecommit-bot@chromium.org  bool expected_match;
140716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com};
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
168c3ff17e2cab6f7c798b9f8ff4515c4a3d3fd9d1bsalomon@google.com}  // namespace
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
180456e0b7b85060e9b9597ce414c4c2b19aff4f58robertphillips@google.comTEST(Pattern, Matches) {
190456e0b7b85060e9b9597ce414c4c2b19aff4f58robertphillips@google.com  Case pattern_cases[] = {
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // Empty pattern matches only empty string.
210e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org    { "", "", true },
220716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com    { "", "foo", false },
230716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com    // Exact matches.
240716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com    { "foo", "foo", true },
250716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com    { "foo", "bar", false },
26842292f10fc08bc8701114f7eec00944b6ea26d2reed@google.com    // Path boundaries.
27842292f10fc08bc8701114f7eec00944b6ea26d2reed@google.com    { "\\b", "", true },
280716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com    { "\\b", "/", true },
290e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org    { "\\b\\b", "/", true },
300716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com    { "\\b\\b\\b", "", false },
310716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com    { "\\b\\b\\b", "/", true },
320716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com    { "\\b", "//", false },
330716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com    { "\\bfoo\\b", "foo", true },
340716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com    { "\\bfoo\\b", "/foo/", true },
350716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com    { "\\b\\bfoo", "/foo", true },
360716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com    // *
37fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com    { "*", "", true },
388426058dee0faf75a18b81cfcde47ee8ab8c31d9reed@google.com    { "*", "foo", true },
398426058dee0faf75a18b81cfcde47ee8ab8c31d9reed@google.com    { "*foo", "foo", true },
408426058dee0faf75a18b81cfcde47ee8ab8c31d9reed@google.com    { "*foo", "gagafoo", true },
418426058dee0faf75a18b81cfcde47ee8ab8c31d9reed@google.com    { "*foo", "gagafoob", false },
42842292f10fc08bc8701114f7eec00944b6ea26d2reed@google.com    { "foo*bar", "foobar", true },
438426058dee0faf75a18b81cfcde47ee8ab8c31d9reed@google.com    { "foo*bar", "foo-bar", true },
441f90287df3129cb267422e482c52ebeca6a8990ftomhudson@google.com    { "foo*bar", "foolalalalabar", true },
45fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com    { "foo*bar", "foolalalalabaz", false },
460e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org    { "*a*b*c*d*", "abcd", true },
470e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org    { "*a*b*c*d*", "1a2b3c4d5", true },
480716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com    { "*a*b*c*d*", "1a2b3c45", false },
490716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com    { "*\\bfoo\\b*", "foo", true },
500716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com    { "*\\bfoo\\b*", "/foo/", true },
510716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com    { "*\\bfoo\\b*", "foob", false },
520716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com    { "*\\bfoo\\b*", "lala/foo/bar/baz", true },
530716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com  };
540716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com  for (size_t i = 0; i < arraysize(pattern_cases); i++) {
550716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com    const Case& c = pattern_cases[i];
560716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com    Pattern pattern(c.pattern);
570716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com    bool result = pattern.MatchesString(c.candidate);
580716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com    EXPECT_EQ(c.expected_match, result) << i << ": \"" << c.pattern
590716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com        << "\", \"" << c.candidate << "\"";
608c3ff17e2cab6f7c798b9f8ff4515c4a3d3fd9d1bsalomon@google.com  }
610716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com}
620716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com