aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/language
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@digia.com>2012-11-15 14:34:52 +0100
committerChristian Kandeler <christian.kandeler@digia.com>2012-11-15 17:19:55 +0100
commit16665154b5372034bb432ca0873b865e4c94e5b8 (patch)
tree51e1a7a5e018f77a6931d4d49062f727171bea56 /tests/auto/language
parent24015ab1a424c78c49d9be080ad5728834ee1b64 (diff)
Loader: search for identifiers by traversing the AST
Replace the naive sourceCode.contains(...) calls with a proper AST traversal when looking for the use of "base" or "outer" identifiers. Introduced the class IdentifierSearch. Change-Id: I5892002ed061b8bb3ff724470c6ab1f09ddb8018 Reviewed-by: Christian Kandeler <christian.kandeler@digia.com>
Diffstat (limited to 'tests/auto/language')
-rw-r--r--tests/auto/language/tst_language.cpp65
-rw-r--r--tests/auto/language/tst_language.h2
2 files changed, 67 insertions, 0 deletions
diff --git a/tests/auto/language/tst_language.cpp b/tests/auto/language/tst_language.cpp
index 3479c8d0f..11572c50b 100644
--- a/tests/auto/language/tst_language.cpp
+++ b/tests/auto/language/tst_language.cpp
@@ -29,7 +29,10 @@
#include "tst_language.h"
+#include <language/identifiersearch.h>
#include <language/scriptengine.h>
+#include <parser/qmljslexer_p.h>
+#include <parser/qmljsparser_p.h>
#include <tools/error.h>
QHash<QString, ResolvedProduct::Ptr> TestLanguage::productsFromProject(ResolvedProject::Ptr project)
@@ -184,6 +187,68 @@ void TestLanguage::groupName()
QCOMPARE(exceptionCaught, false);
}
+void TestLanguage::identifierSearch_data()
+{
+ QTest::addColumn<bool>("expectedHasNarf");
+ QTest::addColumn<bool>("expectedHasZort");
+ QTest::addColumn<QString>("sourceCode");
+ QTest::newRow("no narf, no zort") << false << false << QString(
+ "Product {\n"
+ " name: {\n"
+ " var foo = 'bar';\n"
+ " print(foo);\n"
+ " return foo;\n"
+ " }\n"
+ "}\n");
+ QTest::newRow("narf, no zort") << true << false << QString(
+ "Product {\n"
+ " name: {\n"
+ " var foo = 'zort';\n"
+ " print(narf + foo);\n"
+ " return foo;\n"
+ " }\n"
+ "}\n");
+ QTest::newRow("no narf, zort") << false << true << QString(
+ "Product {\n"
+ " name: {\n"
+ " var foo = 'narf';\n"
+ " print(zort + foo);\n"
+ " return foo;\n"
+ " }\n"
+ "}\n");
+ QTest::newRow("narf, zort") << true << true << QString(
+ "Product {\n"
+ " name: {\n"
+ " var foo = narf;\n"
+ " foo = foo + zort;\n"
+ " return foo;\n"
+ " }\n"
+ "}\n");
+}
+
+void TestLanguage::identifierSearch()
+{
+ QFETCH(bool, expectedHasNarf);
+ QFETCH(bool, expectedHasZort);
+ QFETCH(QString, sourceCode);
+
+ bool hasNarf = !expectedHasNarf;
+ bool hasZort = !expectedHasZort;
+ IdentifierSearch isearch;
+ isearch.add("narf", &hasNarf);
+ isearch.add("zort", &hasZort);
+
+ QmlJS::Engine engine;
+ QmlJS::Lexer lexer(&engine);
+ lexer.setCode(sourceCode, 1);
+ QmlJS::Parser parser(&engine);
+ QVERIFY(parser.parse());
+ QVERIFY(parser.ast());
+ isearch.start(parser.ast());
+ QCOMPARE(hasNarf, expectedHasNarf);
+ QCOMPARE(hasZort, expectedHasZort);
+}
+
void TestLanguage::jsImportUsedInMultipleScopes_data()
{
QTest::addColumn<QString>("buildVariant");
diff --git a/tests/auto/language/tst_language.h b/tests/auto/language/tst_language.h
index 5b728e25d..637030dcc 100644
--- a/tests/auto/language/tst_language.h
+++ b/tests/auto/language/tst_language.h
@@ -54,6 +54,8 @@ private slots:
void cleanupTestCase();
void conditionalDepends();
void groupName();
+ void identifierSearch_data();
+ void identifierSearch();
void jsImportUsedInMultipleScopes_data();
void jsImportUsedInMultipleScopes();
void productConditions();