mirror of
https://github.com/Chatterino/chatterino2.git
synced 2024-11-13 19:49:51 +01:00
Fix color @usernames sometimes not working at all (#3170)
Definitely memory fuckery involved - The comment from @lubieerror https://github.com/Chatterino/chatterino2/issues/2822#issuecomment-897252673 is finally what led me to adding tests and hopefully fixing this.
This commit is contained in:
parent
07454d0537
commit
d7fd08b1d6
|
@ -9,6 +9,7 @@
|
||||||
- Minor: Added a setting to hide similar messages by any user. (#2716)
|
- Minor: Added a setting to hide similar messages by any user. (#2716)
|
||||||
- Minor: Duplicate spaces now count towards the display message length. (#3002)
|
- Minor: Duplicate spaces now count towards the display message length. (#3002)
|
||||||
- Minor: Commands are now backed up. (#3168)
|
- Minor: Commands are now backed up. (#3168)
|
||||||
|
- Bugfix: Fixed colored usernames sometimes not working. (#3170)
|
||||||
- Bugfix: Restored ability to send duplicate `/me` messages. (#3166)
|
- Bugfix: Restored ability to send duplicate `/me` messages. (#3166)
|
||||||
- Bugfix: Notifications for moderators about other moderators deleting messages can now be disabled. (#3121)
|
- Bugfix: Notifications for moderators about other moderators deleting messages can now be disabled. (#3121)
|
||||||
- Bugfix: Moderation mode and active filters are now preserved when opening a split as a popup. (#3113, #3130)
|
- Bugfix: Moderation mode and active filters are now preserved when opening a split as a popup. (#3113, #3130)
|
||||||
|
|
|
@ -35,6 +35,7 @@ public:
|
||||||
lru_cache(lru_cache<key_t, value_t> &&other)
|
lru_cache(lru_cache<key_t, value_t> &&other)
|
||||||
: _cache_items_list(std::move(other._cache_items_list))
|
: _cache_items_list(std::move(other._cache_items_list))
|
||||||
, _cache_items_map(std::move(other._cache_items_map))
|
, _cache_items_map(std::move(other._cache_items_map))
|
||||||
|
, _max_size(other._max_size)
|
||||||
{
|
{
|
||||||
other._cache_items_list.clear();
|
other._cache_items_list.clear();
|
||||||
other._cache_items_map.clear();
|
other._cache_items_map.clear();
|
||||||
|
@ -44,6 +45,7 @@ public:
|
||||||
{
|
{
|
||||||
_cache_items_list = std::move(other._cache_items_list);
|
_cache_items_list = std::move(other._cache_items_list);
|
||||||
_cache_items_map = std::move(other._cache_items_map);
|
_cache_items_map = std::move(other._cache_items_map);
|
||||||
|
_max_size = other._max_size;
|
||||||
other._cache_items_list.clear();
|
other._cache_items_list.clear();
|
||||||
other._cache_items_map.clear();
|
other._cache_items_map.clear();
|
||||||
return *this;
|
return *this;
|
||||||
|
|
|
@ -74,6 +74,12 @@ void ChannelChatters::updateOnlineChatters(
|
||||||
chatters_->updateOnlineChatters(chatters);
|
chatters_->updateOnlineChatters(chatters);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t ChannelChatters::colorsSize() const
|
||||||
|
{
|
||||||
|
auto size = this->chatterColors_.access()->size();
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
const QColor ChannelChatters::getUserColor(const QString &user)
|
const QColor ChannelChatters::getUserColor(const QString &user)
|
||||||
{
|
{
|
||||||
const auto chatterColors = this->chatterColors_.access();
|
const auto chatterColors = this->chatterColors_.access();
|
||||||
|
|
|
@ -25,9 +25,13 @@ public:
|
||||||
void setUserColor(const QString &user, const QColor &color);
|
void setUserColor(const QString &user, const QColor &color);
|
||||||
void updateOnlineChatters(const std::unordered_set<QString> &chatters);
|
void updateOnlineChatters(const std::unordered_set<QString> &chatters);
|
||||||
|
|
||||||
private:
|
// colorsSize returns the amount of colors stored in `chatterColors_`
|
||||||
|
// NOTE: This function is only meant to be used in tests and benchmarks
|
||||||
|
size_t colorsSize() const;
|
||||||
|
|
||||||
static constexpr int maxChatterColorCount = 5000;
|
static constexpr int maxChatterColorCount = 5000;
|
||||||
|
|
||||||
|
private:
|
||||||
Channel &channel_;
|
Channel &channel_;
|
||||||
|
|
||||||
// maps 2 char prefix to set of names
|
// maps 2 char prefix to set of names
|
||||||
|
|
|
@ -2,6 +2,7 @@ project(chatterino-test)
|
||||||
|
|
||||||
set(test_SOURCES
|
set(test_SOURCES
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/main.cpp
|
${CMAKE_CURRENT_LIST_DIR}/src/main.cpp
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/src/ChannelChatters.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/AccessGuard.cpp
|
${CMAKE_CURRENT_LIST_DIR}/src/AccessGuard.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/NetworkCommon.cpp
|
${CMAKE_CURRENT_LIST_DIR}/src/NetworkCommon.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/NetworkRequest.cpp
|
${CMAKE_CURRENT_LIST_DIR}/src/NetworkRequest.cpp
|
||||||
|
|
113
tests/src/ChannelChatters.cpp
Normal file
113
tests/src/ChannelChatters.cpp
Normal file
|
@ -0,0 +1,113 @@
|
||||||
|
#include "common/ChannelChatters.hpp"
|
||||||
|
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
#include <QColor>
|
||||||
|
#include <QStringList>
|
||||||
|
|
||||||
|
namespace chatterino {
|
||||||
|
|
||||||
|
class MockChannel : public Channel
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MockChannel(const QString &name)
|
||||||
|
: Channel(name, Channel::Type::Twitch)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace chatterino
|
||||||
|
|
||||||
|
using namespace chatterino;
|
||||||
|
|
||||||
|
// Ensure inserting the same user does not increase the size of the stored colors
|
||||||
|
TEST(ChatterChatters, insertSameUser)
|
||||||
|
{
|
||||||
|
MockChannel channel("test");
|
||||||
|
|
||||||
|
ChannelChatters chatters(channel);
|
||||||
|
|
||||||
|
EXPECT_EQ(chatters.colorsSize(), 0);
|
||||||
|
chatters.setUserColor("pajlada", QColor("#fff"));
|
||||||
|
EXPECT_EQ(chatters.colorsSize(), 1);
|
||||||
|
chatters.setUserColor("pajlada", QColor("#fff"));
|
||||||
|
EXPECT_EQ(chatters.colorsSize(), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure we can update a chatters color
|
||||||
|
TEST(ChatterChatters, insertSameUserUpdatesColor)
|
||||||
|
{
|
||||||
|
MockChannel channel("test");
|
||||||
|
|
||||||
|
ChannelChatters chatters(channel);
|
||||||
|
|
||||||
|
chatters.setUserColor("pajlada", QColor("#fff"));
|
||||||
|
EXPECT_EQ(chatters.getUserColor("pajlada"), QColor("#fff"));
|
||||||
|
chatters.setUserColor("pajlada", QColor("#f0f"));
|
||||||
|
EXPECT_EQ(chatters.getUserColor("pajlada"), QColor("#f0f"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure getting a non-existant users color returns an invalid QColor
|
||||||
|
TEST(ChatterChatters, getNonExistantUser)
|
||||||
|
{
|
||||||
|
MockChannel channel("test");
|
||||||
|
|
||||||
|
ChannelChatters chatters(channel);
|
||||||
|
|
||||||
|
EXPECT_EQ(chatters.getUserColor("nonexistantuser"), QColor());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure getting a user doesn't create an entry
|
||||||
|
TEST(ChatterChatters, getDoesNotCreate)
|
||||||
|
{
|
||||||
|
MockChannel channel("test");
|
||||||
|
|
||||||
|
ChannelChatters chatters(channel);
|
||||||
|
|
||||||
|
EXPECT_EQ(chatters.colorsSize(), 0);
|
||||||
|
chatters.getUserColor("nonexistantuser");
|
||||||
|
EXPECT_EQ(chatters.colorsSize(), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure the least recently used entry is purged when we reach MAX_SIZE
|
||||||
|
TEST(ChatterChatters, insertMaxSize)
|
||||||
|
{
|
||||||
|
MockChannel channel("test");
|
||||||
|
|
||||||
|
ChannelChatters chatters(channel);
|
||||||
|
|
||||||
|
// Prime chatters with 2 control entries
|
||||||
|
chatters.setUserColor("pajlada", QColor("#f00"));
|
||||||
|
chatters.setUserColor("zneix", QColor("#f0f"));
|
||||||
|
|
||||||
|
EXPECT_EQ(chatters.getUserColor("pajlada"), QColor("#f00"));
|
||||||
|
EXPECT_EQ(chatters.getUserColor("zneix"), QColor("#f0f"));
|
||||||
|
EXPECT_EQ(chatters.getUserColor("nonexistantuser"), QColor());
|
||||||
|
|
||||||
|
EXPECT_EQ(chatters.colorsSize(), 2);
|
||||||
|
|
||||||
|
for (int i = 0; i < ChannelChatters::maxChatterColorCount - 1; ++i)
|
||||||
|
{
|
||||||
|
auto username = QString("user%1").arg(i);
|
||||||
|
chatters.setUserColor(username, QColor("#00f"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Should have bumped ONE entry out (pajlada)
|
||||||
|
|
||||||
|
EXPECT_EQ(chatters.getUserColor("pajlada"), QColor());
|
||||||
|
EXPECT_EQ(chatters.getUserColor("zneix"), QColor("#f0f"));
|
||||||
|
EXPECT_EQ(chatters.getUserColor("user1"), QColor("#00f"));
|
||||||
|
|
||||||
|
chatters.setUserColor("newuser", QColor("#00e"));
|
||||||
|
|
||||||
|
for (int i = 0; i < ChannelChatters::maxChatterColorCount; ++i)
|
||||||
|
{
|
||||||
|
auto username = QString("user%1").arg(i);
|
||||||
|
chatters.setUserColor(username, QColor("#00f"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// One more entry should be bumped out (zneix)
|
||||||
|
|
||||||
|
EXPECT_EQ(chatters.getUserColor("pajlada"), QColor());
|
||||||
|
EXPECT_EQ(chatters.getUserColor("zneix"), QColor());
|
||||||
|
EXPECT_EQ(chatters.getUserColor("user1"), QColor("#00f"));
|
||||||
|
}
|
Loading…
Reference in a new issue