optimize chatter list (#2814)
* optimize chatter list * changelog * Fix tests Co-authored-by: Rasmus Karlsson <rasmus.karlsson@pajlada.com>
This commit is contained in:
@@ -15,7 +15,9 @@ set(chatterino_SOURCES
|
||||
${CMAKE_SOURCE_DIR}/src/common/NetworkRequest.cpp
|
||||
${CMAKE_SOURCE_DIR}/src/common/NetworkResult.cpp
|
||||
${CMAKE_SOURCE_DIR}/src/common/QLogging.cpp
|
||||
${CMAKE_SOURCE_DIR}/src/common/UsernameSet.cpp
|
||||
${CMAKE_SOURCE_DIR}/src/common/ChatterSet.cpp
|
||||
|
||||
${CMAKE_SOURCE_DIR}/src/debug/Benchmark.cpp
|
||||
|
||||
${CMAKE_SOURCE_DIR}/src/controllers/highlights/HighlightPhrase.cpp
|
||||
|
||||
@@ -39,7 +41,7 @@ set(test_SOURCES
|
||||
${CMAKE_CURRENT_LIST_DIR}/src/AccessGuard.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/src/NetworkCommon.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/src/NetworkRequest.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/src/UsernameSet.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/src/ChatterSet.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/src/HighlightPhrase.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/src/Emojis.cpp
|
||||
)
|
||||
@@ -68,6 +70,7 @@ target_link_libraries(${PROJECT_NAME} PRIVATE
|
||||
Pajlada::Settings
|
||||
Pajlada::Signals
|
||||
Threads::Threads
|
||||
LRUCache
|
||||
)
|
||||
|
||||
target_compile_definitions(${PROJECT_NAME} PRIVATE
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
#include "common/ChatterSet.hpp"
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <QStringList>
|
||||
|
||||
TEST(ChatterSet, insert)
|
||||
{
|
||||
chatterino::ChatterSet set;
|
||||
|
||||
EXPECT_FALSE(set.contains("pajlada"));
|
||||
EXPECT_FALSE(set.contains("Pajlada"));
|
||||
|
||||
set.addRecentChatter("pajlada");
|
||||
EXPECT_TRUE(set.contains("pajlada"));
|
||||
EXPECT_TRUE(set.contains("Pajlada"));
|
||||
|
||||
set.addRecentChatter("pajlada");
|
||||
EXPECT_TRUE(set.contains("pajlada"));
|
||||
EXPECT_TRUE(set.contains("Pajlada"));
|
||||
|
||||
set.addRecentChatter("PAJLADA");
|
||||
EXPECT_TRUE(set.contains("pajlada"));
|
||||
EXPECT_TRUE(set.contains("Pajlada"));
|
||||
}
|
||||
|
||||
TEST(ChatterSet, MaxSize)
|
||||
{
|
||||
chatterino::ChatterSet set;
|
||||
|
||||
EXPECT_FALSE(set.contains("pajlada"));
|
||||
EXPECT_FALSE(set.contains("Pajlada"));
|
||||
|
||||
set.addRecentChatter("pajlada");
|
||||
EXPECT_TRUE(set.contains("pajlada"));
|
||||
EXPECT_TRUE(set.contains("Pajlada"));
|
||||
|
||||
// After adding CHATTER_LIMIT-1 additional chatters, pajlada should still be in the set
|
||||
for (auto i = 0; i < chatterino::ChatterSet::chatterLimit - 1; ++i)
|
||||
{
|
||||
set.addRecentChatter(QString("%1").arg(i));
|
||||
}
|
||||
|
||||
EXPECT_TRUE(set.contains("pajlada"));
|
||||
EXPECT_TRUE(set.contains("Pajlada"));
|
||||
|
||||
// But adding one more chatter should bump pajlada out of the set
|
||||
set.addRecentChatter("notpajlada");
|
||||
|
||||
EXPECT_FALSE(set.contains("pajlada"));
|
||||
EXPECT_FALSE(set.contains("Pajlada"));
|
||||
}
|
||||
|
||||
TEST(ChatterSet, MaxSizeLastUsed)
|
||||
{
|
||||
chatterino::ChatterSet set;
|
||||
|
||||
EXPECT_FALSE(set.contains("pajlada"));
|
||||
EXPECT_FALSE(set.contains("Pajlada"));
|
||||
|
||||
set.addRecentChatter("pajlada");
|
||||
EXPECT_TRUE(set.contains("pajlada"));
|
||||
EXPECT_TRUE(set.contains("Pajlada"));
|
||||
|
||||
// After adding CHATTER_LIMIT-1 additional chatters, pajlada should still be in the set
|
||||
for (auto i = 0; i < chatterino::ChatterSet::chatterLimit - 1; ++i)
|
||||
{
|
||||
set.addRecentChatter(QString("%1").arg(i));
|
||||
}
|
||||
|
||||
EXPECT_TRUE(set.contains("pajlada"));
|
||||
EXPECT_TRUE(set.contains("Pajlada"));
|
||||
|
||||
// Bump pajlada as a recent chatter
|
||||
set.addRecentChatter("pajlada");
|
||||
|
||||
// After another CHATTER_LIMIT-1 additional chatters, pajlada should still be there
|
||||
for (auto i = 0; i < chatterino::ChatterSet::chatterLimit - 1; ++i)
|
||||
{
|
||||
set.addRecentChatter(QString("new-%1").arg(i));
|
||||
}
|
||||
|
||||
EXPECT_TRUE(set.contains("pajlada"));
|
||||
EXPECT_TRUE(set.contains("Pajlada"));
|
||||
}
|
||||
@@ -1,161 +0,0 @@
|
||||
#include "common/UsernameSet.hpp"
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <QStringList>
|
||||
|
||||
chatterino::Prefix prefix_pajlada(QString("pajlada"));
|
||||
chatterino::Prefix prefix_Pajlada(QString("Pajlada"));
|
||||
chatterino::Prefix prefix_randers(QString("randers"));
|
||||
chatterino::Prefix prefix_Chancu(QString("ch"));
|
||||
|
||||
TEST(Prefix, isStartOf)
|
||||
{
|
||||
EXPECT_TRUE(prefix_pajlada.isStartOf("pajlada"));
|
||||
EXPECT_TRUE(prefix_pajlada.isStartOf("Pajlada"));
|
||||
EXPECT_FALSE(prefix_pajlada.isStartOf("randers"));
|
||||
|
||||
EXPECT_TRUE(prefix_Pajlada.isStartOf("pajlada"));
|
||||
EXPECT_TRUE(prefix_Pajlada.isStartOf("Pajlada"));
|
||||
EXPECT_TRUE(prefix_Pajlada.isStartOf("pajbot"));
|
||||
EXPECT_TRUE(prefix_Pajlada.isStartOf("Pajbot"));
|
||||
EXPECT_FALSE(prefix_Pajlada.isStartOf("randers"));
|
||||
}
|
||||
|
||||
TEST(Prefix, EqualsOperator)
|
||||
{
|
||||
EXPECT_EQ(prefix_pajlada, prefix_Pajlada);
|
||||
EXPECT_NE(prefix_pajlada, prefix_randers);
|
||||
}
|
||||
|
||||
TEST(UsernameSet, insert)
|
||||
{
|
||||
std::pair<chatterino::UsernameSet::Iterator, bool> p;
|
||||
chatterino::UsernameSet set;
|
||||
|
||||
EXPECT_EQ(set.size(), 0);
|
||||
|
||||
p = set.insert("pajlada");
|
||||
EXPECT_TRUE(p.second);
|
||||
|
||||
EXPECT_EQ(set.size(), 1);
|
||||
|
||||
p = set.insert("pajlada");
|
||||
EXPECT_FALSE(p.second);
|
||||
|
||||
EXPECT_EQ(set.size(), 1);
|
||||
|
||||
// Non-lowercase variant should override full lowercase variant
|
||||
p = set.insert("PAJLADA");
|
||||
EXPECT_TRUE(p.second);
|
||||
|
||||
EXPECT_EQ(set.size(), 1);
|
||||
|
||||
// Lowercase variant should not override non-lowercase variant
|
||||
p = set.insert("pajlada");
|
||||
EXPECT_FALSE(p.second);
|
||||
|
||||
EXPECT_EQ(set.size(), 1);
|
||||
|
||||
p = set.insert("pajbot");
|
||||
EXPECT_TRUE(p.second);
|
||||
|
||||
EXPECT_EQ(set.size(), 2);
|
||||
|
||||
p = set.insert("pajbot");
|
||||
EXPECT_FALSE(p.second);
|
||||
|
||||
EXPECT_EQ(set.size(), 2);
|
||||
|
||||
p = set.insert("Pajbot");
|
||||
EXPECT_TRUE(p.second);
|
||||
|
||||
EXPECT_EQ(set.size(), 2);
|
||||
|
||||
p = set.insert("PAJBOT");
|
||||
EXPECT_TRUE(p.second);
|
||||
|
||||
EXPECT_EQ(set.size(), 2);
|
||||
|
||||
// Same uppercase should not result in a change
|
||||
p = set.insert("PAJBOT");
|
||||
EXPECT_FALSE(p.second);
|
||||
|
||||
EXPECT_EQ(set.size(), 2);
|
||||
}
|
||||
|
||||
TEST(UsernameSet, CollisionTest)
|
||||
{
|
||||
QString s;
|
||||
chatterino::UsernameSet set;
|
||||
chatterino::Prefix prefix("not_");
|
||||
|
||||
set.insert("pajlada");
|
||||
set.insert("Chancu");
|
||||
set.insert("chief_tony");
|
||||
set.insert("ChodzacyKac");
|
||||
set.insert("ChatAbuser");
|
||||
set.insert("Normies_GTFO");
|
||||
set.insert("not_remzy");
|
||||
set.insert("Mullo2500");
|
||||
set.insert("muggedbyapie");
|
||||
|
||||
EXPECT_EQ(set.size(), 9);
|
||||
|
||||
{
|
||||
QStringList result;
|
||||
QStringList expectation{"Normies_GTFO", "not_remzy"};
|
||||
auto subrange = set.subrange(QString("not_"));
|
||||
std::copy(subrange.begin(), subrange.end(), std::back_inserter(result));
|
||||
EXPECT_EQ(expectation, result);
|
||||
}
|
||||
|
||||
{
|
||||
QStringList result;
|
||||
QStringList expectation{};
|
||||
auto subrange = set.subrange(QString("te"));
|
||||
std::copy(subrange.begin(), subrange.end(), std::back_inserter(result));
|
||||
EXPECT_EQ(expectation, result);
|
||||
}
|
||||
|
||||
{
|
||||
QStringList result;
|
||||
QStringList expectation{"pajlada"};
|
||||
auto subrange = set.subrange(QString("PA"));
|
||||
std::copy(subrange.begin(), subrange.end(), std::back_inserter(result));
|
||||
EXPECT_EQ(expectation, result);
|
||||
}
|
||||
|
||||
{
|
||||
QStringList result;
|
||||
QStringList expectation{"pajlada"};
|
||||
auto subrange = set.subrange(QString("pajlada"));
|
||||
std::copy(subrange.begin(), subrange.end(), std::back_inserter(result));
|
||||
EXPECT_EQ(expectation, result);
|
||||
}
|
||||
|
||||
{
|
||||
QStringList result;
|
||||
QStringList expectation{"pajlada"};
|
||||
auto subrange = set.subrange(QString("Pajl"));
|
||||
std::copy(subrange.begin(), subrange.end(), std::back_inserter(result));
|
||||
EXPECT_EQ(expectation, result);
|
||||
}
|
||||
|
||||
{
|
||||
QStringList result;
|
||||
QStringList expectation{"Chancu", "ChatAbuser", "chief_tony",
|
||||
"ChodzacyKac"};
|
||||
auto subrange = set.subrange(QString("chan"));
|
||||
std::copy(subrange.begin(), subrange.end(), std::back_inserter(result));
|
||||
EXPECT_EQ(expectation, result);
|
||||
}
|
||||
|
||||
{
|
||||
QStringList result;
|
||||
QStringList expectation{"muggedbyapie", "Mullo2500"};
|
||||
auto subrange = set.subrange(QString("mu"));
|
||||
std::copy(subrange.begin(), subrange.end(), std::back_inserter(result));
|
||||
EXPECT_EQ(expectation, result);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user