summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Raggi <qtc-committer@nokia.com>2008-12-22 10:46:15 +0100
committerRoberto Raggi <qtc-committer@nokia.com>2008-12-22 10:46:15 +0100
commit864f07d438308dfec322bf83ad29e2d6154083c2 (patch)
tree6e26384d28be394ab07109b5522341e50e422377
parent286e45b473e79a8dd361aea385902e7a3aa4dbb6 (diff)
downloadqt-creator-864f07d438308dfec322bf83ad29e2d6154083c2.tar.gz
Initial work on the test suite for the C++ front-end semantic pass.
-rw-r--r--tests/auto/cplusplus/semantic/semantic.pro5
-rw-r--r--tests/auto/cplusplus/semantic/tst_semantic.cpp96
2 files changed, 101 insertions, 0 deletions
diff --git a/tests/auto/cplusplus/semantic/semantic.pro b/tests/auto/cplusplus/semantic/semantic.pro
new file mode 100644
index 0000000000..71a8b5fab5
--- /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 0000000000..d9200bee4b
--- /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"