1f7a7ab59SRui Ueyama //===- llvm/unittest/Support/GlobPatternTest.cpp --------------------------===//
2f7a7ab59SRui Ueyama //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6f7a7ab59SRui Ueyama //
7f7a7ab59SRui Ueyama //===----------------------------------------------------------------------===//
8f7a7ab59SRui Ueyama 
9f7a7ab59SRui Ueyama #include "llvm/Support/GlobPattern.h"
10f7a7ab59SRui Ueyama #include "gtest/gtest.h"
11f7a7ab59SRui Ueyama 
12f7a7ab59SRui Ueyama using namespace llvm;
13f7a7ab59SRui Ueyama namespace {
14f7a7ab59SRui Ueyama 
15f7a7ab59SRui Ueyama class GlobPatternTest : public ::testing::Test {};
16f7a7ab59SRui Ueyama 
TEST_F(GlobPatternTest,Empty)1748993d5aSJordan Rupprecht TEST_F(GlobPatternTest, Empty) {
18f7a7ab59SRui Ueyama   Expected<GlobPattern> Pat1 = GlobPattern::create("");
19f7a7ab59SRui Ueyama   EXPECT_TRUE((bool)Pat1);
20f7a7ab59SRui Ueyama   EXPECT_TRUE(Pat1->match(""));
21f7a7ab59SRui Ueyama   EXPECT_FALSE(Pat1->match("a"));
2248993d5aSJordan Rupprecht }
23f7a7ab59SRui Ueyama 
TEST_F(GlobPatternTest,Glob)2448993d5aSJordan Rupprecht TEST_F(GlobPatternTest, Glob) {
2548993d5aSJordan Rupprecht   Expected<GlobPattern> Pat1 = GlobPattern::create("ab*c*def");
2648993d5aSJordan Rupprecht   EXPECT_TRUE((bool)Pat1);
2748993d5aSJordan Rupprecht   EXPECT_TRUE(Pat1->match("abcdef"));
2848993d5aSJordan Rupprecht   EXPECT_TRUE(Pat1->match("abxcxdef"));
2948993d5aSJordan Rupprecht   EXPECT_FALSE(Pat1->match(""));
3048993d5aSJordan Rupprecht   EXPECT_FALSE(Pat1->match("xabcdef"));
3148993d5aSJordan Rupprecht   EXPECT_FALSE(Pat1->match("abcdefx"));
3248993d5aSJordan Rupprecht }
3348993d5aSJordan Rupprecht 
TEST_F(GlobPatternTest,Wildcard)3448993d5aSJordan Rupprecht TEST_F(GlobPatternTest, Wildcard) {
3548993d5aSJordan Rupprecht   Expected<GlobPattern> Pat1 = GlobPattern::create("a??c");
3648993d5aSJordan Rupprecht   EXPECT_TRUE((bool)Pat1);
3748993d5aSJordan Rupprecht   EXPECT_TRUE(Pat1->match("axxc"));
3848993d5aSJordan Rupprecht   EXPECT_FALSE(Pat1->match("axxx"));
3948993d5aSJordan Rupprecht   EXPECT_FALSE(Pat1->match(""));
4048993d5aSJordan Rupprecht }
4148993d5aSJordan Rupprecht 
TEST_F(GlobPatternTest,Escape)4248993d5aSJordan Rupprecht TEST_F(GlobPatternTest, Escape) {
4348993d5aSJordan Rupprecht   Expected<GlobPattern> Pat1 = GlobPattern::create("\\*");
4448993d5aSJordan Rupprecht   EXPECT_TRUE((bool)Pat1);
4548993d5aSJordan Rupprecht   EXPECT_TRUE(Pat1->match("*"));
4648993d5aSJordan Rupprecht   EXPECT_FALSE(Pat1->match("\\*"));
4748993d5aSJordan Rupprecht   EXPECT_FALSE(Pat1->match("a"));
4848993d5aSJordan Rupprecht 
4948993d5aSJordan Rupprecht   Expected<GlobPattern> Pat2 = GlobPattern::create("a?\\?c");
50f7a7ab59SRui Ueyama   EXPECT_TRUE((bool)Pat2);
5148993d5aSJordan Rupprecht   EXPECT_TRUE(Pat2->match("ax?c"));
5248993d5aSJordan Rupprecht   EXPECT_FALSE(Pat2->match("axxc"));
53f7a7ab59SRui Ueyama   EXPECT_FALSE(Pat2->match(""));
5448993d5aSJordan Rupprecht }
55f7a7ab59SRui Ueyama 
TEST_F(GlobPatternTest,BasicCharacterClass)5648993d5aSJordan Rupprecht TEST_F(GlobPatternTest, BasicCharacterClass) {
5748993d5aSJordan Rupprecht   Expected<GlobPattern> Pat1 = GlobPattern::create("[abc-fy-z]");
5848993d5aSJordan Rupprecht   EXPECT_TRUE((bool)Pat1);
5948993d5aSJordan Rupprecht   EXPECT_TRUE(Pat1->match("a"));
6048993d5aSJordan Rupprecht   EXPECT_TRUE(Pat1->match("b"));
6148993d5aSJordan Rupprecht   EXPECT_TRUE(Pat1->match("c"));
6248993d5aSJordan Rupprecht   EXPECT_TRUE(Pat1->match("d"));
6348993d5aSJordan Rupprecht   EXPECT_TRUE(Pat1->match("e"));
6448993d5aSJordan Rupprecht   EXPECT_TRUE(Pat1->match("f"));
6548993d5aSJordan Rupprecht   EXPECT_TRUE(Pat1->match("y"));
6648993d5aSJordan Rupprecht   EXPECT_TRUE(Pat1->match("z"));
6748993d5aSJordan Rupprecht   EXPECT_FALSE(Pat1->match("g"));
6848993d5aSJordan Rupprecht   EXPECT_FALSE(Pat1->match(""));
6948993d5aSJordan Rupprecht }
70f7a7ab59SRui Ueyama 
TEST_F(GlobPatternTest,NegatedCharacterClass)7148993d5aSJordan Rupprecht TEST_F(GlobPatternTest, NegatedCharacterClass) {
7248993d5aSJordan Rupprecht   Expected<GlobPattern> Pat1 = GlobPattern::create("[^abc-fy-z]");
7348993d5aSJordan Rupprecht   EXPECT_TRUE((bool)Pat1);
7448993d5aSJordan Rupprecht   EXPECT_TRUE(Pat1->match("g"));
7548993d5aSJordan Rupprecht   EXPECT_FALSE(Pat1->match("a"));
7648993d5aSJordan Rupprecht   EXPECT_FALSE(Pat1->match("b"));
7748993d5aSJordan Rupprecht   EXPECT_FALSE(Pat1->match("c"));
7848993d5aSJordan Rupprecht   EXPECT_FALSE(Pat1->match("d"));
7948993d5aSJordan Rupprecht   EXPECT_FALSE(Pat1->match("e"));
8048993d5aSJordan Rupprecht   EXPECT_FALSE(Pat1->match("f"));
8148993d5aSJordan Rupprecht   EXPECT_FALSE(Pat1->match("y"));
8248993d5aSJordan Rupprecht   EXPECT_FALSE(Pat1->match("z"));
8348993d5aSJordan Rupprecht   EXPECT_FALSE(Pat1->match(""));
84f7a7ab59SRui Ueyama 
8548993d5aSJordan Rupprecht   Expected<GlobPattern> Pat2 = GlobPattern::create("[!abc-fy-z]");
8648993d5aSJordan Rupprecht   EXPECT_TRUE((bool)Pat2);
8748993d5aSJordan Rupprecht   EXPECT_TRUE(Pat2->match("g"));
8848993d5aSJordan Rupprecht   EXPECT_FALSE(Pat2->match("a"));
8948993d5aSJordan Rupprecht   EXPECT_FALSE(Pat2->match("b"));
9048993d5aSJordan Rupprecht   EXPECT_FALSE(Pat2->match("c"));
9148993d5aSJordan Rupprecht   EXPECT_FALSE(Pat2->match("d"));
9248993d5aSJordan Rupprecht   EXPECT_FALSE(Pat2->match("e"));
9348993d5aSJordan Rupprecht   EXPECT_FALSE(Pat2->match("f"));
9448993d5aSJordan Rupprecht   EXPECT_FALSE(Pat2->match("y"));
9548993d5aSJordan Rupprecht   EXPECT_FALSE(Pat2->match("z"));
9648993d5aSJordan Rupprecht   EXPECT_FALSE(Pat2->match(""));
9748993d5aSJordan Rupprecht }
9848993d5aSJordan Rupprecht 
TEST_F(GlobPatternTest,BracketFrontOfCharacterClass)9948993d5aSJordan Rupprecht TEST_F(GlobPatternTest, BracketFrontOfCharacterClass) {
10048993d5aSJordan Rupprecht   Expected<GlobPattern> Pat1 = GlobPattern::create("[]a]x");
10148993d5aSJordan Rupprecht   EXPECT_TRUE((bool)Pat1);
10248993d5aSJordan Rupprecht   EXPECT_TRUE(Pat1->match("]x"));
10348993d5aSJordan Rupprecht   EXPECT_TRUE(Pat1->match("ax"));
10448993d5aSJordan Rupprecht   EXPECT_FALSE(Pat1->match("a]x"));
10548993d5aSJordan Rupprecht   EXPECT_FALSE(Pat1->match(""));
10648993d5aSJordan Rupprecht }
10748993d5aSJordan Rupprecht 
TEST_F(GlobPatternTest,SpecialCharsInCharacterClass)10848993d5aSJordan Rupprecht TEST_F(GlobPatternTest, SpecialCharsInCharacterClass) {
10948993d5aSJordan Rupprecht   Expected<GlobPattern> Pat1 = GlobPattern::create("[*?^]");
11048993d5aSJordan Rupprecht   EXPECT_TRUE((bool)Pat1);
11148993d5aSJordan Rupprecht   EXPECT_TRUE(Pat1->match("*"));
11248993d5aSJordan Rupprecht   EXPECT_TRUE(Pat1->match("?"));
11348993d5aSJordan Rupprecht   EXPECT_TRUE(Pat1->match("^"));
11448993d5aSJordan Rupprecht   EXPECT_FALSE(Pat1->match("*?^"));
11548993d5aSJordan Rupprecht   EXPECT_FALSE(Pat1->match(""));
116f7a7ab59SRui Ueyama }
117f7a7ab59SRui Ueyama 
TEST_F(GlobPatternTest,Invalid)118f7a7ab59SRui Ueyama TEST_F(GlobPatternTest, Invalid) {
119f7a7ab59SRui Ueyama   Expected<GlobPattern> Pat1 = GlobPattern::create("[");
120f7a7ab59SRui Ueyama   EXPECT_FALSE((bool)Pat1);
121f7a7ab59SRui Ueyama   handleAllErrors(Pat1.takeError(), [&](ErrorInfoBase &EIB) {});
12248993d5aSJordan Rupprecht 
12348993d5aSJordan Rupprecht   Expected<GlobPattern> Pat2 = GlobPattern::create("[]");
12448993d5aSJordan Rupprecht   EXPECT_FALSE((bool)Pat2);
12548993d5aSJordan Rupprecht   handleAllErrors(Pat2.takeError(), [&](ErrorInfoBase &EIB) {});
126f7a7ab59SRui Ueyama }
127e36d7a6dSGeorge Rimar 
TEST_F(GlobPatternTest,ExtSym)128e36d7a6dSGeorge Rimar TEST_F(GlobPatternTest, ExtSym) {
129e36d7a6dSGeorge Rimar   Expected<GlobPattern> Pat1 = GlobPattern::create("a*\xFF");
130e36d7a6dSGeorge Rimar   EXPECT_TRUE((bool)Pat1);
131e36d7a6dSGeorge Rimar   EXPECT_TRUE(Pat1->match("axxx\xFF"));
132e36d7a6dSGeorge Rimar   Expected<GlobPattern> Pat2 = GlobPattern::create("[\xFF-\xFF]");
133e36d7a6dSGeorge Rimar   EXPECT_TRUE((bool)Pat2);
134e36d7a6dSGeorge Rimar   EXPECT_TRUE(Pat2->match("\xFF"));
135e36d7a6dSGeorge Rimar }
136*6040e2a6SAndrew Ng 
TEST_F(GlobPatternTest,IsTrivialMatchAll)137*6040e2a6SAndrew Ng TEST_F(GlobPatternTest, IsTrivialMatchAll) {
138*6040e2a6SAndrew Ng   Expected<GlobPattern> Pat1 = GlobPattern::create("*");
139*6040e2a6SAndrew Ng   EXPECT_TRUE((bool)Pat1);
140*6040e2a6SAndrew Ng   EXPECT_TRUE(Pat1->isTrivialMatchAll());
141*6040e2a6SAndrew Ng 
142*6040e2a6SAndrew Ng   const char *NegativeCases[] = {"a*", "*a", "?*", "*?", "**", "\\*"};
143*6040e2a6SAndrew Ng   for (auto *P : NegativeCases) {
144*6040e2a6SAndrew Ng     Expected<GlobPattern> Pat2 = GlobPattern::create(P);
145*6040e2a6SAndrew Ng     EXPECT_TRUE((bool)Pat2);
146*6040e2a6SAndrew Ng     EXPECT_FALSE(Pat2->isTrivialMatchAll());
147*6040e2a6SAndrew Ng   }
148*6040e2a6SAndrew Ng }
149f7a7ab59SRui Ueyama }
150