GlobPatternTest.cpp 4.2 KB

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