Initial import from the monolithic Qt.
[profile/ivi/qtdeclarative.git] / tests / auto / declarative / parserstress / tst_parserstress.cpp
1 /****************************************************************************
2 **
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
6 **
7 ** This file is part of the test suite of the Qt Toolkit.
8 **
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** No Commercial Usage
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
14 ** this package.
15 **
16 ** GNU Lesser General Public License Usage
17 ** Alternatively, this file may be used under the terms of the GNU Lesser
18 ** General Public License version 2.1 as published by the Free Software
19 ** Foundation and appearing in the file LICENSE.LGPL included in the
20 ** packaging of this file.  Please review the following information to
21 ** ensure the GNU Lesser General Public License version 2.1 requirements
22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23 **
24 ** In addition, as a special exception, Nokia gives you certain additional
25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27 **
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at qt-info@nokia.com.
30 **
31 **
32 **
33 **
34 **
35 **
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #include <qtest.h>
43 #include <QDeclarativeEngine>
44 #include <QDeclarativeComponent>
45 #include <QDebug>
46 #include <QDir>
47 #include <QFile>
48
49 #ifdef Q_OS_SYMBIAN
50 // In Symbian OS test data is located in applications private dir
51 #define SRCDIR "."
52 #endif
53
54 class tst_parserstress : public QObject
55 {
56     Q_OBJECT
57 public:
58     tst_parserstress() {}
59
60 private slots:
61     void ecmascript_data();
62     void ecmascript();
63
64 private:
65     static QStringList findJSFiles(const QDir &);
66     QDeclarativeEngine engine;
67 };
68
69 QStringList tst_parserstress::findJSFiles(const QDir &d)
70 {
71     QStringList rv;
72
73     QStringList files = d.entryList(QStringList() << QLatin1String("*.js"),
74                                     QDir::Files);
75     foreach (const QString &file, files) {
76         if (file == "browser.js")
77             continue;
78         rv << d.absoluteFilePath(file);
79     }
80
81     QStringList dirs = d.entryList(QDir::Dirs | QDir::NoDotAndDotDot |
82                                    QDir::NoSymLinks);
83     foreach (const QString &dir, dirs) {
84         QDir sub = d;
85         sub.cd(dir);
86         rv << findJSFiles(sub);
87     }
88
89     return rv;
90 }
91
92 void tst_parserstress::ecmascript_data()
93 {
94 #ifdef Q_OS_SYMBIAN    
95     QDir dir("tests");
96 #else
97     QDir dir(SRCDIR);
98     dir.cdUp();
99     dir.cdUp();
100     dir.cd("qscriptjstestsuite");
101     dir.cd("tests");
102 #endif
103     QStringList files = findJSFiles(dir);
104
105     QTest::addColumn<QString>("file");
106     foreach (const QString &file, files) {
107         QTest::newRow(qPrintable(file)) << file;
108     }
109 }
110
111 void tst_parserstress::ecmascript()
112 {
113     QFETCH(QString, file);
114
115     QFile f(file);
116     QVERIFY(f.open(QIODevice::ReadOnly));
117
118     QByteArray data = f.readAll();
119
120     QVERIFY(!data.isEmpty());
121
122     QString dataStr = QString::fromUtf8(data);
123
124     QString qml = "import QtQuick 1.0\n";
125             qml+= "\n";
126             qml+= "QtObject {\n";
127             qml+= "    property int test\n";
128             qml+= "    test: {\n";
129             qml+= dataStr + "\n";
130             qml+= "        return 1;\n";
131             qml+= "    }\n";
132             qml+= "    function stress() {\n";
133             qml+= dataStr;
134             qml+= "    }\n";
135             qml+= "}\n";
136
137     QByteArray qmlData = qml.toUtf8();
138
139     QDeclarativeComponent component(&engine);
140     
141     component.setData(qmlData, QUrl::fromLocalFile(SRCDIR + QString("/dummy.qml")));
142
143     QFileInfo info(file);
144
145     if (info.fileName() == QLatin1String("regress-352044-02-n.js")) {
146         QVERIFY(component.isError());
147
148         QCOMPARE(component.errors().length(), 2);
149
150         QCOMPARE(component.errors().at(0).description(), QString("Expected token `;'"));
151         QCOMPARE(component.errors().at(0).line(), 66);
152
153         QCOMPARE(component.errors().at(1).description(), QString("Expected token `;'"));
154         QCOMPARE(component.errors().at(1).line(), 142);
155
156     } else {
157
158         QVERIFY(!component.isError());
159     }
160 }
161
162
163 QTEST_MAIN(tst_parserstress)
164
165 #include "tst_parserstress.moc"