2021-03-29 08:46:25 -03:00
2020-08-09 15:13:14 -03:00
# include "TMxpTagParser.h"
2020-05-03 14:09:42 -03:00
# include <MxpTag.h>
# include <QtTest/QtTest>
class TMxpTagParserTest : public QObject {
2020-08-09 15:13:14 -03:00
Q_OBJECT
2020-05-03 14:09:42 -03:00
private :
private slots :
void initTestCase ( )
2021-03-29 08:46:25 -03:00
{
}
2020-05-03 14:09:42 -03:00
2021-03-29 08:46:25 -03:00
QSharedPointer < MxpNode > parseNode ( const QString & tagText ) const
2020-08-09 15:13:14 -03:00
{
2021-03-29 08:46:25 -03:00
auto nodes = TMxpTagParser : : parseToMxpNodeList ( tagText ) ;
return nodes . size ( ) > 0 ? nodes . first ( ) : nullptr ;
}
2020-08-09 15:13:14 -03:00
2021-03-29 08:46:25 -03:00
void testMateriaMagicaScriptedActionEndTag ( )
{
auto node = parseNode ( " <play hangman/scripted_action> " ) ;
QVERIFY ( node - > isEndTag ( ) ) ;
QCOMPARE ( node - > asEndTag ( ) - > getName ( ) , " scripted_action " ) ;
2020-08-09 15:13:14 -03:00
}
void testMateriaMagicaScriptedActionTag ( )
{
TMxpTagParser parser ;
QString tagText = R " (<scripted_action desc= " hangman start " >play hangman<play hangman/scripted_action>) " ;
2021-03-29 08:46:25 -03:00
auto list = parser . parseToMxpNodeList ( tagText , false ) ;
QCOMPARE ( list . size ( ) , 3 ) ;
2020-08-09 15:13:14 -03:00
QVERIFY ( list [ 0 ] - > isStartTag ( ) ) ;
QCOMPARE ( list [ 0 ] - > asStartTag ( ) - > getName ( ) , " scripted_action " ) ;
2021-03-29 08:46:25 -03:00
QVERIFY ( ! list [ 1 ] - > isTag ( ) ) ;
QCOMPARE ( list [ 1 ] - > asText ( ) - > getContent ( ) , " play hangman " ) ;
QVERIFY ( list [ 2 ] - > isEndTag ( ) ) ;
QCOMPARE ( list [ 2 ] - > asEndTag ( ) - > getName ( ) , " scripted_action " ) ;
2020-08-09 15:13:14 -03:00
}
2021-03-29 08:46:25 -03:00
void testSimpleEndTag ( )
{
2020-08-09 15:13:14 -03:00
TMxpTagParser parser ;
QString tagText = R " (<tag_name desc= " blabla " >tag content</tag_name>) " ;
auto list = parser . parseToMxpNodeList ( tagText , true ) ;
QCOMPARE ( list . size ( ) , 2 ) ;
QVERIFY ( list [ 0 ] - > isStartTag ( ) ) ;
QVERIFY ( list [ 1 ] - > isEndTag ( ) ) ;
QCOMPARE ( list [ 0 ] - > asStartTag ( ) - > getName ( ) , " tag_name " ) ;
QVERIFY ( list [ 1 ] - > isEndTag ( ) ) ;
QCOMPARE ( list [ 1 ] - > asEndTag ( ) - > getName ( ) , " tag_name " ) ;
}
2021-03-29 08:46:25 -03:00
void testSimpleTagQuotedSlash ( )
{
2020-08-09 15:13:14 -03:00
TMxpTagParser parser ;
QString tagText = R " (<tag_name desc= " a / b " >) " ;
auto list = parser . parseToMxpNodeList ( tagText , true ) ;
QCOMPARE ( list . size ( ) , 1 ) ;
QVERIFY ( list [ 0 ] - > isStartTag ( ) ) ;
QCOMPARE ( list [ 0 ] - > asStartTag ( ) - > getName ( ) , " tag_name " ) ;
QCOMPARE ( list [ 0 ] - > asStartTag ( ) - > getAttributeValue ( " desc " ) , " a/b " ) ;
}
void testParseUrl ( )
{
2021-03-29 08:46:25 -03:00
QString tagText = R " (<A HREF= " https : //www.google.com/search?q=mudlet">)";
auto node = parseNode ( tagText ) ;
QVERIFY ( node ) ;
2020-06-25 04:20:53 -03:00
2021-03-29 08:46:25 -03:00
QVERIFY ( node - > isStartTag ( ) ) ;
QCOMPARE ( node - > asStartTag ( ) - > getName ( ) , " A " ) ;
QCOMPARE ( node - > asStartTag ( ) - > getAttributeValue ( " HREF " ) , " https://www.google.com/search?q=mudlet " ) ;
2020-06-25 04:20:53 -03:00
}
2020-08-09 15:13:14 -03:00
void testParseWithEqualSymbol ( )
{
2021-03-29 08:46:25 -03:00
QString tagText = R " (<SEND HREF= " 1 + 1 = 2 " >) " ;
auto node = parseNode ( tagText ) ;
2020-06-25 04:20:53 -03:00
2021-03-29 08:46:25 -03:00
QVERIFY ( node ) ;
QVERIFY ( node - > isStartTag ( ) ) ;
QCOMPARE ( node - > asStartTag ( ) - > getName ( ) , " SEND " ) ;
QCOMPARE ( node - > asStartTag ( ) - > getAttributeValue ( " HREF " ) , " 1+1=2 " ) ;
2020-06-25 04:20:53 -03:00
}
2020-05-03 14:09:42 -03:00
void testParseWithQuotes ( )
{
TMxpTagParser parser ;
QList < QSharedPointer < MxpNode > > list = parser . parseToMxpNodeList ( " <!EN quot ' \" '> " , true ) ;
QCOMPARE ( list . size ( ) , 1 ) ;
QCOMPARE ( list [ 0 ] - > asStartTag ( ) - > getName ( ) , " !EN " ) ;
QCOMPARE ( list [ 0 ] - > asStartTag ( ) - > getAttrName ( 0 ) , " quot " ) ;
QCOMPARE ( list [ 0 ] - > asStartTag ( ) - > getAttrName ( 1 ) , " \" " ) ;
}
void testParseToNodes ( )
{
TMxpTagParser parser ;
QList < QSharedPointer < MxpNode > > list = parser . parseToMxpNodeList ( " <COLOR fore=red><B> " ) ;
QCOMPARE ( list . size ( ) , 2 ) ;
QVERIFY ( list [ 0 ] . get ( ) - > isTag ( ) ) ;
QCOMPARE ( list [ 0 ] - > asStartTag ( ) - > getName ( ) , " COLOR " ) ;
QCOMPARE ( list [ 0 ] - > asStartTag ( ) - > getAttributeValue ( " FORE " ) , " red " ) ;
QCOMPARE ( list [ 1 ] - > asStartTag ( ) - > getName ( ) , " B " ) ;
}
void testParseToNodesWithText ( )
{
TMxpTagParser parser ;
QList < QSharedPointer < MxpNode > > list = parser . parseToMxpNodeList ( " <SEND>north</SEND> " ) ;
QCOMPARE ( list . size ( ) , 3 ) ;
QVERIFY ( list [ 0 ] . get ( ) - > isTag ( ) ) ;
QCOMPARE ( list [ 0 ] - > asStartTag ( ) - > getName ( ) , " SEND " ) ;
QVERIFY ( ! list [ 1 ] - > isTag ( ) ) ;
QCOMPARE ( list [ 1 ] - > asText ( ) - > getContent ( ) , " north " ) ;
QCOMPARE ( list [ 2 ] - > asEndTag ( ) - > getName ( ) , " SEND " ) ;
}
void testParseToNodesIgnoreText ( )
{
TMxpTagParser parser ;
QList < QSharedPointer < MxpNode > > list = parser . parseToMxpNodeList ( " <COLOR fore=red>asafsdf<B>asdf " , true ) ;
QCOMPARE ( list . size ( ) , 2 ) ;
QVERIFY ( list [ 0 ] . get ( ) - > isTag ( ) ) ;
QCOMPARE ( list [ 0 ] - > asStartTag ( ) - > getName ( ) , " COLOR " ) ;
QCOMPARE ( list [ 0 ] - > asStartTag ( ) - > getAttributeValue ( " FORE " ) , " red " ) ;
QCOMPARE ( list [ 1 ] - > asStartTag ( ) - > getName ( ) , " B " ) ;
}
void testParseToNodesWithClosedAndEndTag ( )
{
TMxpTagParser parser ;
QList < QSharedPointer < MxpNode > > list = parser . parseToMxpNodeList ( " <RNum 2 /><SEND>text</ SEND> " ) ;
QCOMPARE ( list . size ( ) , 4 ) ;
QVERIFY ( list [ 0 ] . get ( ) - > isTag ( ) ) ;
QVERIFY ( list [ 0 ] . get ( ) - > asStartTag ( ) - > isEmpty ( ) ) ;
QCOMPARE ( list [ 0 ] . get ( ) - > asStartTag ( ) - > getAttrName ( 0 ) , " 2 " ) ;
QVERIFY ( list [ 3 ] . get ( ) - > isEndTag ( ) ) ;
QCOMPARE ( list [ 3 ] . get ( ) - > asEndTag ( ) - > getName ( ) , " SEND " ) ;
}
void testParseToNodesWithTextAndSpaces ( )
{
TMxpTagParser parser ;
QList < QSharedPointer < MxpNode > > list = parser . parseToMxpNodeList ( " <SEND href= \" &text; \" > go north... </SEND> " ) ;
QCOMPARE ( list . size ( ) , 3 ) ;
QVERIFY ( list [ 0 ] . get ( ) - > isTag ( ) ) ;
QCOMPARE ( list [ 0 ] - > asStartTag ( ) - > getName ( ) , " SEND " ) ;
QCOMPARE ( list [ 0 ] - > asStartTag ( ) - > getAttributeValue ( " href " ) , " &text; " ) ;
QVERIFY ( ! list [ 1 ] - > isTag ( ) ) ;
QCOMPARE ( list [ 1 ] - > asText ( ) - > getContent ( ) , " go north... " ) ;
QCOMPARE ( list [ 2 ] - > asEndTag ( ) - > getName ( ) , " SEND " ) ;
}
void testComplexElementDefinitionToTag ( )
{
QString tagLine =
" <!EL get \" <send href='examine "&name;"|get "&name;"' hint='Right mouse click to act on this item|Get &desc;|Examine &desc;|Look in &desc;' expire=get> \" ATT='name desc'> " ;
TMxpTagParser parser ;
2021-03-29 08:46:25 -03:00
auto list = parser . parseToMxpNodeList ( tagLine ) ;
QCOMPARE ( list . size ( ) , 1 ) ;
QVERIFY ( list [ 0 ] - > isStartTag ( ) ) ;
2020-05-03 14:09:42 -03:00
2021-03-29 08:46:25 -03:00
MxpStartTag * tag = list [ 0 ] - > asStartTag ( ) ;
2020-05-03 14:09:42 -03:00
2021-03-29 08:46:25 -03:00
QCOMPARE ( tag - > getName ( ) , " !EL " ) ;
QCOMPARE ( tag - > getAttributesCount ( ) , 3 ) ;
2020-05-03 14:09:42 -03:00
2021-03-29 08:46:25 -03:00
QCOMPARE ( tag - > getAttribute ( 0 ) . getName ( ) , " get " ) ;
QCOMPARE ( tag - > getAttribute ( 0 ) . getValue ( ) , " " ) ;
2020-05-03 14:09:42 -03:00
2021-03-29 08:46:25 -03:00
QCOMPARE ( tag - > getAttribute ( 1 ) . getName ( ) ,
2020-05-03 14:09:42 -03:00
" <send href='examine "&name;"|get "&name;"' hint='Right mouse click to act on this item|Get &desc;|Examine &desc;|Look in &desc;' expire=get> " ) ;
2021-03-29 08:46:25 -03:00
QCOMPARE ( tag - > getAttributeValue ( " ATT " ) , " name desc " ) ;
2020-05-03 14:09:42 -03:00
2021-03-29 08:46:25 -03:00
auto sendTagNodeList = parser . parseToMxpNodeList ( tag - > getAttribute ( 1 ) . getName ( ) ) ;
MxpStartTag * sendTag = sendTagNodeList [ 0 ] - > asStartTag ( ) ;
QCOMPARE ( sendTag - > getName ( ) , " send " ) ;
2020-05-03 14:09:42 -03:00
}
void testMxpTagParser ( )
{
TMxpTagParser parser ;
2021-03-29 08:46:25 -03:00
auto list = parser . parseToMxpNodeList ( " <!EL RExit FLAG=RoomExit> " ) ;
QCOMPARE ( list . size ( ) , 1 ) ;
QVERIFY ( list [ 0 ] - > isStartTag ( ) ) ;
2020-05-03 14:09:42 -03:00
2021-03-29 08:46:25 -03:00
MxpStartTag * tag = list [ 0 ] - > asStartTag ( ) ;
2020-05-03 14:09:42 -03:00
2021-03-29 08:46:25 -03:00
QCOMPARE ( tag - > getName ( ) , " !EL " ) ;
2020-05-03 14:09:42 -03:00
2021-03-29 08:46:25 -03:00
QVERIFY ( tag - > hasAttribute ( " RExit " ) ) ;
QCOMPARE ( tag - > getAttributeValue ( " RExit " ) , " " ) ;
QCOMPARE ( tag - > getAttribute ( 0 ) . getName ( ) , " RExit " ) ;
QCOMPARE ( tag - > getAttribute ( 0 ) . getValue ( ) , " " ) ;
2020-05-03 14:09:42 -03:00
2021-03-29 08:46:25 -03:00
QVERIFY ( tag - > hasAttribute ( " FLAG " ) ) ;
QCOMPARE ( tag - > getAttributeValue ( " FLAG " ) , " RoomExit " ) ;
2020-05-03 14:09:42 -03:00
}
void testAttrDefinition ( )
{
QString tagLine = R " (<!ATTLIST boldtext 'color=red background=white flags'>) " ;
TMxpTagParser parser ;
2021-03-29 08:46:25 -03:00
auto list = parser . parseToMxpNodeList ( tagLine ) ;
2020-05-03 14:09:42 -03:00
2021-03-29 08:46:25 -03:00
QCOMPARE ( list . size ( ) , 1 ) ;
QVERIFY ( list [ 0 ] - > isStartTag ( ) ) ;
2020-05-03 14:09:42 -03:00
2021-03-29 08:46:25 -03:00
MxpStartTag * tag = list [ 0 ] - > asStartTag ( ) ;
QCOMPARE ( tag - > getName ( ) , " !ATTLIST " ) ;
QCOMPARE ( tag - > getAttribute ( 0 ) . getName ( ) , " boldtext " ) ;
QCOMPARE ( tag - > getAttribute ( 1 ) . getName ( ) , " color=red background=white flags " ) ;
2020-05-03 14:09:42 -03:00
}
2021-03-29 08:46:25 -03:00
void testSimpleElementDefinition ( )
2020-05-03 14:09:42 -03:00
{
2021-03-29 08:46:25 -03:00
QString tagLine = " <!EL RExit FLAG=RoomExit> " ;
auto node = parseNode ( tagLine ) ;
2020-05-03 14:09:42 -03:00
2021-03-29 08:46:25 -03:00
QVERIFY ( node - > isStartTag ( ) ) ;
QCOMPARE ( node - > asStartTag ( ) - > getName ( ) , " !EL " ) ;
QVERIFY ( node - > asStartTag ( ) - > hasAttribute ( " RExit " ) ) ;
QCOMPARE ( node - > asStartTag ( ) - > getAttributeValue ( " FLAG " ) , " RoomExit " ) ;
2020-05-03 14:09:42 -03:00
}
2021-03-29 08:46:25 -03:00
void testElementDefinitionWithExtraSpaces ( )
2020-05-03 14:09:42 -03:00
{
2021-03-29 08:46:25 -03:00
QString tagLine = " <!EL RExit FLAG=RoomExit> " ;
auto node = parseNode ( tagLine ) ;
2020-05-03 14:09:42 -03:00
2021-03-29 08:46:25 -03:00
QVERIFY ( node - > isStartTag ( ) ) ;
QCOMPARE ( node - > asStartTag ( ) - > getName ( ) , " !EL " ) ;
QVERIFY ( node - > asStartTag ( ) - > hasAttribute ( " RExit " ) ) ;
QCOMPARE ( node - > asStartTag ( ) - > getAttributeValue ( " FLAG " ) , " RoomExit " ) ;
2020-05-03 14:09:42 -03:00
}
2021-03-29 08:46:25 -03:00
void testElementDefinitionQuotedAttributeSpaces ( )
2020-05-03 14:09:42 -03:00
{
2021-03-29 08:46:25 -03:00
QString tagLine = " <!EL sHp FLAG='Set Hp'> " ;
auto node = parseNode ( tagLine ) ;
2020-05-03 14:09:42 -03:00
2021-03-29 08:46:25 -03:00
QVERIFY ( node - > isStartTag ( ) ) ;
QCOMPARE ( node - > asStartTag ( ) - > getName ( ) , " !EL " ) ;
QVERIFY ( node - > asStartTag ( ) - > hasAttribute ( " sHp " ) ) ;
QCOMPARE ( node - > asStartTag ( ) - > getAttributeValue ( " FLAG " ) , " Set Hp " ) ;
2020-05-03 14:09:42 -03:00
}
void testAccessAttrCaseInsensitive ( )
{
TMxpTagParser parser ;
QString tagLine = " <!EL sHp FLAG='Set Hp'> " ;
2021-03-29 08:46:25 -03:00
auto node = parseNode ( tagLine ) ;
QVERIFY ( node - > isStartTag ( ) ) ;
MxpStartTag * tag = node - > asStartTag ( ) ;
2020-05-03 14:09:42 -03:00
2021-03-29 08:46:25 -03:00
QVERIFY ( tag - > hasAttribute ( " sHp " ) ) ;
QVERIFY ( tag - > hasAttribute ( " shp " ) ) ;
QVERIFY ( tag - > hasAttribute ( " shP " ) ) ;
QCOMPARE ( tag - > getAttributeValue ( " flag " ) , " Set Hp " ) ;
2020-05-03 14:09:42 -03:00
}
2021-03-29 08:46:25 -03:00
void testElementDefinitionQuotesInQuotes ( )
2020-05-03 14:09:42 -03:00
{
2021-03-29 08:46:25 -03:00
QString tagLine = " <!EL x FLAG='Quote \" ex'> " ;
auto node = parseNode ( tagLine ) ;
2020-05-03 14:09:42 -03:00
2021-03-29 08:46:25 -03:00
QVERIFY ( node - > isStartTag ( ) ) ;
QCOMPARE ( node - > asStartTag ( ) - > getName ( ) , " !EL " ) ;
QVERIFY ( node - > asStartTag ( ) - > hasAttribute ( " x " ) ) ;
QCOMPARE ( node - > asStartTag ( ) - > getAttributeValue ( " FLAG " ) , " Quote \" ex " ) ;
2020-05-03 14:09:42 -03:00
}
2021-03-29 08:46:25 -03:00
void testCompleteElement ( )
2020-05-03 14:09:42 -03:00
{
TMxpTagParser parser ;
2021-03-29 08:46:25 -03:00
QString tagLine = R " (<FRAME Name= " Map " Left= " - 20 c " Top= " 0 " Width= " 20 c " Height= " 20 c " >) " ;
auto node = parseNode ( tagLine ) ;
QVERIFY ( node - > isStartTag ( ) ) ;
MxpStartTag * tag = node - > asStartTag ( ) ;
2020-05-03 14:09:42 -03:00
2021-03-29 08:46:25 -03:00
QCOMPARE ( tag - > getName ( ) , " FRAME " ) ;
QCOMPARE ( tag - > getAttributeValue ( " Name " ) , " Map " ) ;
QCOMPARE ( tag - > getAttributeValue ( " Left " ) , " -20c " ) ;
QCOMPARE ( tag - > getAttributeValue ( " Top " ) , " 0 " ) ;
QCOMPARE ( tag - > getAttributeValue ( " Width " ) , " 20c " ) ;
QCOMPARE ( tag - > getAttributeValue ( " Height " ) , " 20c " ) ;
2020-05-03 14:09:42 -03:00
}
void testEndTag ( )
{
2021-03-29 08:46:25 -03:00
auto node = parseNode ( " </V> " ) ;
QVERIFY ( node - > isEndTag ( ) ) ;
2020-05-03 14:09:42 -03:00
2021-03-29 08:46:25 -03:00
MxpEndTag * endTag = node - > asEndTag ( ) ;
2020-05-03 14:09:42 -03:00
QCOMPARE ( endTag - > getName ( ) , " V " ) ;
QCOMPARE ( endTag - > asStartTag ( ) , nullptr ) ;
}
void testParseEndTag ( )
{
2021-03-29 08:46:25 -03:00
auto node = parseNode ( " </V> " ) ;
QVERIFY ( node ) ;
QVERIFY ( node - > isEndTag ( ) ) ;
MxpEndTag * tag = node - > asEndTag ( ) ;
2020-05-03 14:09:42 -03:00
QCOMPARE ( tag - > getName ( ) , " V " ) ;
QVERIFY ( ! tag - > asStartTag ( ) ) ;
}
void testStartTagClosed ( )
{
2021-03-29 08:46:25 -03:00
auto node = parseNode ( " <RNum 212 /> " ) ;
2020-05-03 14:09:42 -03:00
2021-03-29 08:46:25 -03:00
QVERIFY ( node ) ;
QVERIFY ( node - > isStartTag ( ) ) ;
MxpStartTag * tag = node - > asStartTag ( ) ;
QVERIFY ( tag - > isEmpty ( ) ) ;
2020-05-03 14:09:42 -03:00
QCOMPARE ( tag - > getName ( ) , " RNum " ) ;
2021-03-29 08:46:25 -03:00
QCOMPARE ( tag - > getAttribute ( 0 ) . getName ( ) , " 212 " ) ;
QCOMPARE ( tag - > getAttributesCount ( ) , 1 ) ;
}
void testQuotedAttrValue ( )
{
auto node = parseNode ( " <color fore='red' back= \" blue \" > " ) ;
QVERIFY ( node ) ;
QVERIFY ( node - > isStartTag ( ) ) ;
MxpStartTag * tag = node - > asStartTag ( ) ;
QVERIFY ( tag - > isStartTag ( ) ) ;
QCOMPARE ( tag - > getName ( ) , " color " ) ;
QCOMPARE ( tag - > asStartTag ( ) - > getAttributesCount ( ) , 2 ) ;
QCOMPARE ( tag - > asStartTag ( ) - > getAttribute ( " fore " ) . getValue ( ) , " red " ) ;
QCOMPARE ( tag - > asStartTag ( ) - > getAttribute ( " back " ) . getValue ( ) , " blue " ) ;
2020-05-03 14:09:42 -03:00
}
2022-01-22 13:12:19 +01:00
void testUnquotedUrl ( ) {
auto node = parseNode ( " <sound FName= \" cow.wav \" U=https://raw.githubusercontent.com/StickMUD/StickMUDSounds/master/sounds/> " ) ;
QVERIFY ( node ) ;
QVERIFY ( node - > isStartTag ( ) ) ;
MxpStartTag * tag = node - > asStartTag ( ) ;
QCOMPARE ( tag - > getName ( ) , " sound " ) ;
QCOMPARE ( tag - > getAttributeValue ( " FName " ) , " cow.wav " ) ;
QCOMPARE ( tag - > getAttributeValue ( " U " ) , " https://raw.githubusercontent.com/StickMUD/StickMUDSounds/master/sounds/ " ) ;
}
void testEmptyTagWithSlash ( ) {
auto node = parseNode ( " <send url=http://www.gogle.com/ /> " ) ;
QVERIFY ( node ) ;
QVERIFY ( node - > isStartTag ( ) ) ;
MxpStartTag * tag = node - > asStartTag ( ) ;
QVERIFY ( tag - > isEmpty ( ) ) ;
QCOMPARE ( tag - > getName ( ) , " send " ) ;
QCOMPARE ( tag - > getAttributeValue ( " url " ) , " http://www.gogle.com/ " ) ;
}
2021-03-29 08:46:25 -03:00
void cleanupTestCase ( ) { }
2020-05-03 14:09:42 -03:00
} ;
# include "TMxpTagParserTest.moc"
QTEST_MAIN ( TMxpTagParserTest )