blob: fc9d5475e852f811f7c15bc6ec6ca0b009e79760 [file] [log] [blame]
#include <QCoreApplication>
#include <QDebug>
#include "Matcher.h"
#include "Token.h"
#include "AstNode.h"
#include "Parser.h"
int g_numFailed = 0;
void testMatch(const QString &test, bool shouldBe, const MatchResult &result)
{
if (result.success != shouldBe)
{
g_numFailed++;
qDebug() << "\n\033[31mTEST FAILS:\033[0m";
qDebug() << "with context" << result.context;
}
qDebug() << "\033[36mMatchResult\033[0m" << test << result.success;
if (result.success != shouldBe)
{
qDebug() << "";
}
}
void testParse(QString string)
{
Parser parser{string};
QList<AstNode> result = parser.parseMany();
qDebug() << "\033[36mParse\033[0m" << string << result;
}
int testResults()
{
if (g_numFailed == 0)
{
qDebug() << "\033[32mALL TESTS SUCCEEDED\033[0m";
}
else
{
qDebug().nospace() << "\033[31m" << g_numFailed << " TESTS FAILED\033[0m";
}
return g_numFailed;
}
void testAllMatches()
{
testMatch("a = a", true, match({Token('a')}, {Token('a')}, VarContext()));
testMatch("s.a = y", true, match({Token('y')}, {Token('s', "a")}, VarContext()));
LTok sameTwo = {Token('s', "a"), Token('s', "a")};
testMatch("s.a s.a = aa", true, match({Token('a'), Token('a')}, sameTwo, VarContext()));
testMatch("s.a s.a = ab", false, match({Token('a'), Token('b')}, sameTwo, VarContext()));
LTok sameStartEnd = {
Token('s', "a"),
Token('e', "middle"),
Token('s', "a")};
testMatch("s.a e.middle s.a = aea", true,
match({Token('a'), Token('e'), Token('a')}, sameStartEnd, VarContext()));
testMatch("s.a e.middle s.a = aef Hi a", true,
match({Token('a'), Token('e'), Token('f'), Token("Hi"), Token('a')}, sameStartEnd, VarContext()));
testMatch("s.a e.middle s.a = aef Hi c", false,
match({Token('a'), Token('e'), Token('f'), Token("Hi"), Token('c')}, sameStartEnd, VarContext()));
LTok parenthesized = {
Token(LTok({Token('s', "a")})),
Token('e', "Middle"),
Token('s', "a"),
};
LTok parenTest1 = {
Token(LTok({Token('y')})),
Token('f'),
Token("MiddleStuff"),
Token('y')};
testMatch("(s.a) e.Middle s.a = (y)f MiddleStuff y", true,
match(parenTest1, parenthesized, VarContext()));
testMatch("(a) = (a)", true,
match({Token({Token('a')})}, {Token({Token('a')})}, VarContext()));
}
void testAllParses()
{
testParse("all symbols");
testParse("Identifier symbols Identifier");
testParse("s.A");
testParse("(s.A) Variable-quoted");
testParse("<Func-name a b (c)>");
testParse("<Prout hi>");
testParse("(Prout hi)");
testParse("(<Prout hi>)");
testParse("<If T Then (<Prout hi>) Else (<Prout sorry>)>");
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
testAllMatches();
qDebug() << "";
testAllParses();
qDebug() << "";
return testResults();
}