brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.2 KiB · 346ea7c Raw
205 lines · cpp
1//===- unittest/Format/MatchFilePathTest.cpp ------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "../../lib/Format/MatchFilePath.h"10#include "gtest/gtest.h"11 12namespace clang {13namespace format {14namespace {15 16class MatchFilePathTest : public testing::Test {17protected:18  bool match(llvm::StringRef FilePath, llvm::StringRef Pattern) {19    return matchFilePath(Pattern, FilePath);20  }21};22 23// Most of the test cases below are from:24// https://github.com/python/cpython/blob/main/Lib/test/test_fnmatch.py25 26TEST_F(MatchFilePathTest, Wildcard) {27  EXPECT_TRUE(match("abc", "?*?"));28  EXPECT_TRUE(match("abc", "???*"));29  EXPECT_TRUE(match("abc", "*???"));30  EXPECT_TRUE(match("abc", "???"));31  EXPECT_TRUE(match("abc", "*"));32  EXPECT_TRUE(match("abc", "ab[cd]"));33  EXPECT_TRUE(match("abc", "ab[!de]"));34  EXPECT_FALSE(match("abc", "ab[de]"));35  EXPECT_FALSE(match("a", "??"));36  EXPECT_FALSE(match("a", "b"));37}38 39TEST_F(MatchFilePathTest, Backslash) {40  EXPECT_TRUE(match("a?", R"(a\?)"));41  EXPECT_FALSE(match("a\\", R"(a\)"));42  EXPECT_TRUE(match("\\", R"([\])"));43  EXPECT_TRUE(match("a", R"([!\])"));44  EXPECT_FALSE(match("\\", R"([!\])"));45}46 47TEST_F(MatchFilePathTest, Newline) {48  EXPECT_TRUE(match("foo\nbar", "foo*"));49  EXPECT_TRUE(match("foo\nbar\n", "foo*"));50  EXPECT_FALSE(match("\nfoo", "foo*"));51  EXPECT_TRUE(match("\n", "*"));52}53 54TEST_F(MatchFilePathTest, Star) {55  EXPECT_TRUE(match(std::string(50, 'a'), "*a*a*a*a*a*a*a*a*a*a"));56  EXPECT_FALSE(match(std::string(50, 'a') + 'b', "*a*a*a*a*a*a*a*a*a*a"));57}58 59TEST_F(MatchFilePathTest, CaseSensitive) {60  EXPECT_TRUE(match("abc", "abc"));61  EXPECT_FALSE(match("AbC", "abc"));62  EXPECT_FALSE(match("abc", "AbC"));63  EXPECT_TRUE(match("AbC", "AbC"));64}65 66TEST_F(MatchFilePathTest, PathSeparators) {67  EXPECT_TRUE(match("usr/bin", "usr/bin"));68  EXPECT_TRUE(match("usr\\bin", R"(usr\\bin)"));69}70 71TEST_F(MatchFilePathTest, NumericEscapeSequence) {72  EXPECT_TRUE(match("test", "te*"));73  EXPECT_TRUE(match("test\xff", "te*\xff"));74  EXPECT_TRUE(match("foo\nbar", "foo*"));75}76 77TEST_F(MatchFilePathTest, ValidBrackets) {78  EXPECT_TRUE(match("z", "[az]"));79  EXPECT_FALSE(match("z", "[!az]"));80  EXPECT_TRUE(match("a", "[aa]"));81  EXPECT_TRUE(match("^", "[^az]"));82  EXPECT_TRUE(match("[", "[[az]"));83  EXPECT_FALSE(match("]", "[!]]"));84}85 86TEST_F(MatchFilePathTest, InvalidBrackets) {87  EXPECT_TRUE(match("[", "["));88  EXPECT_TRUE(match("[]", "[]"));89  EXPECT_TRUE(match("[!", "[!"));90  EXPECT_TRUE(match("[!]", "[!]"));91}92 93TEST_F(MatchFilePathTest, Range) {94  EXPECT_TRUE(match("c", "[b-d]"));95  EXPECT_FALSE(match("c", "[!b-d]"));96  EXPECT_TRUE(match("y", "[b-dx-z]"));97  EXPECT_FALSE(match("y", "[!b-dx-z]"));98}99 100TEST_F(MatchFilePathTest, Hyphen) {101  EXPECT_FALSE(match("#", "[!-#]"));102  EXPECT_FALSE(match("-", "[!--.]"));103  EXPECT_TRUE(match("_", "[^-`]"));104  EXPECT_TRUE(match("]", "[[-^]"));105  EXPECT_TRUE(match("]", R"([\-^])"));106  EXPECT_TRUE(match("-", "[b-]"));107  EXPECT_FALSE(match("-", "[!b-]"));108  EXPECT_TRUE(match("-", "[-b]"));109  EXPECT_FALSE(match("-", "[!-b]"));110  EXPECT_TRUE(match("-", "[-]"));111  EXPECT_FALSE(match("-", "[!-]"));112}113 114TEST_F(MatchFilePathTest, UpperLELower) {115  EXPECT_FALSE(match("c", "[d-b]"));116  EXPECT_TRUE(match("c", "[!d-b]"));117  EXPECT_TRUE(match("y", "[d-bx-z]"));118  EXPECT_FALSE(match("y", "[!d-bx-z]"));119  EXPECT_TRUE(match("_", "[d-b^-`]"));120  EXPECT_TRUE(match("]", "[d-b[-^]"));121  EXPECT_TRUE(match("b", "[b-b]"));122}123 124TEST_F(MatchFilePathTest, SlashAndBackslashInBrackets) {125  EXPECT_FALSE(match("/", "[/]"));126  EXPECT_TRUE(match("\\", R"([\])"));127  EXPECT_TRUE(match("[/]", "[/]"));128  EXPECT_TRUE(match("\\", R"([\t])"));129  EXPECT_TRUE(match("t", R"([\t])"));130  EXPECT_FALSE(match("\t", R"([\t])"));131}132 133TEST_F(MatchFilePathTest, SlashAndBackslashInRange) {134  EXPECT_FALSE(match("a/b", "a[.-0]b"));135  EXPECT_TRUE(match("a\\b", "a[Z-^]b"));136  EXPECT_FALSE(match("a/b", "a[/-0]b"));137  EXPECT_TRUE(match("a[/-0]b", "a[/-0]b"));138  EXPECT_FALSE(match("a/b", "a[.-/]b"));139  EXPECT_TRUE(match("a[.-/]b", "a[.-/]b"));140  EXPECT_TRUE(match("a\\b", R"(a[\-^]b)"));141  EXPECT_TRUE(match("a\\b", R"(a[Z-\]b)"));142}143 144TEST_F(MatchFilePathTest, Brackets) {145  EXPECT_TRUE(match("[", "[[]"));146  EXPECT_TRUE(match("&", "[a&&b]"));147  EXPECT_TRUE(match("|", "[a||b]"));148  EXPECT_TRUE(match("~", "[a~~b]"));149  EXPECT_TRUE(match(",", "[a-z+--A-Z]"));150  EXPECT_FALSE(match(".", "[a-z--/A-Z]"));151}152 153TEST_F(MatchFilePathTest, Path) {154  EXPECT_TRUE(match(".clang-format", "*"));155  EXPECT_TRUE(match(".git", "*git*"));156  EXPECT_TRUE(match(".gitignore", "*git*"));157  EXPECT_TRUE(match("foo/bar", "foo*/*bar"));158  EXPECT_TRUE(match("foo/bar", "*/*"));159  EXPECT_TRUE(match("foo/bar", R"(*foo*\/*bar*)"));160  EXPECT_FALSE(match("foo/bar", "foo*"));161  EXPECT_FALSE(match("foo/bar", "foo?bar"));162  EXPECT_FALSE(match("foo/bar", "foo*bar"));163  EXPECT_FALSE(match("foobar", "foo*/*"));164  EXPECT_FALSE(match("foo\\", R"(foo*\)"));165}166 167TEST_F(MatchFilePathTest, Globstar) {168  EXPECT_TRUE(match("/", "**"));169  EXPECT_TRUE(match("foo", "**"));170  EXPECT_TRUE(match("/foo", "**"));171  EXPECT_TRUE(match("foo/", "**"));172  EXPECT_TRUE(match("foo/bar", "**"));173 174  EXPECT_TRUE(match("/", "**/"));175  EXPECT_TRUE(match("foo/", "**/"));176  EXPECT_TRUE(match("/foo/", "**/"));177  EXPECT_TRUE(match("foo/bar/", "**/"));178 179  EXPECT_TRUE(match("/", "/**"));180  EXPECT_TRUE(match("/foo", "/**"));181  EXPECT_TRUE(match("/foo/", "/**"));182  EXPECT_TRUE(match("/foo/bar", "/**"));183 184  EXPECT_TRUE(match("foo", "**/foo"));185  EXPECT_TRUE(match("/foo", "**/foo"));186  EXPECT_TRUE(match("foo/bar", "**/bar"));187  EXPECT_TRUE(match("/foo/bar", "**/foo/bar"));188  EXPECT_TRUE(match("foo/bar/baz", "**/bar/baz"));189 190  EXPECT_TRUE(match("abc/foo", "abc/**"));191  EXPECT_TRUE(match("abc/foo/", "abc/**"));192  EXPECT_TRUE(match("abc/foo/bar", "abc/**"));193 194  EXPECT_TRUE(match("a/b", "a/**/b"));195  EXPECT_TRUE(match("a/x/b", "a/**/b"));196  EXPECT_TRUE(match("a/x/y/b", "a/**/b"));197 198  EXPECT_FALSE(match("a/x/b", "a**/b"));199  EXPECT_FALSE(match("a/x/b", "a/**b"));200}201 202} // namespace203} // namespace format204} // namespace clang205