/
tst_qjsvalue.cpp
3671 lines (3208 loc) · 141 KB
1
2
/****************************************************************************
**
3
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4
** Contact: http://www.qt-project.org/
5
6
7
8
9
**
** This file is part of the test suite of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
10
11
12
13
14
15
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this
** file. Please review the following information to ensure the GNU Lesser
** General Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
16
17
**
** In addition, as a special exception, Nokia gives you certain additional
18
** rights. These rights are described in the Nokia Qt LGPL Exception
19
20
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
21
22
23
24
25
26
27
28
29
30
31
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU General
** Public License version 3.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of this
** file. Please review the following information to ensure the GNU General
** Public License version 3.0 requirements will be met:
** http://www.gnu.org/copyleft/gpl.html.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
32
33
34
35
36
**
**
**
**
**
37
**
38
39
40
41
42
** $QT_END_LICENSE$
**
****************************************************************************/
#include "tst_qjsvalue.h"
43
#include <QtWidgets/QPushButton>
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
QT_BEGIN_NAMESPACE
extern bool qt_script_isJITEnabled();
QT_END_NAMESPACE
tst_QJSValue::tst_QJSValue()
: engine(0)
{
}
tst_QJSValue::~tst_QJSValue()
{
if (engine)
delete engine;
}
void tst_QJSValue::ctor_invalid()
{
QJSEngine eng;
{
QJSValue v;
65
QVERIFY(v.isUndefined());
66
67
68
69
70
71
72
73
QCOMPARE(v.engine(), (QJSEngine *)0);
}
}
void tst_QJSValue::ctor_undefinedWithEngine()
{
QJSEngine eng;
{
74
QJSValue v = eng.toScriptValue(QVariant());
75
QVERIFY(v.isUndefined());
76
77
78
79
80
81
82
83
84
QCOMPARE(v.isObject(), false);
QCOMPARE(v.engine(), &eng);
}
}
void tst_QJSValue::ctor_nullWithEngine()
{
QJSEngine eng;
{
85
QJSValue v = eng.evaluate("null");
86
QVERIFY(!v.isUndefined());
87
88
89
90
91
92
93
94
95
96
QCOMPARE(v.isNull(), true);
QCOMPARE(v.isObject(), false);
QCOMPARE(v.engine(), &eng);
}
}
void tst_QJSValue::ctor_boolWithEngine()
{
QJSEngine eng;
{
97
QJSValue v = eng.toScriptValue(false);
98
QVERIFY(!v.isUndefined());
99
QCOMPARE(v.isBool(), true);
100
QCOMPARE(v.isObject(), false);
101
QCOMPARE(v.toBool(), false);
102
103
104
105
106
107
108
109
QCOMPARE(v.engine(), &eng);
}
}
void tst_QJSValue::ctor_intWithEngine()
{
QJSEngine eng;
{
110
QJSValue v = eng.toScriptValue(int(1));
111
QVERIFY(!v.isUndefined());
112
113
114
115
116
117
118
119
120
121
122
123
QCOMPARE(v.isNumber(), true);
QCOMPARE(v.isObject(), false);
QCOMPARE(v.toNumber(), 1.0);
QCOMPARE(v.engine(), &eng);
}
}
void tst_QJSValue::ctor_int()
{
{
QJSValue v(int(0x43211234));
QVERIFY(v.isNumber());
124
QCOMPARE(v.toInt(), 0x43211234);
125
126
127
}
{
QJSValue v(int(1));
128
QVERIFY(!v.isUndefined());
129
130
131
132
133
134
135
136
137
138
139
QCOMPARE(v.isNumber(), true);
QCOMPARE(v.isObject(), false);
QCOMPARE(v.toNumber(), 1.0);
QCOMPARE(v.engine(), (QJSEngine *)0);
}
}
void tst_QJSValue::ctor_uintWithEngine()
{
QJSEngine eng;
{
140
QJSValue v = eng.toScriptValue(uint(1));
141
QVERIFY(!v.isUndefined());
142
143
144
145
146
147
148
149
150
151
152
153
QCOMPARE(v.isNumber(), true);
QCOMPARE(v.isObject(), false);
QCOMPARE(v.toNumber(), 1.0);
QCOMPARE(v.engine(), &eng);
}
}
void tst_QJSValue::ctor_uint()
{
{
QJSValue v(uint(0x43211234));
QVERIFY(v.isNumber());
154
QCOMPARE(v.toUInt(), uint(0x43211234));
155
156
157
}
{
QJSValue v(uint(1));
158
QVERIFY(!v.isUndefined());
159
160
161
162
163
164
165
166
167
168
169
QCOMPARE(v.isNumber(), true);
QCOMPARE(v.isObject(), false);
QCOMPARE(v.toNumber(), 1.0);
QCOMPARE(v.engine(), (QJSEngine *)0);
}
}
void tst_QJSValue::ctor_floatWithEngine()
{
QJSEngine eng;
{
170
QJSValue v = eng.toScriptValue(float(1.0));
171
QVERIFY(!v.isUndefined());
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
QCOMPARE(v.isNumber(), true);
QCOMPARE(v.isObject(), false);
QCOMPARE(v.toNumber(), 1.0);
QCOMPARE(v.engine(), &eng);
}
}
void tst_QJSValue::ctor_float()
{
{
QJSValue v(12345678910.5);
QVERIFY(v.isNumber());
QCOMPARE(v.toNumber(), 12345678910.5);
}
{
QJSValue v(1.0);
188
QVERIFY(!v.isUndefined());
189
190
191
192
193
194
195
196
197
198
199
QCOMPARE(v.isNumber(), true);
QCOMPARE(v.isObject(), false);
QCOMPARE(v.toNumber(), 1.0);
QCOMPARE(v.engine(), (QJSEngine *)0);
}
}
void tst_QJSValue::ctor_stringWithEngine()
{
QJSEngine eng;
{
200
QJSValue v = eng.toScriptValue(QString::fromLatin1("ciao"));
201
QVERIFY(!v.isUndefined());
202
203
204
205
206
207
208
209
210
211
212
QCOMPARE(v.isString(), true);
QCOMPARE(v.isObject(), false);
QCOMPARE(v.toString(), QLatin1String("ciao"));
QCOMPARE(v.engine(), &eng);
}
}
void tst_QJSValue::ctor_string()
{
{
QJSValue v(QString("ciao"));
213
QVERIFY(!v.isUndefined());
214
215
216
217
218
219
220
QCOMPARE(v.isString(), true);
QCOMPARE(v.isObject(), false);
QCOMPARE(v.toString(), QLatin1String("ciao"));
QCOMPARE(v.engine(), (QJSEngine *)0);
}
{
QJSValue v("ciao");
221
QVERIFY(!v.isUndefined());
222
223
224
225
226
227
228
229
230
231
232
233
QCOMPARE(v.isString(), true);
QCOMPARE(v.isObject(), false);
QCOMPARE(v.toString(), QLatin1String("ciao"));
QCOMPARE(v.engine(), (QJSEngine *)0);
}
}
void tst_QJSValue::ctor_copyAndAssignWithEngine()
{
QJSEngine eng;
// copy constructor, operator=
{
234
QJSValue v = eng.toScriptValue(1.0);
235
236
237
238
239
240
241
242
243
QJSValue v2(v);
QCOMPARE(v2.strictlyEquals(v), true);
QCOMPARE(v2.engine(), &eng);
QJSValue v3(v);
QCOMPARE(v3.strictlyEquals(v), true);
QCOMPARE(v3.strictlyEquals(v2), true);
QCOMPARE(v3.engine(), &eng);
244
QJSValue v4 = eng.toScriptValue(2.0);
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
QCOMPARE(v4.strictlyEquals(v), false);
v3 = v4;
QCOMPARE(v3.strictlyEquals(v), false);
QCOMPARE(v3.strictlyEquals(v4), true);
v2 = QJSValue();
QCOMPARE(v2.strictlyEquals(v), false);
QCOMPARE(v.toNumber(), 1.0);
QJSValue v5(v);
QCOMPARE(v5.strictlyEquals(v), true);
v = QJSValue();
QCOMPARE(v5.strictlyEquals(v), false);
QCOMPARE(v5.toNumber(), 1.0);
}
}
void tst_QJSValue::ctor_undefined()
{
QJSValue v(QJSValue::UndefinedValue);
265
QVERIFY(v.isUndefined());
266
267
268
269
270
271
272
QCOMPARE(v.isObject(), false);
QCOMPARE(v.engine(), (QJSEngine *)0);
}
void tst_QJSValue::ctor_null()
{
QJSValue v(QJSValue::NullValue);
273
QVERIFY(!v.isUndefined());
274
275
276
277
278
279
280
281
QCOMPARE(v.isNull(), true);
QCOMPARE(v.isObject(), false);
QCOMPARE(v.engine(), (QJSEngine *)0);
}
void tst_QJSValue::ctor_bool()
{
QJSValue v(false);
282
QVERIFY(!v.isUndefined());
283
QCOMPARE(v.isBool(), true);
284
285
QCOMPARE(v.isBool(), true);
QCOMPARE(v.isObject(), false);
286
QCOMPARE(v.toBool(), false);
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
QCOMPARE(v.engine(), (QJSEngine *)0);
}
void tst_QJSValue::ctor_copyAndAssign()
{
QJSValue v(1.0);
QJSValue v2(v);
QCOMPARE(v2.strictlyEquals(v), true);
QCOMPARE(v2.engine(), (QJSEngine *)0);
QJSValue v3(v);
QCOMPARE(v3.strictlyEquals(v), true);
QCOMPARE(v3.strictlyEquals(v2), true);
QCOMPARE(v3.engine(), (QJSEngine *)0);
QJSValue v4(2.0);
QCOMPARE(v4.strictlyEquals(v), false);
v3 = v4;
QCOMPARE(v3.strictlyEquals(v), false);
QCOMPARE(v3.strictlyEquals(v4), true);
v2 = QJSValue();
QCOMPARE(v2.strictlyEquals(v), false);
QCOMPARE(v.toNumber(), 1.0);
QJSValue v5(v);
QCOMPARE(v5.strictlyEquals(v), true);
v = QJSValue();
QCOMPARE(v5.strictlyEquals(v), false);
QCOMPARE(v5.toNumber(), 1.0);
}
#if 0 // FIXME: No c-style callbacks currently
static QJSValue myFunction(QScriptContext *, QScriptEngine *eng)
{
return eng->undefinedValue();
}
#endif
void tst_QJSValue::toString()
{
QJSEngine eng;
330
QJSValue undefined = eng.toScriptValue(QVariant());
331
332
333
QCOMPARE(undefined.toString(), QString("undefined"));
QCOMPARE(qjsvalue_cast<QString>(undefined), QString());
334
QJSValue null = eng.evaluate("null");
335
336
337
338
QCOMPARE(null.toString(), QString("null"));
QCOMPARE(qjsvalue_cast<QString>(null), QString());
{
339
QJSValue falskt = eng.toScriptValue(false);
340
341
342
QCOMPARE(falskt.toString(), QString("false"));
QCOMPARE(qjsvalue_cast<QString>(falskt), QString("false"));
343
QJSValue sant = eng.toScriptValue(true);
344
345
346
347
QCOMPARE(sant.toString(), QString("true"));
QCOMPARE(qjsvalue_cast<QString>(sant), QString("true"));
}
{
348
QJSValue number = eng.toScriptValue(123);
349
350
351
352
QCOMPARE(number.toString(), QString("123"));
QCOMPARE(qjsvalue_cast<QString>(number), QString("123"));
}
{
353
QJSValue number = eng.toScriptValue(6.37e-8);
354
355
356
QCOMPARE(number.toString(), QString("6.37e-8"));
}
{
357
QJSValue number = eng.toScriptValue(-6.37e-8);
358
359
QCOMPARE(number.toString(), QString("-6.37e-8"));
360
QJSValue str = eng.toScriptValue(QString("ciao"));
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
QCOMPARE(str.toString(), QString("ciao"));
QCOMPARE(qjsvalue_cast<QString>(str), QString("ciao"));
}
QJSValue object = eng.newObject();
QCOMPARE(object.toString(), QString("[object Object]"));
QCOMPARE(qjsvalue_cast<QString>(object), QString("[object Object]"));
// FIXME: No c-style callbacks currently
#if 0
QJSValue fun = eng.newFunction(myFunction);
QCOMPARE(fun.toString().simplified(), QString("function () { [native code] }"));
QCOMPARE(qscriptvalue_cast<QString>(fun).simplified(), QString("function () { [native code] }"));
#endif
// toString() that throws exception
{
QJSValue objectObject = eng.evaluate(
"(function(){"
" o = { };"
" o.toString = function() { throw new Error('toString'); };"
" return o;"
"})()");
QCOMPARE(objectObject.toString(), QLatin1String("Error: toString"));
QVERIFY(eng.hasUncaughtException());
QCOMPARE(eng.uncaughtException().toString(), QLatin1String("Error: toString"));
}
{
eng.clearExceptions();
QJSValue objectObject = eng.evaluate(
"(function(){"
" var f = function() {};"
" f.prototype = Date;"
" return new f;"
"})()");
QVERIFY(!eng.hasUncaughtException());
QVERIFY(objectObject.isObject());
QCOMPARE(objectObject.toString(), QString::fromLatin1("TypeError: Function.prototype.toString is not generic"));
QVERIFY(eng.hasUncaughtException());
eng.clearExceptions();
}
QJSValue inv = QJSValue();
404
QCOMPARE(inv.toString(), QString::fromLatin1("undefined"));
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
// V2 constructors
{
QJSValue falskt = QJSValue(false);
QCOMPARE(falskt.toString(), QString("false"));
QCOMPARE(qjsvalue_cast<QString>(falskt), QString("false"));
QJSValue sant = QJSValue(true);
QCOMPARE(sant.toString(), QString("true"));
QCOMPARE(qjsvalue_cast<QString>(sant), QString("true"));
QJSValue number = QJSValue(123);
QCOMPARE(number.toString(), QString("123"));
QCOMPARE(qjsvalue_cast<QString>(number), QString("123"));
QJSValue number2(int(0x43211234));
QCOMPARE(number2.toString(), QString("1126240820"));
QJSValue str = QJSValue(QString("ciao"));
QCOMPARE(str.toString(), QString("ciao"));
QCOMPARE(qjsvalue_cast<QString>(str), QString("ciao"));
}
// variant should use internal valueOf(), then fall back to QVariant::toString(),
// then fall back to "QVariant(typename)"
430
QJSValue variant = eng.toScriptValue(QPoint(10, 20));
431
432
QVERIFY(variant.isVariant());
QCOMPARE(variant.toString(), QString::fromLatin1("QVariant(QPoint)"));
433
434
variant = eng.toScriptValue(QUrl());
QVERIFY(variant.isVariant());
435
436
437
438
439
440
441
QVERIFY(variant.toString().isEmpty());
}
void tst_QJSValue::toNumber()
{
QJSEngine eng;
442
QJSValue undefined = eng.toScriptValue(QVariant());
443
444
445
QCOMPARE(qIsNaN(undefined.toNumber()), true);
QCOMPARE(qIsNaN(qjsvalue_cast<qreal>(undefined)), true);
446
QJSValue null = eng.evaluate("null");
447
448
449
450
QCOMPARE(null.toNumber(), 0.0);
QCOMPARE(qjsvalue_cast<qreal>(null), 0.0);
{
451
QJSValue falskt = eng.toScriptValue(false);
452
453
454
QCOMPARE(falskt.toNumber(), 0.0);
QCOMPARE(qjsvalue_cast<qreal>(falskt), 0.0);
455
QJSValue sant = eng.toScriptValue(true);
456
457
458
QCOMPARE(sant.toNumber(), 1.0);
QCOMPARE(qjsvalue_cast<qreal>(sant), 1.0);
459
QJSValue number = eng.toScriptValue(123.0);
460
461
462
QCOMPARE(number.toNumber(), 123.0);
QCOMPARE(qjsvalue_cast<qreal>(number), 123.0);
463
QJSValue str = eng.toScriptValue(QString("ciao"));
464
465
466
QCOMPARE(qIsNaN(str.toNumber()), true);
QCOMPARE(qIsNaN(qjsvalue_cast<qreal>(str)), true);
467
QJSValue str2 = eng.toScriptValue(QString("123"));
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
QCOMPARE(str2.toNumber(), 123.0);
QCOMPARE(qjsvalue_cast<qreal>(str2), 123.0);
}
QJSValue object = eng.newObject();
QCOMPARE(qIsNaN(object.toNumber()), true);
QCOMPARE(qIsNaN(qjsvalue_cast<qreal>(object)), true);
// FIXME: No c-style callbacks currently
#if 0
QJSValue fun = eng.newFunction(myFunction);
QCOMPARE(qIsNaN(fun.toNumber()), true);
QCOMPARE(qIsNaN(qscriptvalue_cast<qreal>(fun)), true);
#endif
QJSValue inv = QJSValue();
484
485
QVERIFY(qIsNaN(inv.toNumber()));
QVERIFY(qIsNaN(qjsvalue_cast<qreal>(inv)));
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
// V2 constructors
{
QJSValue falskt = QJSValue(false);
QCOMPARE(falskt.toNumber(), 0.0);
QCOMPARE(qjsvalue_cast<qreal>(falskt), 0.0);
QJSValue sant = QJSValue(true);
QCOMPARE(sant.toNumber(), 1.0);
QCOMPARE(qjsvalue_cast<qreal>(sant), 1.0);
QJSValue number = QJSValue(123.0);
QCOMPARE(number.toNumber(), 123.0);
QCOMPARE(qjsvalue_cast<qreal>(number), 123.0);
QJSValue number2(int(0x43211234));
QCOMPARE(number2.toNumber(), 1126240820.0);
QJSValue str = QJSValue(QString("ciao"));
QCOMPARE(qIsNaN(str.toNumber()), true);
QCOMPARE(qIsNaN(qjsvalue_cast<qreal>(str)), true);
QJSValue str2 = QJSValue(QString("123"));
QCOMPARE(str2.toNumber(), 123.0);
QCOMPARE(qjsvalue_cast<qreal>(str2), 123.0);
}
}
void tst_QJSValue::toBoolean() // deprecated
{
QJSEngine eng;
518
QJSValue undefined = eng.toScriptValue(QVariant());
519
QCOMPARE(undefined.toBool(), false);
520
521
QCOMPARE(qjsvalue_cast<bool>(undefined), false);
522
QJSValue null = eng.evaluate("null");
523
QCOMPARE(null.toBool(), false);
524
525
526
QCOMPARE(qjsvalue_cast<bool>(null), false);
{
527
QJSValue falskt = eng.toScriptValue(false);
528
QCOMPARE(falskt.toBool(), false);
529
530
QCOMPARE(qjsvalue_cast<bool>(falskt), false);
531
QJSValue sant = eng.toScriptValue(true);
532
QCOMPARE(sant.toBool(), true);
533
534
QCOMPARE(qjsvalue_cast<bool>(sant), true);
535
QJSValue number = eng.toScriptValue(0.0);
536
QCOMPARE(number.toBool(), false);
537
538
QCOMPARE(qjsvalue_cast<bool>(number), false);
539
QJSValue number2 = eng.toScriptValue(qSNaN());
540
QCOMPARE(number2.toBool(), false);
541
542
QCOMPARE(qjsvalue_cast<bool>(number2), false);
543
QJSValue number3 = eng.toScriptValue(123.0);
544
QCOMPARE(number3.toBool(), true);
545
546
QCOMPARE(qjsvalue_cast<bool>(number3), true);
547
QJSValue number4 = eng.toScriptValue(-456.0);
548
QCOMPARE(number4.toBool(), true);
549
550
QCOMPARE(qjsvalue_cast<bool>(number4), true);
551
QJSValue str = eng.toScriptValue(QString(""));
552
QCOMPARE(str.toBool(), false);
553
554
QCOMPARE(qjsvalue_cast<bool>(str), false);
555
QJSValue str2 = eng.toScriptValue(QString("123"));
556
QCOMPARE(str2.toBool(), true);
557
558
559
560
QCOMPARE(qjsvalue_cast<bool>(str2), true);
}
QJSValue object = eng.newObject();
561
QCOMPARE(object.toBool(), true);
562
563
564
565
566
567
568
569
570
571
QCOMPARE(qjsvalue_cast<bool>(object), true);
// FIXME: No c-style callbacks currently
#if 0
QJSValue fun = eng.newFunction(myFunction);
QCOMPARE(fun.toBoolean(), true);
QCOMPARE(qscriptvalue_cast<bool>(fun), true);
#endif
QJSValue inv = QJSValue();
572
QCOMPARE(inv.toBool(), false);
573
574
575
576
577
QCOMPARE(qjsvalue_cast<bool>(inv), false);
// V2 constructors
{
QJSValue falskt = QJSValue(false);
578
QCOMPARE(falskt.toBool(), false);
579
580
581
QCOMPARE(qjsvalue_cast<bool>(falskt), false);
QJSValue sant = QJSValue(true);
582
QCOMPARE(sant.toBool(), true);
583
584
585
QCOMPARE(qjsvalue_cast<bool>(sant), true);
QJSValue number = QJSValue(0.0);
586
QCOMPARE(number.toBool(), false);
587
588
589
QCOMPARE(qjsvalue_cast<bool>(number), false);
QJSValue number2 = QJSValue(qSNaN());
590
QCOMPARE(number2.toBool(), false);
591
592
593
QCOMPARE(qjsvalue_cast<bool>(number2), false);
QJSValue number3 = QJSValue(123.0);
594
QCOMPARE(number3.toBool(), true);
595
596
597
QCOMPARE(qjsvalue_cast<bool>(number3), true);
QJSValue number4 = QJSValue(-456.0);
598
QCOMPARE(number4.toBool(), true);
599
600
601
QCOMPARE(qjsvalue_cast<bool>(number4), true);
QJSValue number5 = QJSValue(0x43211234);
602
QCOMPARE(number5.toBool(), true);
603
604
QJSValue str = QJSValue(QString(""));
605
QCOMPARE(str.toBool(), false);
606
607
608
QCOMPARE(qjsvalue_cast<bool>(str), false);
QJSValue str2 = QJSValue(QString("123"));
609
QCOMPARE(str2.toBool(), true);
610
611
612
613
614
615
616
617
QCOMPARE(qjsvalue_cast<bool>(str2), true);
}
}
void tst_QJSValue::toBool()
{
QJSEngine eng;
618
QJSValue undefined = eng.toScriptValue(QVariant());
619
620
621
QCOMPARE(undefined.toBool(), false);
QCOMPARE(qjsvalue_cast<bool>(undefined), false);
622
QJSValue null = eng.evaluate("null");
623
624
625
626
QCOMPARE(null.toBool(), false);
QCOMPARE(qjsvalue_cast<bool>(null), false);
{
627
QJSValue falskt = eng.toScriptValue(false);
628
629
630
QCOMPARE(falskt.toBool(), false);
QCOMPARE(qjsvalue_cast<bool>(falskt), false);
631
QJSValue sant = eng.toScriptValue(true);
632
633
634
QCOMPARE(sant.toBool(), true);
QCOMPARE(qjsvalue_cast<bool>(sant), true);
635
QJSValue number = eng.toScriptValue(0.0);
636
637
638
QCOMPARE(number.toBool(), false);
QCOMPARE(qjsvalue_cast<bool>(number), false);
639
QJSValue number2 = eng.toScriptValue(qSNaN());
640
641
642
QCOMPARE(number2.toBool(), false);
QCOMPARE(qjsvalue_cast<bool>(number2), false);
643
QJSValue number3 = eng.toScriptValue(123.0);
644
645
646
QCOMPARE(number3.toBool(), true);
QCOMPARE(qjsvalue_cast<bool>(number3), true);
647
QJSValue number4 = eng.toScriptValue(-456.0);
648
649
650
QCOMPARE(number4.toBool(), true);
QCOMPARE(qjsvalue_cast<bool>(number4), true);
651
QJSValue str = eng.toScriptValue(QString(""));
652
653
654
QCOMPARE(str.toBool(), false);
QCOMPARE(qjsvalue_cast<bool>(str), false);
655
QJSValue str2 = eng.toScriptValue(QString("123"));
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
QCOMPARE(str2.toBool(), true);
QCOMPARE(qjsvalue_cast<bool>(str2), true);
}
QJSValue object = eng.newObject();
QCOMPARE(object.toBool(), true);
QCOMPARE(qjsvalue_cast<bool>(object), true);
// FIXME: No c-style callbacks currently
#if 0
QJSValue fun = eng.newFunction(myFunction);
QCOMPARE(fun.toBool(), true);
QCOMPARE(qscriptvalue_cast<bool>(fun), true);
#endif
QJSValue inv = QJSValue();
QCOMPARE(inv.toBool(), false);
QCOMPARE(qjsvalue_cast<bool>(inv), false);
// V2 constructors
{
QJSValue falskt = QJSValue(false);
QCOMPARE(falskt.toBool(), false);
QCOMPARE(qjsvalue_cast<bool>(falskt), false);
QJSValue sant = QJSValue(true);
QCOMPARE(sant.toBool(), true);
QCOMPARE(qjsvalue_cast<bool>(sant), true);
QJSValue number = QJSValue(0.0);
QCOMPARE(number.toBool(), false);
QCOMPARE(qjsvalue_cast<bool>(number), false);
QJSValue number2 = QJSValue(qSNaN());
QCOMPARE(number2.toBool(), false);
QCOMPARE(qjsvalue_cast<bool>(number2), false);
QJSValue number3 = QJSValue(123.0);
QCOMPARE(number3.toBool(), true);
QCOMPARE(qjsvalue_cast<bool>(number3), true);
QJSValue number4 = QJSValue(-456.0);
QCOMPARE(number4.toBool(), true);
QCOMPARE(qjsvalue_cast<bool>(number4), true);
QJSValue number5 = QJSValue(0x43211234);
QCOMPARE(number5.toBool(), true);
QJSValue str = QJSValue(QString(""));
QCOMPARE(str.toBool(), false);
QCOMPARE(qjsvalue_cast<bool>(str), false);
QJSValue str2 = QJSValue(QString("123"));
QCOMPARE(str2.toBool(), true);
QCOMPARE(qjsvalue_cast<bool>(str2), true);
}
}
714
void tst_QJSValue::toInt()
715
716
717
718
{
QJSEngine eng;
{
719
QJSValue zer0 = eng.toScriptValue(0.0);
720
QCOMPARE(zer0.toInt(), 0);
721
722
QCOMPARE(qjsvalue_cast<qint32>(zer0), 0);
723
QJSValue number = eng.toScriptValue(123.0);
724
QCOMPARE(number.toInt(), 123);
725
726
QCOMPARE(qjsvalue_cast<qint32>(number), 123);
727
QJSValue number2 = eng.toScriptValue(qSNaN());
728
QCOMPARE(number2.toInt(), 0);
729
730
QCOMPARE(qjsvalue_cast<qint32>(number2), 0);
731
QJSValue number3 = eng.toScriptValue(+qInf());
732
QCOMPARE(number3.toInt(), 0);
733
734
QCOMPARE(qjsvalue_cast<qint32>(number3), 0);
735
QJSValue number3_2 = eng.toScriptValue(-qInf());
736
QCOMPARE(number3_2.toInt(), 0);
737
738
QCOMPARE(qjsvalue_cast<qint32>(number3_2), 0);
739
QJSValue number4 = eng.toScriptValue(0.5);
740
QCOMPARE(number4.toInt(), 0);
741
742
QCOMPARE(qjsvalue_cast<qint32>(number4), 0);
743
QJSValue number5 = eng.toScriptValue(123.5);
744
QCOMPARE(number5.toInt(), 123);
745
746
QCOMPARE(qjsvalue_cast<qint32>(number5), 123);
747
QJSValue number6 = eng.toScriptValue(-456.5);
748
QCOMPARE(number6.toInt(), -456);
749
750
QCOMPARE(qjsvalue_cast<qint32>(number6), -456);
751
QJSValue str = eng.toScriptValue(QString::fromLatin1("123.0"));
752
QCOMPARE(str.toInt(), 123);
753
754
QCOMPARE(qjsvalue_cast<qint32>(str), 123);
755
QJSValue str2 = eng.toScriptValue(QString::fromLatin1("NaN"));
756
QCOMPARE(str2.toInt(), 0);
757
758
QCOMPARE(qjsvalue_cast<qint32>(str2), 0);
759
QJSValue str3 = eng.toScriptValue(QString::fromLatin1("Infinity"));
760
QCOMPARE(str3.toInt(), 0);
761
762
QCOMPARE(qjsvalue_cast<qint32>(str3), 0);
763
QJSValue str3_2 = eng.toScriptValue(QString::fromLatin1("-Infinity"));
764
QCOMPARE(str3_2.toInt(), 0);
765
766
QCOMPARE(qjsvalue_cast<qint32>(str3_2), 0);
767
QJSValue str4 = eng.toScriptValue(QString::fromLatin1("0.5"));
768
QCOMPARE(str4.toInt(), 0);
769
770
QCOMPARE(qjsvalue_cast<qint32>(str4), 0);
771
QJSValue str5 = eng.toScriptValue(QString::fromLatin1("123.5"));
772
QCOMPARE(str5.toInt(), 123);
773
774
QCOMPARE(qjsvalue_cast<qint32>(str5), 123);
775
QJSValue str6 = eng.toScriptValue(QString::fromLatin1("-456.5"));
776
QCOMPARE(str6.toInt(), -456);
777
778
779
780
781
QCOMPARE(qjsvalue_cast<qint32>(str6), -456);
}
// V2 constructors
{
QJSValue zer0 = QJSValue(0.0);
782
QCOMPARE(zer0.toInt(), 0);
783
784
785
QCOMPARE(qjsvalue_cast<qint32>(zer0), 0);
QJSValue number = QJSValue(123.0);
786
QCOMPARE(number.toInt(), 123);
787
788
789
QCOMPARE(qjsvalue_cast<qint32>(number), 123);
QJSValue number2 = QJSValue(qSNaN());
790
QCOMPARE(number2.toInt(), 0);
791
792
793
QCOMPARE(qjsvalue_cast<qint32>(number2), 0);
QJSValue number3 = QJSValue(+qInf());
794
QCOMPARE(number3.toInt(), 0);
795
796
797
QCOMPARE(qjsvalue_cast<qint32>(number3), 0);
QJSValue number3_2 = QJSValue(-qInf());
798
QCOMPARE(number3_2.toInt(), 0);
799
800
801
QCOMPARE(qjsvalue_cast<qint32>(number3_2), 0);
QJSValue number4 = QJSValue(0.5);
802
QCOMPARE(number4.toInt(), 0);
803
804
805
QCOMPARE(qjsvalue_cast<qint32>(number4), 0);
QJSValue number5 = QJSValue(123.5);
806
QCOMPARE(number5.toInt(), 123);
807
808
809
QCOMPARE(qjsvalue_cast<qint32>(number5), 123);
QJSValue number6 = QJSValue(-456.5);
810
QCOMPARE(number6.toInt(), -456);
811
812
813
QCOMPARE(qjsvalue_cast<qint32>(number6), -456);
QJSValue number7 = QJSValue(0x43211234);
814
QCOMPARE(number7.toInt(), 0x43211234);
815
816
QJSValue str = QJSValue("123.0");
817
QCOMPARE(str.toInt(), 123);
818
819
820
QCOMPARE(qjsvalue_cast<qint32>(str), 123);
QJSValue str2 = QJSValue("NaN");
821
QCOMPARE(str2.toInt(), 0);
822
823
824
QCOMPARE(qjsvalue_cast<qint32>(str2), 0);
QJSValue str3 = QJSValue("Infinity");
825
QCOMPARE(str3.toInt(), 0);
826
827
828
QCOMPARE(qjsvalue_cast<qint32>(str3), 0);
QJSValue str3_2 = QJSValue("-Infinity");
829
QCOMPARE(str3_2.toInt(), 0);
830
831
832
QCOMPARE(qjsvalue_cast<qint32>(str3_2), 0);
QJSValue str4 = QJSValue("0.5");
833
QCOMPARE(str4.toInt(), 0);
834
835
836
QCOMPARE(qjsvalue_cast<qint32>(str4), 0);
QJSValue str5 = QJSValue("123.5");
837
QCOMPARE(str5.toInt(), 123);
838
839
840
QCOMPARE(qjsvalue_cast<qint32>(str5), 123);
QJSValue str6 = QJSValue("-456.5");
841
QCOMPARE(str6.toInt(), -456);
842
843
844
845
QCOMPARE(qjsvalue_cast<qint32>(str6), -456);
}
QJSValue inv;
846
QCOMPARE(inv.toInt(), 0);
847
848
849
QCOMPARE(qjsvalue_cast<qint32>(inv), 0);
}
850
void tst_QJSValue::toUInt()
851
852
853
854
{
QJSEngine eng;
{
855
856
QJSValue zer0 = eng.toScriptValue(0.0);
QCOMPARE(zer0.toUInt(), quint32(0));
857
858
QCOMPARE(qjsvalue_cast<quint32>(zer0), quint32(0));
859
860
QJSValue number = eng.toScriptValue(123.0);
QCOMPARE(number.toUInt(), quint32(123));
861
862
QCOMPARE(qjsvalue_cast<quint32>(number), quint32(123));
863
864
QJSValue number2 = eng.toScriptValue(qSNaN());
QCOMPARE(number2.toUInt(), quint32(0));
865
866
QCOMPARE(qjsvalue_cast<quint32>(number2), quint32(0));
867
868
QJSValue number3 = eng.toScriptValue(+qInf());
QCOMPARE(number3.toUInt(), quint32(0));
869
870
QCOMPARE(qjsvalue_cast<quint32>(number3), quint32(0));
871
872
QJSValue number3_2 = eng.toScriptValue(-qInf());
QCOMPARE(number3_2.toUInt(), quint32(0));
873
874
QCOMPARE(qjsvalue_cast<quint32>(number3_2), quint32(0));
875
876
QJSValue number4 = eng.toScriptValue(0.5);
QCOMPARE(number4.toUInt(), quint32(0));
877
878
879
QJSValue number5 = eng.toScriptValue(123.5);
QCOMPARE(number5.toUInt(), quint32(123));
880
881
882
QJSValue number6 = eng.toScriptValue(-456.5);
QCOMPARE(number6.toUInt(), quint32(-456));
883
884
QCOMPARE(qjsvalue_cast<quint32>(number6), quint32(-456));
885
886
QJSValue str = eng.toScriptValue(QString::fromLatin1("123.0"));
QCOMPARE(str.toUInt(), quint32(123));
887
888
QCOMPARE(qjsvalue_cast<quint32>(str), quint32(123));
889
890
QJSValue str2 = eng.toScriptValue(QString::fromLatin1("NaN"));
QCOMPARE(str2.toUInt(), quint32(0));
891
892
QCOMPARE(qjsvalue_cast<quint32>(str2), quint32(0));
893
894
QJSValue str3 = eng.toScriptValue(QString::fromLatin1("Infinity"));
QCOMPARE(str3.toUInt(), quint32(0));
895
896
QCOMPARE(qjsvalue_cast<quint32>(str3), quint32(0));
897
898
QJSValue str3_2 = eng.toScriptValue(QString::fromLatin1("-Infinity"));
QCOMPARE(str3_2.toUInt(), quint32(0));
899
900
QCOMPARE(qjsvalue_cast<quint32>(str3_2), quint32(0));
901
902
QJSValue str4 = eng.toScriptValue(QString::fromLatin1("0.5"));
QCOMPARE(str4.toUInt(), quint32(0));
903
904
QCOMPARE(qjsvalue_cast<quint32>(str4), quint32(0));
905
906
QJSValue str5 = eng.toScriptValue(QString::fromLatin1("123.5"));
QCOMPARE(str5.toUInt(), quint32(123));
907
908
QCOMPARE(qjsvalue_cast<quint32>(str5), quint32(123));
909
910
QJSValue str6 = eng.toScriptValue(QString::fromLatin1("-456.5"));
QCOMPARE(str6.toUInt(), quint32(-456));
911
912
913
914
915
QCOMPARE(qjsvalue_cast<quint32>(str6), quint32(-456));
}
// V2 constructors
{
QJSValue zer0 = QJSValue(0.0);
916
QCOMPARE(zer0.toUInt(), quint32(0));
917
918
919
QCOMPARE(qjsvalue_cast<quint32>(zer0), quint32(0));
QJSValue number = QJSValue(123.0);
920
QCOMPARE(number.toUInt(), quint32(123));
921
922
923
QCOMPARE(qjsvalue_cast<quint32>(number), quint32(123));
QJSValue number2 = QJSValue(qSNaN());
924
QCOMPARE(number2.toUInt(), quint32(0));
925
926
927
QCOMPARE(qjsvalue_cast<quint32>(number2), quint32(0));
QJSValue number3 = QJSValue(+qInf());
928
QCOMPARE(number3.toUInt(), quint32(0));
929
930
931
QCOMPARE(qjsvalue_cast<quint32>(number3), quint32(0));
QJSValue number3_2 = QJSValue(-qInf());
932
QCOMPARE(number3_2.toUInt(), quint32(0));
933
934
935
QCOMPARE(qjsvalue_cast<quint32>(number3_2), quint32(0));
QJSValue number4 = QJSValue(0.5);
936
QCOMPARE(number4.toUInt(), quint32(0));
937
938
QJSValue number5 = QJSValue(123.5);
939
QCOMPARE(number5.toUInt(), quint32(123));
940
941
QJSValue number6 = QJSValue(-456.5);
942
QCOMPARE(number6.toUInt(), quint32(-456));
943
944
945
QCOMPARE(qjsvalue_cast<quint32>(number6), quint32(-456));
QJSValue number7 = QJSValue(0x43211234);
946
QCOMPARE(number7.toUInt(), quint32(0x43211234));
947
948
QJSValue str = QJSValue(QLatin1String("123.0"));
949
QCOMPARE(str.toUInt(), quint32(123));
950
951
952
QCOMPARE(qjsvalue_cast<quint32>(str), quint32(123));
QJSValue str2 = QJSValue(QLatin1String("NaN"));
953
QCOMPARE(str2.toUInt(), quint32(0));
954
955
956
QCOMPARE(qjsvalue_cast<quint32>(str2), quint32(0));
QJSValue str3 = QJSValue(QLatin1String("Infinity"));
957
QCOMPARE(str3.toUInt(), quint32(0));
958
959
960
QCOMPARE(qjsvalue_cast<quint32>(str3), quint32(0));
QJSValue str3_2 = QJSValue(QLatin1String("-Infinity"));
961
QCOMPARE(str3_2.toUInt(), quint32(0));
962
963
964
QCOMPARE(qjsvalue_cast<quint32>(str3_2), quint32(0));
QJSValue str4 = QJSValue(QLatin1String("0.5"));
965
QCOMPARE(str4.toUInt(), quint32(0));
966
967
968
QCOMPARE(qjsvalue_cast<quint32>(str4), quint32(0));
QJSValue str5 = QJSValue(QLatin1String("123.5"));
969
QCOMPARE(str5.toUInt(), quint32(123));
970
971
972
QCOMPARE(qjsvalue_cast<quint32>(str5), quint32(123));
QJSValue str6 = QJSValue(QLatin1String("-456.5"));
973
QCOMPARE(str6.toUInt(), quint32(-456));
974
975
976
977
QCOMPARE(qjsvalue_cast<quint32>(str6), quint32(-456));
}
QJSValue inv;
978
QCOMPARE(inv.toUInt(), quint32(0));
979
980
981
982
983
984
985
986
987
988
QCOMPARE(qjsvalue_cast<quint32>(inv), quint32(0));
}
#if defined Q_CC_MSVC && _MSC_VER < 1300
Q_DECLARE_METATYPE(QVariant)
#endif
void tst_QJSValue::toVariant()
{
QJSEngine eng;
989
QObject temp;
990
991
QJSValue undefined = eng.toScriptValue(QVariant());
992
993
994
QCOMPARE(undefined.toVariant(), QVariant());
QCOMPARE(qjsvalue_cast<QVariant>(undefined), QVariant());
995
QJSValue null = eng.evaluate("null");
996
997
QCOMPARE(null.toVariant(), QVariant(QMetaType::VoidStar, 0));
QCOMPARE(qjsvalue_cast<QVariant>(null), QVariant(QMetaType::VoidStar, 0));
998
999
{
1000
QJSValue number = eng.toScriptValue(123.0);