xref: /llvm-project/llvm/unittests/Support/GlobPatternTest.cpp (revision ca18ce1a00cd8b7cb7ce0e130440f5ae1ffe86ee)
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