| //===- TrigramIndexTest.cpp - Unit tests for TrigramIndex -----------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #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 = |
| std::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 |