diff --git a/include/znc/Message.h b/include/znc/Message.h index 4f87f14d..2ceb39ce 100644 --- a/include/znc/Message.h +++ b/include/znc/Message.h @@ -56,6 +56,7 @@ public: }; Type GetType() const { return m_eType; } + bool Equals(const CMessage& Other) const; void Clone(const CMessage& Other); // ZNC <-> IRC diff --git a/src/Message.cpp b/src/Message.cpp index 6d9c5ad2..45b14669 100644 --- a/src/Message.cpp +++ b/src/Message.cpp @@ -29,6 +29,13 @@ CMessage::CMessage(const CNick& Nick, const CString& sCommand, const VCString& v InitTime(); } +bool CMessage::Equals(const CMessage& Other) const +{ + return m_Nick.NickEquals(Other.GetNick().GetNick()) && + m_sCommand.Equals(Other.GetCommand()) && + m_vsParams == Other.GetParams(); +} + void CMessage::Clone(const CMessage& Message) { if (&Message != this) { diff --git a/test/MessageTest.cpp b/test/MessageTest.cpp index 5163e917..6ccfe832 100644 --- a/test/MessageTest.cpp +++ b/test/MessageTest.cpp @@ -106,6 +106,27 @@ TEST(MessageTest, FormatFlags) { EXPECT_EQ("COMMAND param", msg.ToString(CMessage::ExcludePrefix|CMessage::ExcludeTags)); } +TEST(MessageTest, Equals) { + EXPECT_TRUE(CMessage("JOIN #chan").Equals(CMessage("JOIN #chan"))); + EXPECT_FALSE(CMessage("JOIN #chan").Equals(CMessage("JOIN #znc"))); + + EXPECT_TRUE(CMessage(":nick JOIN #chan").Equals(CMessage(":nick JOIN #chan"))); + EXPECT_FALSE(CMessage(":nick JOIN #chan").Equals(CMessage(":nick JOIN #znc"))); + EXPECT_FALSE(CMessage(":nick JOIN #chan").Equals(CMessage(":someone JOIN #chan"))); + + EXPECT_TRUE(CMessage("PRIVMSG nick :hi").Equals(CMessage("PRIVMSG nick :hi"))); + EXPECT_TRUE(CMessage("PRIVMSG nick hi").Equals(CMessage("PRIVMSG nick :hi"))); + EXPECT_TRUE(CMessage("PRIVMSG nick :hi").Equals(CMessage("PRIVMSG nick hi"))); + EXPECT_TRUE(CMessage("PRIVMSG nick hi").Equals(CMessage("PRIVMSG nick hi"))); + + EXPECT_TRUE(CMessage("CMD nick p1 p2").Equals(CMessage("CMD nick p1 p2"))); + EXPECT_TRUE(CMessage("CMD nick :p1 p2").Equals(CMessage("CMD nick :p1 p2"))); + EXPECT_TRUE(CMessage("CMD nick p1 :p2").Equals(CMessage("CMD nick p1 p2"))); + EXPECT_FALSE(CMessage("CMD nick :p1 p2").Equals(CMessage("CMD nick p1 p2"))); + + EXPECT_TRUE(CMessage("@t=now :sender CMD p").Equals(CMessage("@t=then :sender CMD p"))); +} + TEST(MessageTest, Type) { EXPECT_EQ(CMessage::Type::Unknown, CMessage("FOO").GetType()); EXPECT_EQ(CMessage::Type::Account, CMessage("ACCOUNT").GetType());