13dade419SIvan Krasin //===- TrigramIndexTest.cpp - Unit tests for TrigramIndex -----------------===//
23dade419SIvan Krasin //
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
63dade419SIvan Krasin //
73dade419SIvan Krasin //===----------------------------------------------------------------------===//
83dade419SIvan Krasin
93dade419SIvan Krasin #include "llvm/Support/TrigramIndex.h"
109a67b073SChandler Carruth #include "llvm/ADT/STLExtras.h"
113dade419SIvan Krasin #include "gtest/gtest.h"
123dade419SIvan Krasin
133dade419SIvan Krasin #include <string>
143dade419SIvan Krasin #include <vector>
153dade419SIvan Krasin
163dade419SIvan Krasin using namespace llvm;
173dade419SIvan Krasin
183dade419SIvan Krasin namespace {
193dade419SIvan Krasin
203dade419SIvan Krasin class TrigramIndexTest : public ::testing::Test {
213dade419SIvan Krasin protected:
makeTrigramIndex(std::vector<std::string> Rules)223dade419SIvan Krasin std::unique_ptr<TrigramIndex> makeTrigramIndex(
233dade419SIvan Krasin std::vector<std::string> Rules) {
243dade419SIvan Krasin std::unique_ptr<TrigramIndex> TI =
25*0eaee545SJonas Devlieghere std::make_unique<TrigramIndex>();
263dade419SIvan Krasin for (auto &Rule : Rules)
273dade419SIvan Krasin TI->insert(Rule);
283dade419SIvan Krasin return TI;
293dade419SIvan Krasin }
303dade419SIvan Krasin };
313dade419SIvan Krasin
TEST_F(TrigramIndexTest,Empty)323dade419SIvan Krasin TEST_F(TrigramIndexTest, Empty) {
333dade419SIvan Krasin std::unique_ptr<TrigramIndex> TI =
343dade419SIvan Krasin makeTrigramIndex({});
353dade419SIvan Krasin EXPECT_FALSE(TI->isDefeated());
363dade419SIvan Krasin EXPECT_TRUE(TI->isDefinitelyOut("foo"));
373dade419SIvan Krasin }
383dade419SIvan Krasin
TEST_F(TrigramIndexTest,Basic)393dade419SIvan Krasin TEST_F(TrigramIndexTest, Basic) {
403dade419SIvan Krasin std::unique_ptr<TrigramIndex> TI =
413dade419SIvan Krasin makeTrigramIndex({"*hello*", "*wor.d*"});
423dade419SIvan Krasin EXPECT_FALSE(TI->isDefeated());
433dade419SIvan Krasin EXPECT_TRUE(TI->isDefinitelyOut("foo"));
443dade419SIvan Krasin }
453dade419SIvan Krasin
TEST_F(TrigramIndexTest,NoTrigramsInRules)463dade419SIvan Krasin TEST_F(TrigramIndexTest, NoTrigramsInRules) {
473dade419SIvan Krasin std::unique_ptr<TrigramIndex> TI =
483dade419SIvan Krasin makeTrigramIndex({"b.r", "za*az"});
493dade419SIvan Krasin EXPECT_TRUE(TI->isDefeated());
503dade419SIvan Krasin EXPECT_FALSE(TI->isDefinitelyOut("foo"));
513dade419SIvan Krasin EXPECT_FALSE(TI->isDefinitelyOut("bar"));
523dade419SIvan Krasin EXPECT_FALSE(TI->isDefinitelyOut("zakaz"));
533dade419SIvan Krasin }
543dade419SIvan Krasin
TEST_F(TrigramIndexTest,NoTrigramsInARule)553dade419SIvan Krasin TEST_F(TrigramIndexTest, NoTrigramsInARule) {
563dade419SIvan Krasin std::unique_ptr<TrigramIndex> TI =
573dade419SIvan Krasin makeTrigramIndex({"*hello*", "*wo.ld*"});
583dade419SIvan Krasin EXPECT_TRUE(TI->isDefeated());
593dade419SIvan Krasin EXPECT_FALSE(TI->isDefinitelyOut("foo"));
603dade419SIvan Krasin }
613dade419SIvan Krasin
TEST_F(TrigramIndexTest,RepetitiveRule)623dade419SIvan Krasin TEST_F(TrigramIndexTest, RepetitiveRule) {
633dade419SIvan Krasin std::unique_ptr<TrigramIndex> TI =
643dade419SIvan Krasin makeTrigramIndex({"*bar*bar*bar*bar*bar", "bar*bar"});
653dade419SIvan Krasin EXPECT_FALSE(TI->isDefeated());
663dade419SIvan Krasin EXPECT_TRUE(TI->isDefinitelyOut("foo"));
673dade419SIvan Krasin EXPECT_TRUE(TI->isDefinitelyOut("bar"));
683dade419SIvan Krasin EXPECT_FALSE(TI->isDefinitelyOut("barbara"));
693dade419SIvan Krasin EXPECT_FALSE(TI->isDefinitelyOut("bar+bar"));
703dade419SIvan Krasin }
713dade419SIvan Krasin
TEST_F(TrigramIndexTest,PopularTrigram)723dade419SIvan Krasin TEST_F(TrigramIndexTest, PopularTrigram) {
733dade419SIvan Krasin std::unique_ptr<TrigramIndex> TI =
743dade419SIvan Krasin makeTrigramIndex({"*aaa*", "*aaaa*", "*aaaaa*", "*aaaaa*", "*aaaaaa*"});
753dade419SIvan Krasin EXPECT_TRUE(TI->isDefeated());
763dade419SIvan Krasin }
773dade419SIvan Krasin
TEST_F(TrigramIndexTest,PopularTrigram2)783dade419SIvan Krasin TEST_F(TrigramIndexTest, PopularTrigram2) {
793dade419SIvan Krasin std::unique_ptr<TrigramIndex> TI =
803dade419SIvan Krasin makeTrigramIndex({"class1.h", "class2.h", "class3.h", "class4.h", "class.h"});
813dade419SIvan Krasin EXPECT_TRUE(TI->isDefeated());
823dade419SIvan Krasin }
833dade419SIvan Krasin
TEST_F(TrigramIndexTest,TooComplicatedRegex)843dade419SIvan Krasin TEST_F(TrigramIndexTest, TooComplicatedRegex) {
853dade419SIvan Krasin std::unique_ptr<TrigramIndex> TI =
863dade419SIvan Krasin makeTrigramIndex({"[0-9]+"});
873dade419SIvan Krasin EXPECT_TRUE(TI->isDefeated());
883dade419SIvan Krasin }
893dade419SIvan Krasin
TEST_F(TrigramIndexTest,TooComplicatedRegex2)903dade419SIvan Krasin TEST_F(TrigramIndexTest, TooComplicatedRegex2) {
913dade419SIvan Krasin std::unique_ptr<TrigramIndex> TI =
923dade419SIvan Krasin makeTrigramIndex({"foo|bar"});
933dade419SIvan Krasin EXPECT_TRUE(TI->isDefeated());
943dade419SIvan Krasin }
953dade419SIvan Krasin
TEST_F(TrigramIndexTest,EscapedSymbols)9675453b05SIvan Krasin TEST_F(TrigramIndexTest, EscapedSymbols) {
973dade419SIvan Krasin std::unique_ptr<TrigramIndex> TI =
9875453b05SIvan Krasin makeTrigramIndex({"*c\\+\\+*", "*hello\\\\world*", "a\\tb", "a\\0b"});
9975453b05SIvan Krasin EXPECT_FALSE(TI->isDefeated());
10075453b05SIvan Krasin EXPECT_FALSE(TI->isDefinitelyOut("c++"));
10175453b05SIvan Krasin EXPECT_TRUE(TI->isDefinitelyOut("c\\+\\+"));
10275453b05SIvan Krasin EXPECT_FALSE(TI->isDefinitelyOut("hello\\world"));
10375453b05SIvan Krasin EXPECT_TRUE(TI->isDefinitelyOut("hello\\\\world"));
10475453b05SIvan Krasin EXPECT_FALSE(TI->isDefinitelyOut("atb"));
10575453b05SIvan Krasin EXPECT_TRUE(TI->isDefinitelyOut("a\\tb"));
10675453b05SIvan Krasin EXPECT_TRUE(TI->isDefinitelyOut("a\tb"));
10775453b05SIvan Krasin EXPECT_FALSE(TI->isDefinitelyOut("a0b"));
10875453b05SIvan Krasin }
10975453b05SIvan Krasin
TEST_F(TrigramIndexTest,Backreference1)11075453b05SIvan Krasin TEST_F(TrigramIndexTest, Backreference1) {
11175453b05SIvan Krasin std::unique_ptr<TrigramIndex> TI =
11275453b05SIvan Krasin makeTrigramIndex({"*foo\\1*"});
11375453b05SIvan Krasin EXPECT_TRUE(TI->isDefeated());
11475453b05SIvan Krasin }
11575453b05SIvan Krasin
TEST_F(TrigramIndexTest,Backreference2)11675453b05SIvan Krasin TEST_F(TrigramIndexTest, Backreference2) {
11775453b05SIvan Krasin std::unique_ptr<TrigramIndex> TI =
11875453b05SIvan Krasin makeTrigramIndex({"*foo\\2*"});
1193dade419SIvan Krasin EXPECT_TRUE(TI->isDefeated());
1203dade419SIvan Krasin }
1213dade419SIvan Krasin
TEST_F(TrigramIndexTest,Sequence)1223dade419SIvan Krasin TEST_F(TrigramIndexTest, Sequence) {
1233dade419SIvan Krasin std::unique_ptr<TrigramIndex> TI =
1243dade419SIvan Krasin makeTrigramIndex({"class1.h", "class2.h", "class3.h", "class4.h"});
1253dade419SIvan Krasin EXPECT_FALSE(TI->isDefeated());
1263dade419SIvan Krasin EXPECT_FALSE(TI->isDefinitelyOut("class1"));
1273dade419SIvan Krasin EXPECT_TRUE(TI->isDefinitelyOut("class.h"));
1283dade419SIvan Krasin EXPECT_TRUE(TI->isDefinitelyOut("class"));
1293dade419SIvan Krasin }
1303dade419SIvan Krasin
1313dade419SIvan Krasin } // namespace
132