From 864f07d438308dfec322bf83ad29e2d6154083c2 Mon Sep 17 00:00:00 2001 From: Roberto Raggi <qtc-committer@nokia.com> Date: Mon, 22 Dec 2008 10:46:15 +0100 Subject: [PATCH] Initial work on the test suite for the C++ front-end semantic pass. --- tests/auto/cplusplus/semantic/semantic.pro | 5 + .../auto/cplusplus/semantic/tst_semantic.cpp | 96 +++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 tests/auto/cplusplus/semantic/semantic.pro create mode 100644 tests/auto/cplusplus/semantic/tst_semantic.cpp diff --git a/tests/auto/cplusplus/semantic/semantic.pro b/tests/auto/cplusplus/semantic/semantic.pro new file mode 100644 index 00000000000..71a8b5fab5f --- /dev/null +++ b/tests/auto/cplusplus/semantic/semantic.pro @@ -0,0 +1,5 @@ +load(qttest_p4) +include(../shared/shared.pri) +QT = core + +SOURCES += tst_semantic.cpp diff --git a/tests/auto/cplusplus/semantic/tst_semantic.cpp b/tests/auto/cplusplus/semantic/tst_semantic.cpp new file mode 100644 index 00000000000..d9200bee4b5 --- /dev/null +++ b/tests/auto/cplusplus/semantic/tst_semantic.cpp @@ -0,0 +1,96 @@ + +#include <QtTest> +#include <QtDebug> + +#include <Control.h> +#include <Parser.h> +#include <AST.h> +#include <Semantic.h> +#include <Scope.h> +#include <Symbols.h> +#include <Names.h> +#include <Literals.h> + +CPLUSPLUS_USE_NAMESPACE + +class tst_Semantic: public QObject +{ + Q_OBJECT + + Control control; + +public: + TranslationUnit *parse(const QByteArray &source, + TranslationUnit::ParseMode mode) + { + StringLiteral *fileId = control.findOrInsertFileName("<stdin>"); + TranslationUnit *unit = new TranslationUnit(&control, fileId); + unit->setSource(source.constData(), source.length()); + unit->parse(mode); + return unit; + } + + class Document { + Q_DISABLE_COPY(Document) + + public: + Document(TranslationUnit *unit) + : unit(unit), globals(new Scope()) + { } + + ~Document() + { delete globals; } + + void check() + { + QVERIFY(unit); + QVERIFY(unit->ast()); + Semantic sem(unit->control()); + TranslationUnitAST *ast = unit->ast()->asTranslationUnit(); + QVERIFY(ast); + for (DeclarationAST *decl = ast->declarations; decl; decl = decl->next) { + sem.check(decl, globals); + } + } + + TranslationUnit *unit; + Scope *globals; + }; + + QSharedPointer<Document> document(const QByteArray &source) + { + TranslationUnit *unit = parse(source, TranslationUnit::ParseTranlationUnit); + QSharedPointer<Document> doc(new Document(unit)); + doc->check(); + return doc; + } + +private slots: + void function_declarations(); +}; + +void tst_Semantic::function_declarations() +{ + QSharedPointer<Document> doc = document("void foo();"); + QCOMPARE(doc->globals->symbolCount(), 1U); + + Declaration *decl = doc->globals->symbolAt(0)->asDeclaration(); + QVERIFY(decl); + + FullySpecifiedType declTy = decl->type(); + Function *funTy = declTy->asFunction(); + QVERIFY(funTy); + QVERIFY(funTy->returnType()->isVoidType()); + QCOMPARE(funTy->argumentCount(), 0U); + + QVERIFY(decl->name()->isNameId()); + Identifier *funId = decl->name()->asNameId()->identifier(); + QVERIFY(funId); + + const QByteArray foo(funId->chars(), funId->size()); + QCOMPARE(foo, QByteArray("foo")); +} + + +QTEST_APPLESS_MAIN(tst_Semantic) +#include "tst_semantic.moc" -- GitLab