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