Alien-SmokeQt
view release on metacpan or search on metacpan
generator/parser/tests/test_generator.cpp view on Meta::CPAN
#include <QtTest/QtTest>
#include "ast.h"
#include "parser.h"
#include "rpp/preprocessor.h"
#include "control.h"
#include "dumptree.h"
#include "tokens.h"
#include "parsesession.h"
#include "commentformatter.h"
#include "codegenerator.h"
#include "testconfig.h"
#include <QByteArray>
#include <QDataStream>
#include <QFile>
#include <iostream>
#include <rpp/chartools.h>
#include <rpp/pp-engine.h>
bool operator==(const Token& t1, const Token& t2)
{
return t1.kind == t2.kind && t1.symbolString() == t2.symbolString();
}
namespace QTest {
template<>
char* toString(const Token& t)
{
return qstrdup(QString("%1 [ %2 ]").arg(token_name(t.kind)).arg(t.symbolString()).toUtf8());
}
}
class TestGenerator : public QObject
{
Q_OBJECT
Control control;
DumpTree dumper;
public:
TestGenerator()
{
}
enum ParseFlag {
FlagNone = 0,
DumpAST = 1,
PrintCode = 2,
FlagAll = 3
};
Q_DECLARE_FLAGS(ParseFlags, ParseFlag)
void parse(const QByteArray& unit, ParseFlags flags = static_cast<ParseFlags>(FlagNone))
{
TranslationUnitAST* ast = parseOriginal(unit);
if (flags & DumpAST)
dumper.dump(ast, lastSession->token_stream);
CodeGenerator cg(lastSession);
cg.visit(ast);
if (flags & PrintCode) {
qDebug() << unit;
qDebug() << cg.output();
}
parseGenerated( cg.output().toUtf8() );
compareTokenStreams();
}
private slots:
void initTestCase()
{
}
void testIf()
{
parse(QByteArray("void test() { if (i == 0) { foo(); } else { foo2(); } }"));
}
void testFor()
{
QByteArray method("void test() { for (int i = 0; i < 4; ++i) { break; } for (j; j < 4; ) {return;} }");
parse(method);
}
void testDo()
{
QByteArray method("void test() { do { foo(); } while (i < 0); }");
parse(method);
}
void testWhile()
{
QByteArray method("void test() { while (i & 3) { foo(); } }");
parse(method);
}
void testSwitch()
{
QByteArray method("void test() { switch (i) { case 1: break; case 2: return; default: goto foo; } foo: return; }");
parse(method);
}
void testClass()
{
QByteArray method("struct A : public B, virtual private C { int i; A() : i(5) { } virtual void test() = 0; };");
parse(method);
}
void testTemplateClass()
{
QByteArray method("template <typename B> struct A : private C { B i; A() : i(5) { } virtual void test() = 0; };");
parse(method);
}
void testMethod()
{
QByteArray method("int A::test(int primitive, B* pointer) { return primitive; }");
parse(method);
}
( run in 1.383 second using v1.01-cache-2.11-cpan-d7f47b0818f )