| //===- TrigramIndexTest.cpp - Unit tests for TrigramIndex -----------------===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "llvm/Support/TrigramIndex.h" | |
| #include "llvm/ADT/STLExtras.h" | |
| #include "gtest/gtest.h" | |
| #include <string> | |
| #include <vector> | |
| using namespace llvm; | |
| namespace { | |
| class TrigramIndexTest : public ::testing::Test { | |
| protected: | |
| std::unique_ptr<TrigramIndex> makeTrigramIndex( | |
| std::vector<std::string> Rules) { | |
| std::unique_ptr<TrigramIndex> TI = | |
| make_unique<TrigramIndex>(); | |
| for (auto &Rule : Rules) | |
| TI->insert(Rule); | |
| return TI; | |
| } | |
| }; | |
| TEST_F(TrigramIndexTest, Empty) { | |
| std::unique_ptr<TrigramIndex> TI = | |
| makeTrigramIndex({}); | |
| EXPECT_FALSE(TI->isDefeated()); | |
| EXPECT_TRUE(TI->isDefinitelyOut("foo")); | |
| } | |
| TEST_F(TrigramIndexTest, Basic) { | |
| std::unique_ptr<TrigramIndex> TI = | |
| makeTrigramIndex({"*hello*", "*wor.d*"}); | |
| EXPECT_FALSE(TI->isDefeated()); | |
| EXPECT_TRUE(TI->isDefinitelyOut("foo")); | |
| } | |
| TEST_F(TrigramIndexTest, NoTrigramsInRules) { | |
| std::unique_ptr<TrigramIndex> TI = | |
| makeTrigramIndex({"b.r", "za*az"}); | |
| EXPECT_TRUE(TI->isDefeated()); | |
| EXPECT_FALSE(TI->isDefinitelyOut("foo")); | |
| EXPECT_FALSE(TI->isDefinitelyOut("bar")); | |
| EXPECT_FALSE(TI->isDefinitelyOut("zakaz")); | |
| } | |
| TEST_F(TrigramIndexTest, NoTrigramsInARule) { | |
| std::unique_ptr<TrigramIndex> TI = | |
| makeTrigramIndex({"*hello*", "*wo.ld*"}); | |
| EXPECT_TRUE(TI->isDefeated()); | |
| EXPECT_FALSE(TI->isDefinitelyOut("foo")); | |
| } | |
| TEST_F(TrigramIndexTest, RepetitiveRule) { | |
| std::unique_ptr<TrigramIndex> TI = | |
| makeTrigramIndex({"*bar*bar*bar*bar*bar", "bar*bar"}); | |
| EXPECT_FALSE(TI->isDefeated()); | |
| EXPECT_TRUE(TI->isDefinitelyOut("foo")); | |
| EXPECT_TRUE(TI->isDefinitelyOut("bar")); | |
| EXPECT_FALSE(TI->isDefinitelyOut("barbara")); | |
| EXPECT_FALSE(TI->isDefinitelyOut("bar+bar")); | |
| } | |
| TEST_F(TrigramIndexTest, PopularTrigram) { | |
| std::unique_ptr<TrigramIndex> TI = | |
| makeTrigramIndex({"*aaa*", "*aaaa*", "*aaaaa*", "*aaaaa*", "*aaaaaa*"}); | |
| EXPECT_TRUE(TI->isDefeated()); | |
| } | |
| TEST_F(TrigramIndexTest, PopularTrigram2) { | |
| std::unique_ptr<TrigramIndex> TI = | |
| makeTrigramIndex({"class1.h", "class2.h", "class3.h", "class4.h", "class.h"}); | |
| EXPECT_TRUE(TI->isDefeated()); | |
| } | |
| TEST_F(TrigramIndexTest, TooComplicatedRegex) { | |
| std::unique_ptr<TrigramIndex> TI = | |
| makeTrigramIndex({"[0-9]+"}); | |
| EXPECT_TRUE(TI->isDefeated()); | |
| } | |
| TEST_F(TrigramIndexTest, TooComplicatedRegex2) { | |
| std::unique_ptr<TrigramIndex> TI = | |
| makeTrigramIndex({"foo|bar"}); | |
| EXPECT_TRUE(TI->isDefeated()); | |
| } | |
| TEST_F(TrigramIndexTest, EscapedSymbols) { | |
| std::unique_ptr<TrigramIndex> TI = | |
| makeTrigramIndex({"*c\\+\\+*", "*hello\\\\world*", "a\\tb", "a\\0b"}); | |
| EXPECT_FALSE(TI->isDefeated()); | |
| EXPECT_FALSE(TI->isDefinitelyOut("c++")); | |
| EXPECT_TRUE(TI->isDefinitelyOut("c\\+\\+")); | |
| EXPECT_FALSE(TI->isDefinitelyOut("hello\\world")); | |
| EXPECT_TRUE(TI->isDefinitelyOut("hello\\\\world")); | |
| EXPECT_FALSE(TI->isDefinitelyOut("atb")); | |
| EXPECT_TRUE(TI->isDefinitelyOut("a\\tb")); | |
| EXPECT_TRUE(TI->isDefinitelyOut("a\tb")); | |
| EXPECT_FALSE(TI->isDefinitelyOut("a0b")); | |
| } | |
| TEST_F(TrigramIndexTest, Backreference1) { | |
| std::unique_ptr<TrigramIndex> TI = | |
| makeTrigramIndex({"*foo\\1*"}); | |
| EXPECT_TRUE(TI->isDefeated()); | |
| } | |
| TEST_F(TrigramIndexTest, Backreference2) { | |
| std::unique_ptr<TrigramIndex> TI = | |
| makeTrigramIndex({"*foo\\2*"}); | |
| EXPECT_TRUE(TI->isDefeated()); | |
| } | |
| TEST_F(TrigramIndexTest, Sequence) { | |
| std::unique_ptr<TrigramIndex> TI = | |
| makeTrigramIndex({"class1.h", "class2.h", "class3.h", "class4.h"}); | |
| EXPECT_FALSE(TI->isDefeated()); | |
| EXPECT_FALSE(TI->isDefinitelyOut("class1")); | |
| EXPECT_TRUE(TI->isDefinitelyOut("class.h")); | |
| EXPECT_TRUE(TI->isDefinitelyOut("class")); | |
| } | |
| } // namespace |