2020-05-03 14:09:42 -03:00
|
|
|
|
|
|
|
|
#include <QMap>
|
|
|
|
|
#include <TEntityResolver.h>
|
|
|
|
|
#include <QtTest/QtTest>
|
2021-12-14 17:03:20 -04:00
|
|
|
#include "utils.h"
|
2020-05-03 14:09:42 -03:00
|
|
|
|
|
|
|
|
class TEntityResolverTest : public QObject {
|
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
|
|
private slots:
|
|
|
|
|
|
|
|
|
|
void initTestCase()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void testStandardEntities()
|
|
|
|
|
{
|
|
|
|
|
TEntityResolver resolver;
|
|
|
|
|
|
|
|
|
|
QCOMPARE(resolver.getResolution(" "), " ");
|
|
|
|
|
QCOMPARE(resolver.getResolution(">"), ">");
|
|
|
|
|
QCOMPARE(resolver.getResolution("<"), "<");
|
|
|
|
|
QCOMPARE(resolver.getResolution("&"), "&");
|
|
|
|
|
QCOMPARE(resolver.getResolution("""), "\"");
|
2024-08-31 15:33:24 +02:00
|
|
|
QCOMPARE(resolver.getResolution("Ú"), "Ú");
|
|
|
|
|
QCOMPARE(resolver.getResolution("ú"), "ú");
|
2020-05-03 14:09:42 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void testStandardEntitiesCaseInsensitive()
|
|
|
|
|
{
|
|
|
|
|
TEntityResolver resolver;
|
2024-08-31 15:33:24 +02:00
|
|
|
TEntityType type;
|
2020-05-03 14:09:42 -03:00
|
|
|
|
|
|
|
|
QCOMPARE(resolver.getResolution(">"), ">");
|
|
|
|
|
QCOMPARE(resolver.getResolution("≪"), "<");
|
|
|
|
|
QCOMPARE(resolver.getResolution("&AmP;"), "&");
|
|
|
|
|
QCOMPARE(resolver.getResolution("""), "\"");
|
2024-08-31 15:33:24 +02:00
|
|
|
QCOMPARE(resolver.getResolution("&Copy;", true, &type), "©");
|
|
|
|
|
QCOMPARE(type, ENTITY_TYPE_SYSTEM);
|
2020-05-03 14:09:42 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void testDecimalCode()
|
|
|
|
|
{
|
|
|
|
|
TEntityResolver resolver;
|
|
|
|
|
|
|
|
|
|
QCOMPARE(resolver.getResolution(" "), "\n");
|
|
|
|
|
QCOMPARE(resolver.getResolution("%"), "%");
|
|
|
|
|
QCOMPARE(resolver.getResolution(" "), " ");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void testHexCode()
|
|
|
|
|
{
|
|
|
|
|
TEntityResolver resolver;
|
|
|
|
|
|
|
|
|
|
QCOMPARE(resolver.getResolution(" "), " ");
|
|
|
|
|
QCOMPARE(resolver.getResolution("&"), "&");
|
|
|
|
|
QCOMPARE(resolver.getResolution("+"), "+");
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2026-07-25 17:23:31 +02:00
|
|
|
void testMalformedNumericEntity()
|
|
|
|
|
{
|
|
|
|
|
TEntityResolver resolver;
|
|
|
|
|
|
|
|
|
|
// A numeric entity with no digits ("&#;") leaves an empty value that was
|
|
|
|
|
// previously passed to QString::front() (undefined behaviour). It must
|
|
|
|
|
// now resolve safely rather than crash/assert.
|
|
|
|
|
QCOMPARE(resolver.getResolution("&#;"), "");
|
|
|
|
|
QCOMPARE(resolver.getResolution("&#x;"), "");
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-03 14:09:42 -03:00
|
|
|
void testRegisteredEntities()
|
|
|
|
|
{
|
|
|
|
|
TEntityResolver resolver;
|
2024-08-31 15:33:24 +02:00
|
|
|
TEntityType type;
|
2020-05-03 14:09:42 -03:00
|
|
|
|
|
|
|
|
// Examples from MXP specification https://www.zuggsoft.com/zmud/mxp.htm#ENTITY
|
|
|
|
|
resolver.registerEntity("&Version;", "6.15");
|
|
|
|
|
resolver.registerEntity("&Start;", "<em>");
|
|
|
|
|
resolver.registerEntity("&End;", "</em>");
|
|
|
|
|
|
|
|
|
|
QCOMPARE(resolver.getResolution("&VERSION;"), "6.15");
|
|
|
|
|
QCOMPARE(resolver.getResolution("&Start;"), "<em>");
|
2024-08-31 15:33:24 +02:00
|
|
|
QCOMPARE(resolver.getResolution("&end;", true, &type), "</em>");
|
|
|
|
|
QCOMPARE(type, ENTITY_TYPE_CUSTOM);
|
|
|
|
|
// Check if disabling resolution of custom entities works and is properly signalled
|
|
|
|
|
QCOMPARE(resolver.getResolution("&end;", false, &type), "&end;");
|
|
|
|
|
QCOMPARE(type, ENTITY_TYPE_UNKNOWN);
|
2020-05-03 14:09:42 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void testRegisterEntityAsChar()
|
|
|
|
|
{
|
|
|
|
|
TEntityResolver resolver;
|
|
|
|
|
|
|
|
|
|
resolver.registerEntity("&symbol;", '@');
|
|
|
|
|
|
|
|
|
|
QCOMPARE(resolver.getResolution("&symbol;"), "@");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void testInvalidRegister()
|
|
|
|
|
{
|
|
|
|
|
TEntityResolver resolver;
|
|
|
|
|
|
|
|
|
|
QVERIFY(!resolver.registerEntity("&symbol", '@'));
|
|
|
|
|
QVERIFY(!resolver.registerEntity("symbol", '@'));
|
|
|
|
|
|
|
|
|
|
QVERIFY(resolver.registerEntity("&symbol;", '@'));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void testResolveNonExistentEntity()
|
|
|
|
|
{
|
|
|
|
|
TEntityResolver resolver;
|
|
|
|
|
|
|
|
|
|
QCOMPARE(resolver.getResolution("&symbol;"), "&symbol;");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void testInterpolation()
|
|
|
|
|
{
|
|
|
|
|
TEntityResolver resolver;
|
|
|
|
|
|
|
|
|
|
QCOMPARE(resolver.interpolate("2 < 4"), "2 < 4");
|
|
|
|
|
QCOMPARE(resolver.interpolate("2 ≪ 4"), "2 < 4");
|
|
|
|
|
QCOMPARE(resolver.interpolate("You say "Hello World""), "You say \"Hello World\"");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void testCustomInterpolation()
|
|
|
|
|
{
|
|
|
|
|
const QMap<QString, QString> attributes = {
|
2021-12-14 17:03:20 -04:00
|
|
|
{qsl("&name;"), qsl("drunk sailor")},
|
|
|
|
|
{qsl("&desc;"), qsl("A drunk sailor is lying here")}
|
2020-05-03 14:09:42 -03:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
auto mapping = [attributes](auto& attr) {
|
|
|
|
|
auto ptr = attributes.find(attr);
|
|
|
|
|
return ptr != attributes.end() ? *ptr : attr;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
QCOMPARE(TEntityResolver::interpolate("attack '&name;'|look '&name;'", mapping), "attack 'drunk sailor'|look 'drunk sailor'");
|
|
|
|
|
QCOMPARE(TEntityResolver::interpolate("desc: '&desc;'", mapping), "desc: 'A drunk sailor is lying here'");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void cleanupTestCase()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#include "TEntityResolverTest.moc"
|
|
|
|
|
QTEST_MAIN(TEntityResolverTest)
|