1/*
2    Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
3
4    This library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Library General Public
6    License as published by the Free Software Foundation; either
7    version 2 of the License, or (at your option) any later version.
8
9    This library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Library General Public License for more details.
13
14    You should have received a copy of the GNU Library General Public License
15    along with this library; see the file COPYING.LIB.  If not, write to
16    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17    Boston, MA 02110-1301, USA.
18*/
19
20#include "qscriptengine.h"
21#include "qscriptstring.h"
22#include "qscriptvalue.h"
23#include <qtest.h>
24
25Q_DECLARE_METATYPE(QScriptValue);
26
27class tst_QScriptValue : public QObject {
28    Q_OBJECT
29
30public:
31    tst_QScriptValue()
32        : m_engine(0)
33    {}
34
35    ~tst_QScriptValue()
36    {
37        if (m_engine)
38            delete m_engine;
39    }
40
41private slots:
42    void values_data();
43
44    void ctorBool();
45    void ctorReal();
46    void ctorNumber();
47    void ctorQString();
48    void ctorCString();
49    void ctorSpecial();
50    void ctorQScriptValue();
51
52    void isValid_data();
53    void isValid();
54    void isBool_data();
55    void isBool();
56    void isNumber_data();
57    void isNumber();
58    void isFunction_data();
59    void isFunction();
60    void isNull_data();
61    void isNull();
62    void isString_data();
63    void isString();
64    void isUndefined_data();
65    void isUndefined();
66    void isObject_data();
67    void isObject();
68    void isError_data();
69    void isError();
70
71    void toString_data();
72    void toString();
73    void toNumber_data();
74    void toNumber();
75    void toBool_data();
76    void toBool();
77    void toInteger_data();
78    void toInteger();
79    void toInt32_data();
80    void toInt32();
81    void toUInt32_data();
82    void toUInt32();
83    void toUInt16_data();
84    void toUInt16();
85    void toObject_data();
86    void toObject();
87
88    void equals_data();
89    void equals();
90    void strictlyEquals_data();
91    void strictlyEquals();
92    void instanceOf_data();
93    void instanceOf();
94
95private:
96    QScriptEngine* m_engine;
97};
98
99void tst_QScriptValue::values_data()
100{
101    if (m_engine)
102        delete m_engine;
103    m_engine = new QScriptEngine;
104
105    QTest::addColumn<QScriptValue>("value");
106
107    QTest::newRow("invalid") << QScriptValue();
108
109    QTest::newRow("cbool") << QScriptValue(true);
110    QTest::newRow("cnumber") << QScriptValue(1234);
111    QTest::newRow("cstring") << QScriptValue("abc");
112    QTest::newRow("cnull") << QScriptValue(QScriptValue::NullValue);
113    QTest::newRow("cundefined") << QScriptValue(QScriptValue::UndefinedValue);
114
115    QTest::newRow("jsbool") << m_engine->evaluate("true");
116    QTest::newRow("jsnumber") << m_engine->evaluate("12345");
117    QTest::newRow("jsstring") << m_engine->evaluate("'go'");
118    QTest::newRow("jsfunction") << m_engine->evaluate("(function {})");
119    QTest::newRow("jsnull") << m_engine->nullValue();
120    QTest::newRow("jsundefined") << m_engine->undefinedValue();
121    QTest::newRow("jsobject") << m_engine->newObject();
122    QTest::newRow("jserror") << m_engine->evaluate("new Error()");
123}
124
125void tst_QScriptValue::ctorBool()
126{
127    QBENCHMARK {
128        QScriptValue(true);
129    }
130}
131
132void tst_QScriptValue::ctorReal()
133{
134    QBENCHMARK {
135        QScriptValue(12.3);
136    }
137}
138
139void tst_QScriptValue::ctorNumber()
140{
141    QBENCHMARK {
142        QScriptValue(123);
143    }
144}
145
146void tst_QScriptValue::ctorQString()
147{
148    QString str = QString::fromLatin1("ciao");
149    QBENCHMARK {
150        QScriptValue(str);
151    }
152}
153
154void tst_QScriptValue::ctorCString()
155{
156    QBENCHMARK {
157        QScriptValue("Pong!");
158    }
159}
160
161void tst_QScriptValue::ctorSpecial()
162{
163    QBENCHMARK {
164        (void)QScriptValue(QScriptValue::NullValue);
165    }
166}
167
168void tst_QScriptValue::ctorQScriptValue()
169{
170    QScriptValue tmp(1234);
171    QBENCHMARK {
172        QScriptValue(tmp);
173    }
174}
175
176void tst_QScriptValue::isValid_data()
177{
178    values_data();
179}
180
181void tst_QScriptValue::isValid()
182{
183    QFETCH(QScriptValue, value);
184    QBENCHMARK {
185        value.isValid();
186    }
187}
188
189void tst_QScriptValue::isBool_data()
190{
191    values_data();
192}
193
194void tst_QScriptValue::isBool()
195{
196    QFETCH(QScriptValue, value);
197    QBENCHMARK {
198        value.isBool();
199    }
200}
201
202void tst_QScriptValue::isNumber_data()
203{
204    values_data();
205}
206
207void tst_QScriptValue::isNumber()
208{
209    QFETCH(QScriptValue, value);
210    QBENCHMARK {
211        value.isNumber();
212    }
213}
214
215void tst_QScriptValue::isFunction_data()
216{
217    values_data();
218}
219
220void tst_QScriptValue::isFunction()
221{
222    QFETCH(QScriptValue, value);
223    QBENCHMARK {
224        value.isFunction();
225    }
226}
227
228void tst_QScriptValue::isNull_data()
229{
230    values_data();
231}
232
233void tst_QScriptValue::isNull()
234{
235    QFETCH(QScriptValue, value);
236    QBENCHMARK {
237        value.isNull();
238    }
239}
240
241void tst_QScriptValue::isString_data()
242{
243    values_data();
244}
245
246void tst_QScriptValue::isString()
247{
248    QFETCH(QScriptValue, value);
249    QBENCHMARK {
250        value.isString();
251    }
252}
253
254void tst_QScriptValue::isUndefined_data()
255{
256    values_data();
257}
258
259void tst_QScriptValue::isUndefined()
260{
261    QFETCH(QScriptValue, value);
262    QBENCHMARK {
263        value.isUndefined();
264    }
265}
266
267void tst_QScriptValue::isObject_data()
268{
269    values_data();
270}
271
272void tst_QScriptValue::isObject()
273{
274    QFETCH(QScriptValue, value);
275    QBENCHMARK {
276        value.isObject();
277    }
278}
279
280void tst_QScriptValue::isError_data()
281{
282    values_data();
283}
284
285void tst_QScriptValue::isError()
286{
287    QFETCH(QScriptValue, value);
288    QBENCHMARK {
289        value.isError();
290    }
291}
292
293void tst_QScriptValue::toString_data()
294{
295    values_data();
296}
297
298void tst_QScriptValue::toString()
299{
300    QFETCH(QScriptValue, value);
301    QBENCHMARK {
302        value.toString();
303    }
304}
305
306void tst_QScriptValue::toNumber_data()
307{
308    values_data();
309}
310
311void tst_QScriptValue::toNumber()
312{
313    QFETCH(QScriptValue, value);
314    QBENCHMARK {
315        value.toNumber();
316    }
317}
318
319void tst_QScriptValue::toBool_data()
320{
321    values_data();
322}
323
324void tst_QScriptValue::toBool()
325{
326    QFETCH(QScriptValue, value);
327    QBENCHMARK {
328        value.toBool();
329    }
330}
331
332void tst_QScriptValue::toInteger_data()
333{
334    values_data();
335}
336
337void tst_QScriptValue::toInteger()
338{
339    QFETCH(QScriptValue, value);
340    QBENCHMARK {
341        value.toInteger();
342    }
343}
344
345void tst_QScriptValue::toInt32_data()
346{
347    values_data();
348}
349
350void tst_QScriptValue::toInt32()
351{
352    QFETCH(QScriptValue, value);
353    QBENCHMARK {
354        value.toInt32();
355    }
356}
357
358void tst_QScriptValue::toUInt32_data()
359{
360    values_data();
361}
362
363void tst_QScriptValue::toUInt32()
364{
365    QFETCH(QScriptValue, value);
366    QBENCHMARK {
367        value.toUInt32();
368    }
369}
370
371void tst_QScriptValue::toUInt16_data()
372{
373    values_data();
374}
375
376void tst_QScriptValue::toUInt16()
377{
378    QFETCH(QScriptValue, value);
379    QBENCHMARK {
380        value.toUInt16();
381    }
382}
383
384void tst_QScriptValue::toObject_data()
385{
386    values_data();
387}
388
389void tst_QScriptValue::toObject()
390{
391    QFETCH(QScriptValue, value);
392    QBENCHMARK {
393        value.toObject();
394    }
395}
396
397void tst_QScriptValue::equals_data()
398{
399    values_data();
400}
401
402void tst_QScriptValue::equals()
403{
404    QFETCH(QScriptValue, value);
405    static QScriptValue previous;
406    QBENCHMARK {
407        value.equals(previous);
408    }
409    previous = value;
410}
411
412void tst_QScriptValue::strictlyEquals_data()
413{
414    values_data();
415}
416
417void tst_QScriptValue::strictlyEquals()
418{
419    QFETCH(QScriptValue, value);
420    static QScriptValue previous;
421    QBENCHMARK {
422        value.strictlyEquals(previous);
423    }
424    previous = value;
425}
426
427void tst_QScriptValue::instanceOf_data()
428{
429    values_data();
430}
431
432void tst_QScriptValue::instanceOf()
433{
434    QFETCH(QScriptValue, value);
435    static QScriptValue object = m_engine->newObject();
436    QBENCHMARK {
437        value.instanceOf(object);
438    }
439}
440
441QTEST_MAIN(tst_QScriptValue)
442#include "tst_qscriptvalue.moc"
443