From 616227963009ca1af868f735b16793119b7395ab Mon Sep 17 00:00:00 2001 From: Erik Verbruggen <erik.verbruggen@nokia.com> Date: Wed, 10 Feb 2010 23:15:16 +0100 Subject: [PATCH] Added test for selector names. --- .../auto/cplusplus/semantic/tst_semantic.cpp | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/tests/auto/cplusplus/semantic/tst_semantic.cpp b/tests/auto/cplusplus/semantic/tst_semantic.cpp index 4b4c22709df..2f6bcf47433 100644 --- a/tests/auto/cplusplus/semantic/tst_semantic.cpp +++ b/tests/auto/cplusplus/semantic/tst_semantic.cpp @@ -7,6 +7,7 @@ #include <Control.h> #include <Parser.h> #include <AST.h> +#include <ASTVisitor.h> #include <Semantic.h> #include <Scope.h> #include <Symbols.h> @@ -17,6 +18,7 @@ #include <GenTemplateInstance.h> #include <Overview.h> #include <ExpressionUnderCursor.h> +#include <Names.h> using namespace CPlusPlus; @@ -130,6 +132,8 @@ private slots: void bracketed_expression_under_cursor_8(); void objcClass_1(); + void objcSelector_1(); + void objcSelector_2(); void q_enum_1(); }; @@ -625,6 +629,82 @@ void tst_Semantic::objcClass_1() QVERIFY(!deallocMethod->isStatic()); } +void tst_Semantic::objcSelector_1() +{ + QSharedPointer<Document> doc = document("\n" + "@interface A {}\n" + "-(void)a:(int)a b:(int)b c:(int)c;\n" + "@end\n", + true); + + QCOMPARE(doc->errorCount, 0U); + QCOMPARE(doc->globals->symbolCount(), 1U); + + ObjCClass *iface = doc->globals->symbolAt(0)->asObjCClass(); + QVERIFY(iface); + QVERIFY(iface->isInterface()); + QCOMPARE(iface->memberCount(), 1U); + + Declaration *decl = iface->memberAt(0)->asDeclaration(); + QVERIFY(decl); + QVERIFY(decl->name()); + const SelectorNameId *selId = decl->name()->asSelectorNameId(); + QVERIFY(selId); + QCOMPARE(selId->nameCount(), 3U); + QCOMPARE(selId->nameAt(0)->identifier()->chars(), "a"); + QCOMPARE(selId->nameAt(1)->identifier()->chars(), "b"); + QCOMPARE(selId->nameAt(2)->identifier()->chars(), "c"); +} + +class CollectSelectors: public ASTVisitor +{ +public: + CollectSelectors(TranslationUnit *xUnit): ASTVisitor(xUnit) {} + + QList<ObjCSelectorAST *> operator()() { + selectors.clear(); + accept(translationUnit()->ast()); + return selectors; + } + + virtual bool visit(ObjCSelectorWithArgumentsAST *ast) {selectors.append(ast); return false;} + virtual bool visit(ObjCSelectorWithoutArgumentsAST *ast) {selectors.append(ast); return false;} + +private: + QList<ObjCSelectorAST *> selectors; +}; + +void tst_Semantic::objcSelector_2() +{ + QSharedPointer<Document> doc = document("\n" + "@implementation A {}\n" + "-(SEL)x {\n" + " return @selector(a:b:c:);\n" + "}\n" + "@end\n", + true); + + QCOMPARE(doc->errorCount, 0U); + QCOMPARE(doc->globals->symbolCount(), 1U); + + ObjCClass *iface = doc->globals->symbolAt(0)->asObjCClass(); + QVERIFY(iface); + QCOMPARE(iface->memberCount(), 1U); + + QList<ObjCSelectorAST*>selectors = CollectSelectors(doc->unit)(); + QCOMPARE(selectors.size(), 2); + + ObjCSelectorWithArgumentsAST *sel = selectors.at(1)->asObjCSelectorWithArguments(); + QVERIFY(sel); + + const SelectorNameId *selId = sel->selector_name->asSelectorNameId(); + QVERIFY(selId); + QCOMPARE(selId->nameCount(), 3U); + QCOMPARE(selId->nameAt(0)->identifier()->chars(), "a"); + QCOMPARE(selId->nameAt(1)->identifier()->chars(), "b"); + QCOMPARE(selId->nameAt(2)->identifier()->chars(), "c"); +} + void tst_Semantic::q_enum_1() { QSharedPointer<Document> doc = document("\n" -- GitLab