1 //===- llvm/unittest/Support/GlobPatternTest.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-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "llvm/Support/GlobPattern.h" 10 #include "llvm/ADT/BitVector.h" 11 #include "gtest/gtest.h" 12 13 using namespace llvm; 14 namespace { 15 16 class GlobPatternTest : public ::testing::Test {}; 17 18 TEST_F(GlobPatternTest, Empty) { 19 Expected<GlobPattern> Pat1 = GlobPattern::create(""); 20 EXPECT_TRUE((bool)Pat1); 21 EXPECT_TRUE(Pat1->match("")); 22 EXPECT_FALSE(Pat1->match("a")); 23 } 24 25 TEST_F(GlobPatternTest, Glob) { 26 Expected<GlobPattern> Pat1 = GlobPattern::create("ab*c*def"); 27 EXPECT_TRUE((bool)Pat1); 28 EXPECT_TRUE(Pat1->match("abcdef")); 29 EXPECT_TRUE(Pat1->match("abxcxdef")); 30 EXPECT_FALSE(Pat1->match("")); 31 EXPECT_FALSE(Pat1->match("xabcdef")); 32 EXPECT_FALSE(Pat1->match("abcdefx")); 33 } 34 35 TEST_F(GlobPatternTest, Wildcard) { 36 Expected<GlobPattern> Pat1 = GlobPattern::create("a??c"); 37 EXPECT_TRUE((bool)Pat1); 38 EXPECT_TRUE(Pat1->match("axxc")); 39 EXPECT_FALSE(Pat1->match("axxx")); 40 EXPECT_FALSE(Pat1->match("")); 41 } 42 43 TEST_F(GlobPatternTest, Escape) { 44 Expected<GlobPattern> Pat1 = GlobPattern::create("\\*"); 45 EXPECT_TRUE((bool)Pat1); 46 EXPECT_TRUE(Pat1->match("*")); 47 EXPECT_FALSE(Pat1->match("\\*")); 48 EXPECT_FALSE(Pat1->match("a")); 49 50 Expected<GlobPattern> Pat2 = GlobPattern::create("a?\\?c"); 51 EXPECT_TRUE((bool)Pat2); 52 EXPECT_TRUE(Pat2->match("ax?c")); 53 EXPECT_FALSE(Pat2->match("axxc")); 54 EXPECT_FALSE(Pat2->match("")); 55 } 56 57 TEST_F(GlobPatternTest, BasicCharacterClass) { 58 Expected<GlobPattern> Pat1 = GlobPattern::create("[abc-fy-z]"); 59 EXPECT_TRUE((bool)Pat1); 60 EXPECT_TRUE(Pat1->match("a")); 61 EXPECT_TRUE(Pat1->match("b")); 62 EXPECT_TRUE(Pat1->match("c")); 63 EXPECT_TRUE(Pat1->match("d")); 64 EXPECT_TRUE(Pat1->match("e")); 65 EXPECT_TRUE(Pat1->match("f")); 66 EXPECT_TRUE(Pat1->match("y")); 67 EXPECT_TRUE(Pat1->match("z")); 68 EXPECT_FALSE(Pat1->match("g")); 69 EXPECT_FALSE(Pat1->match("")); 70 } 71 72 TEST_F(GlobPatternTest, NegatedCharacterClass) { 73 Expected<GlobPattern> Pat1 = GlobPattern::create("[^abc-fy-z]"); 74 EXPECT_TRUE((bool)Pat1); 75 EXPECT_TRUE(Pat1->match("g")); 76 EXPECT_FALSE(Pat1->match("a")); 77 EXPECT_FALSE(Pat1->match("b")); 78 EXPECT_FALSE(Pat1->match("c")); 79 EXPECT_FALSE(Pat1->match("d")); 80 EXPECT_FALSE(Pat1->match("e")); 81 EXPECT_FALSE(Pat1->match("f")); 82 EXPECT_FALSE(Pat1->match("y")); 83 EXPECT_FALSE(Pat1->match("z")); 84 EXPECT_FALSE(Pat1->match("")); 85 86 Expected<GlobPattern> Pat2 = GlobPattern::create("[!abc-fy-z]"); 87 EXPECT_TRUE((bool)Pat2); 88 EXPECT_TRUE(Pat2->match("g")); 89 EXPECT_FALSE(Pat2->match("a")); 90 EXPECT_FALSE(Pat2->match("b")); 91 EXPECT_FALSE(Pat2->match("c")); 92 EXPECT_FALSE(Pat2->match("d")); 93 EXPECT_FALSE(Pat2->match("e")); 94 EXPECT_FALSE(Pat2->match("f")); 95 EXPECT_FALSE(Pat2->match("y")); 96 EXPECT_FALSE(Pat2->match("z")); 97 EXPECT_FALSE(Pat2->match("")); 98 } 99 100 TEST_F(GlobPatternTest, BracketFrontOfCharacterClass) { 101 Expected<GlobPattern> Pat1 = GlobPattern::create("[]a]x"); 102 EXPECT_TRUE((bool)Pat1); 103 EXPECT_TRUE(Pat1->match("]x")); 104 EXPECT_TRUE(Pat1->match("ax")); 105 EXPECT_FALSE(Pat1->match("a]x")); 106 EXPECT_FALSE(Pat1->match("")); 107 } 108 109 TEST_F(GlobPatternTest, SpecialCharsInCharacterClass) { 110 Expected<GlobPattern> Pat1 = GlobPattern::create("[*?^]"); 111 EXPECT_TRUE((bool)Pat1); 112 EXPECT_TRUE(Pat1->match("*")); 113 EXPECT_TRUE(Pat1->match("?")); 114 EXPECT_TRUE(Pat1->match("^")); 115 EXPECT_FALSE(Pat1->match("*?^")); 116 EXPECT_FALSE(Pat1->match("")); 117 } 118 119 TEST_F(GlobPatternTest, Invalid) { 120 Expected<GlobPattern> Pat1 = GlobPattern::create("["); 121 EXPECT_FALSE((bool)Pat1); 122 handleAllErrors(Pat1.takeError(), [&](ErrorInfoBase &EIB) {}); 123 124 Expected<GlobPattern> Pat2 = GlobPattern::create("[]"); 125 EXPECT_FALSE((bool)Pat2); 126 handleAllErrors(Pat2.takeError(), [&](ErrorInfoBase &EIB) {}); 127 } 128 129 TEST_F(GlobPatternTest, ExtSym) { 130 Expected<GlobPattern> Pat1 = GlobPattern::create("a*\xFF"); 131 EXPECT_TRUE((bool)Pat1); 132 EXPECT_TRUE(Pat1->match("axxx\xFF")); 133 Expected<GlobPattern> Pat2 = GlobPattern::create("[\xFF-\xFF]"); 134 EXPECT_TRUE((bool)Pat2); 135 EXPECT_TRUE(Pat2->match("\xFF")); 136 } 137 } 138