TrigramIndexTest.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. //===- TrigramIndexTest.cpp - Unit tests for TrigramIndex -----------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #include "llvm/ADT/STLExtras.h"
  10. #include "llvm/Support/TrigramIndex.h"
  11. #include "gtest/gtest.h"
  12. #include <string>
  13. #include <vector>
  14. using namespace llvm;
  15. namespace {
  16. class TrigramIndexTest : public ::testing::Test {
  17. protected:
  18. std::unique_ptr<TrigramIndex> makeTrigramIndex(
  19. std::vector<std::string> Rules) {
  20. std::unique_ptr<TrigramIndex> TI =
  21. make_unique<TrigramIndex>();
  22. for (auto &Rule : Rules)
  23. TI->insert(Rule);
  24. return TI;
  25. }
  26. };
  27. TEST_F(TrigramIndexTest, Empty) {
  28. std::unique_ptr<TrigramIndex> TI =
  29. makeTrigramIndex({});
  30. EXPECT_FALSE(TI->isDefeated());
  31. EXPECT_TRUE(TI->isDefinitelyOut("foo"));
  32. }
  33. TEST_F(TrigramIndexTest, Basic) {
  34. std::unique_ptr<TrigramIndex> TI =
  35. makeTrigramIndex({"*hello*", "*wor.d*"});
  36. EXPECT_FALSE(TI->isDefeated());
  37. EXPECT_TRUE(TI->isDefinitelyOut("foo"));
  38. }
  39. TEST_F(TrigramIndexTest, NoTrigramsInRules) {
  40. std::unique_ptr<TrigramIndex> TI =
  41. makeTrigramIndex({"b.r", "za*az"});
  42. EXPECT_TRUE(TI->isDefeated());
  43. EXPECT_FALSE(TI->isDefinitelyOut("foo"));
  44. EXPECT_FALSE(TI->isDefinitelyOut("bar"));
  45. EXPECT_FALSE(TI->isDefinitelyOut("zakaz"));
  46. }
  47. TEST_F(TrigramIndexTest, NoTrigramsInARule) {
  48. std::unique_ptr<TrigramIndex> TI =
  49. makeTrigramIndex({"*hello*", "*wo.ld*"});
  50. EXPECT_TRUE(TI->isDefeated());
  51. EXPECT_FALSE(TI->isDefinitelyOut("foo"));
  52. }
  53. TEST_F(TrigramIndexTest, RepetitiveRule) {
  54. std::unique_ptr<TrigramIndex> TI =
  55. makeTrigramIndex({"*bar*bar*bar*bar*bar", "bar*bar"});
  56. EXPECT_FALSE(TI->isDefeated());
  57. EXPECT_TRUE(TI->isDefinitelyOut("foo"));
  58. EXPECT_TRUE(TI->isDefinitelyOut("bar"));
  59. EXPECT_FALSE(TI->isDefinitelyOut("barbara"));
  60. EXPECT_FALSE(TI->isDefinitelyOut("bar+bar"));
  61. }
  62. TEST_F(TrigramIndexTest, PopularTrigram) {
  63. std::unique_ptr<TrigramIndex> TI =
  64. makeTrigramIndex({"*aaa*", "*aaaa*", "*aaaaa*", "*aaaaa*", "*aaaaaa*"});
  65. EXPECT_TRUE(TI->isDefeated());
  66. }
  67. TEST_F(TrigramIndexTest, PopularTrigram2) {
  68. std::unique_ptr<TrigramIndex> TI =
  69. makeTrigramIndex({"class1.h", "class2.h", "class3.h", "class4.h", "class.h"});
  70. EXPECT_TRUE(TI->isDefeated());
  71. }
  72. TEST_F(TrigramIndexTest, TooComplicatedRegex) {
  73. std::unique_ptr<TrigramIndex> TI =
  74. makeTrigramIndex({"[0-9]+"});
  75. EXPECT_TRUE(TI->isDefeated());
  76. }
  77. TEST_F(TrigramIndexTest, TooComplicatedRegex2) {
  78. std::unique_ptr<TrigramIndex> TI =
  79. makeTrigramIndex({"foo|bar"});
  80. EXPECT_TRUE(TI->isDefeated());
  81. }
  82. TEST_F(TrigramIndexTest, EscapedSymbols) {
  83. std::unique_ptr<TrigramIndex> TI =
  84. makeTrigramIndex({"*c\\+\\+*", "*hello\\\\world*", "a\\tb", "a\\0b"});
  85. EXPECT_FALSE(TI->isDefeated());
  86. EXPECT_FALSE(TI->isDefinitelyOut("c++"));
  87. EXPECT_TRUE(TI->isDefinitelyOut("c\\+\\+"));
  88. EXPECT_FALSE(TI->isDefinitelyOut("hello\\world"));
  89. EXPECT_TRUE(TI->isDefinitelyOut("hello\\\\world"));
  90. EXPECT_FALSE(TI->isDefinitelyOut("atb"));
  91. EXPECT_TRUE(TI->isDefinitelyOut("a\\tb"));
  92. EXPECT_TRUE(TI->isDefinitelyOut("a\tb"));
  93. EXPECT_FALSE(TI->isDefinitelyOut("a0b"));
  94. }
  95. TEST_F(TrigramIndexTest, Backreference1) {
  96. std::unique_ptr<TrigramIndex> TI =
  97. makeTrigramIndex({"*foo\\1*"});
  98. EXPECT_TRUE(TI->isDefeated());
  99. }
  100. TEST_F(TrigramIndexTest, Backreference2) {
  101. std::unique_ptr<TrigramIndex> TI =
  102. makeTrigramIndex({"*foo\\2*"});
  103. EXPECT_TRUE(TI->isDefeated());
  104. }
  105. TEST_F(TrigramIndexTest, Sequence) {
  106. std::unique_ptr<TrigramIndex> TI =
  107. makeTrigramIndex({"class1.h", "class2.h", "class3.h", "class4.h"});
  108. EXPECT_FALSE(TI->isDefeated());
  109. EXPECT_FALSE(TI->isDefinitelyOut("class1"));
  110. EXPECT_TRUE(TI->isDefinitelyOut("class.h"));
  111. EXPECT_TRUE(TI->isDefinitelyOut("class"));
  112. }
  113. } // namespace