Test filters context map & message builder (#4886)
This commit is contained in:
@@ -99,6 +99,6 @@ jobs:
|
|||||||
docker pull ${{ env.TWITCH_PUBSUB_SERVER_IMAGE }}
|
docker pull ${{ env.TWITCH_PUBSUB_SERVER_IMAGE }}
|
||||||
docker run --network=host --detach ${{ env.TWITCH_PUBSUB_SERVER_IMAGE }}
|
docker run --network=host --detach ${{ env.TWITCH_PUBSUB_SERVER_IMAGE }}
|
||||||
docker run -p 9051:80 --detach kennethreitz/httpbin
|
docker run -p 9051:80 --detach kennethreitz/httpbin
|
||||||
./bin/chatterino-test || ./bin/chatterino-test || ./bin/chatterino-test
|
ctest --repeat until-pass:4
|
||||||
working-directory: build-test
|
working-directory: build-test
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "common/Channel.hpp"
|
||||||
|
|
||||||
|
namespace chatterino::mock {
|
||||||
|
|
||||||
|
class MockChannel : public Channel
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MockChannel(const QString &name)
|
||||||
|
: Channel(name, Channel::Type::Twitch)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace chatterino::mock
|
||||||
@@ -74,6 +74,12 @@ public:
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SeventvBadges *getSeventvBadges() override
|
||||||
|
{
|
||||||
|
assert(!"getSeventvBadges was called without being initialized");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
IUserDataController *getUserData() override
|
IUserDataController *getUserData() override
|
||||||
{
|
{
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "mocks/Channel.hpp"
|
||||||
|
#include "providers/twitch/TwitchIrcServer.hpp"
|
||||||
|
|
||||||
|
namespace chatterino::mock {
|
||||||
|
|
||||||
|
class MockTwitchIrcServer : public ITwitchIrcServer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MockTwitchIrcServer()
|
||||||
|
: watchingChannelInner(
|
||||||
|
std::shared_ptr<Channel>(new MockChannel("testaccount_420")))
|
||||||
|
, watchingChannel(this->watchingChannelInner,
|
||||||
|
Channel::Type::TwitchWatching)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
const BttvEmotes &getBttvEmotes() const override
|
||||||
|
{
|
||||||
|
return this->bttv;
|
||||||
|
}
|
||||||
|
|
||||||
|
const FfzEmotes &getFfzEmotes() const override
|
||||||
|
{
|
||||||
|
return this->ffz;
|
||||||
|
}
|
||||||
|
|
||||||
|
const SeventvEmotes &getSeventvEmotes() const override
|
||||||
|
{
|
||||||
|
return this->seventv;
|
||||||
|
}
|
||||||
|
|
||||||
|
const IndirectChannel &getWatchingChannel() const override
|
||||||
|
{
|
||||||
|
return this->watchingChannel;
|
||||||
|
}
|
||||||
|
|
||||||
|
BttvEmotes bttv;
|
||||||
|
FfzEmotes ffz;
|
||||||
|
SeventvEmotes seventv;
|
||||||
|
ChannelPtr watchingChannelInner;
|
||||||
|
IndirectChannel watchingChannel;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace chatterino::mock
|
||||||
@@ -63,6 +63,7 @@ public:
|
|||||||
virtual ITwitchIrcServer *getTwitch() = 0;
|
virtual ITwitchIrcServer *getTwitch() = 0;
|
||||||
virtual ChatterinoBadges *getChatterinoBadges() = 0;
|
virtual ChatterinoBadges *getChatterinoBadges() = 0;
|
||||||
virtual FfzBadges *getFfzBadges() = 0;
|
virtual FfzBadges *getFfzBadges() = 0;
|
||||||
|
virtual SeventvBadges *getSeventvBadges() = 0;
|
||||||
virtual IUserDataController *getUserData() = 0;
|
virtual IUserDataController *getUserData() = 0;
|
||||||
virtual ITwitchLiveController *getTwitchLiveController() = 0;
|
virtual ITwitchLiveController *getTwitchLiveController() = 0;
|
||||||
};
|
};
|
||||||
@@ -160,6 +161,10 @@ public:
|
|||||||
{
|
{
|
||||||
return this->ffzBadges;
|
return this->ffzBadges;
|
||||||
}
|
}
|
||||||
|
SeventvBadges *getSeventvBadges() override
|
||||||
|
{
|
||||||
|
return this->seventvBadges;
|
||||||
|
}
|
||||||
IUserDataController *getUserData() override;
|
IUserDataController *getUserData() override;
|
||||||
ITwitchLiveController *getTwitchLiveController() override;
|
ITwitchLiveController *getTwitchLiveController() override;
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ namespace chatterino::filters {
|
|||||||
|
|
||||||
ContextMap buildContextMap(const MessagePtr &m, chatterino::Channel *channel)
|
ContextMap buildContextMap(const MessagePtr &m, chatterino::Channel *channel)
|
||||||
{
|
{
|
||||||
auto watchingChannel = chatterino::getApp()->twitch->watchingChannel.get();
|
auto watchingChannel = getIApp()->getTwitch()->getWatchingChannel().get();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Looking to add a new identifier to filters? Here's what to do:
|
* Looking to add a new identifier to filters? Here's what to do:
|
||||||
|
|||||||
@@ -72,7 +72,8 @@ namespace detail {
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
this->durationOffset_ = std::min<int>(
|
this->durationOffset_ = std::min<int>(
|
||||||
int(getApp()->emotes->gifTimer.position() % totalLength),
|
int(getIApp()->getEmotes()->getGIFTimer().position() %
|
||||||
|
totalLength),
|
||||||
60000);
|
60000);
|
||||||
}
|
}
|
||||||
this->processOffset();
|
this->processOffset();
|
||||||
|
|||||||
@@ -229,8 +229,6 @@ void SharedMessageBuilder::triggerHighlights()
|
|||||||
QString SharedMessageBuilder::stylizeUsername(const QString &username,
|
QString SharedMessageBuilder::stylizeUsername(const QString &username,
|
||||||
const Message &message)
|
const Message &message)
|
||||||
{
|
{
|
||||||
auto app = getApp();
|
|
||||||
|
|
||||||
const QString &localizedName = message.localizedName;
|
const QString &localizedName = message.localizedName;
|
||||||
bool hasLocalizedName = !localizedName.isEmpty();
|
bool hasLocalizedName = !localizedName.isEmpty();
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "TwitchIrcServer.hpp"
|
#include "TwitchIrcServer.hpp"
|
||||||
|
|
||||||
#include "Application.hpp"
|
#include "Application.hpp"
|
||||||
|
#include "common/Channel.hpp"
|
||||||
#include "common/Env.hpp"
|
#include "common/Env.hpp"
|
||||||
#include "common/QLogging.hpp"
|
#include "common/QLogging.hpp"
|
||||||
#include "controllers/accounts/AccountController.hpp"
|
#include "controllers/accounts/AccountController.hpp"
|
||||||
@@ -520,6 +521,11 @@ const SeventvEmotes &TwitchIrcServer::getSeventvEmotes() const
|
|||||||
return this->seventv_;
|
return this->seventv_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const IndirectChannel &TwitchIrcServer::getWatchingChannel() const
|
||||||
|
{
|
||||||
|
return this->watchingChannel;
|
||||||
|
}
|
||||||
|
|
||||||
void TwitchIrcServer::reloadBTTVGlobalEmotes()
|
void TwitchIrcServer::reloadBTTVGlobalEmotes()
|
||||||
{
|
{
|
||||||
this->bttv.loadEmotes();
|
this->bttv.loadEmotes();
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ public:
|
|||||||
virtual const BttvEmotes &getBttvEmotes() const = 0;
|
virtual const BttvEmotes &getBttvEmotes() const = 0;
|
||||||
virtual const FfzEmotes &getFfzEmotes() const = 0;
|
virtual const FfzEmotes &getFfzEmotes() const = 0;
|
||||||
virtual const SeventvEmotes &getSeventvEmotes() const = 0;
|
virtual const SeventvEmotes &getSeventvEmotes() const = 0;
|
||||||
|
virtual const IndirectChannel &getWatchingChannel() const = 0;
|
||||||
|
|
||||||
// Update this interface with TwitchIrcServer methods as needed
|
// Update this interface with TwitchIrcServer methods as needed
|
||||||
};
|
};
|
||||||
@@ -85,6 +86,7 @@ public:
|
|||||||
const BttvEmotes &getBttvEmotes() const override;
|
const BttvEmotes &getBttvEmotes() const override;
|
||||||
const FfzEmotes &getFfzEmotes() const override;
|
const FfzEmotes &getFfzEmotes() const override;
|
||||||
const SeventvEmotes &getSeventvEmotes() const override;
|
const SeventvEmotes &getSeventvEmotes() const override;
|
||||||
|
const IndirectChannel &getWatchingChannel() const override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void initializeConnection(IrcConnection *connection,
|
virtual void initializeConnection(IrcConnection *connection,
|
||||||
|
|||||||
@@ -205,6 +205,9 @@ void TwitchMessageBuilder::triggerHighlights()
|
|||||||
|
|
||||||
MessagePtr TwitchMessageBuilder::build()
|
MessagePtr TwitchMessageBuilder::build()
|
||||||
{
|
{
|
||||||
|
assert(this->ircMessage != nullptr);
|
||||||
|
assert(this->channel != nullptr);
|
||||||
|
|
||||||
// PARSE
|
// PARSE
|
||||||
this->userId_ = this->ircMessage->tag("user-id").toString();
|
this->userId_ = this->ircMessage->tag("user-id").toString();
|
||||||
|
|
||||||
@@ -433,7 +436,8 @@ void TwitchMessageBuilder::addWords(
|
|||||||
|
|
||||||
// 1. Add text before the emote
|
// 1. Add text before the emote
|
||||||
QString preText = word.left(currentTwitchEmote.start - cursor);
|
QString preText = word.left(currentTwitchEmote.start - cursor);
|
||||||
for (auto &variant : getApp()->emotes->emojis.parse(preText))
|
for (auto &variant :
|
||||||
|
getIApp()->getEmotes()->getEmojis()->parse(preText))
|
||||||
{
|
{
|
||||||
boost::apply_visitor(
|
boost::apply_visitor(
|
||||||
[&](auto &&arg) {
|
[&](auto &&arg) {
|
||||||
@@ -453,7 +457,7 @@ void TwitchMessageBuilder::addWords(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// split words
|
// split words
|
||||||
for (auto &variant : getApp()->emotes->emojis.parse(word))
|
for (auto &variant : getIApp()->getEmotes()->getEmojis()->parse(word))
|
||||||
{
|
{
|
||||||
boost::apply_visitor(
|
boost::apply_visitor(
|
||||||
[&](auto &&arg) {
|
[&](auto &&arg) {
|
||||||
@@ -748,7 +752,7 @@ void TwitchMessageBuilder::parseUsername()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Update current user color if this is our message
|
// Update current user color if this is our message
|
||||||
auto currentUser = getApp()->accounts->twitch.getCurrent();
|
auto currentUser = getIApp()->getAccounts()->twitch.getCurrent();
|
||||||
if (this->ircMessage->nick() == currentUser->getUserName())
|
if (this->ircMessage->nick() == currentUser->getUserName())
|
||||||
{
|
{
|
||||||
currentUser->setColor(this->usernameColor_);
|
currentUser->setColor(this->usernameColor_);
|
||||||
@@ -757,7 +761,7 @@ void TwitchMessageBuilder::parseUsername()
|
|||||||
|
|
||||||
void TwitchMessageBuilder::appendUsername()
|
void TwitchMessageBuilder::appendUsername()
|
||||||
{
|
{
|
||||||
auto app = getApp();
|
auto *app = getIApp();
|
||||||
|
|
||||||
QString username = this->userName;
|
QString username = this->userName;
|
||||||
this->message().loginName = username;
|
this->message().loginName = username;
|
||||||
@@ -802,7 +806,7 @@ void TwitchMessageBuilder::appendUsername()
|
|||||||
FontStyle::ChatMediumBold)
|
FontStyle::ChatMediumBold)
|
||||||
->setLink({Link::UserWhisper, this->message().displayName});
|
->setLink({Link::UserWhisper, this->message().displayName});
|
||||||
|
|
||||||
auto currentUser = app->accounts->twitch.getCurrent();
|
auto currentUser = app->getAccounts()->twitch.getCurrent();
|
||||||
|
|
||||||
// Separator
|
// Separator
|
||||||
this->emplace<TextElement>("->", MessageElementFlag::Username,
|
this->emplace<TextElement>("->", MessageElementFlag::Username,
|
||||||
@@ -1062,11 +1066,11 @@ void TwitchMessageBuilder::runIgnoreReplaces(
|
|||||||
|
|
||||||
Outcome TwitchMessageBuilder::tryAppendEmote(const EmoteName &name)
|
Outcome TwitchMessageBuilder::tryAppendEmote(const EmoteName &name)
|
||||||
{
|
{
|
||||||
auto *app = getApp();
|
auto *app = getIApp();
|
||||||
|
|
||||||
const auto &globalBttvEmotes = app->twitch->getBttvEmotes();
|
const auto &globalBttvEmotes = app->getTwitch()->getBttvEmotes();
|
||||||
const auto &globalFfzEmotes = app->twitch->getFfzEmotes();
|
const auto &globalFfzEmotes = app->getTwitch()->getFfzEmotes();
|
||||||
const auto &globalSeventvEmotes = app->twitch->getSeventvEmotes();
|
const auto &globalSeventvEmotes = app->getTwitch()->getSeventvEmotes();
|
||||||
|
|
||||||
auto flags = MessageElementFlags();
|
auto flags = MessageElementFlags();
|
||||||
auto emote = std::optional<EmotePtr>{};
|
auto emote = std::optional<EmotePtr>{};
|
||||||
@@ -1312,7 +1316,8 @@ void TwitchMessageBuilder::appendTwitchBadges()
|
|||||||
|
|
||||||
void TwitchMessageBuilder::appendChatterinoBadges()
|
void TwitchMessageBuilder::appendChatterinoBadges()
|
||||||
{
|
{
|
||||||
if (auto badge = getApp()->chatterinoBadges->getBadge({this->userId_}))
|
if (auto badge =
|
||||||
|
getIApp()->getChatterinoBadges()->getBadge({this->userId_}))
|
||||||
{
|
{
|
||||||
this->emplace<BadgeElement>(*badge,
|
this->emplace<BadgeElement>(*badge,
|
||||||
MessageElementFlag::BadgeChatterino);
|
MessageElementFlag::BadgeChatterino);
|
||||||
@@ -1322,7 +1327,7 @@ void TwitchMessageBuilder::appendChatterinoBadges()
|
|||||||
void TwitchMessageBuilder::appendFfzBadges()
|
void TwitchMessageBuilder::appendFfzBadges()
|
||||||
{
|
{
|
||||||
for (const auto &badge :
|
for (const auto &badge :
|
||||||
getApp()->ffzBadges->getUserBadges({this->userId_}))
|
getIApp()->getFfzBadges()->getUserBadges({this->userId_}))
|
||||||
{
|
{
|
||||||
this->emplace<FfzBadgeElement>(
|
this->emplace<FfzBadgeElement>(
|
||||||
badge.emote, MessageElementFlag::BadgeFfz, badge.color);
|
badge.emote, MessageElementFlag::BadgeFfz, badge.color);
|
||||||
@@ -1331,7 +1336,7 @@ void TwitchMessageBuilder::appendFfzBadges()
|
|||||||
|
|
||||||
void TwitchMessageBuilder::appendSeventvBadges()
|
void TwitchMessageBuilder::appendSeventvBadges()
|
||||||
{
|
{
|
||||||
if (auto badge = getApp()->seventvBadges->getBadge({this->userId_}))
|
if (auto badge = getIApp()->getSeventvBadges()->getBadge({this->userId_}))
|
||||||
{
|
{
|
||||||
this->emplace<BadgeElement>(*badge, MessageElementFlag::BadgeSevenTV);
|
this->emplace<BadgeElement>(*badge, MessageElementFlag::BadgeSevenTV);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ public:
|
|||||||
|
|
||||||
virtual ITwitchEmotes *getTwitchEmotes() = 0;
|
virtual ITwitchEmotes *getTwitchEmotes() = 0;
|
||||||
virtual IEmojis *getEmojis() = 0;
|
virtual IEmojis *getEmojis() = 0;
|
||||||
|
virtual GIFTimer &getGIFTimer() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Emotes final : public IEmotes, public Singleton
|
class Emotes final : public IEmotes, public Singleton
|
||||||
@@ -38,6 +39,11 @@ public:
|
|||||||
return &this->emojis;
|
return &this->emojis;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GIFTimer &getGIFTimer() final
|
||||||
|
{
|
||||||
|
return this->gifTimer;
|
||||||
|
}
|
||||||
|
|
||||||
TwitchEmotes twitch;
|
TwitchEmotes twitch;
|
||||||
Emojis emojis;
|
Emojis emojis;
|
||||||
|
|
||||||
|
|||||||
@@ -1,25 +1,13 @@
|
|||||||
#include "common/ChannelChatters.hpp"
|
#include "common/ChannelChatters.hpp"
|
||||||
|
|
||||||
#include "common/Channel.hpp"
|
#include "mocks/Channel.hpp"
|
||||||
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
#include <QColor>
|
#include <QColor>
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
|
|
||||||
namespace chatterino {
|
|
||||||
|
|
||||||
class MockChannel : public Channel
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
MockChannel(const QString &name)
|
|
||||||
: Channel(name, Channel::Type::Twitch)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace chatterino
|
|
||||||
|
|
||||||
using namespace chatterino;
|
using namespace chatterino;
|
||||||
|
using chatterino::mock::MockChannel;
|
||||||
|
|
||||||
// Ensure inserting the same user does not increase the size of the stored colors
|
// Ensure inserting the same user does not increase the size of the stored colors
|
||||||
TEST(ChatterChatters, insertSameUser)
|
TEST(ChatterChatters, insertSameUser)
|
||||||
|
|||||||
@@ -1,5 +1,17 @@
|
|||||||
|
#include "controllers/accounts/AccountController.hpp"
|
||||||
#include "controllers/filters/lang/Filter.hpp"
|
#include "controllers/filters/lang/Filter.hpp"
|
||||||
#include "controllers/filters/lang/Types.hpp"
|
#include "controllers/filters/lang/Types.hpp"
|
||||||
|
#include "controllers/highlights/HighlightController.hpp"
|
||||||
|
#include "mocks/Channel.hpp"
|
||||||
|
#include "mocks/EmptyApplication.hpp"
|
||||||
|
#include "mocks/TwitchIrcServer.hpp"
|
||||||
|
#include "mocks/UserData.hpp"
|
||||||
|
#include "providers/chatterino/ChatterinoBadges.hpp"
|
||||||
|
#include "providers/ffz/FfzBadges.hpp"
|
||||||
|
#include "providers/seventv/SeventvBadges.hpp"
|
||||||
|
#include "providers/twitch/TwitchBadge.hpp"
|
||||||
|
#include "providers/twitch/TwitchMessageBuilder.hpp"
|
||||||
|
#include "singletons/Emotes.hpp"
|
||||||
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
#include <QColor>
|
#include <QColor>
|
||||||
@@ -7,9 +19,83 @@
|
|||||||
|
|
||||||
using namespace chatterino;
|
using namespace chatterino;
|
||||||
using namespace chatterino::filters;
|
using namespace chatterino::filters;
|
||||||
|
using chatterino::mock::MockChannel;
|
||||||
|
|
||||||
TypingContext typingContext = MESSAGE_TYPING_CONTEXT;
|
TypingContext typingContext = MESSAGE_TYPING_CONTEXT;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
class MockApplication : mock::EmptyApplication
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
IEmotes *getEmotes() override
|
||||||
|
{
|
||||||
|
return &this->emotes;
|
||||||
|
}
|
||||||
|
|
||||||
|
IUserDataController *getUserData() override
|
||||||
|
{
|
||||||
|
return &this->userData;
|
||||||
|
}
|
||||||
|
|
||||||
|
AccountController *getAccounts() override
|
||||||
|
{
|
||||||
|
return &this->accounts;
|
||||||
|
}
|
||||||
|
|
||||||
|
ITwitchIrcServer *getTwitch() override
|
||||||
|
{
|
||||||
|
return &this->twitch;
|
||||||
|
}
|
||||||
|
|
||||||
|
ChatterinoBadges *getChatterinoBadges() override
|
||||||
|
{
|
||||||
|
return &this->chatterinoBadges;
|
||||||
|
}
|
||||||
|
|
||||||
|
FfzBadges *getFfzBadges() override
|
||||||
|
{
|
||||||
|
return &this->ffzBadges;
|
||||||
|
}
|
||||||
|
|
||||||
|
SeventvBadges *getSeventvBadges() override
|
||||||
|
{
|
||||||
|
return &this->seventvBadges;
|
||||||
|
}
|
||||||
|
|
||||||
|
HighlightController *getHighlights() override
|
||||||
|
{
|
||||||
|
return &this->highlights;
|
||||||
|
}
|
||||||
|
|
||||||
|
AccountController accounts;
|
||||||
|
Emotes emotes;
|
||||||
|
mock::UserDataController userData;
|
||||||
|
mock::MockTwitchIrcServer twitch;
|
||||||
|
ChatterinoBadges chatterinoBadges;
|
||||||
|
FfzBadges ffzBadges;
|
||||||
|
SeventvBadges seventvBadges;
|
||||||
|
HighlightController highlights;
|
||||||
|
};
|
||||||
|
|
||||||
|
class FiltersF : public ::testing::Test
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
void SetUp() override
|
||||||
|
{
|
||||||
|
this->mockApplication = std::make_unique<MockApplication>();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TearDown() override
|
||||||
|
{
|
||||||
|
this->mockApplication.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<MockApplication> mockApplication;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
namespace chatterino::filters {
|
namespace chatterino::filters {
|
||||||
|
|
||||||
std::ostream &operator<<(std::ostream &os, Type t)
|
std::ostream &operator<<(std::ostream &os, Type t)
|
||||||
@@ -170,3 +256,32 @@ TEST(Filters, Evaluation)
|
|||||||
<< qUtf8Printable(filter.debugString(typingContext));
|
<< qUtf8Printable(filter.debugString(typingContext));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(FiltersF, TypingContextChecks)
|
||||||
|
{
|
||||||
|
MockChannel channel("pajlada");
|
||||||
|
|
||||||
|
QByteArray message =
|
||||||
|
R"(@badge-info=subscriber/80;badges=broadcaster/1,subscriber/3072,partner/1;color=#CC44FF;display-name=pajlada;emote-only=1;emotes=25:0-4;first-msg=0;flags=;id=90ef1e46-8baa-4bf2-9c54-272f39d6fa11;mod=0;returning-chatter=0;room-id=11148817;subscriber=1;tmi-sent-ts=1662206235860;turbo=0;user-id=11148817;user-type= :pajlada!pajlada@pajlada.tmi.twitch.tv PRIVMSG #pajlada :ACTION Kappa)";
|
||||||
|
|
||||||
|
struct TestCase {
|
||||||
|
QByteArray input;
|
||||||
|
};
|
||||||
|
|
||||||
|
auto *privmsg = dynamic_cast<Communi::IrcPrivateMessage *>(
|
||||||
|
Communi::IrcPrivateMessage::fromData(message, nullptr));
|
||||||
|
EXPECT_NE(privmsg, nullptr);
|
||||||
|
|
||||||
|
QString originalMessage = privmsg->content();
|
||||||
|
|
||||||
|
TwitchMessageBuilder builder(&channel, privmsg, MessageParseArgs{});
|
||||||
|
|
||||||
|
auto msg = builder.build();
|
||||||
|
EXPECT_NE(msg.get(), nullptr);
|
||||||
|
|
||||||
|
auto contextMap = buildContextMap(msg, &channel);
|
||||||
|
|
||||||
|
EXPECT_EQ(contextMap.size(), MESSAGE_TYPING_CONTEXT.size());
|
||||||
|
|
||||||
|
delete privmsg;
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,9 +5,10 @@
|
|||||||
#include "controllers/completion/strategies/ClassicUserStrategy.hpp"
|
#include "controllers/completion/strategies/ClassicUserStrategy.hpp"
|
||||||
#include "controllers/completion/strategies/Strategy.hpp"
|
#include "controllers/completion/strategies/Strategy.hpp"
|
||||||
#include "messages/Emote.hpp"
|
#include "messages/Emote.hpp"
|
||||||
|
#include "mocks/Channel.hpp"
|
||||||
#include "mocks/EmptyApplication.hpp"
|
#include "mocks/EmptyApplication.hpp"
|
||||||
#include "mocks/Helix.hpp"
|
#include "mocks/Helix.hpp"
|
||||||
#include "providers/twitch/TwitchIrcServer.hpp"
|
#include "mocks/TwitchIrcServer.hpp"
|
||||||
#include "singletons/Emotes.hpp"
|
#include "singletons/Emotes.hpp"
|
||||||
#include "singletons/Paths.hpp"
|
#include "singletons/Paths.hpp"
|
||||||
#include "singletons/Settings.hpp"
|
#include "singletons/Settings.hpp"
|
||||||
@@ -22,35 +23,14 @@
|
|||||||
|
|
||||||
#include <span>
|
#include <span>
|
||||||
|
|
||||||
|
using namespace chatterino;
|
||||||
|
using chatterino::mock::MockChannel;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
using namespace chatterino;
|
|
||||||
using namespace chatterino::completion;
|
using namespace chatterino::completion;
|
||||||
using ::testing::Exactly;
|
using ::testing::Exactly;
|
||||||
|
|
||||||
class MockTwitchIrcServer : public ITwitchIrcServer
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
const BttvEmotes &getBttvEmotes() const override
|
|
||||||
{
|
|
||||||
return this->bttv;
|
|
||||||
}
|
|
||||||
|
|
||||||
const FfzEmotes &getFfzEmotes() const override
|
|
||||||
{
|
|
||||||
return this->ffz;
|
|
||||||
}
|
|
||||||
|
|
||||||
const SeventvEmotes &getSeventvEmotes() const override
|
|
||||||
{
|
|
||||||
return this->seventv;
|
|
||||||
}
|
|
||||||
|
|
||||||
BttvEmotes bttv;
|
|
||||||
FfzEmotes ffz;
|
|
||||||
SeventvEmotes seventv;
|
|
||||||
};
|
|
||||||
|
|
||||||
class MockApplication : mock::EmptyApplication
|
class MockApplication : mock::EmptyApplication
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -70,25 +50,12 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
AccountController accounts;
|
AccountController accounts;
|
||||||
MockTwitchIrcServer twitch;
|
mock::MockTwitchIrcServer twitch;
|
||||||
Emotes emotes;
|
Emotes emotes;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
namespace chatterino {
|
|
||||||
|
|
||||||
class MockChannel : public Channel
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
MockChannel(const QString &name)
|
|
||||||
: Channel(name, Channel::Type::Twitch)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace chatterino
|
|
||||||
|
|
||||||
EmotePtr namedEmote(const EmoteName &name)
|
EmotePtr namedEmote(const EmoteName &name)
|
||||||
{
|
{
|
||||||
return std::shared_ptr<Emote>(new Emote{
|
return std::shared_ptr<Emote>(new Emote{
|
||||||
|
|||||||
@@ -1,9 +1,16 @@
|
|||||||
#include "providers/twitch/TwitchMessageBuilder.hpp"
|
#include "providers/twitch/TwitchMessageBuilder.hpp"
|
||||||
|
|
||||||
#include "common/Channel.hpp"
|
#include "common/Channel.hpp"
|
||||||
|
#include "controllers/accounts/AccountController.hpp"
|
||||||
|
#include "controllers/highlights/HighlightController.hpp"
|
||||||
#include "messages/MessageBuilder.hpp"
|
#include "messages/MessageBuilder.hpp"
|
||||||
|
#include "mocks/Channel.hpp"
|
||||||
#include "mocks/EmptyApplication.hpp"
|
#include "mocks/EmptyApplication.hpp"
|
||||||
|
#include "mocks/TwitchIrcServer.hpp"
|
||||||
#include "mocks/UserData.hpp"
|
#include "mocks/UserData.hpp"
|
||||||
|
#include "providers/chatterino/ChatterinoBadges.hpp"
|
||||||
|
#include "providers/ffz/FfzBadges.hpp"
|
||||||
|
#include "providers/seventv/SeventvBadges.hpp"
|
||||||
#include "providers/twitch/TwitchBadge.hpp"
|
#include "providers/twitch/TwitchBadge.hpp"
|
||||||
#include "singletons/Emotes.hpp"
|
#include "singletons/Emotes.hpp"
|
||||||
|
|
||||||
@@ -16,6 +23,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
using namespace chatterino;
|
using namespace chatterino;
|
||||||
|
using chatterino::mock::MockChannel;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
@@ -32,8 +40,44 @@ public:
|
|||||||
return &this->userData;
|
return &this->userData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AccountController *getAccounts() override
|
||||||
|
{
|
||||||
|
return &this->accounts;
|
||||||
|
}
|
||||||
|
|
||||||
|
ITwitchIrcServer *getTwitch() override
|
||||||
|
{
|
||||||
|
return &this->twitch;
|
||||||
|
}
|
||||||
|
|
||||||
|
ChatterinoBadges *getChatterinoBadges() override
|
||||||
|
{
|
||||||
|
return &this->chatterinoBadges;
|
||||||
|
}
|
||||||
|
|
||||||
|
FfzBadges *getFfzBadges() override
|
||||||
|
{
|
||||||
|
return &this->ffzBadges;
|
||||||
|
}
|
||||||
|
|
||||||
|
SeventvBadges *getSeventvBadges() override
|
||||||
|
{
|
||||||
|
return &this->seventvBadges;
|
||||||
|
}
|
||||||
|
|
||||||
|
HighlightController *getHighlights() override
|
||||||
|
{
|
||||||
|
return &this->highlights;
|
||||||
|
}
|
||||||
|
|
||||||
|
AccountController accounts;
|
||||||
Emotes emotes;
|
Emotes emotes;
|
||||||
mock::UserDataController userData;
|
mock::UserDataController userData;
|
||||||
|
mock::MockTwitchIrcServer twitch;
|
||||||
|
ChatterinoBadges chatterinoBadges;
|
||||||
|
FfzBadges ffzBadges;
|
||||||
|
SeventvBadges seventvBadges;
|
||||||
|
HighlightController highlights;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
@@ -349,3 +393,70 @@ TEST_F(TestTwitchMessageBuilder, ParseTwitchEmotes)
|
|||||||
delete privmsg;
|
delete privmsg;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(TestTwitchMessageBuilder, ParseMessage)
|
||||||
|
{
|
||||||
|
MockChannel channel("pajlada");
|
||||||
|
|
||||||
|
struct TestCase {
|
||||||
|
QByteArray input;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<TestCase> testCases{
|
||||||
|
{
|
||||||
|
// action /me message
|
||||||
|
R"(@badge-info=subscriber/80;badges=broadcaster/1,subscriber/3072,partner/1;color=#CC44FF;display-name=pajlada;emote-only=1;emotes=25:0-4;first-msg=0;flags=;id=90ef1e46-8baa-4bf2-9c54-272f39d6fa11;mod=0;returning-chatter=0;room-id=11148817;subscriber=1;tmi-sent-ts=1662206235860;turbo=0;user-id=11148817;user-type= :pajlada!pajlada@pajlada.tmi.twitch.tv PRIVMSG #pajlada :ACTION Kappa)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
R"(@badge-info=subscriber/17;badges=subscriber/12,no_audio/1;color=#EBA2C0;display-name=jammehcow;emote-only=1;emotes=25:0-4;first-msg=0;flags=;id=9c2dd916-5a6d-4c1f-9fe7-a081b62a9c6b;mod=0;returning-chatter=0;room-id=11148817;subscriber=1;tmi-sent-ts=1662201093248;turbo=0;user-id=82674227;user-type= :jammehcow!jammehcow@jammehcow.tmi.twitch.tv PRIVMSG #pajlada :Kappa)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
R"(@badge-info=;badges=no_audio/1;color=#DAA520;display-name=Mm2PL;emote-only=1;emotes=1902:0-4;first-msg=0;flags=;id=9b1c3cb9-7817-47ea-add1-f9d4a9b4f846;mod=0;returning-chatter=0;room-id=11148817;subscriber=0;tmi-sent-ts=1662201095690;turbo=0;user-id=117691339;user-type= :mm2pl!mm2pl@mm2pl.tmi.twitch.tv PRIVMSG #pajlada :Keepo)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
R"(@badge-info=;badges=no_audio/1;color=#DAA520;display-name=Mm2PL;emote-only=1;emotes=25:0-4/1902:6-10/305954156:12-19;first-msg=0;flags=;id=7be87072-bf24-4fa3-b3df-0ea6fa5f1474;mod=0;returning-chatter=0;room-id=11148817;subscriber=0;tmi-sent-ts=1662201102276;turbo=0;user-id=117691339;user-type= :mm2pl!mm2pl@mm2pl.tmi.twitch.tv PRIVMSG #pajlada :Kappa Keepo PogChamp)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
R"(@badge-info=subscriber/80;badges=broadcaster/1,subscriber/3072,partner/1;color=#CC44FF;display-name=pajlada;emote-only=1;emotes=25:0-4,6-10;first-msg=0;flags=;id=f7516287-e5d1-43ca-974e-fe0cff84400b;mod=0;returning-chatter=0;room-id=11148817;subscriber=1;tmi-sent-ts=1662204375009;turbo=0;user-id=11148817;user-type= :pajlada!pajlada@pajlada.tmi.twitch.tv PRIVMSG #pajlada :Kappa Kappa)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
R"(@badge-info=subscriber/80;badges=broadcaster/1,subscriber/3072,partner/1;color=#CC44FF;display-name=pajlada;emotes=25:0-4,8-12;first-msg=0;flags=;id=44f85d39-b5fb-475d-8555-f4244f2f7e82;mod=0;returning-chatter=0;room-id=11148817;subscriber=1;tmi-sent-ts=1662204423418;turbo=0;user-id=11148817;user-type= :pajlada!pajlada@pajlada.tmi.twitch.tv PRIVMSG #pajlada :Kappa 😂 Kappa)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// start out of range
|
||||||
|
R"(@emotes=84608:9-10 :test!test@test.tmi.twitch.tv PRIVMSG #pajlada :foo bar)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// one character emote
|
||||||
|
R"(@emotes=84608:0-0 :test!test@test.tmi.twitch.tv PRIVMSG #pajlada :foo bar)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// two character emote
|
||||||
|
R"(@emotes=84609:0-1 :test!test@test.tmi.twitch.tv PRIVMSG #pajlada :foo bar)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// end out of range
|
||||||
|
R"(@emotes=84608:0-15 :test!test@test.tmi.twitch.tv PRIVMSG #pajlada :foo bar)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// range bad (end character before start)
|
||||||
|
R"(@emotes=84608:15-2 :test!test@test.tmi.twitch.tv PRIVMSG #pajlada :foo bar)",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
for (const auto &test : testCases)
|
||||||
|
{
|
||||||
|
auto *privmsg = dynamic_cast<Communi::IrcPrivateMessage *>(
|
||||||
|
Communi::IrcPrivateMessage::fromData(test.input, nullptr));
|
||||||
|
EXPECT_NE(privmsg, nullptr);
|
||||||
|
|
||||||
|
QString originalMessage = privmsg->content();
|
||||||
|
|
||||||
|
TwitchMessageBuilder builder(&channel, privmsg, MessageParseArgs{});
|
||||||
|
|
||||||
|
auto msg = builder.build();
|
||||||
|
EXPECT_NE(msg.get(), nullptr);
|
||||||
|
|
||||||
|
delete privmsg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#include "common/NetworkManager.hpp"
|
#include "common/NetworkManager.hpp"
|
||||||
|
#include "singletons/Resources.hpp"
|
||||||
#include "singletons/Settings.hpp"
|
#include "singletons/Settings.hpp"
|
||||||
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
@@ -24,6 +25,8 @@ int main(int argc, char **argv)
|
|||||||
// make sure to always debug-log
|
// make sure to always debug-log
|
||||||
QLoggingCategory::setFilterRules("*.debug=true");
|
QLoggingCategory::setFilterRules("*.debug=true");
|
||||||
|
|
||||||
|
initResources();
|
||||||
|
|
||||||
chatterino::NetworkManager::init();
|
chatterino::NetworkManager::init();
|
||||||
|
|
||||||
// Ensure settings are initialized before any tests are run
|
// Ensure settings are initialized before any tests are run
|
||||||
|
|||||||
Reference in New Issue
Block a user