aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/guiapplauncher/demos.txt8
-rw-r--r--tests/auto/qml/debugger/debugger.pro8
-rw-r--r--tests/auto/qml/debugger/qdebugmessageservice/tst_qdebugmessageservice.cpp9
-rw-r--r--tests/auto/qml/debugger/qqmldebugclient/tst_qqmldebugclient.cpp2
-rw-r--r--tests/auto/qml/debugger/qqmldebuggingenabler/qqmldebuggingenabler/tst_qqmldebuggingenabler.cpp4
-rw-r--r--tests/auto/qml/debugger/qqmldebugjs/data/breakpointRelocation.qml (renamed from tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/breakpointRelocation.qml)0
-rw-r--r--tests/auto/qml/debugger/qqmldebugjs/data/changeBreakpoint.qml (renamed from tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/changeBreakpoint.qml)0
-rw-r--r--tests/auto/qml/debugger/qqmldebugjs/data/condition.qml (renamed from tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/condition.qml)0
-rw-r--r--tests/auto/qml/debugger/qqmldebugjs/data/createComponent.qml (renamed from tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/createComponent.qml)0
-rw-r--r--tests/auto/qml/debugger/qqmldebugjs/data/encodeQmlScope.qml (renamed from tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/encodeQmlScope.qml)0
-rw-r--r--tests/auto/qml/debugger/qqmldebugjs/data/exception.qml (renamed from tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/exception.qml)0
-rw-r--r--tests/auto/qml/debugger/qqmldebugjs/data/loadjsfile.qml (renamed from tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/loadjsfile.qml)0
-rw-r--r--tests/auto/qml/debugger/qqmldebugjs/data/oncompleted.qml (renamed from tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/oncompleted.qml)0
-rw-r--r--tests/auto/qml/debugger/qqmldebugjs/data/quit.qml (renamed from tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/quit.qml)0
-rw-r--r--tests/auto/qml/debugger/qqmldebugjs/data/stepAction.qml (renamed from tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/stepAction.qml)0
-rw-r--r--tests/auto/qml/debugger/qqmldebugjs/data/test.js (renamed from tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/test.js)0
-rw-r--r--tests/auto/qml/debugger/qqmldebugjs/data/test.qml (renamed from tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/test.qml)0
-rw-r--r--tests/auto/qml/debugger/qqmldebugjs/data/timer.qml (renamed from tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/timer.qml)0
-rw-r--r--tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs.pro26
-rw-r--r--tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/qqmldebugjs.pro24
-rw-r--r--tests/auto/qml/debugger/qqmldebugjs/qqmldebugjsserver/qqmldebugjsserver.pro12
-rw-r--r--tests/auto/qml/debugger/qqmldebugjs/tst_qqmldebugjs.cpp (renamed from tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/tst_qqmldebugjs.cpp)12
-rw-r--r--tests/auto/qml/debugger/qqmldebugjsserver/qqmldebugjsserver.cpp (renamed from tests/auto/qml/debugger/qqmldebugjs/qqmldebugjsserver/qqmldebugjsserver.cpp)0
-rw-r--r--tests/auto/qml/debugger/qqmldebugjsserver/qqmldebugjsserver.pro9
-rw-r--r--tests/auto/qml/debugger/qqmldebuglocal/tst_qqmldebuglocal.cpp2
-rw-r--r--tests/auto/qml/debugger/qqmldebugprocess/qqmldebugprocess/tst_qqmldebugprocess.cpp2
-rw-r--r--tests/auto/qml/debugger/qqmldebugservice/tst_qqmldebugservice.cpp2
-rw-r--r--tests/auto/qml/debugger/qqmlpreview/data/broken.qml31
-rw-r--r--tests/auto/qml/debugger/qqmlpreview/data/qtquick2.qml71
-rw-r--r--tests/auto/qml/debugger/qqmlpreview/data/window.qml44
-rw-r--r--tests/auto/qml/debugger/qqmlpreview/data/window1.qml43
-rw-r--r--tests/auto/qml/debugger/qqmlpreview/data/window2.qml43
-rw-r--r--tests/auto/qml/debugger/qqmlpreview/data/zoom.qml51
-rw-r--r--tests/auto/qml/debugger/qqmlpreview/qqmlpreview.pro24
-rw-r--r--tests/auto/qml/debugger/qqmlpreview/tst_qqmlpreview.cpp317
-rw-r--r--tests/auto/qml/debugger/qqmlprofilerservice/data/quit.qml40
-rw-r--r--tests/auto/qml/debugger/qqmlprofilerservice/tst_qqmlprofilerservice.cpp48
-rw-r--r--tests/auto/qml/debugger/qv4debugger/tst_qv4debugger.cpp31
-rw-r--r--tests/auto/qml/debugger/shared/debugutil.cpp105
-rw-r--r--tests/auto/qml/debugger/shared/debugutil_p.h31
-rw-r--r--tests/auto/qml/debugger/shared/qqmldebugprocess.cpp8
-rw-r--r--tests/auto/qml/debugger/shared/qqmldebugprocess_p.h4
-rw-r--r--tests/auto/qml/debugger/shared/qqmldebugtestservice.cpp1
-rw-r--r--tests/auto/qml/debugger/shared/qqmldebugtestservice.h3
-rw-r--r--tests/auto/qml/ecmascripttests/TestExpectations2855
-rw-r--r--tests/auto/qml/ecmascripttests/ecmascripttests.pro15
-rw-r--r--tests/auto/qml/ecmascripttests/qjstest/main.cpp114
-rw-r--r--tests/auto/qml/ecmascripttests/qjstest/qjstest.pro13
-rw-r--r--tests/auto/qml/ecmascripttests/qjstest/test262runner.cpp760
-rw-r--r--tests/auto/qml/ecmascripttests/qjstest/test262runner.h131
m---------tests/auto/qml/ecmascripttests/test2620
-rwxr-xr-xtests/auto/qml/ecmascripttests/test262.py91
-rw-r--r--tests/auto/qml/ecmascripttests/testcase.pro15
-rw-r--r--tests/auto/qml/ecmascripttests/tst_ecmascripttests.cpp48
-rw-r--r--tests/auto/qml/qjsengine/tst_qjsengine.cpp168
-rw-r--r--tests/auto/qml/qjsvalue/tst_qjsvalue.cpp2
-rw-r--r--tests/auto/qml/qml.pro1
-rw-r--r--tests/auto/qml/qmldiskcache/tst_qmldiskcache.cpp12
-rw-r--r--tests/auto/qml/qmlmin/tst_qmlmin.cpp3
-rw-r--r--tests/auto/qml/qqmlcomponent/tst_qqmlcomponent.cpp24
-rw-r--r--tests/auto/qml/qqmlconsole/data/categorized_logging.qml14
-rw-r--r--tests/auto/qml/qqmlconsole/data/logging.qml2
-rw-r--r--tests/auto/qml/qqmlconsole/tst_qqmlconsole.cpp24
-rw-r--r--tests/auto/qml/qqmlcontext/tst_qqmlcontext.cpp2
-rw-r--r--tests/auto/qml/qqmlecmascript/data/assignSequenceTypes.8.qml16
-rw-r--r--tests/auto/qml/qqmlecmascript/data/include_pragma_shadow.js7
-rw-r--r--tests/auto/qml/qqmlecmascript/data/include_pragma_shadow.qml15
-rw-r--r--tests/auto/qml/qqmlecmascript/data/jsimport/importPragmaLibraryWithPragmaLibraryImports.js2
-rw-r--r--tests/auto/qml/qqmlecmascript/data/jsimport/testImportPragmaLibraryWithPragmaLibraryImports.qml2
-rw-r--r--tests/auto/qml/qqmlecmascript/data/jsimport/testJsImport.qml4
-rw-r--r--tests/auto/qml/qqmlecmascript/data/jsimport/testJsModuleImport.js2
-rw-r--r--tests/auto/qml/qqmlecmascript/data/jsimport/testJsModuleRemoteImport.js2
-rw-r--r--tests/auto/qml/qqmlecmascript/data/jsimport/testJsRemoteImport.qml4
-rw-r--r--tests/auto/qml/qqmlecmascript/data/lib/com/qt/JsModule/ScriptAPI.js (renamed from tests/auto/qml/qqmlecmascript/data/lib/com/nokia/JsModule/ScriptAPI.js)0
-rw-r--r--tests/auto/qml/qqmlecmascript/data/lib/com/qt/JsModule/qmldir (renamed from tests/auto/qml/qqmlecmascript/data/lib/com/nokia/JsModule/qmldir)0
-rw-r--r--tests/auto/qml/qqmlecmascript/data/remote/com/qt/JsRemoteModule/ScriptAPI.js (renamed from tests/auto/qml/qqmlecmascript/data/remote/com/nokia/JsRemoteModule/ScriptAPI.js)0
-rw-r--r--tests/auto/qml/qqmlecmascript/data/remote/com/qt/JsRemoteModule/qmldir (renamed from tests/auto/qml/qqmlecmascript/data/remote/com/nokia/JsRemoteModule/qmldir)0
-rw-r--r--tests/auto/qml/qqmlecmascript/data/removeBindingsWithNoDependencies.qml9
-rw-r--r--tests/auto/qml/qqmlecmascript/data/tryStatement.3.qml2
-rw-r--r--tests/auto/qml/qqmlecmascript/data/tryStatement.4.qml2
-rw-r--r--tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp397
-rw-r--r--tests/auto/qml/qqmlengine/tst_qqmlengine.cpp117
-rw-r--r--tests/auto/qml/qqmllanguage/data/dynamicMeta.5.errors.txt2
-rw-r--r--tests/auto/qml/qqmllanguage/data/incorrectCase.errors.insensitive.txt2
-rw-r--r--tests/auto/qml/qqmllanguage/data/objectValueTypeProperty.errors.txt2
-rw-r--r--tests/auto/qml/qqmllanguage/data/property.4.errors.txt2
-rw-r--r--tests/auto/qml/qqmllanguage/data/singletonTest18.qml9
-rw-r--r--tests/auto/qml/qqmllanguage/data/wrongType.16.errors.txt2
-rw-r--r--tests/auto/qml/qqmllanguage/testtypes.cpp9
-rw-r--r--tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp50
-rw-r--r--tests/auto/qml/qqmllistmodel/data/dynamicroles.qml21
-rw-r--r--tests/auto/qml/qqmllistmodel/data/qtbug38907.qml25
-rw-r--r--tests/auto/qml/qqmllistmodel/tst_qqmllistmodel.cpp111
-rw-r--r--tests/auto/qml/qqmlopenmetaobject/tst_qqmlopenmetaobject.cpp2
-rw-r--r--tests/auto/qml/qqmlparser/tst_qqmlparser.cpp82
-rw-r--r--tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp32
-rw-r--r--tests/auto/qml/qqmlpropertycache/tst_qqmlpropertycache.cpp2
-rw-r--r--tests/auto/qml/qqmlqt/tst_qqmlqt.cpp10
-rw-r--r--tests/auto/qml/qqmltranslation/data/translationChange.qml8
-rw-r--r--tests/auto/qml/qqmltranslation/tst_qqmltranslation.cpp6
-rw-r--r--tests/auto/qml/qqmltypeloader/tst_qqmltypeloader.cpp2
-rw-r--r--tests/auto/qml/qqmlvaluetypes/tst_qqmlvaluetypes.cpp4
-rw-r--r--tests/auto/qml/qv4identifiertable/qv4identifiertable.pro8
-rw-r--r--tests/auto/qml/qv4identifiertable/tst_qv4identifiertable.cpp305
-rw-r--r--tests/auto/qml/qv4mm/tst_qv4mm.cpp11
-rw-r--r--tests/auto/qmltest/rectangle/tst_rectangle.qml23
-rw-r--r--tests/auto/quick/examples/tst_examples.cpp4
-rw-r--r--tests/auto/quick/pointerhandlers/flickableinterop/data/GrooveDragSlider.qml123
-rw-r--r--tests/auto/quick/pointerhandlers/flickableinterop/data/KnobDragSlider.qml (renamed from tests/auto/quick/pointerhandlers/flickableinterop/data/Slider.qml)16
-rw-r--r--tests/auto/quick/pointerhandlers/flickableinterop/data/flickableWithHandlers.qml19
-rw-r--r--tests/auto/quick/pointerhandlers/flickableinterop/tst_flickableinterop.cpp133
-rw-r--r--tests/auto/quick/pointerhandlers/multipointtoucharea_interop/tst_multipointtoucharea_interop.cpp4
-rw-r--r--tests/auto/quick/pointerhandlers/qquickdraghandler/tst_qquickdraghandler.cpp13
-rw-r--r--tests/auto/quick/pointerhandlers/qquicktaphandler/tst_qquicktaphandler.cpp23
-rw-r--r--tests/auto/quick/qquickanimatedsprite/data/infiniteLoops.qml38
-rw-r--r--tests/auto/quick/qquickanimatedsprite/tst_qquickanimatedsprite.cpp33
-rw-r--r--tests/auto/quick/qquickanimations/data/finished.qml95
-rw-r--r--tests/auto/quick/qquickanimations/tst_qquickanimations.cpp74
-rw-r--r--tests/auto/quick/qquickcanvasitem/data/tst_line.qml91
-rw-r--r--tests/auto/quick/qquickdesignersupport/data/TestComponent.qml4
-rw-r--r--tests/auto/quick/qquickdesignersupport/data/test.qml4
-rw-r--r--tests/auto/quick/qquickdesignersupport/tst_qquickdesignersupport.cpp8
-rw-r--r--tests/auto/quick/qquickflickable/BLACKLIST1
-rw-r--r--tests/auto/quick/qquickflickable/tst_qquickflickable.cpp66
-rw-r--r--tests/auto/quick/qquickframebufferobject/tst_qquickframebufferobject.cpp4
-rw-r--r--tests/auto/quick/qquickgridview/tst_qquickgridview.cpp31
-rw-r--r--tests/auto/quick/qquickimageprovider/tst_qquickimageprovider.cpp65
-rw-r--r--tests/auto/quick/qquicklistview/tst_qquicklistview.cpp70
-rw-r--r--tests/auto/quick/qquickloader/tst_qquickloader.cpp4
-rw-r--r--tests/auto/quick/qquickmultipointtoucharea/BLACKLIST2
-rw-r--r--tests/auto/quick/qquickpathview/tst_qquickpathview.cpp8
-rw-r--r--tests/auto/quick/qquickpositioners/tst_qquickpositioners.cpp20
-rw-r--r--tests/auto/quick/qquickrectangle/data/gradient-preset.qml16
-rw-r--r--tests/auto/quick/qquickrectangle/tst_qquickrectangle.cpp28
-rw-r--r--tests/auto/quick/qquickrepeater/data/ownership.qml4
-rw-r--r--tests/auto/quick/qquickrepeater/data/package.qml35
-rw-r--r--tests/auto/quick/qquickrepeater/tst_qquickrepeater.cpp88
-rw-r--r--tests/auto/quick/qquickshape/qquickshape.pro24
-rw-r--r--tests/auto/quick/qquickshape/tst_qquickshape.cpp2
-rw-r--r--tests/auto/quick/qquicktableview/data/countingtableview.qml85
-rw-r--r--tests/auto/quick/qquicktableview/data/plaintableview.qml80
-rw-r--r--tests/auto/quick/qquicktableview/data/tableviewimplicitsize.qml66
-rw-r--r--tests/auto/quick/qquicktableview/qquicktableview.pro14
-rw-r--r--tests/auto/quick/qquicktableview/testmodel.h89
-rw-r--r--tests/auto/quick/qquicktableview/tst_qquicktableview.cpp791
-rw-r--r--tests/auto/quick/qquicktext/data/implicitSizeChangeRewrap.qml27
-rw-r--r--tests/auto/quick/qquicktext/tst_qquicktext.cpp23
-rw-r--r--tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp5
-rw-r--r--tests/auto/quick/qquickwindow/tst_qquickwindow.cpp45
-rw-r--r--tests/auto/quick/qquickxmllistmodel/tst_qquickxmllistmodel.cpp13
-rw-r--r--tests/auto/quick/quick.pro3
-rw-r--r--tests/auto/quick/shared/viewtestutil.cpp8
-rw-r--r--tests/auto/quick/shared/viewtestutil.h3
-rw-r--r--tests/auto/quick/touchmouse/tst_touchmouse.cpp50
-rw-r--r--tests/auto/quicktest/quicktest.pro3
-rw-r--r--tests/auto/quicktest/testfiltering/quicktestmain/quicktestmain.cpp29
-rw-r--r--tests/auto/quicktest/testfiltering/quicktestmain/quicktestmain.pro11
-rw-r--r--tests/auto/quicktest/testfiltering/quicktestmain/tst_first.qml38
-rw-r--r--tests/auto/quicktest/testfiltering/quicktestmain/tst_second.qml38
-rw-r--r--tests/auto/quicktest/testfiltering/test/test.pro5
-rw-r--r--tests/auto/quicktest/testfiltering/testfiltering.pro4
-rw-r--r--tests/auto/quicktest/testfiltering/tst_testfiltering.cpp135
-rw-r--r--tests/manual/pointer/content/MultiButton.qml1
-rw-r--r--tests/manual/pointer/map.qml8
-rw-r--r--tests/manual/pointer/multibuttons.qml3
-rw-r--r--tests/manual/pointer/pinchDragFlingMPTA.qml2
-rw-r--r--tests/manual/pointer/pinchHandler.qml6
-rw-r--r--tests/manual/pointer/sidebar.qml186
-rw-r--r--tests/manual/pointer/singlePointHandlerProperties.qml5
-rw-r--r--tests/manual/tableview/abstracttablemodel/abstracttablemodel.pro10
-rw-r--r--tests/manual/tableview/abstracttablemodel/main.cpp100
-rw-r--r--tests/manual/tableview/abstracttablemodel/main.qml91
-rw-r--r--tests/manual/tableview/listmodel/listmodel.pro10
-rw-r--r--tests/manual/tableview/listmodel/main.cpp52
-rw-r--r--tests/manual/tableview/listmodel/main.qml86
-rw-r--r--tests/manual/tableview/storagemodel/main.cpp56
-rw-r--r--tests/manual/tableview/storagemodel/main.qml75
-rw-r--r--tests/manual/tableview/storagemodel/storagemodel.cpp226
-rw-r--r--tests/manual/tableview/storagemodel/storagemodel.h93
-rw-r--r--tests/manual/tableview/storagemodel/storagemodel.pro11
-rw-r--r--tests/manual/tableview/tableview.pro4
-rw-r--r--tests/manual/touch/flicktext.qml8
182 files changed, 9630 insertions, 738 deletions
diff --git a/tests/auto/guiapplauncher/demos.txt b/tests/auto/guiapplauncher/demos.txt
deleted file mode 100644
index 1c48b6923d..0000000000
--- a/tests/auto/guiapplauncher/demos.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-"quick/demos/clocks Example", "examples/quick/demos/clocks", "clocks", 0, -1
-"quick/demos/maroon Example", "examples/quick/demos/maroon", "maroon", 0, -1
-"quick/demos/calqlatr Example", "examples/quick/demos/calqlatr", "calqlatr", 0, -1
-"quick/demos/stocqt Example", "examples/quick/demos/stocqt", "stocqt", 0, -1
-"quick/demos/tweetsearch Example", "examples/quick/demos/tweetsearch", "tweetsearch", 0, -1
-"quick/demos/samegame Example", "examples/quick/demos/samegame", "samegame", 0, -1
-"quick/demos/phoyosurface Example", "examples/quick/demos/photosurface", "photosurface", 10, -1
-"quick/demos/rssnews Example", "examples/quick/demos/rssnews", "rssnews", 0, -1
diff --git a/tests/auto/qml/debugger/debugger.pro b/tests/auto/qml/debugger/debugger.pro
index 63721cc575..5c328fbfcc 100644
--- a/tests/auto/qml/debugger/debugger.pro
+++ b/tests/auto/qml/debugger/debugger.pro
@@ -1,5 +1,7 @@
TEMPLATE = subdirs
+SUBDIRS += qqmldebugjsserver
+
PUBLICTESTS += \
qdebugmessageservice \
qqmlenginedebugservice \
@@ -11,7 +13,8 @@ PUBLICTESTS += \
qqmlenginecontrol \
qqmldebuggingenabler \
qqmlnativeconnector \
- qqmldebugprocess
+ qqmldebugprocess \
+ qqmlpreview
PRIVATETESTS += \
qqmldebugclient \
@@ -21,6 +24,9 @@ PRIVATETESTS += \
SUBDIRS += $$PUBLICTESTS
+qqmldebugjs.depends = qqmldebugjsserver
+qqmlprofilerservice.depends = qqmldebugjsserver
+
qtConfig(private_tests): \
SUBDIRS += $$PRIVATETESTS
diff --git a/tests/auto/qml/debugger/qdebugmessageservice/tst_qdebugmessageservice.cpp b/tests/auto/qml/debugger/qdebugmessageservice/tst_qdebugmessageservice.cpp
index f851688b5e..d2cfd3897a 100644
--- a/tests/auto/qml/debugger/qdebugmessageservice/tst_qdebugmessageservice.cpp
+++ b/tests/auto/qml/debugger/qdebugmessageservice/tst_qdebugmessageservice.cpp
@@ -89,21 +89,12 @@ public:
protected:
//inherited from QQmlDebugClient
- void stateChanged(State state);
void messageReceived(const QByteArray &data);
signals:
- void enabled();
void debugOutput();
};
-void QQmlDebugMsgClient::stateChanged(State state)
-{
- if (state == Enabled) {
- emit enabled();
- }
-}
-
void QQmlDebugMsgClient::messageReceived(const QByteArray &data)
{
QPacket ds(connection()->currentDataStreamVersion(), data);
diff --git a/tests/auto/qml/debugger/qqmldebugclient/tst_qqmldebugclient.cpp b/tests/auto/qml/debugger/qqmldebugclient/tst_qqmldebugclient.cpp
index 452520cf11..ffdbf72ded 100644
--- a/tests/auto/qml/debugger/qqmldebugclient/tst_qqmldebugclient.cpp
+++ b/tests/auto/qml/debugger/qqmldebugclient/tst_qqmldebugclient.cpp
@@ -66,8 +66,6 @@ void tst_QQmlDebugClient::initTestCase()
QQmlDebugConnector::setPluginKey(QLatin1String("QQmlDebugServer"));
QQmlDebugConnector::setServices(QStringList()
<< QStringLiteral("tst_QQmlDebugClient::handshake()"));
- QTest::ignoreMessage(QtWarningMsg,
- "QML debugger: Cannot set plugin key after loading the plugin.");
m_service = new QQmlDebugTestService("tst_QQmlDebugClient::handshake()");
diff --git a/tests/auto/qml/debugger/qqmldebuggingenabler/qqmldebuggingenabler/tst_qqmldebuggingenabler.cpp b/tests/auto/qml/debugger/qqmldebuggingenabler/qqmldebuggingenabler/tst_qqmldebuggingenabler.cpp
index 52e7f85e52..37118f4bd0 100644
--- a/tests/auto/qml/debugger/qqmldebuggingenabler/qqmldebuggingenabler/tst_qqmldebuggingenabler.cpp
+++ b/tests/auto/qml/debugger/qqmldebuggingenabler/qqmldebuggingenabler/tst_qqmldebuggingenabler.cpp
@@ -125,7 +125,7 @@ void tst_QQmlDebuggingEnabler::qmlscene()
QQmlDebugClient::Enabled : QQmlDebugClient::Unavailable);
}
- QCOMPARE(m_process->state(), QLatin1String("running"));
+ QCOMPARE(m_process->state(), QProcess::Running);
if (!blockMode) {
QTRY_VERIFY_WITH_TIMEOUT(m_process->output().contains(
QLatin1String("Component.onCompleted")), 15000);
@@ -172,7 +172,7 @@ void tst_QQmlDebuggingEnabler::custom()
QQmlDebugClient::Enabled : QQmlDebugClient::Unavailable);
}
- QCOMPARE(m_process->state(), QLatin1String("running"));
+ QCOMPARE(m_process->state(), QProcess::Running);
if (!blockMode) {
QTRY_VERIFY_WITH_TIMEOUT(m_process->output().contains(QLatin1String("QQmlEngine created")),
15000);
diff --git a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/breakpointRelocation.qml b/tests/auto/qml/debugger/qqmldebugjs/data/breakpointRelocation.qml
index 06aabc94f9..06aabc94f9 100644
--- a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/breakpointRelocation.qml
+++ b/tests/auto/qml/debugger/qqmldebugjs/data/breakpointRelocation.qml
diff --git a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/changeBreakpoint.qml b/tests/auto/qml/debugger/qqmldebugjs/data/changeBreakpoint.qml
index 00a85e56ac..00a85e56ac 100644
--- a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/changeBreakpoint.qml
+++ b/tests/auto/qml/debugger/qqmldebugjs/data/changeBreakpoint.qml
diff --git a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/condition.qml b/tests/auto/qml/debugger/qqmldebugjs/data/condition.qml
index 3a50ba2eb7..3a50ba2eb7 100644
--- a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/condition.qml
+++ b/tests/auto/qml/debugger/qqmldebugjs/data/condition.qml
diff --git a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/createComponent.qml b/tests/auto/qml/debugger/qqmldebugjs/data/createComponent.qml
index 089cc03733..089cc03733 100644
--- a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/createComponent.qml
+++ b/tests/auto/qml/debugger/qqmldebugjs/data/createComponent.qml
diff --git a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/encodeQmlScope.qml b/tests/auto/qml/debugger/qqmldebugjs/data/encodeQmlScope.qml
index 7ea048044f..7ea048044f 100644
--- a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/encodeQmlScope.qml
+++ b/tests/auto/qml/debugger/qqmldebugjs/data/encodeQmlScope.qml
diff --git a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/exception.qml b/tests/auto/qml/debugger/qqmldebugjs/data/exception.qml
index 06f11fa016..06f11fa016 100644
--- a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/exception.qml
+++ b/tests/auto/qml/debugger/qqmldebugjs/data/exception.qml
diff --git a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/loadjsfile.qml b/tests/auto/qml/debugger/qqmldebugjs/data/loadjsfile.qml
index 088c1b19fd..088c1b19fd 100644
--- a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/loadjsfile.qml
+++ b/tests/auto/qml/debugger/qqmldebugjs/data/loadjsfile.qml
diff --git a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/oncompleted.qml b/tests/auto/qml/debugger/qqmldebugjs/data/oncompleted.qml
index deba24cf91..deba24cf91 100644
--- a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/oncompleted.qml
+++ b/tests/auto/qml/debugger/qqmldebugjs/data/oncompleted.qml
diff --git a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/quit.qml b/tests/auto/qml/debugger/qqmldebugjs/data/quit.qml
index bc8c2b90ae..bc8c2b90ae 100644
--- a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/quit.qml
+++ b/tests/auto/qml/debugger/qqmldebugjs/data/quit.qml
diff --git a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/stepAction.qml b/tests/auto/qml/debugger/qqmldebugjs/data/stepAction.qml
index fb0b6c401c..fb0b6c401c 100644
--- a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/stepAction.qml
+++ b/tests/auto/qml/debugger/qqmldebugjs/data/stepAction.qml
diff --git a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/test.js b/tests/auto/qml/debugger/qqmldebugjs/data/test.js
index 92e61d103c..92e61d103c 100644
--- a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/test.js
+++ b/tests/auto/qml/debugger/qqmldebugjs/data/test.js
diff --git a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/test.qml b/tests/auto/qml/debugger/qqmldebugjs/data/test.qml
index a36d0cae91..a36d0cae91 100644
--- a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/test.qml
+++ b/tests/auto/qml/debugger/qqmldebugjs/data/test.qml
diff --git a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/timer.qml b/tests/auto/qml/debugger/qqmldebugjs/data/timer.qml
index 66e6b96e18..66e6b96e18 100644
--- a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/data/timer.qml
+++ b/tests/auto/qml/debugger/qqmldebugjs/data/timer.qml
diff --git a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs.pro b/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs.pro
index bd6debcea1..b9d5f116dc 100644
--- a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs.pro
+++ b/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs.pro
@@ -1,4 +1,24 @@
-TEMPLATE = subdirs
-SUBDIRS = qqmldebugjs qqmldebugjsserver
+CONFIG += testcase
+TARGET = tst_qqmldebugjs
+QT += qml testlib gui-private core-private
+macos:CONFIG -= app_bundle
-qqmldebugjs.depends = qqmldebugjsserver
+SOURCES += tst_qqmldebugjs.cpp
+
+INCLUDEPATH += ../shared
+include(../shared/debugutil.pri)
+include(../shared/qqmlenginedebugclient.pri)
+
+TESTDATA = data/*
+
+OTHER_FILES += data/test.qml data/test.js \
+ data/timer.qml \
+ data/exception.qml \
+ data/oncompleted.qml \
+ data/loadjsfile.qml \
+ data/condition.qml \
+ data/changeBreakpoint.qml \
+ data/stepAction.qml \
+ data/breakpointRelocation.qml \
+ data/createComponent.qml \
+ data/encodeQmlScope.qml
diff --git a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/qqmldebugjs.pro b/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/qqmldebugjs.pro
deleted file mode 100644
index 52d70bd1b1..0000000000
--- a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/qqmldebugjs.pro
+++ /dev/null
@@ -1,24 +0,0 @@
-CONFIG += testcase
-TARGET = tst_qqmldebugjs
-QT += qml testlib gui-private core-private
-CONFIG -= debug_and_release_target
-osx:CONFIG -= app_bundle
-
-SOURCES += tst_qqmldebugjs.cpp
-
-include(../../shared/debugutil.pri)
-include(../../shared/qqmlenginedebugclient.pri)
-
-TESTDATA = data/*
-
-OTHER_FILES += data/test.qml data/test.js \
- data/timer.qml \
- data/exception.qml \
- data/oncompleted.qml \
- data/loadjsfile.qml \
- data/condition.qml \
- data/changeBreakpoint.qml \
- data/stepAction.qml \
- data/breakpointRelocation.qml \
- data/createComponent.qml \
- data/encodeQmlScope.qml
diff --git a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjsserver/qqmldebugjsserver.pro b/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjsserver/qqmldebugjsserver.pro
deleted file mode 100644
index 837eaed9f1..0000000000
--- a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjsserver/qqmldebugjsserver.pro
+++ /dev/null
@@ -1,12 +0,0 @@
-QT += qml testlib
-osx:CONFIG -= app_bundle
-CONFIG -= debug_and_release_target
-INCLUDEPATH += ../../shared
-SOURCES += qqmldebugjsserver.cpp
-DEFINES += QT_QML_DEBUG_NO_WARNING
-
-DESTDIR = ../qqmldebugjs
-
-target.path = $$[QT_INSTALL_TESTS]/tst_qqmldebugjs
-INSTALLS += target
-
diff --git a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/tst_qqmldebugjs.cpp b/tests/auto/qml/debugger/qqmldebugjs/tst_qqmldebugjs.cpp
index a28dbcd9de..e3996e0c18 100644
--- a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs/tst_qqmldebugjs.cpp
+++ b/tests/auto/qml/debugger/qqmldebugjs/tst_qqmldebugjs.cpp
@@ -28,8 +28,8 @@
#include "debugutil_p.h"
#include "qqmldebugprocess_p.h"
-#include "../../shared/qqmlenginedebugclient.h"
-#include "../../../../shared/util.h"
+#include "../shared/qqmlenginedebugclient.h"
+#include "../../../shared/util.h"
#include <private/qqmldebugclient_p.h>
#include <private/qqmldebugconnection_p.h>
@@ -256,6 +256,8 @@ public:
{
parser = jsEngine.evaluate(QLatin1String("JSON.parse"));
stringify = jsEngine.evaluate(QLatin1String("JSON.stringify"));
+ QObject::connect(this, &QQmlDebugClient::stateChanged,
+ this, &QJSDebugClient::onStateChanged);
}
void connect(bool redundantRefs = false, bool namesAsObjects = false);
@@ -277,7 +279,7 @@ public:
protected:
//inherited from QQmlDebugClient
- void stateChanged(State state);
+ void onStateChanged(State state);
void messageReceived(const QByteArray &data);
signals:
@@ -665,7 +667,7 @@ void QJSDebugClient::disconnect()
sendMessage(packMessage(DISCONNECT, json.toString().toUtf8()));
}
-void QJSDebugClient::stateChanged(State state)
+void QJSDebugClient::onStateChanged(State state)
{
if (state == Enabled)
flushSendBuffer();
@@ -770,7 +772,7 @@ QQmlDebugTest::ConnectResult tst_QQmlDebugJS::init(bool qmlscene, const QString
{
const QString executable = qmlscene
? QLibraryInfo::location(QLibraryInfo::BinariesPath) + "/qmlscene"
- : QCoreApplication::applicationDirPath() + QLatin1String("/qqmldebugjsserver");
+ : debugJsServerPath("qqmldebugjs");
return QQmlDebugTest::connect(
executable, restrictServices ? QStringLiteral("V8Debugger") : QString(),
testFile(qmlFile), blockMode);
diff --git a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjsserver/qqmldebugjsserver.cpp b/tests/auto/qml/debugger/qqmldebugjsserver/qqmldebugjsserver.cpp
index 6a4ec5cc75..6a4ec5cc75 100644
--- a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjsserver/qqmldebugjsserver.cpp
+++ b/tests/auto/qml/debugger/qqmldebugjsserver/qqmldebugjsserver.cpp
diff --git a/tests/auto/qml/debugger/qqmldebugjsserver/qqmldebugjsserver.pro b/tests/auto/qml/debugger/qqmldebugjsserver/qqmldebugjsserver.pro
new file mode 100644
index 0000000000..a31da57054
--- /dev/null
+++ b/tests/auto/qml/debugger/qqmldebugjsserver/qqmldebugjsserver.pro
@@ -0,0 +1,9 @@
+QT += qml testlib
+macos:CONFIG -= app_bundle
+INCLUDEPATH += ../shared
+SOURCES += qqmldebugjsserver.cpp
+DEFINES += QT_QML_DEBUG_NO_WARNING
+
+target.path = $$[QT_INSTALL_TESTS]/qqmldebugjsserver
+INSTALLS += target
+
diff --git a/tests/auto/qml/debugger/qqmldebuglocal/tst_qqmldebuglocal.cpp b/tests/auto/qml/debugger/qqmldebuglocal/tst_qqmldebuglocal.cpp
index 5b3c0c5240..4e47c92c2a 100644
--- a/tests/auto/qml/debugger/qqmldebuglocal/tst_qqmldebuglocal.cpp
+++ b/tests/auto/qml/debugger/qqmldebuglocal/tst_qqmldebuglocal.cpp
@@ -65,8 +65,6 @@ void tst_QQmlDebugLocal::initTestCase()
{
fileName = QString::fromLatin1("tst_QQmlDebugLocal%1").arg(std::time(nullptr));
QQmlDebugConnector::setPluginKey("QQmlDebugServer");
- QTest::ignoreMessage(QtWarningMsg,
- "QML debugger: Cannot set plugin key after loading the plugin.");
m_service = new QQmlDebugTestService("tst_QQmlDebugLocal::handshake()");
const QString waitingMsg = QString("QML Debugger: Connecting to socket %1...").arg(fileName);
diff --git a/tests/auto/qml/debugger/qqmldebugprocess/qqmldebugprocess/tst_qqmldebugprocess.cpp b/tests/auto/qml/debugger/qqmldebugprocess/qqmldebugprocess/tst_qqmldebugprocess.cpp
index 993a1d5f63..35bd912d9b 100644
--- a/tests/auto/qml/debugger/qqmldebugprocess/qqmldebugprocess/tst_qqmldebugprocess.cpp
+++ b/tests/auto/qml/debugger/qqmldebugprocess/qqmldebugprocess/tst_qqmldebugprocess.cpp
@@ -118,7 +118,7 @@ void tst_QQmlDebugProcess::sessionStart()
QTimer::singleShot(delay, process.data(), wait);
QTRY_VERIFY(done);
- QVERIFY(process->state().startsWith("not running"));
+ QCOMPARE(process->state(), QProcess::NotRunning);
}
QTEST_MAIN(tst_QQmlDebugProcess)
diff --git a/tests/auto/qml/debugger/qqmldebugservice/tst_qqmldebugservice.cpp b/tests/auto/qml/debugger/qqmldebugservice/tst_qqmldebugservice.cpp
index 1daf6b581e..3557940386 100644
--- a/tests/auto/qml/debugger/qqmldebugservice/tst_qqmldebugservice.cpp
+++ b/tests/auto/qml/debugger/qqmldebugservice/tst_qqmldebugservice.cpp
@@ -75,8 +75,6 @@ void tst_QQmlDebugService::initTestCase()
QQmlDebugConnector::setPluginKey(QLatin1String("QQmlDebugServer"));
QQmlDebugConnector::setServices(QStringList()
<< QStringLiteral("tst_QQmlDebugService"));
- QTest::ignoreMessage(QtWarningMsg,
- "QML debugger: Cannot set plugin key after loading the plugin.");
m_service = new QQmlDebugTestService("tst_QQmlDebugService", 2);
foreach (const QString &service, QQmlDebuggingEnabler::debuggerServices())
diff --git a/tests/auto/qml/debugger/qqmlpreview/data/broken.qml b/tests/auto/qml/debugger/qqmlpreview/data/broken.qml
new file mode 100644
index 0000000000..4ebbf7576a
--- /dev/null
+++ b/tests/auto/qml/debugger/qqmlpreview/data/broken.qml
@@ -0,0 +1,31 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+Item {
diff --git a/tests/auto/qml/debugger/qqmlpreview/data/qtquick2.qml b/tests/auto/qml/debugger/qqmlpreview/data/qtquick2.qml
new file mode 100644
index 0000000000..b525ab4fa0
--- /dev/null
+++ b/tests/auto/qml/debugger/qqmlpreview/data/qtquick2.qml
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+Rectangle {
+ width: 100
+ height: 100
+ color: "blue"
+
+ RotationAnimation on rotation {
+ duration: 3600
+ loops: Animation.Infinite
+ from: 0
+ to: 360
+ }
+
+ Timer {
+ interval: 300
+ repeat: true
+ running: true
+ property int prevHit: -1
+ property int prevRotation: -1
+ onTriggered: {
+ var date = new Date;
+ var millis = date.getMilliseconds()
+
+ if (prevHit < 0) {
+ prevHit = millis;
+ prevRotation = parent.rotation
+ return;
+ }
+
+ var milliDelta = millis - prevHit;
+ if (milliDelta <= 0)
+ milliDelta += 1000;
+ prevHit = millis;
+
+ var delta = parent.rotation - prevRotation;
+ if (delta < 0)
+ delta += 360
+ prevRotation = parent.rotation
+ console.log(milliDelta, delta, "ms/degrees ");
+ }
+ }
+}
diff --git a/tests/auto/qml/debugger/qqmlpreview/data/window.qml b/tests/auto/qml/debugger/qqmlpreview/data/window.qml
new file mode 100644
index 0000000000..f9f8d5aeb1
--- /dev/null
+++ b/tests/auto/qml/debugger/qqmlpreview/data/window.qml
@@ -0,0 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Window 2.0
+
+Window {
+ visible: true
+
+ height: 100
+ width: 100
+
+ Timer {
+ repeat: false
+ interval: 1000
+ running: true
+ onTriggered: console.log("window.qml");
+ }
+}
diff --git a/tests/auto/qml/debugger/qqmlpreview/data/window1.qml b/tests/auto/qml/debugger/qqmlpreview/data/window1.qml
new file mode 100644
index 0000000000..e8e9ad706d
--- /dev/null
+++ b/tests/auto/qml/debugger/qqmlpreview/data/window1.qml
@@ -0,0 +1,43 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Window 2.3
+
+Window {
+ visible: true
+
+ height: 200
+ width: 100
+
+ Timer {
+ interval: 1000
+ running: true
+ onTriggered: console.log("window1.qml");
+ }
+}
diff --git a/tests/auto/qml/debugger/qqmlpreview/data/window2.qml b/tests/auto/qml/debugger/qqmlpreview/data/window2.qml
new file mode 100644
index 0000000000..9ad42d2ee2
--- /dev/null
+++ b/tests/auto/qml/debugger/qqmlpreview/data/window2.qml
@@ -0,0 +1,43 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Window 2.3
+
+Window {
+ visible: true
+
+ height: 100
+ width: 200
+
+ Timer {
+ interval: 1000
+ running: true
+ onTriggered: console.log("window2.qml");
+ }
+}
diff --git a/tests/auto/qml/debugger/qqmlpreview/data/zoom.qml b/tests/auto/qml/debugger/qqmlpreview/data/zoom.qml
new file mode 100644
index 0000000000..0aca235de1
--- /dev/null
+++ b/tests/auto/qml/debugger/qqmlpreview/data/zoom.qml
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Window 2.2
+
+Window {
+ id: w
+ height: 100
+ width: 100
+ visible: true
+
+ Rectangle {
+ width: 50
+ height: 50
+ color: "blue"
+ anchors.centerIn: parent
+ }
+
+ Timer {
+ interval: 100
+ running: true
+ repeat: true
+ onTriggered: console.log("zoom", w.screen.devicePixelRatio)
+ }
+}
diff --git a/tests/auto/qml/debugger/qqmlpreview/qqmlpreview.pro b/tests/auto/qml/debugger/qqmlpreview/qqmlpreview.pro
new file mode 100644
index 0000000000..4a0d385e1a
--- /dev/null
+++ b/tests/auto/qml/debugger/qqmlpreview/qqmlpreview.pro
@@ -0,0 +1,24 @@
+CONFIG += testcase
+TARGET = tst_qqmlpreview
+
+QT += qml testlib core qmldebug-private
+macos:CONFIG -= app_bundle
+
+INCLUDEPATH += ../../../../../src/plugins/qmltooling/qmldbg_preview/
+
+SOURCES += \
+ tst_qqmlpreview.cpp \
+ ../../../../../src/plugins/qmltooling/qmldbg_preview/qqmlpreviewblacklist.cpp
+
+HEADERS += \
+ ../../../../../src/plugins/qmltooling/qmldbg_preview/qqmlpreviewblacklist.h
+
+include(../shared/debugutil.pri)
+
+TESTDATA = \
+ data/window.qml \
+ data/qtquick2.qml \
+ data/window2.qml \
+ data/window1.qml \
+ data/broken.qml \
+ data/zoom.qml
diff --git a/tests/auto/qml/debugger/qqmlpreview/tst_qqmlpreview.cpp b/tests/auto/qml/debugger/qqmlpreview/tst_qqmlpreview.cpp
new file mode 100644
index 0000000000..fa416900d0
--- /dev/null
+++ b/tests/auto/qml/debugger/qqmlpreview/tst_qqmlpreview.cpp
@@ -0,0 +1,317 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qqmldebugprocess_p.h"
+#include "debugutil_p.h"
+#include "qqmlpreviewblacklist.h"
+
+#include <QtTest/qtest.h>
+#include <QtTest/qsignalspy.h>
+#include <QtCore/qtimer.h>
+#include <QtCore/qdebug.h>
+#include <QtCore/qthread.h>
+#include <QtCore/qlibraryinfo.h>
+#include <QtNetwork/qhostaddress.h>
+
+#include <private/qqmldebugconnection_p.h>
+#include <private/qqmlpreviewclient_p.h>
+
+class tst_QQmlPreview : public QQmlDebugTest
+{
+ Q_OBJECT
+
+private:
+ ConnectResult startQmlProcess(const QString &qmlFile);
+ void serveRequest(const QString &path);
+ QList<QQmlDebugClient *> createClients() override;
+
+ QPointer<QQmlPreviewClient> m_client;
+
+ QStringList m_files;
+ QStringList m_filesNotFound;
+ QStringList m_directories;
+ QStringList m_serviceErrors;
+
+private slots:
+ void cleanup() final;
+
+ void connect();
+ void load();
+ void rerun();
+ void blacklist();
+ void error();
+ void zoom();
+};
+
+QQmlDebugTest::ConnectResult tst_QQmlPreview::startQmlProcess(const QString &qmlFile)
+{
+ return QQmlDebugTest::connect(QLibraryInfo::location(QLibraryInfo::BinariesPath) + "/qml",
+ QStringLiteral("QmlPreview"), testFile(qmlFile), true);
+}
+
+void tst_QQmlPreview::serveRequest(const QString &path)
+{
+ QFileInfo info(path);
+
+ if (info.isDir()) {
+ m_directories.append(path);
+ m_client->sendDirectory(path, QDir(path).entryList());
+ } else {
+ QFile file(path);
+ if (file.open(QIODevice::ReadOnly)) {
+ m_files.append(path);
+ m_client->sendFile(path, file.readAll());
+ } else {
+ m_filesNotFound.append(path);
+ m_client->sendError(path);
+ }
+ }
+}
+
+QList<QQmlDebugClient *> tst_QQmlPreview::createClients()
+{
+ m_client = new QQmlPreviewClient(m_connection);
+
+ QObject::connect(m_client, &QQmlPreviewClient::request, this, &tst_QQmlPreview::serveRequest);
+ QObject::connect(m_client, &QQmlPreviewClient::error, this, [this](const QString &error) {
+ m_serviceErrors.append(error);
+ });
+
+ return QList<QQmlDebugClient *>({m_client});
+}
+
+void checkFiles(const QStringList &files)
+{
+ QVERIFY(!files.contains("/etc/localtime"));
+ QVERIFY(!files.contains("/etc/timezome"));
+ QVERIFY(!files.contains(":/qgradient/webgradients.binaryjson"));
+}
+
+void tst_QQmlPreview::cleanup()
+{
+ // Use a separate function so that we don't return early from cleanup() on failure.
+ checkFiles(m_files);
+
+ QQmlDebugTest::cleanup();
+ if (QTest::currentTestFailed()) {
+ qDebug() << "Files loaded:" << m_files;
+ qDebug() << "Files not loaded:" << m_filesNotFound;
+ qDebug() << "Directories loaded:" << m_directories;
+ qDebug() << "Errors reported:" << m_serviceErrors;
+ }
+
+ m_directories.clear();
+ m_files.clear();
+ m_filesNotFound.clear();
+ m_serviceErrors.clear();
+}
+
+void tst_QQmlPreview::connect()
+{
+ const QString file("window.qml");
+ QCOMPARE(startQmlProcess(file), ConnectSuccess);
+ QVERIFY(m_client);
+ QTRY_COMPARE(m_client->state(), QQmlDebugClient::Enabled);
+ m_client->triggerLoad(testFileUrl(file));
+ QTRY_VERIFY(m_files.contains(testFile(file)));
+ QTRY_VERIFY_WITH_TIMEOUT(m_process->output().contains("qml: window.qml"), 10000);
+ m_process->stop();
+ QTRY_COMPARE(m_client->state(), QQmlDebugClient::NotConnected);
+ QVERIFY(m_serviceErrors.isEmpty());
+}
+
+void tst_QQmlPreview::load()
+{
+ const QString file("qtquick2.qml");
+ QCOMPARE(startQmlProcess(file), ConnectSuccess);
+ QVERIFY(m_client);
+ QTRY_COMPARE(m_client->state(), QQmlDebugClient::Enabled);
+ m_client->triggerLoad(testFileUrl(file));
+ QTRY_VERIFY(m_files.contains(testFile(file)));
+ QTRY_VERIFY(m_process->output().contains("ms/degrees"));
+
+ const QStringList files({"window2.qml", "window1.qml", "window.qml"});
+ for (const QString &newFile : files) {
+ m_client->triggerLoad(testFileUrl(newFile));
+ QTRY_VERIFY(m_files.contains(testFile(newFile)));
+ QTRY_VERIFY(m_process->output().contains(QString::fromLatin1("qml: %1").arg(newFile)));
+ }
+
+ m_process->stop();
+ QTRY_COMPARE(m_client->state(), QQmlDebugClient::NotConnected);
+ QVERIFY(m_serviceErrors.isEmpty());
+}
+
+void tst_QQmlPreview::rerun()
+{
+ const QString file("window.qml");
+ QCOMPARE(startQmlProcess(file), ConnectSuccess);
+ QVERIFY(m_client);
+ m_client->triggerLoad(testFileUrl(file));
+ const QLatin1String message("qml: window.qml");
+ QTRY_VERIFY(m_process->output().contains(message));
+ const int pos = m_process->output().lastIndexOf(message) + message.size();
+ QVERIFY(pos >= 0);
+
+ m_client->triggerRerun();
+ QTRY_VERIFY(m_process->output().indexOf(message, pos) >= pos);
+
+ m_process->stop();
+ QVERIFY(m_serviceErrors.isEmpty());
+}
+
+void tst_QQmlPreview::blacklist()
+{
+ QQmlPreviewBlacklist blacklist;
+
+ QStringList strings({
+ "lalala", "lulul", "trakdkd", "suppe", "zack"
+ });
+
+ for (const QString &string : strings)
+ QVERIFY(!blacklist.isBlacklisted(string));
+
+ for (const QString &string : strings)
+ blacklist.blacklist(string);
+
+ for (const QString &string : strings) {
+ QVERIFY(blacklist.isBlacklisted(string));
+ QVERIFY(!blacklist.isBlacklisted(string.left(string.size() / 2)));
+ QVERIFY(!blacklist.isBlacklisted(string + "45"));
+ QVERIFY(!blacklist.isBlacklisted(" " + string));
+ QVERIFY(blacklist.isBlacklisted(string + "/45"));
+ }
+
+ for (auto begin = strings.begin(), it = begin, end = strings.end(); it != end; ++it) {
+ std::rotate(begin, it, end);
+ QString path = "/" + strings.join('/');
+ blacklist.blacklist(path);
+ QVERIFY(blacklist.isBlacklisted(path));
+ QVERIFY(blacklist.isBlacklisted(path + "/file"));
+ QVERIFY(!blacklist.isBlacklisted(path + "more"));
+ path.chop(1);
+ QVERIFY(!blacklist.isBlacklisted(path));
+ std::reverse(begin, end);
+ }
+
+ blacklist.clear();
+ for (const QString &string : strings)
+ QVERIFY(!blacklist.isBlacklisted(string));
+
+ blacklist.blacklist(":/qt-project.org");
+ QVERIFY(blacklist.isBlacklisted(":/qt-project.org/QmlRuntime/conf/configuration.qml"));
+ QVERIFY(!blacklist.isBlacklisted(":/qt-project.orgQmlRuntime/conf/configuration.qml"));
+
+ QQmlPreviewBlacklist blacklist2;
+
+ blacklist2.blacklist(":/qt-project.org");
+ blacklist2.blacklist(":/QtQuick/Controls/Styles");
+ blacklist2.blacklist(":/ExtrasImports/QtQuick/Controls/Styles");
+ blacklist2.blacklist(QLibraryInfo::location(QLibraryInfo::Qml2ImportsPath));
+ blacklist2.blacklist("/home/ulf/.local/share/QtProject/Qml Runtime/configuration.qml");
+ blacklist2.blacklist("/usr/share");
+ blacklist2.blacklist("/usr/share/QtProject/Qml Runtime/configuration.qml");
+ QVERIFY(blacklist2.isBlacklisted(QLibraryInfo::location(QLibraryInfo::Qml2ImportsPath)));
+ blacklist2.blacklist("/usr/local/share/QtProject/Qml Runtime/configuration.qml");
+ blacklist2.blacklist("qml");
+ blacklist2.blacklist(""); // This should not remove all other paths.
+
+ QVERIFY(blacklist2.isBlacklisted(QLibraryInfo::location(QLibraryInfo::Qml2ImportsPath) +
+ "/QtQuick/Window.2.0"));
+ QVERIFY(blacklist2.isBlacklisted(QLibraryInfo::location(QLibraryInfo::Qml2ImportsPath)));
+ QVERIFY(blacklist2.isBlacklisted("/usr/share/QtProject/Qml Runtime/configuration.qml"));
+ QVERIFY(blacklist2.isBlacklisted("/usr/share/stuff"));
+ QVERIFY(blacklist2.isBlacklisted(""));
+
+ QQmlPreviewBlacklist blacklist3;
+ blacklist3.blacklist("/usr/share");
+ blacklist3.blacklist("/usr");
+ blacklist3.blacklist("/usrdings");
+ QVERIFY(blacklist3.isBlacklisted("/usrdings"));
+ QVERIFY(blacklist3.isBlacklisted("/usr/src"));
+ QVERIFY(!blacklist3.isBlacklisted("/opt/share"));
+ QVERIFY(!blacklist3.isBlacklisted("/opt"));
+
+ blacklist3.whitelist("/usr/share");
+ QVERIFY(blacklist3.isBlacklisted("/usrdings"));
+ QVERIFY(!blacklist3.isBlacklisted("/usr"));
+ QVERIFY(!blacklist3.isBlacklisted("/usr/share"));
+ QVERIFY(!blacklist3.isBlacklisted("/usr/src"));
+ QVERIFY(!blacklist3.isBlacklisted("/opt/share"));
+ QVERIFY(!blacklist3.isBlacklisted("/opt"));
+}
+
+void tst_QQmlPreview::error()
+{
+ QCOMPARE(startQmlProcess("window.qml"), ConnectSuccess);
+ QVERIFY(m_client);
+ m_client->triggerLoad(testFileUrl("broken.qml"));
+ QTRY_COMPARE_WITH_TIMEOUT(m_serviceErrors.count(), 1, 10000);
+ QVERIFY(m_serviceErrors.first().contains("broken.qml:32 Expected token `}'"));
+}
+
+static float parseZoomFactor(const QString &output)
+{
+ const QString prefix("zoom ");
+ const int start = output.lastIndexOf(prefix) + prefix.length();
+ if (start < 0)
+ return -1;
+ const int end = output.indexOf('\n', start);
+ if (end < 0)
+ return -1;
+ bool ok = false;
+ const float zoomFactor = output.mid(start, end - start).toFloat(&ok);
+ if (!ok)
+ return -1;
+ return zoomFactor;
+}
+
+void tst_QQmlPreview::zoom()
+{
+ const QString file("zoom.qml");
+ QCOMPARE(startQmlProcess(file), ConnectSuccess);
+ QVERIFY(m_client);
+ m_client->triggerLoad(testFileUrl(file));
+ QTRY_VERIFY(m_files.contains(testFile(file)));
+ float baseZoomFactor = -1;
+ QTRY_VERIFY((baseZoomFactor = parseZoomFactor(m_process->output())) > 0);
+ m_client->triggerZoom(2.0f);
+ QTRY_VERIFY(qFuzzyCompare(parseZoomFactor(m_process->output()), baseZoomFactor * 2.0f));
+ m_client->triggerZoom(1.5f);
+ QTRY_VERIFY(qFuzzyCompare(parseZoomFactor(m_process->output()), baseZoomFactor * 1.5f));
+ m_client->triggerZoom(0.5f);
+ QTRY_VERIFY(qFuzzyCompare(parseZoomFactor(m_process->output()), baseZoomFactor * 0.5f));
+ m_client->triggerZoom(-1.0f);
+ QTRY_VERIFY(qFuzzyCompare(parseZoomFactor(m_process->output()), baseZoomFactor));
+ m_process->stop();
+ QVERIFY(m_serviceErrors.isEmpty());
+}
+
+QTEST_MAIN(tst_QQmlPreview)
+
+#include "tst_qqmlpreview.moc"
diff --git a/tests/auto/qml/debugger/qqmlprofilerservice/data/quit.qml b/tests/auto/qml/debugger/qqmlprofilerservice/data/quit.qml
new file mode 100644
index 0000000000..bc8c2b90ae
--- /dev/null
+++ b/tests/auto/qml/debugger/qqmlprofilerservice/data/quit.qml
@@ -0,0 +1,40 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+//DO NOT CHANGE
+
+Item {
+ Timer {
+ running: true
+ triggeredOnStart: true
+ onTriggered: Qt.quit();
+ }
+}
+
diff --git a/tests/auto/qml/debugger/qqmlprofilerservice/tst_qqmlprofilerservice.cpp b/tests/auto/qml/debugger/qqmlprofilerservice/tst_qqmlprofilerservice.cpp
index 3cb315b355..eb0b0c2fe2 100644
--- a/tests/auto/qml/debugger/qqmlprofilerservice/tst_qqmlprofilerservice.cpp
+++ b/tests/auto/qml/debugger/qqmlprofilerservice/tst_qqmlprofilerservice.cpp
@@ -34,6 +34,7 @@
#include <private/qqmldebugconnection_p.h>
#include <QtTest/qtest.h>
+#include <QtTest/qsignalspy.h>
#include <QtCore/qlibraryinfo.h>
#include <QtGui/private/qguiapplication_p.h>
@@ -195,7 +196,9 @@ private:
};
ConnectResult connect(bool block, const QString &testFile, bool recordFromStart = true,
- uint flushInterval = 0, bool restrictServices = true);
+ uint flushInterval = 0, bool restrictServices = true,
+ const QString &executable
+ = QLibraryInfo::location(QLibraryInfo::BinariesPath) + "/qmlscene");
void checkProcessTerminated();
void checkTraceReceived();
void checkJsHeap();
@@ -221,6 +224,7 @@ private slots:
void translationBinding();
void memory();
void compile();
+ void multiEngine();
private:
bool m_recordFromStart = true;
@@ -237,7 +241,7 @@ private:
QQmlDebugTest::ConnectResult tst_QQmlProfilerService::connect(
bool block, const QString &file, bool recordFromStart, uint flushInterval,
- bool restrictServices)
+ bool restrictServices, const QString &executable)
{
m_recordFromStart = recordFromStart;
m_flushInterval = flushInterval;
@@ -245,7 +249,7 @@ QQmlDebugTest::ConnectResult tst_QQmlProfilerService::connect(
// ### Still using qmlscene due to QTBUG-33377
return QQmlDebugTest::connect(
- QLibraryInfo::location(QLibraryInfo::BinariesPath) + "/qmlscene",
+ executable,
restrictServices ? "CanvasFrameRate,EngineControl,DebugMessages" : QString(),
testFile(file), block);
}
@@ -261,11 +265,13 @@ void tst_QQmlProfilerService::checkProcessTerminated()
QVERIFY(m_client->client);
QTRY_COMPARE(m_client->client->state(), QQmlDebugClient::NotConnected);
QVERIFY(m_process);
+ QVERIFY(m_process->exitStatus() != QProcess::CrashExit);
QTRY_COMPARE(m_process->exitStatus(), QProcess::NormalExit);
}
void tst_QQmlProfilerService::checkTraceReceived()
{
+ QVERIFY(m_process->exitStatus() != QProcess::CrashExit);
QTRY_VERIFY2(m_isComplete, "No trace received in time.");
QVector<qint64> numbers;
@@ -282,6 +288,7 @@ void tst_QQmlProfilerService::checkTraceReceived()
void tst_QQmlProfilerService::checkJsHeap()
{
+ QVERIFY(m_client);
QVERIFY2(m_client->jsHeapMessages.count() > 0, "no JavaScript heap messages received");
bool seen_alloc = false;
@@ -340,6 +347,11 @@ bool tst_QQmlProfilerService::verify(tst_QQmlProfilerService::MessageListType ty
int expectedPosition, const QQmlProfilerEventType &expected,
quint32 checks, const QVector<qint64> &expectedNumbers)
{
+ if (!m_client) {
+ qWarning() << "No debug client available";
+ return false;
+ }
+
const QVector<QQmlProfilerEvent> *target = nullptr;
switch (type) {
case MessageListQML: target = &(m_client->qmlMessages); break;
@@ -349,6 +361,11 @@ bool tst_QQmlProfilerService::verify(tst_QQmlProfilerService::MessageListType ty
case MessageListPixmap: target = &(m_client->pixmapMessages); break;
}
+ if (!target) {
+ qWarning() << "Invalid MessageListType" << type;
+ return false;
+ }
+
if (target->length() <= expectedPosition) {
qWarning() << "Not enough events. expected position:" << expectedPosition
<< "length:" << target->length();
@@ -629,7 +646,7 @@ void tst_QQmlProfilerService::scenegraphData()
void tst_QQmlProfilerService::profileOnExit()
{
- connect(true, "exit.qml");
+ QCOMPARE(connect(true, "exit.qml"), ConnectSuccess);
checkProcessTerminated();
checkTraceReceived();
@@ -711,7 +728,7 @@ void tst_QQmlProfilerService::flushInterval()
void tst_QQmlProfilerService::translationBinding()
{
- connect(true, "qstr.qml");
+ QCOMPARE(connect(true, "qstr.qml"), ConnectSuccess);
checkProcessTerminated();
checkTraceReceived();
@@ -727,12 +744,13 @@ void tst_QQmlProfilerService::translationBinding()
void tst_QQmlProfilerService::memory()
{
- connect(true, "memory.qml");
+ QCOMPARE(connect(true, "memory.qml"), ConnectSuccess);
checkProcessTerminated();
checkTraceReceived();
checkJsHeap();
+ QVERIFY(m_client);
int smallItems = 0;
for (auto message : m_client->jsHeapMessages) {
const QQmlProfilerEventType &type = m_client->types[message.typeIndex()];
@@ -757,6 +775,8 @@ void tst_QQmlProfilerService::compile()
// Flush interval so that we actually get the events before we stop recording.
connect(true, "test.qml", true, 100);
+ QVERIFY(m_client);
+
// We need to check specifically for compile events as we can otherwise stop recording after the
// StartTrace has arrived, but before it compiles anything.
QTRY_VERIFY(hasCompileEvents(m_client->types));
@@ -790,6 +810,22 @@ void tst_QQmlProfilerService::compile()
QCOMPARE(rangeStage, RangeEnd);
}
+void tst_QQmlProfilerService::multiEngine()
+{
+ QCOMPARE(connect(true, "quit.qml", true, 0, false, debugJsServerPath("qqmlprofilerservice")),
+ ConnectSuccess);
+
+ QSignalSpy spy(m_client->client, SIGNAL(complete(qint64)));
+
+ checkTraceReceived();
+ checkJsHeap();
+
+ QTRY_COMPARE(m_process->state(), QProcess::NotRunning);
+ QCOMPARE(m_process->exitStatus(), QProcess::NormalExit);
+
+ QCOMPARE(spy.count(), 1);
+}
+
QTEST_MAIN(tst_QQmlProfilerService)
#include "tst_qqmlprofilerservice.moc"
diff --git a/tests/auto/qml/debugger/qv4debugger/tst_qv4debugger.cpp b/tests/auto/qml/debugger/qv4debugger/tst_qv4debugger.cpp
index c65c592f10..a176f674e6 100644
--- a/tests/auto/qml/debugger/qv4debugger/tst_qv4debugger.cpp
+++ b/tests/auto/qml/debugger/qv4debugger/tst_qv4debugger.cpp
@@ -86,8 +86,7 @@ public:
QV4::Scope scope(v4);
QV4::ScopedString name(scope, v4->newString(functionName));
- QV4::ScopedContext ctx(scope, v4->rootContext());
- QV4::ScopedValue function(scope, FunctionObject::createBuiltinFunction(ctx, name, injectedFunction));
+ QV4::ScopedValue function(scope, FunctionObject::createBuiltinFunction(v4, name, injectedFunction, 0));
v4->globalObject->put(name, function);
}
@@ -220,7 +219,21 @@ public:
{
for (int i = 0, ei = m_stackTrace.size(); i != ei; ++i) {
m_capturedScope.append(NamedRefs());
- ScopeJob job(&collector, i, 0);
+ FrameJob frameJob(&collector, i);
+ debugger->runInEngine(&frameJob);
+ QJsonObject frameObj = frameJob.returnValue();
+ QJsonArray scopes = frameObj.value(QLatin1String("scopes")).toArray();
+ int nscopes = scopes.size();
+ int s = 0;
+ for (s = 0; s < nscopes; ++s) {
+ QJsonObject o = scopes.at(s).toObject();
+ if (o.value(QLatin1String("type")).toInt(-2) == 1) // CallContext
+ break;
+ }
+ if (s == nscopes)
+ return;
+
+ ScopeJob job(&collector, i, s);
debugger->runInEngine(&job);
NamedRefs &refs = m_capturedScope.last();
QJsonObject object = job.returnValue();
@@ -482,7 +495,7 @@ void tst_qv4debugger::conditionalBreakPoint()
QVERIFY(m_debuggerAgent->m_capturedScope.size() > 1);
const TestAgent::NamedRefs &frame0 = m_debuggerAgent->m_capturedScope.at(0);
- QCOMPARE(frame0.size(), 2);
+ QCOMPARE(frame0.size(), 3);
QVERIFY(frame0.contains("i"));
QCOMPARE(frame0.value("i").toInt(), 11);
}
@@ -541,7 +554,7 @@ void tst_qv4debugger::readArguments()
QVERIFY(m_debuggerAgent->m_wasPaused);
QVERIFY(m_debuggerAgent->m_capturedScope.size() > 1);
const TestAgent::NamedRefs &frame0 = m_debuggerAgent->m_capturedScope.at(0);
- QCOMPARE(frame0.size(), 4);
+ QCOMPARE(frame0.size(), 5);
QVERIFY(frame0.contains(QStringLiteral("a")));
QCOMPARE(frame0.type(QStringLiteral("a")), QStringLiteral("number"));
QCOMPARE(frame0.value(QStringLiteral("a")).toDouble(), 1.0);
@@ -565,7 +578,7 @@ void tst_qv4debugger::readComplicatedArguments()
QVERIFY(m_debuggerAgent->m_wasPaused);
QVERIFY(m_debuggerAgent->m_capturedScope.size() > 1);
const TestAgent::NamedRefs &frame0 = m_debuggerAgent->m_capturedScope.at(0);
- QCOMPARE(frame0.size(), 1);
+ QCOMPARE(frame0.size(), 2);
QVERIFY(frame0.contains(QStringLiteral("a")));
QCOMPARE(frame0.type(QStringLiteral("a")), QStringLiteral("number"));
QCOMPARE(frame0.value(QStringLiteral("a")).toInt(), 12);
@@ -589,7 +602,7 @@ void tst_qv4debugger::readLocals()
QVERIFY(m_debuggerAgent->m_wasPaused);
QVERIFY(m_debuggerAgent->m_capturedScope.size() > 1);
const TestAgent::NamedRefs &frame0 = m_debuggerAgent->m_capturedScope.at(0);
- QCOMPARE(frame0.size(), 4); // locals and parameters
+ QCOMPARE(frame0.size(), 5); // locals and parameters
QVERIFY(frame0.contains("c"));
QCOMPARE(frame0.type("c"), QStringLiteral("number"));
QCOMPARE(frame0.value("c").toDouble(), 3.0);
@@ -614,7 +627,7 @@ void tst_qv4debugger::readObject()
QVERIFY(m_debuggerAgent->m_wasPaused);
QVERIFY(m_debuggerAgent->m_capturedScope.size() > 1);
const TestAgent::NamedRefs &frame0 = m_debuggerAgent->m_capturedScope.at(0);
- QCOMPARE(frame0.size(), 2);
+ QCOMPARE(frame0.size(), 3);
QVERIFY(frame0.contains("b"));
QCOMPARE(frame0.type("b"), QStringLiteral("object"));
QJsonObject b = frame0.rawValue("b");
@@ -679,7 +692,7 @@ void tst_qv4debugger::readContextInAllFrames()
for (int i = 0; i < 12; ++i) {
const TestAgent::NamedRefs &scope = m_debuggerAgent->m_capturedScope.at(i);
- QCOMPARE(scope.size(), 2);
+ QCOMPARE(scope.size(), 3);
QVERIFY(scope.contains("n"));
QCOMPARE(scope.type("n"), QStringLiteral("number"));
QCOMPARE(scope.value("n").toDouble(), i + 1.0);
diff --git a/tests/auto/qml/debugger/shared/debugutil.cpp b/tests/auto/qml/debugger/shared/debugutil.cpp
index b118b22c64..68446b53a4 100644
--- a/tests/auto/qml/debugger/shared/debugutil.cpp
+++ b/tests/auto/qml/debugger/shared/debugutil.cpp
@@ -98,6 +98,9 @@ QString QQmlDebugTest::connectionStateString(const QQmlDebugConnection *connecti
QQmlDebugTestClient::QQmlDebugTestClient(const QString &s, QQmlDebugConnection *c)
: QQmlDebugClient(s, c)
{
+ connect(this, &QQmlDebugClient::stateChanged, this, [this](QQmlDebugClient::State newState) {
+ QCOMPARE(newState, state());
+ });
}
QByteArray QQmlDebugTestClient::waitForResponse()
@@ -111,31 +114,12 @@ QByteArray QQmlDebugTestClient::waitForResponse()
return lastMsg;
}
-void QQmlDebugTestClient::stateChanged(State stat)
-{
- QCOMPARE(stat, state());
- emit stateHasChanged();
-}
-
void QQmlDebugTestClient::messageReceived(const QByteArray &ba)
{
lastMsg = ba;
emit serverMessage(ba);
}
-template<typename F>
-struct Finalizer {
- F m_lambda;
- Finalizer(F &&lambda) : m_lambda(std::forward<F>(lambda)) {}
- ~Finalizer() { m_lambda(); }
-};
-
-template<typename F>
-static Finalizer<F> defer(F &&lambda)
-{
- return Finalizer<F>(std::forward<F>(lambda));
-}
-
QQmlDebugTest::ConnectResult QQmlDebugTest::connect(
const QString &executable, const QString &services, const QString &extraArgs,
bool block)
@@ -162,31 +146,27 @@ QQmlDebugTest::ConnectResult QQmlDebugTest::connect(
if (m_clients.contains(nullptr))
return ClientsFailed;
- auto allEnabled = [this]() {
- for (QQmlDebugClient *client : m_clients) {
- if (client->state() != QQmlDebugClient::Enabled)
- return false;
- }
- return true;
- };
+ ClientStateHandler stateHandler(m_clients, createOtherClients(m_connection), services.isEmpty()
+ ? QQmlDebugClient::Enabled : QQmlDebugClient::Unavailable);
- QList<QQmlDebugClient *> others = createOtherClients(m_connection);
- auto deleter = defer([&others]() { qDeleteAll(others); });
- Q_UNUSED(deleter);
const int port = m_process->debugPort();
m_connection->connectToHost(QLatin1String("127.0.0.1"), port);
- for (int tries = 0; tries < 100 && !allEnabled(); ++tries)
- QTest::qWait(50);
- if (!allEnabled())
+
+ QEventLoop loop;
+ QTimer timer;
+ QObject::connect(&stateHandler, &ClientStateHandler::allOk, &loop, &QEventLoop::quit);
+ QObject::connect(m_connection, &QQmlDebugConnection::disconnected, &loop, &QEventLoop::quit);
+ QObject::connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit);
+
+ timer.start(5000);
+ loop.exec();
+
+ if (!stateHandler.allEnabled())
return EnableFailed;
- const QQmlDebugClient::State expectedState = services.isEmpty() ? QQmlDebugClient::Enabled
- : QQmlDebugClient::Unavailable;
- for (QQmlDebugClient *other : others) {
- if (other->state() != expectedState)
- return RestrictFailed;
- }
+ if (!stateHandler.othersAsExpected())
+ return RestrictFailed;
return ConnectSuccess;
}
@@ -211,7 +191,7 @@ void QQmlDebugTest::cleanup()
if (QTest::currentTestFailed()) {
const QString null = QStringLiteral("null");
- qDebug() << "Process State:" << (m_process ? m_process->state() : null);
+ qDebug() << "Process State:" << (m_process ? m_process->stateString() : null);
qDebug() << "Application Output:" << (m_process ? m_process->output() : null);
qDebug() << "Connection State:" << QQmlDebugTest::connectionStateString(m_connection);
for (QQmlDebugClient *client : m_clients) {
@@ -234,3 +214,50 @@ void QQmlDebugTest::cleanup()
m_process = nullptr;
}
}
+
+ClientStateHandler::ClientStateHandler(const QList<QQmlDebugClient *> &clients,
+ const QList<QQmlDebugClient *> &others,
+ QQmlDebugClient::State expectedOthers) :
+ m_clients(clients), m_others(others), m_expectedOthers(expectedOthers)
+{
+ for (QQmlDebugClient *client : m_clients) {
+ QObject::connect(client, &QQmlDebugClient::stateChanged,
+ this, &ClientStateHandler::checkStates);
+ }
+ for (QQmlDebugClient *client : m_others) {
+ QObject::connect(client, &QQmlDebugClient::stateChanged,
+ this, &ClientStateHandler::checkStates);
+ }
+}
+
+ClientStateHandler::~ClientStateHandler()
+{
+ qDeleteAll(m_others);
+}
+
+void ClientStateHandler::checkStates()
+{
+ for (QQmlDebugClient *client : m_clients) {
+ if (client->state() != QQmlDebugClient::Enabled)
+ return;
+ }
+
+ m_allEnabled = true;
+
+ for (QQmlDebugClient *other : m_others) {
+ if (other->state() != m_expectedOthers)
+ return;
+ }
+
+ m_othersAsExpected = true;
+ emit allOk();
+}
+
+QString debugJsServerPath(const QString &selfPath)
+{
+ static const char *debugserver = "qqmldebugjsserver";
+ QString appPath = QCoreApplication::applicationDirPath();
+ const int position = appPath.lastIndexOf(selfPath);
+ return (position == -1 ? appPath : appPath.replace(position, selfPath.length(), debugserver))
+ + "/" + debugserver;
+}
diff --git a/tests/auto/qml/debugger/shared/debugutil_p.h b/tests/auto/qml/debugger/shared/debugutil_p.h
index 94ad83bfce..1c32590305 100644
--- a/tests/auto/qml/debugger/shared/debugutil_p.h
+++ b/tests/auto/qml/debugger/shared/debugutil_p.h
@@ -88,11 +88,9 @@ public:
QByteArray waitForResponse();
signals:
- void stateHasChanged();
void serverMessage(const QByteArray &);
protected:
- virtual void stateChanged(State state);
virtual void messageReceived(const QByteArray &ba);
private:
@@ -116,4 +114,33 @@ public:
}
};
+class ClientStateHandler : public QObject
+{
+ Q_OBJECT
+public:
+ ClientStateHandler(const QList<QQmlDebugClient *> &clients,
+ const QList<QQmlDebugClient *> &others,
+ QQmlDebugClient::State expectedOthers);
+
+ ~ClientStateHandler();
+
+ bool allEnabled() const { return m_allEnabled; }
+ bool othersAsExpected() const { return m_othersAsExpected; }
+
+signals:
+ void allOk();
+
+private:
+ void checkStates();
+
+ const QList<QQmlDebugClient *> m_clients;
+ const QList<QQmlDebugClient *> m_others;
+ const QQmlDebugClient::State m_expectedOthers;
+
+ bool m_allEnabled = false;
+ bool m_othersAsExpected = false;
+};
+
+QString debugJsServerPath(const QString &selfPath);
+
#endif // DEBUGUTIL_P_H
diff --git a/tests/auto/qml/debugger/shared/qqmldebugprocess.cpp b/tests/auto/qml/debugger/shared/qqmldebugprocess.cpp
index f2b85833c9..6f74edf863 100644
--- a/tests/auto/qml/debugger/shared/qqmldebugprocess.cpp
+++ b/tests/auto/qml/debugger/shared/qqmldebugprocess.cpp
@@ -50,6 +50,7 @@ QQmlDebugProcess::QQmlDebugProcess(const QString &executable, QObject *parent)
this, [this]() {
m_timer.stop();
m_eventLoop.quit();
+ emit finished();
});
connect(&m_timer, &QTimer::timeout,
this, &QQmlDebugProcess::timeout);
@@ -60,7 +61,7 @@ QQmlDebugProcess::~QQmlDebugProcess()
stop();
}
-QString QQmlDebugProcess::state()
+QString QQmlDebugProcess::stateString() const
{
QString stateStr;
switch (m_process.state()) {
@@ -155,6 +156,11 @@ bool QQmlDebugProcess::waitForFinished()
return m_process.waitForFinished();
}
+QProcess::ProcessState QQmlDebugProcess::state() const
+{
+ return m_process.state();
+}
+
QProcess::ExitStatus QQmlDebugProcess::exitStatus() const
{
return m_process.exitStatus();
diff --git a/tests/auto/qml/debugger/shared/qqmldebugprocess_p.h b/tests/auto/qml/debugger/shared/qqmldebugprocess_p.h
index fd2c89bb41..945cc58c85 100644
--- a/tests/auto/qml/debugger/shared/qqmldebugprocess_p.h
+++ b/tests/auto/qml/debugger/shared/qqmldebugprocess_p.h
@@ -52,7 +52,7 @@ public:
QQmlDebugProcess(const QString &executable, QObject *parent = 0);
~QQmlDebugProcess();
- QString state();
+ QString stateString() const;
void addEnvironment(const QString &environment);
@@ -61,6 +61,7 @@ public:
int debugPort() const;
bool waitForFinished();
+ QProcess::ProcessState state() const;
QProcess::ExitStatus exitStatus() const;
QString output() const;
@@ -69,6 +70,7 @@ public:
signals:
void readyReadStandardOutput();
+ void finished();
private slots:
void timeout();
diff --git a/tests/auto/qml/debugger/shared/qqmldebugtestservice.cpp b/tests/auto/qml/debugger/shared/qqmldebugtestservice.cpp
index 4dce07d824..896ed608fd 100644
--- a/tests/auto/qml/debugger/shared/qqmldebugtestservice.cpp
+++ b/tests/auto/qml/debugger/shared/qqmldebugtestservice.cpp
@@ -48,5 +48,4 @@ void QQmlDebugTestService::stateAboutToBeChanged(QQmlDebugService::State)
void QQmlDebugTestService::stateChanged(State)
{
Q_ASSERT(QThread::currentThread() != thread());
- emit stateHasChanged();
}
diff --git a/tests/auto/qml/debugger/shared/qqmldebugtestservice.h b/tests/auto/qml/debugger/shared/qqmldebugtestservice.h
index 37b4a9f98c..9c39c0893d 100644
--- a/tests/auto/qml/debugger/shared/qqmldebugtestservice.h
+++ b/tests/auto/qml/debugger/shared/qqmldebugtestservice.h
@@ -38,9 +38,6 @@ class QQmlDebugTestService : public QQmlDebugService
public:
QQmlDebugTestService(const QString &s, float version = 1, QObject *parent = 0);
-signals:
- void stateHasChanged();
-
protected:
virtual void messageReceived(const QByteArray &ba);
virtual void stateAboutToBeChanged(State state);
diff --git a/tests/auto/qml/ecmascripttests/TestExpectations b/tests/auto/qml/ecmascripttests/TestExpectations
index 589f25d174..dbf2e22c63 100644
--- a/tests/auto/qml/ecmascripttests/TestExpectations
+++ b/tests/auto/qml/ecmascripttests/TestExpectations
@@ -1,177 +1,2684 @@
-# wrong tests
-# uses octal number
-15.2.3.6-2-17-1 failing
+# ----- These are tests we will not fix
-# these fail after the update to Unicode 6.3.
-# the reason is that u+180e changed type from whitespace to control
-S9.3.1_A2
-S9.3.1_A3_T1
-S9.3.1_A3_T2
-S15.1.2.2_A2_T10
-S15.1.2.3_A2_T10
-15.5.4.20-3-2
-15.5.4.20-3-3
-15.5.4.20-3-4
-15.5.4.20-3-5
-15.5.4.20-3-6
+# The tests below rely on the ES6 spec quirk that allows 'let' as an identifier. We've
+# always treated 'let' as a reserved keyword (without ever getting a bug report about it),
+# so we'll keep it that way. It also removes a huge headache in the parser.
+language/statements/for-in/let-block-with-newline.js sloppyFails
+language/statements/for-of/let-block-with-newline.js sloppyFails
+language/statements/for/let-block-with-newline.js sloppyFails
+language/statements/if/let-block-with-newline.js sloppyFails
+language/statements/labeled/let-block-with-newline.js sloppyFails
+language/statements/while/let-block-with-newline.js sloppyFails
+language/statements/with/let-block-with-newline.js sloppyFails
+language/statements/for-in/let-identifier-with-newline.js sloppyFails
+language/statements/for-of/let-identifier-with-newline.js sloppyFails
+language/statements/for/let-identifier-with-newline.js sloppyFails
+language/statements/if/let-identifier-with-newline.js sloppyFails
+language/statements/labeled/let-identifier-with-newline.js sloppyFails
+language/statements/while/let-identifier-with-newline.js sloppyFails
+language/statements/with/let-identifier-with-newline.js sloppyFails
-11.2.3-3_3 failing
-S13_A15_T4 failing
-S15.4.4.3_A1_T1 failing
-S15.4.4.3_A3_T1 failing
-S15.5.4.11_A5_T1 failing
-S15.2.4.4_A14 failing
-# Function declarations in conditionals. We allow them, because the real
-# world requires them.
-Sbp_12.5_A9_T3 failing
-Sbp_12.6.1_A13_T3 failing
-Sbp_12.6.2_A13_T3 failing
-Sbp_12.6.4_A13_T3 failing
-
-# es6: function length attributes are configurable, wasn't in es5
-S15.1.2.2_A9.2 failing
-S15.1.3.1_A5.2 failing
-S15.1.3.2_A5.2 failing
-S15.1.3.3_A5.2 failing
-S15.1.2.3_A7.2 failing
-S15.1.2.4_A2.2 failing
-S15.1.2.5_A2.2 failing
-S15.1.3.4_A5.2 failing
-15.2.3.3-4-186 failing
-S15.2.4.2_A9 failing
-S15.2.4.3_A9 failing
-S15.2.4.4_A9 failing
-S15.2.4.5_A9 failing
-S15.2.4.6_A9 failing
-S15.2.4.7_A9 failing
-15.3.3.2-1 failing
-15.4.4.2_A4.2
-S15.3.4.2_A9 failing
-S15.3.4.3_A9 failing
-S15.3.4.4_A9 failing
-15.3.4.5-15-2 failing
-S15.4.4.2_A4.2 failing
-S15.4.4.3_A4.2 failing
-S15.4.4.4_A4.2 failing
-S15.4.4.5_A6.2 failing
-S15.4.4.6_A5.2 failing
-S15.4.4.7_A6.2 failing
-S15.4.4.8_A5.2 failing
-S15.4.4.9_A5.2 failing
-S15.4.4.10_A5.2 failing
-S15.4.4.11_A7.2 failing
-S15.4.4.12_A5.2 failing
-S15.4.4.13_A5.2 failing
-S15.5.4.10_A9 failing
-S15.5.4.11_A9 failing
-S15.5.4.12_A9 failing
-S15.5.4.13_A9 failing
-S15.5.4.14_A9 failing
-S15.5.4.15_A9 failing
-S15.5.4.16_A9 failing
-S15.5.4.17_A9 failing
-S15.5.4.18_A9 failing
-S15.5.4.19_A9 failing
-S15.5.4.4_A9 failing
-S15.5.4.5_A9 failing
-S15.5.4.6_A9 failing
-S15.5.4.7_A9 failing
-S15.5.4.8_A9 failing
-S15.5.4.9_A9 failing
-S15.9.4.2_A3_T2 failing
-S15.9.4.3_A3_T2 failing
-S15.9.5.2_A3_T2 failing
-S15.9.5.3_A3_T2 failing
-S15.9.5.4_A3_T2 failing
-S15.9.5.5_A3_T2 failing
-S15.9.5.1_A3_T2 failing
-S15.9.5.10_A3_T2 failing
-S15.9.5.11_A3_T2 failing
-S15.9.5.12_A3_T2 failing
-S15.9.5.13_A3_T2 failing
-S15.9.5.14_A3_T2 failing
-S15.9.5.15_A3_T2 failing
-S15.9.5.16_A3_T2 failing
-S15.9.5.17_A3_T2 failing
-S15.9.5.18_A3_T2 failing
-S15.9.5.19_A3_T2 failing
-S15.9.5.20_A3_T2 failing
-S15.9.5.21_A3_T2 failing
-S15.9.5.22_A3_T2 failing
-S15.9.5.23_A3_T2 failing
-S15.9.5.24_A3_T2 failing
-S15.9.5.25_A3_T2 failing
-S15.9.5.26_A3_T2 failing
-S15.9.5.27_A3_T2 failing
-S15.9.5.28_A3_T2 failing
-S15.9.5.29_A3_T2 failing
-S15.9.5.30_A3_T2 failing
-S15.9.5.31_A3_T2 failing
-S15.9.5.32_A3_T2 failing
-S15.9.5.33_A3_T2 failing
-S15.9.5.34_A3_T2 failing
-S15.9.5.35_A3_T2 failing
-S15.9.5.36_A3_T2 failing
-S15.9.5.37_A3_T2 failing
-S15.9.5.38_A3_T2 failing
-S15.9.5.39_A3_T2 failing
-S15.9.5.40_A3_T2 failing
-S15.9.5.41_A3_T2 failing
-S15.9.5.42_A3_T2 failing
-S15.9.5.6_A3_T2 failing
-S15.9.5.7_A3_T2 failing
-S15.9.5.8_A3_T2 failing
-S15.9.5.9_A3_T2 failing
-S15.10.6.2_A9 failing
-S15.10.6.3_A9 failing
-S15.10.6.4_A9 failing
-
-# es6: Object.freeze(v) on a non-object returns v, no longer TypeError
-15.2.3.9-1 failing
-15.2.3.9-1-1 failing
-15.2.3.9-1-2 failing
-15.2.3.9-1-3 failing
-15.2.3.9-1-4 failing
-# es6: Object.preventExtensions(O) on a non-object, no longer TypeError
-15.2.3.10-1 failing
-15.2.3.10-1-3 failing
-15.2.3.10-1-4 failing
-# es6: Object.isSealed(O) on a non-object, no longer TypeError
-15.2.3.11-1
-# es6: Object.isFrozen(O) on a non-object, no longer TypeError
-15.2.3.12-1
-15.2.3.12-1-3
-15.2.3.12-1-4
-# es6: Object.isExtensible(O) on a non-object, no longer TypeError
-15.2.3.13-1
-15.2.3.13-1-3
-15.2.3.13-1-4
-# es6: Object.keys(O) on a non-object, no longer TypeError
-15.2.3.14-1-1
-15.2.3.14-1-2
-15.2.3.14-1-3
-15.2.3.14-1
-15.2.3.14-2
-15.2.3.14-3
-# es6: Object.getOwnPropertyDescriptor(O) on a non-object, no longer TypeError
-15.2.3.3-1
-15.2.3.3-1-3
-15.2.3.3-1-4
-# es6: Object.getPrototypeOf(O) on a non-object, no longer TypeError
-15.2.3.2-1
-15.2.3.2-1-3
-15.2.3.2-1-4
-# es6: Object.getOwnPropertyNames(O) on a non-object, no longer TypeError
-15.2.3.4-1
-15.2.3.4-1-4
-15.2.3.4-1-5
-# es6: Object.seal(O) on a non-object, no longer TypeError
-15.2.3.8-1
-15.2.3.8-1-1
-15.2.3.8-1-2
-15.2.3.8-1-3
-15.2.3.8-1-4
-
-# es6: Date.prototype is no longer a DateObject
-15.9.5.40_1 failing
+# ----- test failures that should be fixed
+built-ins/Array/from/iter-cstm-ctor-err.js fails
+built-ins/Array/from/proto-from-ctor-realm.js fails
+built-ins/Array/isArray/proxy-revoked.js fails
+built-ins/Array/isArray/proxy.js fails
+built-ins/Array/length/define-own-prop-length-overflow-realm.js fails
+built-ins/Array/of/proto-from-ctor-realm.js fails
+built-ins/Array/proto-from-ctor-realm.js fails
+built-ins/Array/prototype/Symbol.unscopables/prop-desc.js fails
+built-ins/Array/prototype/Symbol.unscopables/value.js fails
+built-ins/Array/prototype/concat/Array.prototype.concat_array-like-length-to-string-throws.js fails
+built-ins/Array/prototype/concat/Array.prototype.concat_array-like-length-value-of-throws.js fails
+built-ins/Array/prototype/concat/Array.prototype.concat_array-like-negative-length.js fails
+built-ins/Array/prototype/concat/Array.prototype.concat_array-like-primitive-non-number-length.js fails
+built-ins/Array/prototype/concat/Array.prototype.concat_array-like-string-length.js fails
+built-ins/Array/prototype/concat/Array.prototype.concat_array-like-to-length-throws.js fails
+built-ins/Array/prototype/concat/Array.prototype.concat_array-like.js fails
+built-ins/Array/prototype/concat/Array.prototype.concat_holey-sloppy-arguments.js fails
+built-ins/Array/prototype/concat/Array.prototype.concat_large-typed-array.js fails
+built-ins/Array/prototype/concat/Array.prototype.concat_length-throws.js fails
+built-ins/Array/prototype/concat/Array.prototype.concat_sloppy-arguments-throws.js fails
+built-ins/Array/prototype/concat/Array.prototype.concat_sloppy-arguments-with-dupes.js sloppyFails
+built-ins/Array/prototype/concat/Array.prototype.concat_sloppy-arguments.js fails
+built-ins/Array/prototype/concat/Array.prototype.concat_small-typed-array.js fails
+built-ins/Array/prototype/concat/Array.prototype.concat_spreadable-boolean-wrapper.js fails
+built-ins/Array/prototype/concat/Array.prototype.concat_spreadable-function.js fails
+built-ins/Array/prototype/concat/Array.prototype.concat_spreadable-getter-throws.js fails
+built-ins/Array/prototype/concat/Array.prototype.concat_spreadable-number-wrapper.js fails
+built-ins/Array/prototype/concat/Array.prototype.concat_spreadable-reg-exp.js fails
+built-ins/Array/prototype/concat/Array.prototype.concat_spreadable-sparse-object.js fails
+built-ins/Array/prototype/concat/Array.prototype.concat_spreadable-string-wrapper.js fails
+built-ins/Array/prototype/concat/Array.prototype.concat_strict-arguments.js fails
+built-ins/Array/prototype/concat/S15.4.4.4_A3_T2.js fails
+built-ins/Array/prototype/concat/S15.4.4.4_A3_T3.js fails
+built-ins/Array/prototype/concat/create-ctor-non-object.js fails
+built-ins/Array/prototype/concat/create-proto-from-ctor-realm-array.js fails
+built-ins/Array/prototype/concat/create-proto-from-ctor-realm-non-array.js fails
+built-ins/Array/prototype/concat/create-proxy.js fails
+built-ins/Array/prototype/concat/create-revoked-proxy.js fails
+built-ins/Array/prototype/concat/create-species-non-ctor.js fails
+built-ins/Array/prototype/concat/create-species.js fails
+built-ins/Array/prototype/concat/is-concat-spreadable-is-array-proxy-revoked.js fails
+built-ins/Array/prototype/concat/is-concat-spreadable-proxy-revoked.js fails
+built-ins/Array/prototype/concat/is-concat-spreadable-proxy.js fails
+built-ins/Array/prototype/concat/is-concat-spreadable-val-falsey.js fails
+built-ins/Array/prototype/concat/is-concat-spreadable-val-truthy.js fails
+built-ins/Array/prototype/every/15.4.4.16-3-29.js fails
+built-ins/Array/prototype/filter/create-ctor-non-object.js fails
+built-ins/Array/prototype/filter/create-proto-from-ctor-realm-array.js fails
+built-ins/Array/prototype/filter/create-proto-from-ctor-realm-non-array.js fails
+built-ins/Array/prototype/filter/create-proxy.js fails
+built-ins/Array/prototype/filter/create-species-non-ctor.js fails
+built-ins/Array/prototype/filter/create-species.js fails
+built-ins/Array/prototype/includes/length-boundaries.js fails
+built-ins/Array/prototype/indexOf/15.4.4.14-3-28.js fails
+built-ins/Array/prototype/indexOf/15.4.4.14-3-29.js fails
+built-ins/Array/prototype/join/S15.4.4.5_A4_T3.js fails
+built-ins/Array/prototype/lastIndexOf/15.4.4.15-3-28.js fails
+built-ins/Array/prototype/map/create-ctor-non-object.js fails
+built-ins/Array/prototype/map/create-proto-from-ctor-realm-array.js fails
+built-ins/Array/prototype/map/create-proto-from-ctor-realm-non-array.js fails
+built-ins/Array/prototype/map/create-proxy.js fails
+built-ins/Array/prototype/map/create-species-non-ctor.js fails
+built-ins/Array/prototype/map/create-species.js fails
+built-ins/Array/prototype/pop/S15.4.4.6_A2_T2.js fails
+built-ins/Array/prototype/pop/S15.4.4.6_A3_T1.js fails
+built-ins/Array/prototype/pop/S15.4.4.6_A3_T2.js fails
+built-ins/Array/prototype/pop/clamps-to-integer-limit.js fails
+built-ins/Array/prototype/pop/length-near-integer-limit.js fails
+built-ins/Array/prototype/push/S15.4.4.7_A2_T2.js fails
+built-ins/Array/prototype/push/S15.4.4.7_A3.js fails
+built-ins/Array/prototype/push/throws-if-integer-limit-exceeded.js fails
+built-ins/Array/prototype/reverse/length-exceeding-integer-limit-with-object.js fails
+built-ins/Array/prototype/reverse/length-exceeding-integer-limit-with-proxy.js fails
+built-ins/Array/prototype/slice/S15.4.4.10_A3_T1.js fails
+built-ins/Array/prototype/slice/S15.4.4.10_A3_T2.js fails
+built-ins/Array/prototype/slice/create-ctor-non-object.js fails
+built-ins/Array/prototype/slice/create-non-array-invalid-len.js fails
+built-ins/Array/prototype/slice/create-proto-from-ctor-realm-array.js fails
+built-ins/Array/prototype/slice/create-proto-from-ctor-realm-non-array.js fails
+built-ins/Array/prototype/slice/create-proxied-array-invalid-len.js fails
+built-ins/Array/prototype/slice/create-proxy.js fails
+built-ins/Array/prototype/slice/create-species-neg-zero.js fails
+built-ins/Array/prototype/slice/create-species-non-ctor.js fails
+built-ins/Array/prototype/slice/create-species.js fails
+built-ins/Array/prototype/slice/length-exceeding-integer-limit-proxied-array.js fails
+built-ins/Array/prototype/slice/length-exceeding-integer-limit.js fails
+built-ins/Array/prototype/some/15.4.4.17-3-28.js fails
+built-ins/Array/prototype/some/15.4.4.17-3-29.js fails
+built-ins/Array/prototype/sort/comparefn-nonfunction-call-throws.js fails
+built-ins/Array/prototype/splice/S15.4.4.12_A3_T1.js fails
+built-ins/Array/prototype/splice/clamps-length-to-integer-limit.js fails
+built-ins/Array/prototype/splice/create-ctor-non-object.js fails
+built-ins/Array/prototype/splice/create-proto-from-ctor-realm-array.js fails
+built-ins/Array/prototype/splice/create-proto-from-ctor-realm-non-array.js fails
+built-ins/Array/prototype/splice/create-proxy.js fails
+built-ins/Array/prototype/splice/create-species-length-exceeding-integer-limit.js fails
+built-ins/Array/prototype/splice/create-species-neg-zero.js fails
+built-ins/Array/prototype/splice/create-species-non-ctor.js fails
+built-ins/Array/prototype/splice/create-species.js fails
+built-ins/Array/prototype/splice/length-and-deleteCount-exceeding-integer-limit.js fails
+built-ins/Array/prototype/splice/length-exceeding-integer-limit-shrink-array.js fails
+built-ins/Array/prototype/splice/length-near-integer-limit-grow-array.js fails
+built-ins/Array/prototype/toLocaleString/S15.4.4.3_A1_T1.js fails
+built-ins/Array/prototype/toLocaleString/S15.4.4.3_A3_T1.js fails
+built-ins/Array/prototype/toLocaleString/primitive_this_value.js strictFails
+built-ins/Array/prototype/toLocaleString/primitive_this_value_getter.js strictFails
+built-ins/Array/prototype/unshift/clamps-to-integer-limit.js fails
+built-ins/Array/prototype/unshift/length-near-integer-limit.js fails
+built-ins/Array/prototype/unshift/throws-if-integer-limit-exceeded.js fails
+built-ins/ArrayBuffer/data-allocation-after-object-creation.js fails
+built-ins/ArrayBuffer/proto-from-ctor-realm.js fails
+built-ins/ArrayBuffer/prototype-from-newtarget.js fails
+built-ins/ArrayBuffer/prototype/byteLength/detached-buffer.js fails
+built-ins/ArrayBuffer/prototype/slice/end-default-if-absent.js fails
+built-ins/ArrayBuffer/prototype/slice/end-default-if-undefined.js fails
+built-ins/ArrayBuffer/prototype/slice/end-exceeds-length.js fails
+built-ins/ArrayBuffer/prototype/slice/negative-end.js fails
+built-ins/ArrayBuffer/prototype/slice/negative-start.js fails
+built-ins/ArrayBuffer/prototype/slice/nonconstructor.js fails
+built-ins/ArrayBuffer/prototype/slice/species-constructor-is-undefined.js fails
+built-ins/ArrayBuffer/prototype/slice/species-is-null.js fails
+built-ins/ArrayBuffer/prototype/slice/species-is-undefined.js fails
+built-ins/ArrayBuffer/prototype/slice/species-returns-larger-arraybuffer.js fails
+built-ins/ArrayBuffer/prototype/slice/species.js fails
+built-ins/ArrayBuffer/prototype/slice/start-default-if-absent.js fails
+built-ins/ArrayBuffer/prototype/slice/start-default-if-undefined.js fails
+built-ins/ArrayBuffer/prototype/slice/start-exceeds-end.js fails
+built-ins/ArrayBuffer/prototype/slice/start-exceeds-length.js fails
+built-ins/ArrayBuffer/prototype/slice/tointeger-conversion-end.js fails
+built-ins/ArrayBuffer/prototype/slice/tointeger-conversion-start.js fails
+built-ins/ArrayBuffer/undefined-newtarget-throws.js fails
+built-ins/ArrayIteratorPrototype/next/detach-typedarray-in-progress.js fails
+built-ins/AsyncFunction/AsyncFunction-construct.js fails
+built-ins/AsyncFunction/AsyncFunction-is-extensible.js fails
+built-ins/AsyncFunction/AsyncFunction-is-subclass.js fails
+built-ins/AsyncFunction/AsyncFunction-length.js fails
+built-ins/AsyncFunction/AsyncFunction-name.js fails
+built-ins/AsyncFunction/AsyncFunction-prototype.js fails
+built-ins/AsyncFunction/AsyncFunction.js fails
+built-ins/AsyncFunction/AsyncFunctionPrototype-is-extensible.js fails
+built-ins/AsyncFunction/AsyncFunctionPrototype-prototype.js fails
+built-ins/AsyncFunction/AsyncFunctionPrototype-to-string.js fails
+built-ins/AsyncFunction/instance-construct-throws.js fails
+built-ins/AsyncFunction/instance-has-name.js fails
+built-ins/AsyncFunction/instance-length.js fails
+built-ins/AsyncFunction/instance-prototype-property.js fails
+built-ins/AsyncGeneratorPrototype/next/name.js fails
+built-ins/AsyncGeneratorPrototype/return/name.js fails
+built-ins/AsyncGeneratorPrototype/throw/name.js fails
+built-ins/Atomics/Symbol.toStringTag.js fails
+built-ins/Atomics/add/descriptor.js fails
+built-ins/Atomics/add/length.js fails
+built-ins/Atomics/add/name.js fails
+built-ins/Atomics/add/nonshared-int-views.js fails
+built-ins/Atomics/add/shared-nonint-views.js fails
+built-ins/Atomics/and/descriptor.js fails
+built-ins/Atomics/and/length.js fails
+built-ins/Atomics/and/name.js fails
+built-ins/Atomics/and/nonshared-int-views.js fails
+built-ins/Atomics/and/shared-nonint-views.js fails
+built-ins/Atomics/compareExchange/descriptor.js fails
+built-ins/Atomics/compareExchange/length.js fails
+built-ins/Atomics/compareExchange/name.js fails
+built-ins/Atomics/compareExchange/nonshared-int-views.js fails
+built-ins/Atomics/compareExchange/shared-nonint-views.js fails
+built-ins/Atomics/exchange/descriptor.js fails
+built-ins/Atomics/exchange/length.js fails
+built-ins/Atomics/exchange/name.js fails
+built-ins/Atomics/exchange/nonshared-int-views.js fails
+built-ins/Atomics/exchange/shared-nonint-views.js fails
+built-ins/Atomics/isLockFree/corner-cases.js fails
+built-ins/Atomics/isLockFree/descriptor.js fails
+built-ins/Atomics/isLockFree/length.js fails
+built-ins/Atomics/isLockFree/name.js fails
+built-ins/Atomics/isLockFree/value.js fails
+built-ins/Atomics/load/descriptor.js fails
+built-ins/Atomics/load/length.js fails
+built-ins/Atomics/load/name.js fails
+built-ins/Atomics/load/nonshared-int-views.js fails
+built-ins/Atomics/load/shared-nonint-views.js fails
+built-ins/Atomics/or/descriptor.js fails
+built-ins/Atomics/or/length.js fails
+built-ins/Atomics/or/name.js fails
+built-ins/Atomics/or/nonshared-int-views.js fails
+built-ins/Atomics/or/shared-nonint-views.js fails
+built-ins/Atomics/prop-desc.js fails
+built-ins/Atomics/proto.js fails
+built-ins/Atomics/store/descriptor.js fails
+built-ins/Atomics/store/length.js fails
+built-ins/Atomics/store/name.js fails
+built-ins/Atomics/store/nonshared-int-views.js fails
+built-ins/Atomics/store/shared-nonint-views.js fails
+built-ins/Atomics/sub/descriptor.js fails
+built-ins/Atomics/sub/length.js fails
+built-ins/Atomics/sub/name.js fails
+built-ins/Atomics/sub/nonshared-int-views.js fails
+built-ins/Atomics/sub/shared-nonint-views.js fails
+built-ins/Atomics/wait/descriptor.js fails
+built-ins/Atomics/wait/did-timeout.js fails
+built-ins/Atomics/wait/good-views.js fails
+built-ins/Atomics/wait/length.js fails
+built-ins/Atomics/wait/name.js fails
+built-ins/Atomics/wait/nan-timeout.js fails
+built-ins/Atomics/wait/negative-timeout.js fails
+built-ins/Atomics/wait/no-spurious-wakeup.js fails
+built-ins/Atomics/wait/nonshared-int-views.js fails
+built-ins/Atomics/wait/shared-nonint-views.js fails
+built-ins/Atomics/wait/was-woken.js fails
+built-ins/Atomics/wake/counts.js fails
+built-ins/Atomics/wake/descriptor.js fails
+built-ins/Atomics/wake/length.js fails
+built-ins/Atomics/wake/name.js fails
+built-ins/Atomics/wake/nonshared-int-views.js fails
+built-ins/Atomics/wake/shared-nonint-views.js fails
+built-ins/Atomics/wake/wake-all-on-loc.js fails
+built-ins/Atomics/wake/wake-all.js fails
+built-ins/Atomics/wake/wake-in-order.js fails
+built-ins/Atomics/wake/wake-nan.js fails
+built-ins/Atomics/wake/wake-negative.js fails
+built-ins/Atomics/wake/wake-one.js fails
+built-ins/Atomics/wake/wake-two.js fails
+built-ins/Atomics/wake/wake-zero.js fails
+built-ins/Atomics/xor/descriptor.js fails
+built-ins/Atomics/xor/length.js fails
+built-ins/Atomics/xor/name.js fails
+built-ins/Atomics/xor/nonshared-int-views.js fails
+built-ins/Atomics/xor/shared-nonint-views.js fails
+built-ins/Boolean/proto-from-ctor-realm.js fails
+built-ins/DataView/custom-proto-access-throws.js fails
+built-ins/DataView/custom-proto-if-object-is-used.js fails
+built-ins/DataView/detached-buffer.js fails
+built-ins/DataView/length.js fails
+built-ins/DataView/newtarget-undefined-throws.js fails
+built-ins/DataView/proto-from-ctor-realm.js fails
+built-ins/DataView/prototype/buffer/detached-buffer.js fails
+built-ins/DataView/prototype/byteLength/detached-buffer.js fails
+built-ins/DataView/prototype/byteOffset/detached-buffer.js fails
+built-ins/DataView/prototype/getFloat32/detached-buffer-after-toindex-byteoffset.js fails
+built-ins/DataView/prototype/getFloat32/detached-buffer-before-outofrange-byteoffset.js fails
+built-ins/DataView/prototype/getFloat32/detached-buffer.js fails
+built-ins/DataView/prototype/getFloat32/index-is-out-of-range.js fails
+built-ins/DataView/prototype/getFloat32/negative-byteoffset-throws.js fails
+built-ins/DataView/prototype/getFloat32/toindex-byteoffset.js fails
+built-ins/DataView/prototype/getFloat64/detached-buffer-after-toindex-byteoffset.js fails
+built-ins/DataView/prototype/getFloat64/detached-buffer-before-outofrange-byteoffset.js fails
+built-ins/DataView/prototype/getFloat64/detached-buffer.js fails
+built-ins/DataView/prototype/getFloat64/index-is-out-of-range.js fails
+built-ins/DataView/prototype/getFloat64/negative-byteoffset-throws.js fails
+built-ins/DataView/prototype/getFloat64/toindex-byteoffset.js fails
+built-ins/DataView/prototype/getInt16/detached-buffer-after-toindex-byteoffset.js fails
+built-ins/DataView/prototype/getInt16/detached-buffer-before-outofrange-byteoffset.js fails
+built-ins/DataView/prototype/getInt16/detached-buffer.js fails
+built-ins/DataView/prototype/getInt16/index-is-out-of-range.js fails
+built-ins/DataView/prototype/getInt16/negative-byteoffset-throws.js fails
+built-ins/DataView/prototype/getInt16/toindex-byteoffset.js fails
+built-ins/DataView/prototype/getInt32/detached-buffer-after-toindex-byteoffset.js fails
+built-ins/DataView/prototype/getInt32/detached-buffer-before-outofrange-byteoffset.js fails
+built-ins/DataView/prototype/getInt32/detached-buffer.js fails
+built-ins/DataView/prototype/getInt32/index-is-out-of-range.js fails
+built-ins/DataView/prototype/getInt32/negative-byteoffset-throws.js fails
+built-ins/DataView/prototype/getInt32/toindex-byteoffset.js fails
+built-ins/DataView/prototype/getInt8/detached-buffer-after-toindex-byteoffset.js fails
+built-ins/DataView/prototype/getInt8/detached-buffer-before-outofrange-byteoffset.js fails
+built-ins/DataView/prototype/getInt8/detached-buffer.js fails
+built-ins/DataView/prototype/getInt8/index-is-out-of-range.js fails
+built-ins/DataView/prototype/getInt8/negative-byteoffset-throws.js fails
+built-ins/DataView/prototype/getInt8/toindex-byteoffset.js fails
+built-ins/DataView/prototype/getUint16/detached-buffer-after-toindex-byteoffset.js fails
+built-ins/DataView/prototype/getUint16/detached-buffer-before-outofrange-byteoffset.js fails
+built-ins/DataView/prototype/getUint16/detached-buffer.js fails
+built-ins/DataView/prototype/getUint16/index-is-out-of-range.js fails
+built-ins/DataView/prototype/getUint16/negative-byteoffset-throws.js fails
+built-ins/DataView/prototype/getUint16/toindex-byteoffset.js fails
+built-ins/DataView/prototype/getUint32/detached-buffer-after-toindex-byteoffset.js fails
+built-ins/DataView/prototype/getUint32/detached-buffer-before-outofrange-byteoffset.js fails
+built-ins/DataView/prototype/getUint32/detached-buffer.js fails
+built-ins/DataView/prototype/getUint32/index-is-out-of-range.js fails
+built-ins/DataView/prototype/getUint32/negative-byteoffset-throws.js fails
+built-ins/DataView/prototype/getUint32/toindex-byteoffset.js fails
+built-ins/DataView/prototype/getUint8/detached-buffer-after-toindex-byteoffset.js fails
+built-ins/DataView/prototype/getUint8/detached-buffer-before-outofrange-byteoffset.js fails
+built-ins/DataView/prototype/getUint8/detached-buffer.js fails
+built-ins/DataView/prototype/getUint8/index-is-out-of-range.js fails
+built-ins/DataView/prototype/getUint8/negative-byteoffset-throws.js fails
+built-ins/DataView/prototype/getUint8/toindex-byteoffset.js fails
+built-ins/DataView/prototype/setFloat32/detached-buffer-after-number-value.js fails
+built-ins/DataView/prototype/setFloat32/detached-buffer-after-toindex-byteoffset.js fails
+built-ins/DataView/prototype/setFloat32/detached-buffer-before-outofrange-byteoffset.js fails
+built-ins/DataView/prototype/setFloat32/detached-buffer.js fails
+built-ins/DataView/prototype/setFloat32/index-check-before-value-conversion.js fails
+built-ins/DataView/prototype/setFloat32/index-is-out-of-range.js fails
+built-ins/DataView/prototype/setFloat32/negative-byteoffset-throws.js fails
+built-ins/DataView/prototype/setFloat32/range-check-after-value-conversion.js fails
+built-ins/DataView/prototype/setFloat32/toindex-byteoffset.js fails
+built-ins/DataView/prototype/setFloat64/detached-buffer-after-number-value.js fails
+built-ins/DataView/prototype/setFloat64/detached-buffer-after-toindex-byteoffset.js fails
+built-ins/DataView/prototype/setFloat64/detached-buffer-before-outofrange-byteoffset.js fails
+built-ins/DataView/prototype/setFloat64/detached-buffer.js fails
+built-ins/DataView/prototype/setFloat64/index-check-before-value-conversion.js fails
+built-ins/DataView/prototype/setFloat64/index-is-out-of-range.js fails
+built-ins/DataView/prototype/setFloat64/negative-byteoffset-throws.js fails
+built-ins/DataView/prototype/setFloat64/range-check-after-value-conversion.js fails
+built-ins/DataView/prototype/setFloat64/toindex-byteoffset.js fails
+built-ins/DataView/prototype/setInt16/detached-buffer-after-number-value.js fails
+built-ins/DataView/prototype/setInt16/detached-buffer-after-toindex-byteoffset.js fails
+built-ins/DataView/prototype/setInt16/detached-buffer-before-outofrange-byteoffset.js fails
+built-ins/DataView/prototype/setInt16/detached-buffer.js fails
+built-ins/DataView/prototype/setInt16/index-check-before-value-conversion.js fails
+built-ins/DataView/prototype/setInt16/index-is-out-of-range.js fails
+built-ins/DataView/prototype/setInt16/negative-byteoffset-throws.js fails
+built-ins/DataView/prototype/setInt16/range-check-after-value-conversion.js fails
+built-ins/DataView/prototype/setInt16/toindex-byteoffset.js fails
+built-ins/DataView/prototype/setInt32/detached-buffer-after-number-value.js fails
+built-ins/DataView/prototype/setInt32/detached-buffer-after-toindex-byteoffset.js fails
+built-ins/DataView/prototype/setInt32/detached-buffer-before-outofrange-byteoffset.js fails
+built-ins/DataView/prototype/setInt32/detached-buffer.js fails
+built-ins/DataView/prototype/setInt32/index-check-before-value-conversion.js fails
+built-ins/DataView/prototype/setInt32/index-is-out-of-range.js fails
+built-ins/DataView/prototype/setInt32/negative-byteoffset-throws.js fails
+built-ins/DataView/prototype/setInt32/range-check-after-value-conversion.js fails
+built-ins/DataView/prototype/setInt32/toindex-byteoffset.js fails
+built-ins/DataView/prototype/setInt8/detached-buffer-after-number-value.js fails
+built-ins/DataView/prototype/setInt8/detached-buffer-after-toindex-byteoffset.js fails
+built-ins/DataView/prototype/setInt8/detached-buffer-before-outofrange-byteoffset.js fails
+built-ins/DataView/prototype/setInt8/detached-buffer.js fails
+built-ins/DataView/prototype/setInt8/index-check-before-value-conversion.js fails
+built-ins/DataView/prototype/setInt8/index-is-out-of-range.js fails
+built-ins/DataView/prototype/setInt8/negative-byteoffset-throws.js fails
+built-ins/DataView/prototype/setInt8/range-check-after-value-conversion.js fails
+built-ins/DataView/prototype/setInt8/toindex-byteoffset.js fails
+built-ins/DataView/prototype/setUint16/detached-buffer-after-number-value.js fails
+built-ins/DataView/prototype/setUint16/detached-buffer-after-toindex-byteoffset.js fails
+built-ins/DataView/prototype/setUint16/detached-buffer-before-outofrange-byteoffset.js fails
+built-ins/DataView/prototype/setUint16/detached-buffer.js fails
+built-ins/DataView/prototype/setUint16/index-check-before-value-conversion.js fails
+built-ins/DataView/prototype/setUint16/index-is-out-of-range.js fails
+built-ins/DataView/prototype/setUint16/negative-byteoffset-throws.js fails
+built-ins/DataView/prototype/setUint16/range-check-after-value-conversion.js fails
+built-ins/DataView/prototype/setUint16/toindex-byteoffset.js fails
+built-ins/DataView/prototype/setUint32/detached-buffer-after-number-value.js fails
+built-ins/DataView/prototype/setUint32/detached-buffer-after-toindex-byteoffset.js fails
+built-ins/DataView/prototype/setUint32/detached-buffer-before-outofrange-byteoffset.js fails
+built-ins/DataView/prototype/setUint32/detached-buffer.js fails
+built-ins/DataView/prototype/setUint32/index-check-before-value-conversion.js fails
+built-ins/DataView/prototype/setUint32/index-is-out-of-range.js fails
+built-ins/DataView/prototype/setUint32/negative-byteoffset-throws.js fails
+built-ins/DataView/prototype/setUint32/range-check-after-value-conversion.js fails
+built-ins/DataView/prototype/setUint32/toindex-byteoffset.js fails
+built-ins/DataView/prototype/setUint8/detached-buffer-after-number-value.js fails
+built-ins/DataView/prototype/setUint8/detached-buffer-after-toindex-byteoffset.js fails
+built-ins/DataView/prototype/setUint8/detached-buffer-before-outofrange-byteoffset.js fails
+built-ins/DataView/prototype/setUint8/detached-buffer.js fails
+built-ins/DataView/prototype/setUint8/index-check-before-value-conversion.js fails
+built-ins/DataView/prototype/setUint8/index-is-out-of-range.js fails
+built-ins/DataView/prototype/setUint8/negative-byteoffset-throws.js fails
+built-ins/DataView/prototype/setUint8/range-check-after-value-conversion.js fails
+built-ins/DataView/prototype/setUint8/toindex-byteoffset.js fails
+built-ins/DataView/toindex-bytelength.js fails
+built-ins/DataView/toindex-byteoffset.js fails
+built-ins/Date/UTC/infinity-make-day.js fails
+built-ins/Date/UTC/nans.js fails
+built-ins/Date/UTC/no-arg.js fails
+built-ins/Date/UTC/non-integer-values.js fails
+built-ins/Date/UTC/return-value.js fails
+built-ins/Date/UTC/year-offset.js fails
+built-ins/Date/proto-from-ctor-realm-one.js fails
+built-ins/Date/proto-from-ctor-realm-two.js fails
+built-ins/Date/proto-from-ctor-realm-zero.js fails
+built-ins/Date/prototype/toDateString/format.js fails
+built-ins/Date/prototype/toDateString/invalid-date.js fails
+built-ins/Date/prototype/toString/format.js fails
+built-ins/Date/prototype/toTimeString/format.js fails
+built-ins/Date/prototype/toTimeString/invalid-date.js fails
+built-ins/Date/prototype/toUTCString/day-names.js fails
+built-ins/Date/prototype/toUTCString/format.js fails
+built-ins/Date/prototype/toUTCString/month-names.js fails
+built-ins/Date/subclassing.js fails
+built-ins/Error/proto-from-ctor-realm.js fails
+built-ins/Error/prototype/S15.11.4_A2.js fails
+built-ins/Function/call-bind-this-realm-undef.js fails
+built-ins/Function/call-bind-this-realm-value.js fails
+built-ins/Function/internals/Call/class-ctor-realm.js fails
+built-ins/Function/internals/Construct/base-ctor-revoked-proxy-realm.js fails
+built-ins/Function/internals/Construct/base-ctor-revoked-proxy.js fails
+built-ins/Function/internals/Construct/derived-return-val-realm.js fails
+built-ins/Function/internals/Construct/derived-this-uninitialized-realm.js fails
+built-ins/Function/internals/Construct/derived-this-uninitialized.js fails
+built-ins/Function/proto-from-ctor-realm.js fails
+built-ins/Function/prototype/Symbol.hasInstance/this-val-not-callable.js fails
+built-ins/Function/prototype/Symbol.hasInstance/this-val-poisoned-prototype.js fails
+built-ins/Function/prototype/Symbol.hasInstance/value-non-obj.js fails
+built-ins/Function/prototype/bind/BoundFunction_restricted-properties.js fails
+built-ins/Function/prototype/bind/get-fn-realm.js fails
+built-ins/Function/prototype/bind/instance-name-chained.js fails
+built-ins/Function/prototype/bind/instance-name-non-string.js fails
+built-ins/Function/prototype/bind/instance-name.js fails
+built-ins/Function/prototype/bind/proto-from-ctor-realm.js fails
+built-ins/Function/prototype/toString/AsyncFunction.js fails
+built-ins/Function/prototype/toString/Function.js fails
+built-ins/Function/prototype/toString/GeneratorFunction.js fails
+built-ins/Function/prototype/toString/anonymous-intrinsics.js fails
+built-ins/Function/prototype/toString/arrow-function.js fails
+built-ins/Function/prototype/toString/async-arrow-function.js fails
+built-ins/Function/prototype/toString/async-function-declaration.js fails
+built-ins/Function/prototype/toString/async-function-expression.js fails
+built-ins/Function/prototype/toString/async-method-class-expression-static.js fails
+built-ins/Function/prototype/toString/async-method-class-expression.js fails
+built-ins/Function/prototype/toString/async-method-class-statement-static.js fails
+built-ins/Function/prototype/toString/async-method-class-statement.js fails
+built-ins/Function/prototype/toString/async-method-object.js fails
+built-ins/Function/prototype/toString/bound-function.js fails
+built-ins/Function/prototype/toString/class-declaration-complex-heritage.js fails
+built-ins/Function/prototype/toString/class-declaration-explicit-ctor.js fails
+built-ins/Function/prototype/toString/class-declaration-implicit-ctor.js fails
+built-ins/Function/prototype/toString/class-expression-explicit-ctor.js fails
+built-ins/Function/prototype/toString/class-expression-implicit-ctor.js fails
+built-ins/Function/prototype/toString/function-declaration-non-simple-parameter-list.js fails
+built-ins/Function/prototype/toString/function-declaration.js fails
+built-ins/Function/prototype/toString/function-expression.js fails
+built-ins/Function/prototype/toString/generator-function-declaration.js fails
+built-ins/Function/prototype/toString/generator-function-expression.js fails
+built-ins/Function/prototype/toString/generator-method.js fails
+built-ins/Function/prototype/toString/getter-class-expression-static.js fails
+built-ins/Function/prototype/toString/getter-class-expression.js fails
+built-ins/Function/prototype/toString/getter-class-statement-static.js fails
+built-ins/Function/prototype/toString/getter-class-statement.js fails
+built-ins/Function/prototype/toString/getter-object.js fails
+built-ins/Function/prototype/toString/intrinsics.js fails
+built-ins/Function/prototype/toString/line-terminator-normalisation-CR-LF.js fails
+built-ins/Function/prototype/toString/line-terminator-normalisation-CR.js fails
+built-ins/Function/prototype/toString/line-terminator-normalisation-LF.js fails
+built-ins/Function/prototype/toString/method-class-expression-static.js fails
+built-ins/Function/prototype/toString/method-class-expression.js fails
+built-ins/Function/prototype/toString/method-class-statement-static.js fails
+built-ins/Function/prototype/toString/method-class-statement.js fails
+built-ins/Function/prototype/toString/method-computed-property-name.js fails
+built-ins/Function/prototype/toString/method-object.js fails
+built-ins/Function/prototype/toString/proxy.js fails
+built-ins/Function/prototype/toString/setter-class-expression-static.js fails
+built-ins/Function/prototype/toString/setter-class-expression.js fails
+built-ins/Function/prototype/toString/setter-class-statement-static.js fails
+built-ins/Function/prototype/toString/setter-class-statement.js fails
+built-ins/Function/prototype/toString/setter-object.js fails
+built-ins/Function/prototype/toString/symbol-named-builtins.js fails
+built-ins/Function/prototype/toString/unicode.js fails
+built-ins/GeneratorFunction/proto-from-ctor-realm.js fails
+built-ins/JSON/parse/revived-proxy-revoked.js fails
+built-ins/JSON/parse/revived-proxy.js fails
+built-ins/JSON/stringify/replacer-proxy-revoked.js fails
+built-ins/JSON/stringify/replacer-proxy.js fails
+built-ins/JSON/stringify/value-proxy.js fails
+built-ins/Map/iterable-calls-set.js fails
+built-ins/Map/iterator-close-after-set-failure.js fails
+built-ins/Map/iterator-is-undefined-throws.js fails
+built-ins/Map/iterator-item-first-entry-returns-abrupt.js fails
+built-ins/Map/iterator-item-second-entry-returns-abrupt.js fails
+built-ins/Map/iterator-items-are-not-object-close-iterator.js fails
+built-ins/Map/iterator-items-are-not-object.js fails
+built-ins/Map/map-iterable-throws-when-set-is-not-callable.js fails
+built-ins/Map/map-iterable.js fails
+built-ins/Map/proto-from-ctor-realm.js fails
+built-ins/Map/prototype/clear/context-is-weakmap-object-throws.js fails
+built-ins/Map/prototype/delete/context-is-weakmap-object-throws.js fails
+built-ins/Map/prototype/delete/does-not-break-iterators.js fails
+built-ins/Map/prototype/delete/returns-true-for-deleted-entry.js fails
+built-ins/Map/prototype/entries/does-not-have-mapdata-internal-slot-weakmap.js fails
+built-ins/Map/prototype/forEach/callback-parameters.js fails
+built-ins/Map/prototype/forEach/deleted-values-during-foreach.js fails
+built-ins/Map/prototype/forEach/does-not-have-mapdata-internal-slot-weakmap.js fails
+built-ins/Map/prototype/forEach/iterates-in-key-insertion-order.js fails
+built-ins/Map/prototype/forEach/iterates-values-added-after-foreach-begins.js fails
+built-ins/Map/prototype/forEach/iterates-values-deleted-then-readded.js fails
+built-ins/Map/prototype/get/does-not-have-mapdata-internal-slot-weakmap.js fails
+built-ins/Map/prototype/has/does-not-have-mapdata-internal-slot-weakmap.js fails
+built-ins/Map/prototype/keys/does-not-have-mapdata-internal-slot-weakmap.js fails
+built-ins/Map/prototype/set/append-new-values.js fails
+built-ins/Map/prototype/set/does-not-have-mapdata-internal-slot-weakmap.js fails
+built-ins/Map/prototype/set/length.js fails
+built-ins/Map/prototype/size/does-not-have-mapdata-internal-slot-weakmap.js fails
+built-ins/Map/prototype/size/returns-count-of-present-values-by-iterable.js fails
+built-ins/Map/prototype/values/does-not-have-mapdata-internal-slot-weakmap.js fails
+built-ins/Math/max/zeros.js fails
+built-ins/Math/round/S15.8.2.15_A7.js fails
+built-ins/NativeErrors/EvalError/proto.js fails
+built-ins/NativeErrors/EvalError/prototype/not-error-object.js fails
+built-ins/NativeErrors/RangeError/proto.js fails
+built-ins/NativeErrors/RangeError/prototype/not-error-object.js fails
+built-ins/NativeErrors/ReferenceError/proto.js fails
+built-ins/NativeErrors/ReferenceError/prototype/not-error-object.js fails
+built-ins/NativeErrors/SyntaxError/proto.js fails
+built-ins/NativeErrors/SyntaxError/prototype/not-error-object.js fails
+built-ins/NativeErrors/TypeError/proto.js fails
+built-ins/NativeErrors/TypeError/prototype/not-error-object.js fails
+built-ins/NativeErrors/URIError/proto.js fails
+built-ins/NativeErrors/URIError/prototype/not-error-object.js fails
+built-ins/Number/isFinite/arg-is-not-number.js fails
+built-ins/Number/isNaN/arg-is-not-number.js fails
+built-ins/Number/proto-from-ctor-realm.js fails
+built-ins/Number/prototype/toExponential/infinity.js fails
+built-ins/Number/prototype/toExponential/nan.js fails
+built-ins/Number/prototype/toExponential/range.js fails
+built-ins/Number/prototype/toFixed/range.js fails
+built-ins/Number/prototype/toPrecision/infinity.js fails
+built-ins/Number/prototype/toPrecision/nan.js fails
+built-ins/Number/prototype/toPrecision/range.js fails
+built-ins/Number/prototype/toPrecision/return-values.js fails
+built-ins/Number/string-binary-literal.js fails
+built-ins/Number/string-hex-literal-invalid.js fails
+built-ins/Number/string-octal-literal.js fails
+built-ins/Object/assign/Target-Symbol.js fails
+built-ins/Object/assign/source-own-prop-desc-missing.js fails
+built-ins/Object/create/15.2.3.5-4-14.js strictFails
+built-ins/Object/create/15.2.3.5-4-37.js strictFails
+built-ins/Object/entries/exception-during-enumeration.js fails
+built-ins/Object/entries/function-length.js fails
+built-ins/Object/entries/function-name.js fails
+built-ins/Object/entries/function-property-descriptor.js fails
+built-ins/Object/entries/getter-adding-key.js fails
+built-ins/Object/entries/getter-making-future-key-nonenumerable.js fails
+built-ins/Object/entries/getter-removing-future-key.js fails
+built-ins/Object/entries/inherited-properties-omitted.js fails
+built-ins/Object/entries/observable-operations.js fails
+built-ins/Object/entries/primitive-booleans.js fails
+built-ins/Object/entries/primitive-numbers.js fails
+built-ins/Object/entries/primitive-strings.js fails
+built-ins/Object/entries/primitive-symbols.js fails
+built-ins/Object/entries/symbols-omitted.js fails
+built-ins/Object/entries/tamper-with-global-object.js fails
+built-ins/Object/entries/tamper-with-object-keys.js fails
+built-ins/Object/getOwnPropertyDescriptor/15.2.3.3-4-212.js fails
+built-ins/Object/getOwnPropertyDescriptor/15.2.3.3-4-213.js fails
+built-ins/Object/getOwnPropertyDescriptor/15.2.3.3-4-214.js fails
+built-ins/Object/getOwnPropertyDescriptor/15.2.3.3-4-215.js fails
+built-ins/Object/getOwnPropertyDescriptors/function-length.js fails
+built-ins/Object/getOwnPropertyDescriptors/function-name.js fails
+built-ins/Object/getOwnPropertyDescriptors/function-property-descriptor.js fails
+built-ins/Object/getOwnPropertyDescriptors/inherited-properties-omitted.js fails
+built-ins/Object/getOwnPropertyDescriptors/normal-object.js fails
+built-ins/Object/getOwnPropertyDescriptors/observable-operations.js fails
+built-ins/Object/getOwnPropertyDescriptors/primitive-booleans.js fails
+built-ins/Object/getOwnPropertyDescriptors/primitive-numbers.js fails
+built-ins/Object/getOwnPropertyDescriptors/primitive-strings.js fails
+built-ins/Object/getOwnPropertyDescriptors/primitive-symbols.js fails
+built-ins/Object/getOwnPropertyDescriptors/proxy-undefined-descriptor.js fails
+built-ins/Object/getOwnPropertyDescriptors/symbols-included.js fails
+built-ins/Object/getOwnPropertyDescriptors/tamper-with-global-object.js fails
+built-ins/Object/getOwnPropertyDescriptors/tamper-with-object-keys.js fails
+built-ins/Object/getPrototypeOf/15.2.3.2-2-12.js fails
+built-ins/Object/getPrototypeOf/15.2.3.2-2-13.js fails
+built-ins/Object/getPrototypeOf/15.2.3.2-2-14.js fails
+built-ins/Object/getPrototypeOf/15.2.3.2-2-15.js fails
+built-ins/Object/getPrototypeOf/15.2.3.2-2-16.js fails
+built-ins/Object/getPrototypeOf/15.2.3.2-2-17.js fails
+built-ins/Object/isExtensible/15.2.3.13-1-1.js fails
+built-ins/Object/isExtensible/15.2.3.13-1-2.js fails
+built-ins/Object/isFrozen/15.2.3.12-1-1.js fails
+built-ins/Object/isFrozen/15.2.3.12-1-2.js fails
+built-ins/Object/keys/proxy-keys.js fails
+built-ins/Object/preventExtensions/15.2.3.10-1-1.js fails
+built-ins/Object/preventExtensions/15.2.3.10-1-2.js fails
+built-ins/Object/proto-from-ctor.js fails
+built-ins/Object/prototype/toLocaleString/primitive_this_value_getter.js strictFails
+built-ins/Object/prototype/toString/no-prototype-property.js fails
+built-ins/Object/prototype/toString/proxy-array.js fails
+built-ins/Object/prototype/toString/proxy-function.js fails
+built-ins/Object/prototype/valueOf/S15.2.4.4_A14.js fails
+built-ins/Object/values/exception-during-enumeration.js fails
+built-ins/Object/values/function-length.js fails
+built-ins/Object/values/function-name.js fails
+built-ins/Object/values/function-property-descriptor.js fails
+built-ins/Object/values/getter-adding-key.js fails
+built-ins/Object/values/getter-making-future-key-nonenumerable.js fails
+built-ins/Object/values/getter-removing-future-key.js fails
+built-ins/Object/values/inherited-properties-omitted.js fails
+built-ins/Object/values/observable-operations.js fails
+built-ins/Object/values/primitive-booleans.js fails
+built-ins/Object/values/primitive-numbers.js fails
+built-ins/Object/values/primitive-strings.js fails
+built-ins/Object/values/primitive-symbols.js fails
+built-ins/Object/values/symbols-omitted.js fails
+built-ins/Object/values/tamper-with-global-object.js fails
+built-ins/Object/values/tamper-with-object-keys.js fails
+built-ins/Promise/S25.4.3.1_A1.1_T1.js fails
+built-ins/Promise/S25.4.3.1_A2.1_T1.js fails
+built-ins/Promise/S25.4.3.1_A2.2_T1.js fails
+built-ins/Promise/S25.4.3.1_A3.1_T1.js fails
+built-ins/Promise/Symbol.species/length.js fails
+built-ins/Promise/Symbol.species/prop-desc.js fails
+built-ins/Promise/Symbol.species/return-value.js fails
+built-ins/Promise/Symbol.species/symbol-species-name.js fails
+built-ins/Promise/Symbol.species/symbol-species.js fails
+built-ins/Promise/all/S25.4.4.1_A1.1_T1.js fails
+built-ins/Promise/all/S25.4.4.1_A2.1_T1.js fails
+built-ins/Promise/all/S25.4.4.1_A4.1_T1.js fails
+built-ins/Promise/all/S25.4.4.1_A6.1_T1.js fails
+built-ins/Promise/all/call-resolve-element-after-return.js fails
+built-ins/Promise/all/call-resolve-element-items.js fails
+built-ins/Promise/all/call-resolve-element.js fails
+built-ins/Promise/all/capability-executor-called-twice.js fails
+built-ins/Promise/all/capability-executor-not-callable.js fails
+built-ins/Promise/all/capability-resolve-throws-no-close.js fails
+built-ins/Promise/all/ctx-ctor-throws.js fails
+built-ins/Promise/all/ctx-ctor.js fails
+built-ins/Promise/all/ctx-non-ctor.js fails
+built-ins/Promise/all/ctx-non-object.js fails
+built-ins/Promise/all/invoke-resolve-error-close.js fails
+built-ins/Promise/all/invoke-resolve-get-error-close.js fails
+built-ins/Promise/all/invoke-resolve-return.js fails
+built-ins/Promise/all/invoke-resolve.js fails
+built-ins/Promise/all/invoke-then-error-close.js fails
+built-ins/Promise/all/invoke-then-get-error-close.js fails
+built-ins/Promise/all/invoke-then.js fails
+built-ins/Promise/all/iter-next-val-err-no-close.js fails
+built-ins/Promise/all/iter-step-err-no-close.js fails
+built-ins/Promise/all/length.js fails
+built-ins/Promise/all/name.js fails
+built-ins/Promise/all/new-resolve-function.js fails
+built-ins/Promise/all/prop-desc.js fails
+built-ins/Promise/all/resolve-before-loop-exit-from-same.js fails
+built-ins/Promise/all/resolve-before-loop-exit.js fails
+built-ins/Promise/all/resolve-element-function-extensible.js fails
+built-ins/Promise/all/resolve-element-function-length.js fails
+built-ins/Promise/all/resolve-element-function-name.js fails
+built-ins/Promise/all/resolve-element-function-nonconstructor.js fails
+built-ins/Promise/all/resolve-element-function-prototype.js fails
+built-ins/Promise/all/resolve-from-same-thenable.js fails
+built-ins/Promise/all/same-reject-function.js fails
+built-ins/Promise/all/species-get-error.js fails
+built-ins/Promise/exec-args.js fails
+built-ins/Promise/executor-function-extensible.js fails
+built-ins/Promise/executor-function-length.js fails
+built-ins/Promise/executor-function-name.js fails
+built-ins/Promise/executor-function-nonconstructor.js fails
+built-ins/Promise/executor-function-prototype.js fails
+built-ins/Promise/length.js fails
+built-ins/Promise/name.js fails
+built-ins/Promise/proto-from-ctor-realm.js fails
+built-ins/Promise/prototype/S25.4.4.2_A1.1_T1.js fails
+built-ins/Promise/prototype/S25.4.5_A3.1_T1.js fails
+built-ins/Promise/prototype/Symbol.toStringTag.js fails
+built-ins/Promise/prototype/catch/S25.4.5.1_A1.1_T1.js fails
+built-ins/Promise/prototype/catch/S25.4.5.1_A2.1_T1.js fails
+built-ins/Promise/prototype/catch/invokes-then.js fails
+built-ins/Promise/prototype/catch/length.js fails
+built-ins/Promise/prototype/catch/name.js fails
+built-ins/Promise/prototype/catch/prop-desc.js fails
+built-ins/Promise/prototype/catch/this-value-non-object.js fails
+built-ins/Promise/prototype/catch/this-value-obj-coercible.js fails
+built-ins/Promise/prototype/catch/this-value-then-not-callable.js fails
+built-ins/Promise/prototype/catch/this-value-then-poisoned.js fails
+built-ins/Promise/prototype/catch/this-value-then-throws.js fails
+built-ins/Promise/prototype/no-promise-state.js fails
+built-ins/Promise/prototype/prop-desc.js fails
+built-ins/Promise/prototype/proto.js fails
+built-ins/Promise/prototype/then/S25.4.5.3_A1.1_T1.js fails
+built-ins/Promise/prototype/then/S25.4.5.3_A1.1_T2.js fails
+built-ins/Promise/prototype/then/S25.4.5.3_A2.1_T1.js fails
+built-ins/Promise/prototype/then/S25.4.5.3_A2.1_T2.js fails
+built-ins/Promise/prototype/then/capability-executor-called-twice.js fails
+built-ins/Promise/prototype/then/capability-executor-not-callable.js fails
+built-ins/Promise/prototype/then/context-check-on-entry.js fails
+built-ins/Promise/prototype/then/ctor-custom.js fails
+built-ins/Promise/prototype/then/ctor-null.js fails
+built-ins/Promise/prototype/then/ctor-poisoned.js fails
+built-ins/Promise/prototype/then/ctor-throws.js fails
+built-ins/Promise/prototype/then/ctor-undef.js fails
+built-ins/Promise/prototype/then/length.js fails
+built-ins/Promise/prototype/then/name.js fails
+built-ins/Promise/prototype/then/prop-desc.js fails
+built-ins/Promise/race/S25.4.4.3_A1.1_T1.js fails
+built-ins/Promise/race/S25.4.4.3_A2.1_T1.js fails
+built-ins/Promise/race/S25.4.4.3_A3.1_T1.js fails
+built-ins/Promise/race/S25.4.4.3_A3.1_T2.js fails
+built-ins/Promise/race/capability-executor-called-twice.js fails
+built-ins/Promise/race/capability-executor-not-callable.js fails
+built-ins/Promise/race/ctx-ctor-throws.js fails
+built-ins/Promise/race/ctx-ctor.js fails
+built-ins/Promise/race/ctx-non-ctor.js fails
+built-ins/Promise/race/ctx-non-object.js fails
+built-ins/Promise/race/invoke-resolve-error-close.js fails
+built-ins/Promise/race/invoke-resolve-get-error-close.js fails
+built-ins/Promise/race/invoke-resolve-return.js fails
+built-ins/Promise/race/invoke-resolve.js fails
+built-ins/Promise/race/invoke-then-error-close.js fails
+built-ins/Promise/race/invoke-then-get-error-close.js fails
+built-ins/Promise/race/invoke-then.js fails
+built-ins/Promise/race/iter-next-val-err-no-close.js fails
+built-ins/Promise/race/iter-step-err-no-close.js fails
+built-ins/Promise/race/length.js fails
+built-ins/Promise/race/name.js fails
+built-ins/Promise/race/prop-desc.js fails
+built-ins/Promise/race/same-reject-function.js fails
+built-ins/Promise/race/same-resolve-function.js fails
+built-ins/Promise/race/species-get-error.js fails
+built-ins/Promise/reject-function-extensible.js fails
+built-ins/Promise/reject-function-length.js fails
+built-ins/Promise/reject-function-name.js fails
+built-ins/Promise/reject-function-nonconstructor.js fails
+built-ins/Promise/reject-function-prototype.js fails
+built-ins/Promise/reject/S25.4.4.4_A1.1_T1.js fails
+built-ins/Promise/reject/S25.4.4.4_A3.1_T1.js fails
+built-ins/Promise/reject/capability-executor-called-twice.js fails
+built-ins/Promise/reject/capability-executor-not-callable.js fails
+built-ins/Promise/reject/capability-invocation-error.js fails
+built-ins/Promise/reject/capability-invocation.js fails
+built-ins/Promise/reject/ctx-ctor-throws.js fails
+built-ins/Promise/reject/ctx-ctor.js fails
+built-ins/Promise/reject/ctx-non-ctor.js fails
+built-ins/Promise/reject/ctx-non-object.js fails
+built-ins/Promise/reject/length.js fails
+built-ins/Promise/reject/name.js fails
+built-ins/Promise/reject/prop-desc.js fails
+built-ins/Promise/resolve-function-extensible.js fails
+built-ins/Promise/resolve-function-length.js fails
+built-ins/Promise/resolve-function-name.js fails
+built-ins/Promise/resolve-function-nonconstructor.js fails
+built-ins/Promise/resolve-function-prototype.js fails
+built-ins/Promise/resolve/S25.4.4.5_A1.1_T1.js fails
+built-ins/Promise/resolve/S25.4.4.5_A2.1_T1.js fails
+built-ins/Promise/resolve/arg-uniq-ctor.js fails
+built-ins/Promise/resolve/capability-executor-called-twice.js fails
+built-ins/Promise/resolve/capability-executor-not-callable.js fails
+built-ins/Promise/resolve/capability-invocation-error.js fails
+built-ins/Promise/resolve/context-non-object-with-promise.js fails
+built-ins/Promise/resolve/ctx-ctor-throws.js fails
+built-ins/Promise/resolve/ctx-ctor.js fails
+built-ins/Promise/resolve/ctx-non-ctor.js fails
+built-ins/Promise/resolve/ctx-non-object.js fails
+built-ins/Promise/resolve/length.js fails
+built-ins/Promise/resolve/name.js fails
+built-ins/Promise/resolve/prop-desc.js fails
+built-ins/Promise/resolve/resolve-from-promise-capability.js fails
+built-ins/Promise/resolve/resolve-prms-cstm-then.js fails
+built-ins/Proxy/apply/arguments-realm.js fails
+built-ins/Proxy/apply/call-parameters.js fails
+built-ins/Proxy/apply/call-result.js fails
+built-ins/Proxy/apply/return-abrupt.js fails
+built-ins/Proxy/apply/trap-is-not-callable-realm.js fails
+built-ins/Proxy/apply/trap-is-null.js fails
+built-ins/Proxy/apply/trap-is-undefined-no-property.js fails
+built-ins/Proxy/apply/trap-is-undefined.js fails
+built-ins/Proxy/construct/arguments-realm.js fails
+built-ins/Proxy/construct/call-parameters-new-target.js fails
+built-ins/Proxy/construct/call-parameters.js fails
+built-ins/Proxy/construct/call-result.js fails
+built-ins/Proxy/construct/return-is-abrupt.js fails
+built-ins/Proxy/construct/trap-is-not-callable-realm.js fails
+built-ins/Proxy/construct/trap-is-null.js fails
+built-ins/Proxy/construct/trap-is-undefined-no-property.js fails
+built-ins/Proxy/construct/trap-is-undefined-proto-from-ctor-realm.js fails
+built-ins/Proxy/construct/trap-is-undefined.js fails
+built-ins/Proxy/create-target-is-not-constructor.js fails
+built-ins/Proxy/defineProperty/desc-realm.js fails
+built-ins/Proxy/defineProperty/null-handler-realm.js fails
+built-ins/Proxy/defineProperty/targetdesc-configurable-desc-not-configurable-realm.js fails
+built-ins/Proxy/defineProperty/targetdesc-not-compatible-descriptor-not-configurable-target-realm.js fails
+built-ins/Proxy/defineProperty/targetdesc-not-compatible-descriptor-not-configurable-target.js fails
+built-ins/Proxy/defineProperty/targetdesc-not-compatible-descriptor-realm.js fails
+built-ins/Proxy/defineProperty/targetdesc-not-compatible-descriptor.js fails
+built-ins/Proxy/defineProperty/targetdesc-undefined-not-configurable-descriptor-realm.js fails
+built-ins/Proxy/defineProperty/targetdesc-undefined-target-is-not-extensible-realm.js fails
+built-ins/Proxy/defineProperty/trap-is-not-callable-realm.js fails
+built-ins/Proxy/deleteProperty/trap-is-not-callable-realm.js fails
+built-ins/Proxy/enumerate/removed-does-not-trigger.js fails
+built-ins/Proxy/get-fn-realm.js fails
+built-ins/Proxy/get/trap-is-not-callable-realm.js fails
+built-ins/Proxy/get/trap-is-undefined-receiver.js fails
+built-ins/Proxy/getOwnPropertyDescriptor/result-type-is-not-object-nor-undefined-realm.js fails
+built-ins/Proxy/getOwnPropertyDescriptor/result-type-is-not-object-nor-undefined.js fails
+built-ins/Proxy/getOwnPropertyDescriptor/resultdesc-is-invalid-descriptor.js fails
+built-ins/Proxy/getOwnPropertyDescriptor/resultdesc-is-not-configurable-targetdesc-is-configurable.js fails
+built-ins/Proxy/getOwnPropertyDescriptor/resultdesc-return-not-configurable.js fails
+built-ins/Proxy/getOwnPropertyDescriptor/trap-is-not-callable-realm.js fails
+built-ins/Proxy/getOwnPropertyDescriptor/trap-is-undefined.js fails
+built-ins/Proxy/getPrototypeOf/trap-is-not-callable-realm.js fails
+built-ins/Proxy/has/call-object-create.js fails
+built-ins/Proxy/has/call-with.js sloppyFails
+built-ins/Proxy/has/return-false-target-not-extensible-using-with.js sloppyFails
+built-ins/Proxy/has/return-false-target-prop-exists-using-with.js sloppyFails
+built-ins/Proxy/has/return-false-targetdesc-not-configurable-using-with.js sloppyFails
+built-ins/Proxy/has/return-is-abrupt-with.js sloppyFails
+built-ins/Proxy/has/trap-is-not-callable-realm.js fails
+built-ins/Proxy/has/trap-is-not-callable-using-with.js sloppyFails
+built-ins/Proxy/isExtensible/trap-is-not-callable-realm.js fails
+built-ins/Proxy/ownKeys/call-parameters-object-getownpropertynames.js fails
+built-ins/Proxy/ownKeys/call-parameters-object-getownpropertysymbols.js fails
+built-ins/Proxy/ownKeys/call-parameters-object-keys.js fails
+built-ins/Proxy/ownKeys/extensible-return-trap-result-absent-not-configurable-keys.js fails
+built-ins/Proxy/ownKeys/extensible-return-trap-result.js fails
+built-ins/Proxy/ownKeys/not-extensible-missing-keys-throws.js fails
+built-ins/Proxy/ownKeys/not-extensible-new-keys-throws.js fails
+built-ins/Proxy/ownKeys/not-extensible-return-keys.js fails
+built-ins/Proxy/ownKeys/null-handler.js fails
+built-ins/Proxy/ownKeys/return-all-non-configurable-keys.js fails
+built-ins/Proxy/ownKeys/return-duplicate-entries-throws.js fails
+built-ins/Proxy/ownKeys/return-duplicate-symbol-entries-throws.js fails
+built-ins/Proxy/ownKeys/return-not-list-object-throws-realm.js fails
+built-ins/Proxy/ownKeys/return-not-list-object-throws.js fails
+built-ins/Proxy/ownKeys/return-type-throws-array.js fails
+built-ins/Proxy/ownKeys/return-type-throws-boolean.js fails
+built-ins/Proxy/ownKeys/return-type-throws-null.js fails
+built-ins/Proxy/ownKeys/return-type-throws-number.js fails
+built-ins/Proxy/ownKeys/return-type-throws-object.js fails
+built-ins/Proxy/ownKeys/return-type-throws-undefined.js fails
+built-ins/Proxy/ownKeys/trap-is-not-callable-realm.js fails
+built-ins/Proxy/ownKeys/trap-is-not-callable.js fails
+built-ins/Proxy/ownKeys/trap-is-undefined.js fails
+built-ins/Proxy/preventExtensions/trap-is-not-callable-realm.js fails
+built-ins/Proxy/proxy-no-prototype.js fails
+built-ins/Proxy/revocable/revocation-function-name.js fails
+built-ins/Proxy/revocable/revocation-function-nonconstructor.js fails
+built-ins/Proxy/set/trap-is-not-callable-realm.js fails
+built-ins/Proxy/set/trap-is-undefined-receiver.js fails
+built-ins/Proxy/setPrototypeOf/trap-is-not-callable-realm.js fails
+built-ins/Reflect/construct/newtarget-is-not-constructor-throws.js fails
+built-ins/Reflect/construct/return-with-newtarget-argument.js fails
+built-ins/Reflect/ownKeys/return-on-corresponding-order.js fails
+built-ins/Reflect/set/creates-a-data-descriptor.js fails
+built-ins/Reflect/set/different-property-descriptors.js fails
+built-ins/Reflect/set/receiver-is-not-object.js fails
+built-ins/Reflect/set/return-false-if-target-is-not-writable.js fails
+built-ins/Reflect/set/set-value-on-data-descriptor.js fails
+built-ins/Reflect/set/symbol-property.js fails
+built-ins/RegExp/15.10.4.1-1.js fails
+built-ins/RegExp/S15.10.2.12_A2_T1.js fails
+built-ins/RegExp/S15.10.3.1_A2_T1.js fails
+built-ins/RegExp/S15.10.3.1_A2_T2.js fails
+built-ins/RegExp/S15.10.4.1_A2_T1.js fails
+built-ins/RegExp/S15.10.4.1_A2_T2.js fails
+built-ins/RegExp/call_with_non_regexp_same_constructor.js fails
+built-ins/RegExp/call_with_regexp_match_falsy.js fails
+built-ins/RegExp/call_with_regexp_not_same_constructor.js fails
+built-ins/RegExp/dotall/without-dotall-unicode.js fails
+built-ins/RegExp/from-regexp-like-flag-override.js fails
+built-ins/RegExp/from-regexp-like-get-source-err.js fails
+built-ins/RegExp/from-regexp-like-short-circuit.js fails
+built-ins/RegExp/from-regexp-like.js fails
+built-ins/RegExp/proto-from-ctor-realm.js fails
+built-ins/RegExp/prototype/15.10.6.js fails
+built-ins/RegExp/prototype/Symbol.match/builtin-coerce-lastindex.js fails
+built-ins/RegExp/prototype/Symbol.match/builtin-failure-g-set-lastindex.js fails
+built-ins/RegExp/prototype/Symbol.match/builtin-failure-return-val.js fails
+built-ins/RegExp/prototype/Symbol.match/builtin-failure-y-return-val.js fails
+built-ins/RegExp/prototype/Symbol.match/builtin-failure-y-set-lastindex-err.js fails
+built-ins/RegExp/prototype/Symbol.match/builtin-failure-y-set-lastindex.js fails
+built-ins/RegExp/prototype/Symbol.match/builtin-infer-unicode.js fails
+built-ins/RegExp/prototype/Symbol.match/builtin-success-g-set-lastindex.js fails
+built-ins/RegExp/prototype/Symbol.match/builtin-success-return-val-groups.js fails
+built-ins/RegExp/prototype/Symbol.match/builtin-success-return-val.js fails
+built-ins/RegExp/prototype/Symbol.match/builtin-success-u-return-val-groups.js fails
+built-ins/RegExp/prototype/Symbol.match/builtin-success-y-set-lastindex-err.js fails
+built-ins/RegExp/prototype/Symbol.match/builtin-success-y-set-lastindex.js fails
+built-ins/RegExp/prototype/Symbol.match/builtin-y-coerce-lastindex-err.js fails
+built-ins/RegExp/prototype/Symbol.match/coerce-arg-err.js fails
+built-ins/RegExp/prototype/Symbol.match/coerce-arg.js fails
+built-ins/RegExp/prototype/Symbol.match/coerce-global.js fails
+built-ins/RegExp/prototype/Symbol.match/exec-err.js fails
+built-ins/RegExp/prototype/Symbol.match/exec-invocation.js fails
+built-ins/RegExp/prototype/Symbol.match/exec-return-type-invalid.js fails
+built-ins/RegExp/prototype/Symbol.match/exec-return-type-valid.js fails
+built-ins/RegExp/prototype/Symbol.match/g-coerce-result-err.js fails
+built-ins/RegExp/prototype/Symbol.match/g-get-exec-err.js fails
+built-ins/RegExp/prototype/Symbol.match/g-get-result-err.js fails
+built-ins/RegExp/prototype/Symbol.match/g-init-lastindex.js fails
+built-ins/RegExp/prototype/Symbol.match/g-match-empty-advance-lastindex.js fails
+built-ins/RegExp/prototype/Symbol.match/g-match-empty-coerce-lastindex-err.js fails
+built-ins/RegExp/prototype/Symbol.match/g-match-no-coerce-lastindex.js fails
+built-ins/RegExp/prototype/Symbol.match/g-match-no-set-lastindex.js fails
+built-ins/RegExp/prototype/Symbol.match/g-success-return-val.js fails
+built-ins/RegExp/prototype/Symbol.match/g-zero-matches.js fails
+built-ins/RegExp/prototype/Symbol.match/get-exec-err.js fails
+built-ins/RegExp/prototype/Symbol.match/get-global-err.js fails
+built-ins/RegExp/prototype/Symbol.match/get-unicode-error.js fails
+built-ins/RegExp/prototype/Symbol.match/length.js fails
+built-ins/RegExp/prototype/Symbol.match/name.js fails
+built-ins/RegExp/prototype/Symbol.match/prop-desc.js fails
+built-ins/RegExp/prototype/Symbol.match/this-val-non-regexp.js fails
+built-ins/RegExp/prototype/Symbol.match/u-advance-after-empty.js fails
+built-ins/RegExp/prototype/Symbol.match/y-fail-global-return.js fails
+built-ins/RegExp/prototype/Symbol.match/y-fail-lastindex-no-write.js fails
+built-ins/RegExp/prototype/Symbol.match/y-fail-lastindex.js fails
+built-ins/RegExp/prototype/Symbol.match/y-fail-return.js fails
+built-ins/RegExp/prototype/Symbol.match/y-init-lastindex.js fails
+built-ins/RegExp/prototype/Symbol.match/y-set-lastindex.js fails
+built-ins/RegExp/prototype/Symbol.replace/arg-1-coerce-err.js fails
+built-ins/RegExp/prototype/Symbol.replace/arg-1-coerce.js fails
+built-ins/RegExp/prototype/Symbol.replace/arg-2-coerce-err.js fails
+built-ins/RegExp/prototype/Symbol.replace/arg-2-coerce.js fails
+built-ins/RegExp/prototype/Symbol.replace/coerce-global.js fails
+built-ins/RegExp/prototype/Symbol.replace/coerce-unicode.js fails
+built-ins/RegExp/prototype/Symbol.replace/exec-err.js fails
+built-ins/RegExp/prototype/Symbol.replace/exec-invocation.js fails
+built-ins/RegExp/prototype/Symbol.replace/fn-coerce-replacement-err.js fails
+built-ins/RegExp/prototype/Symbol.replace/fn-coerce-replacement.js fails
+built-ins/RegExp/prototype/Symbol.replace/fn-err.js fails
+built-ins/RegExp/prototype/Symbol.replace/fn-invoke-args.js fails
+built-ins/RegExp/prototype/Symbol.replace/fn-invoke-this-no-strict.js sloppyFails
+built-ins/RegExp/prototype/Symbol.replace/fn-invoke-this-strict.js strictFails
+built-ins/RegExp/prototype/Symbol.replace/g-init-lastindex-err.js fails
+built-ins/RegExp/prototype/Symbol.replace/g-init-lastindex.js fails
+built-ins/RegExp/prototype/Symbol.replace/g-pos-decrement.js fails
+built-ins/RegExp/prototype/Symbol.replace/g-pos-increment.js fails
+built-ins/RegExp/prototype/Symbol.replace/get-exec-err.js fails
+built-ins/RegExp/prototype/Symbol.replace/get-global-err.js fails
+built-ins/RegExp/prototype/Symbol.replace/get-unicode-error.js fails
+built-ins/RegExp/prototype/Symbol.replace/length.js fails
+built-ins/RegExp/prototype/Symbol.replace/match-failure.js fails
+built-ins/RegExp/prototype/Symbol.replace/name.js fails
+built-ins/RegExp/prototype/Symbol.replace/prop-desc.js fails
+built-ins/RegExp/prototype/Symbol.replace/replace-with-trailing.js fails
+built-ins/RegExp/prototype/Symbol.replace/replace-without-trailing.js fails
+built-ins/RegExp/prototype/Symbol.replace/result-coerce-capture-err.js fails
+built-ins/RegExp/prototype/Symbol.replace/result-coerce-capture.js fails
+built-ins/RegExp/prototype/Symbol.replace/result-coerce-index-err.js fails
+built-ins/RegExp/prototype/Symbol.replace/result-coerce-index.js fails
+built-ins/RegExp/prototype/Symbol.replace/result-coerce-length-err.js fails
+built-ins/RegExp/prototype/Symbol.replace/result-coerce-length.js fails
+built-ins/RegExp/prototype/Symbol.replace/result-coerce-matched-err.js fails
+built-ins/RegExp/prototype/Symbol.replace/result-coerce-matched.js fails
+built-ins/RegExp/prototype/Symbol.replace/result-get-capture-err.js fails
+built-ins/RegExp/prototype/Symbol.replace/result-get-index-err.js fails
+built-ins/RegExp/prototype/Symbol.replace/result-get-length-err.js fails
+built-ins/RegExp/prototype/Symbol.replace/result-get-matched-err.js fails
+built-ins/RegExp/prototype/Symbol.replace/subst-after.js fails
+built-ins/RegExp/prototype/Symbol.replace/subst-before.js fails
+built-ins/RegExp/prototype/Symbol.replace/subst-capture-idx-1.js fails
+built-ins/RegExp/prototype/Symbol.replace/subst-capture-idx-2.js fails
+built-ins/RegExp/prototype/Symbol.replace/subst-dollar.js fails
+built-ins/RegExp/prototype/Symbol.replace/subst-matched.js fails
+built-ins/RegExp/prototype/Symbol.replace/u-advance-after-empty.js fails
+built-ins/RegExp/prototype/Symbol.replace/y-fail-global-return.js fails
+built-ins/RegExp/prototype/Symbol.replace/y-fail-lastindex-no-write.js fails
+built-ins/RegExp/prototype/Symbol.replace/y-fail-lastindex.js fails
+built-ins/RegExp/prototype/Symbol.replace/y-fail-return.js fails
+built-ins/RegExp/prototype/Symbol.replace/y-init-lastindex.js fails
+built-ins/RegExp/prototype/Symbol.replace/y-set-lastindex.js fails
+built-ins/RegExp/prototype/Symbol.search/coerce-string-err.js fails
+built-ins/RegExp/prototype/Symbol.search/coerce-string.js fails
+built-ins/RegExp/prototype/Symbol.search/cstm-exec-return-index.js fails
+built-ins/RegExp/prototype/Symbol.search/failure-return-val.js fails
+built-ins/RegExp/prototype/Symbol.search/get-lastindex-err.js fails
+built-ins/RegExp/prototype/Symbol.search/lastindex-no-restore.js fails
+built-ins/RegExp/prototype/Symbol.search/length.js fails
+built-ins/RegExp/prototype/Symbol.search/match-err.js fails
+built-ins/RegExp/prototype/Symbol.search/name.js fails
+built-ins/RegExp/prototype/Symbol.search/prop-desc.js fails
+built-ins/RegExp/prototype/Symbol.search/set-lastindex-init-err.js fails
+built-ins/RegExp/prototype/Symbol.search/set-lastindex-init.js fails
+built-ins/RegExp/prototype/Symbol.search/set-lastindex-restore-err.js fails
+built-ins/RegExp/prototype/Symbol.search/set-lastindex-restore.js fails
+built-ins/RegExp/prototype/Symbol.search/success-get-index-err.js fails
+built-ins/RegExp/prototype/Symbol.search/success-return-val.js fails
+built-ins/RegExp/prototype/Symbol.search/u-lastindex-advance.js fails
+built-ins/RegExp/prototype/Symbol.search/y-fail-return.js fails
+built-ins/RegExp/prototype/Symbol.split/coerce-flags-err.js fails
+built-ins/RegExp/prototype/Symbol.split/coerce-flags.js fails
+built-ins/RegExp/prototype/Symbol.split/coerce-limit-err.js fails
+built-ins/RegExp/prototype/Symbol.split/coerce-limit.js fails
+built-ins/RegExp/prototype/Symbol.split/coerce-string-err.js fails
+built-ins/RegExp/prototype/Symbol.split/coerce-string.js fails
+built-ins/RegExp/prototype/Symbol.split/get-flags-err.js fails
+built-ins/RegExp/prototype/Symbol.split/last-index-exceeds-str-size.js fails
+built-ins/RegExp/prototype/Symbol.split/length.js fails
+built-ins/RegExp/prototype/Symbol.split/limit-0-bail.js fails
+built-ins/RegExp/prototype/Symbol.split/name.js fails
+built-ins/RegExp/prototype/Symbol.split/prop-desc.js fails
+built-ins/RegExp/prototype/Symbol.split/species-ctor-ctor-get-err.js fails
+built-ins/RegExp/prototype/Symbol.split/species-ctor-ctor-non-obj.js fails
+built-ins/RegExp/prototype/Symbol.split/species-ctor-ctor-undef.js fails
+built-ins/RegExp/prototype/Symbol.split/species-ctor-err.js fails
+built-ins/RegExp/prototype/Symbol.split/species-ctor-species-get-err.js fails
+built-ins/RegExp/prototype/Symbol.split/species-ctor-species-non-ctor.js fails
+built-ins/RegExp/prototype/Symbol.split/species-ctor-species-undef.js fails
+built-ins/RegExp/prototype/Symbol.split/species-ctor-y.js fails
+built-ins/RegExp/prototype/Symbol.split/species-ctor.js fails
+built-ins/RegExp/prototype/Symbol.split/splitter-proto-from-ctor-realm.js fails
+built-ins/RegExp/prototype/Symbol.split/str-adv-thru-empty-match.js fails
+built-ins/RegExp/prototype/Symbol.split/str-coerce-lastindex-err.js fails
+built-ins/RegExp/prototype/Symbol.split/str-coerce-lastindex.js fails
+built-ins/RegExp/prototype/Symbol.split/str-empty-match-err.js fails
+built-ins/RegExp/prototype/Symbol.split/str-empty-match.js fails
+built-ins/RegExp/prototype/Symbol.split/str-empty-no-match.js fails
+built-ins/RegExp/prototype/Symbol.split/str-get-lastindex-err.js fails
+built-ins/RegExp/prototype/Symbol.split/str-limit-capturing.js fails
+built-ins/RegExp/prototype/Symbol.split/str-limit.js fails
+built-ins/RegExp/prototype/Symbol.split/str-match-err.js fails
+built-ins/RegExp/prototype/Symbol.split/str-result-coerce-length-err.js fails
+built-ins/RegExp/prototype/Symbol.split/str-result-coerce-length.js fails
+built-ins/RegExp/prototype/Symbol.split/str-result-get-capture-err.js fails
+built-ins/RegExp/prototype/Symbol.split/str-result-get-length-err.js fails
+built-ins/RegExp/prototype/Symbol.split/str-set-lastindex-err.js fails
+built-ins/RegExp/prototype/Symbol.split/str-set-lastindex-match.js fails
+built-ins/RegExp/prototype/Symbol.split/str-set-lastindex-no-match.js fails
+built-ins/RegExp/prototype/Symbol.split/str-trailing-chars.js fails
+built-ins/RegExp/prototype/Symbol.split/u-lastindex-adv-thru-failure.js fails
+built-ins/RegExp/prototype/Symbol.split/u-lastindex-adv-thru-match.js fails
+built-ins/RegExp/prototype/exec/S15.10.6.2_A5_T3.js fails
+built-ins/RegExp/prototype/exec/failure-lastindex-access.js fails
+built-ins/RegExp/prototype/exec/success-lastindex-access.js fails
+built-ins/RegExp/prototype/exec/u-captured-value.js fails
+built-ins/RegExp/prototype/exec/u-lastindex-adv.js fails
+built-ins/RegExp/prototype/exec/u-lastindex-value.js fails
+built-ins/RegExp/prototype/exec/y-fail-lastindex-no-write.js fails
+built-ins/RegExp/prototype/exec/y-fail-lastindex.js fails
+built-ins/RegExp/prototype/exec/y-fail-return.js fails
+built-ins/RegExp/prototype/exec/y-init-lastindex.js fails
+built-ins/RegExp/prototype/exec/y-set-lastindex.js fails
+built-ins/RegExp/prototype/flags/coercion-global.js fails
+built-ins/RegExp/prototype/flags/coercion-ignoreCase.js fails
+built-ins/RegExp/prototype/flags/coercion-multiline.js fails
+built-ins/RegExp/prototype/flags/coercion-sticky.js fails
+built-ins/RegExp/prototype/flags/coercion-unicode.js fails
+built-ins/RegExp/prototype/flags/length.js fails
+built-ins/RegExp/prototype/flags/name.js fails
+built-ins/RegExp/prototype/flags/prop-desc.js fails
+built-ins/RegExp/prototype/flags/this-val-non-obj.js fails
+built-ins/RegExp/prototype/flags/this-val-regexp-prototype.js fails
+built-ins/RegExp/prototype/global/15.10.7.2-2.js fails
+built-ins/RegExp/prototype/global/S15.10.7.2_A9.js fails
+built-ins/RegExp/prototype/global/length.js fails
+built-ins/RegExp/prototype/global/name.js fails
+built-ins/RegExp/prototype/global/this-val-regexp-prototype.js fails
+built-ins/RegExp/prototype/ignoreCase/15.10.7.3-2.js fails
+built-ins/RegExp/prototype/ignoreCase/S15.10.7.3_A9.js fails
+built-ins/RegExp/prototype/ignoreCase/length.js fails
+built-ins/RegExp/prototype/ignoreCase/name.js fails
+built-ins/RegExp/prototype/ignoreCase/this-val-regexp-prototype.js fails
+built-ins/RegExp/prototype/multiline/15.10.7.4-2.js fails
+built-ins/RegExp/prototype/multiline/S15.10.7.4_A9.js fails
+built-ins/RegExp/prototype/multiline/length.js fails
+built-ins/RegExp/prototype/multiline/name.js fails
+built-ins/RegExp/prototype/multiline/this-val-regexp-prototype.js fails
+built-ins/RegExp/prototype/no-regexp-matcher.js fails
+built-ins/RegExp/prototype/source/length.js fails
+built-ins/RegExp/prototype/source/name.js fails
+built-ins/RegExp/prototype/source/prop-desc.js fails
+built-ins/RegExp/prototype/source/this-val-regexp-prototype.js fails
+built-ins/RegExp/prototype/source/value-line-terminator.js fails
+built-ins/RegExp/prototype/source/value-u.js fails
+built-ins/RegExp/prototype/sticky/length.js fails
+built-ins/RegExp/prototype/sticky/name.js fails
+built-ins/RegExp/prototype/sticky/prop-desc.js fails
+built-ins/RegExp/prototype/sticky/this-val-invalid-obj.js fails
+built-ins/RegExp/prototype/sticky/this-val-non-obj.js fails
+built-ins/RegExp/prototype/sticky/this-val-regexp-prototype.js fails
+built-ins/RegExp/prototype/sticky/this-val-regexp.js fails
+built-ins/RegExp/prototype/test/S15.10.6.3_A1_T22.js fails
+built-ins/RegExp/prototype/test/y-fail-lastindex-no-write.js fails
+built-ins/RegExp/prototype/test/y-fail-lastindex.js fails
+built-ins/RegExp/prototype/test/y-fail-return.js fails
+built-ins/RegExp/prototype/test/y-init-lastindex.js fails
+built-ins/RegExp/prototype/test/y-set-lastindex.js fails
+built-ins/RegExp/prototype/unicode/length.js fails
+built-ins/RegExp/prototype/unicode/name.js fails
+built-ins/RegExp/prototype/unicode/prop-desc.js fails
+built-ins/RegExp/prototype/unicode/this-val-invalid-obj.js fails
+built-ins/RegExp/prototype/unicode/this-val-non-obj.js fails
+built-ins/RegExp/prototype/unicode/this-val-regexp-prototype.js fails
+built-ins/RegExp/prototype/unicode/this-val-regexp.js fails
+built-ins/RegExp/u180e.js fails
+built-ins/RegExp/unicode_identity_escape.js fails
+built-ins/RegExp/valid-flags-y.js fails
+built-ins/Set/proto-from-ctor-realm.js fails
+built-ins/Set/prototype/add/does-not-have-setdata-internal-slot-weakset.js fails
+built-ins/Set/prototype/clear/does-not-have-setdata-internal-slot-weakset.js fails
+built-ins/Set/prototype/delete/does-not-have-setdata-internal-slot-weakset.js fails
+built-ins/Set/prototype/entries/does-not-have-setdata-internal-slot-weakset.js fails
+built-ins/Set/prototype/forEach/does-not-have-setdata-internal-slot-weakset.js fails
+built-ins/Set/prototype/forEach/iterates-values-revisits-after-delete-re-add.js fails
+built-ins/Set/prototype/forEach/this-arg-explicit-cannot-override-lexical-this-arrow.js fails
+built-ins/Set/prototype/has/does-not-have-setdata-internal-slot-weakset.js fails
+built-ins/Set/prototype/values/does-not-have-setdata-internal-slot-weakset.js fails
+built-ins/SharedArrayBuffer/allocation-limit.js fails
+built-ins/SharedArrayBuffer/data-allocation-after-object-creation.js fails
+built-ins/SharedArrayBuffer/init-zero.js fails
+built-ins/SharedArrayBuffer/length-is-absent.js fails
+built-ins/SharedArrayBuffer/length-is-too-large-throws.js fails
+built-ins/SharedArrayBuffer/negative-length-throws.js fails
+built-ins/SharedArrayBuffer/newtarget-prototype-is-not-object.js fails
+built-ins/SharedArrayBuffer/proto-from-ctor-realm.js fails
+built-ins/SharedArrayBuffer/prototype-from-newtarget.js fails
+built-ins/SharedArrayBuffer/prototype/Symbol.toStringTag.js fails
+built-ins/SharedArrayBuffer/prototype/byteLength/invoked-as-accessor.js fails
+built-ins/SharedArrayBuffer/prototype/byteLength/invoked-as-func.js fails
+built-ins/SharedArrayBuffer/prototype/byteLength/length.js fails
+built-ins/SharedArrayBuffer/prototype/byteLength/name.js fails
+built-ins/SharedArrayBuffer/prototype/byteLength/prop-desc.js fails
+built-ins/SharedArrayBuffer/prototype/byteLength/return-bytelength.js fails
+built-ins/SharedArrayBuffer/prototype/byteLength/this-has-no-typedarrayname-internal.js fails
+built-ins/SharedArrayBuffer/prototype/byteLength/this-is-arraybuffer.js fails
+built-ins/SharedArrayBuffer/prototype/byteLength/this-is-not-object.js fails
+built-ins/SharedArrayBuffer/prototype/constructor.js fails
+built-ins/SharedArrayBuffer/prototype/slice/context-is-not-arraybuffer-object.js fails
+built-ins/SharedArrayBuffer/prototype/slice/context-is-not-object.js fails
+built-ins/SharedArrayBuffer/prototype/slice/descriptor.js fails
+built-ins/SharedArrayBuffer/prototype/slice/end-default-if-absent.js fails
+built-ins/SharedArrayBuffer/prototype/slice/end-default-if-undefined.js fails
+built-ins/SharedArrayBuffer/prototype/slice/end-exceeds-length.js fails
+built-ins/SharedArrayBuffer/prototype/slice/extensible.js fails
+built-ins/SharedArrayBuffer/prototype/slice/length.js fails
+built-ins/SharedArrayBuffer/prototype/slice/name.js fails
+built-ins/SharedArrayBuffer/prototype/slice/negative-end.js fails
+built-ins/SharedArrayBuffer/prototype/slice/negative-start.js fails
+built-ins/SharedArrayBuffer/prototype/slice/nonconstructor.js fails
+built-ins/SharedArrayBuffer/prototype/slice/number-conversion.js fails
+built-ins/SharedArrayBuffer/prototype/slice/species-constructor-is-not-object.js fails
+built-ins/SharedArrayBuffer/prototype/slice/species-constructor-is-undefined.js fails
+built-ins/SharedArrayBuffer/prototype/slice/species-is-not-constructor.js fails
+built-ins/SharedArrayBuffer/prototype/slice/species-is-not-object.js fails
+built-ins/SharedArrayBuffer/prototype/slice/species-is-null.js fails
+built-ins/SharedArrayBuffer/prototype/slice/species-is-undefined.js fails
+built-ins/SharedArrayBuffer/prototype/slice/species-returns-larger-arraybuffer.js fails
+built-ins/SharedArrayBuffer/prototype/slice/species-returns-not-arraybuffer.js fails
+built-ins/SharedArrayBuffer/prototype/slice/species-returns-same-arraybuffer.js fails
+built-ins/SharedArrayBuffer/prototype/slice/species-returns-smaller-arraybuffer.js fails
+built-ins/SharedArrayBuffer/prototype/slice/species.js fails
+built-ins/SharedArrayBuffer/prototype/slice/start-default-if-absent.js fails
+built-ins/SharedArrayBuffer/prototype/slice/start-default-if-undefined.js fails
+built-ins/SharedArrayBuffer/prototype/slice/start-exceeds-end.js fails
+built-ins/SharedArrayBuffer/prototype/slice/start-exceeds-length.js fails
+built-ins/SharedArrayBuffer/prototype/slice/this-is-arraybuffer.js fails
+built-ins/SharedArrayBuffer/prototype/slice/tointeger-conversion-end.js fails
+built-ins/SharedArrayBuffer/prototype/slice/tointeger-conversion-start.js fails
+built-ins/SharedArrayBuffer/return-abrupt-from-length-symbol.js fails
+built-ins/SharedArrayBuffer/return-abrupt-from-length.js fails
+built-ins/SharedArrayBuffer/toindex-length.js fails
+built-ins/SharedArrayBuffer/undefined-newtarget-throws.js fails
+built-ins/SharedArrayBuffer/zero-length.js fails
+built-ins/String/proto-from-ctor-realm.js fails
+built-ins/String/prototype/endsWith/return-abrupt-from-searchstring-regexp-test.js fails
+built-ins/String/prototype/includes/return-abrupt-from-searchstring-regexp-test.js fails
+built-ins/String/prototype/indexOf/position-tointeger-toprimitive.js fails
+built-ins/String/prototype/indexOf/position-tointeger.js fails
+built-ins/String/prototype/indexOf/searchstring-tostring-toprimitive.js fails
+built-ins/String/prototype/match/invoke-builtin-match.js fails
+built-ins/String/prototype/match/cstm-matcher-invocation.js fails
+built-ins/String/prototype/replace/cstm-replace-invocation.js fails
+built-ins/String/prototype/replace/this-value-not-obj-coercible.js fails
+built-ins/String/prototype/search/cstm-search-invocation.js fails
+built-ins/String/prototype/search/invoke-builtin-search-searcher-undef.js fails
+built-ins/String/prototype/search/invoke-builtin-search.js fails
+built-ins/String/prototype/slice/this-value-not-obj-coercible.js fails
+built-ins/String/prototype/split/cstm-split-invocation.js fails
+built-ins/String/prototype/startsWith/return-abrupt-from-searchstring-regexp-test.js fails
+built-ins/String/prototype/toLocaleLowerCase/Final_Sigma_U180E.js fails
+built-ins/String/prototype/toLocaleLowerCase/special_casing_conditional.js fails
+built-ins/String/prototype/toLowerCase/Final_Sigma_U180E.js fails
+built-ins/String/prototype/toLowerCase/special_casing_conditional.js fails
+built-ins/String/raw/length.js fails
+built-ins/String/raw/name.js fails
+built-ins/String/raw/raw.js fails
+built-ins/String/raw/return-empty-string-from-empty-array-length.js fails
+built-ins/String/raw/return-empty-string-if-length-is-negative-infinity.js fails
+built-ins/String/raw/return-empty-string-if-length-is-not-defined.js fails
+built-ins/String/raw/return-empty-string-if-length-is-undefined.js fails
+built-ins/String/raw/return-empty-string-if-length-is-zero-NaN.js fails
+built-ins/String/raw/return-empty-string-if-length-is-zero-boolean.js fails
+built-ins/String/raw/return-empty-string-if-length-is-zero-null.js fails
+built-ins/String/raw/return-empty-string-if-length-is-zero-or-less-number.js fails
+built-ins/String/raw/return-empty-string-if-length-is-zero-or-less-string.js fails
+built-ins/String/raw/return-the-string-value-from-template.js fails
+built-ins/String/raw/return-the-string-value.js fails
+built-ins/String/raw/returns-abrupt-from-next-key-toString.js fails
+built-ins/String/raw/returns-abrupt-from-next-key.js fails
+built-ins/String/raw/returns-abrupt-from-substitution.js fails
+built-ins/String/raw/special-characters.js fails
+built-ins/String/raw/substitutions-are-appended-on-same-index.js fails
+built-ins/String/raw/substitutions-are-limited-to-template-raw-length.js fails
+built-ins/String/raw/template-length-throws.js fails
+built-ins/String/raw/template-raw-throws.js fails
+built-ins/String/raw/template-substitutions-are-appended-on-same-index.js fails
+built-ins/String/raw/zero-literal-segments.js fails
+built-ins/Symbol/for/cross-realm.js fails
+built-ins/Symbol/hasInstance/cross-realm.js fails
+built-ins/Symbol/isConcatSpreadable/cross-realm.js fails
+built-ins/Symbol/iterator/cross-realm.js fails
+built-ins/Symbol/keyFor/cross-realm.js fails
+built-ins/Symbol/match/cross-realm.js fails
+built-ins/Symbol/replace/cross-realm.js fails
+built-ins/Symbol/search/cross-realm.js fails
+built-ins/Symbol/species/builtin-getter-name.js fails
+built-ins/Symbol/species/cross-realm.js fails
+built-ins/Symbol/split/cross-realm.js fails
+built-ins/Symbol/toPrimitive/cross-realm.js fails
+built-ins/Symbol/toStringTag/cross-realm.js fails
+built-ins/Symbol/unscopables/cross-realm.js fails
+built-ins/ThrowTypeError/distinct-cross-realm.js fails
+built-ins/TypedArray/from/arylk-get-length-error.js fails
+built-ins/TypedArray/from/arylk-to-length-error.js fails
+built-ins/TypedArray/from/iter-access-error.js fails
+built-ins/TypedArray/from/iter-invoke-error.js fails
+built-ins/TypedArray/from/iter-next-error.js fails
+built-ins/TypedArray/from/iter-next-value-error.js fails
+built-ins/TypedArray/from/length.js fails
+built-ins/TypedArray/from/name.js fails
+built-ins/TypedArray/from/prop-desc.js fails
+built-ins/TypedArray/name.js fails
+built-ins/TypedArray/of/length.js fails
+built-ins/TypedArray/of/name.js fails
+built-ins/TypedArray/of/prop-desc.js fails
+built-ins/TypedArray/prototype/Symbol.toStringTag/detached-buffer.js fails
+built-ins/TypedArray/prototype/buffer/detached-buffer.js fails
+built-ins/TypedArray/prototype/byteLength/detached-buffer.js fails
+built-ins/TypedArray/prototype/byteOffset/detached-buffer.js fails
+built-ins/TypedArray/prototype/constructor.js fails
+built-ins/TypedArray/prototype/copyWithin/bit-precision.js fails
+built-ins/TypedArray/prototype/copyWithin/coerced-values-end.js fails
+built-ins/TypedArray/prototype/copyWithin/coerced-values-start.js fails
+built-ins/TypedArray/prototype/copyWithin/coerced-values-target.js fails
+built-ins/TypedArray/prototype/copyWithin/detached-buffer.js fails
+built-ins/TypedArray/prototype/copyWithin/get-length-ignores-length-prop.js fails
+built-ins/TypedArray/prototype/copyWithin/invoked-as-func.js fails
+built-ins/TypedArray/prototype/copyWithin/invoked-as-method.js fails
+built-ins/TypedArray/prototype/copyWithin/length.js fails
+built-ins/TypedArray/prototype/copyWithin/name.js fails
+built-ins/TypedArray/prototype/copyWithin/negative-end.js fails
+built-ins/TypedArray/prototype/copyWithin/negative-out-of-bounds-end.js fails
+built-ins/TypedArray/prototype/copyWithin/negative-out-of-bounds-start.js fails
+built-ins/TypedArray/prototype/copyWithin/negative-out-of-bounds-target.js fails
+built-ins/TypedArray/prototype/copyWithin/negative-start.js fails
+built-ins/TypedArray/prototype/copyWithin/negative-target.js fails
+built-ins/TypedArray/prototype/copyWithin/non-negative-out-of-bounds-end.js fails
+built-ins/TypedArray/prototype/copyWithin/non-negative-out-of-bounds-target-and-start.js fails
+built-ins/TypedArray/prototype/copyWithin/non-negative-target-and-start.js fails
+built-ins/TypedArray/prototype/copyWithin/non-negative-target-start-and-end.js fails
+built-ins/TypedArray/prototype/copyWithin/prop-desc.js fails
+built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-end.js fails
+built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-start.js fails
+built-ins/TypedArray/prototype/copyWithin/return-abrupt-from-target.js fails
+built-ins/TypedArray/prototype/copyWithin/return-this.js fails
+built-ins/TypedArray/prototype/copyWithin/undefined-end.js fails
+built-ins/TypedArray/prototype/entries/detached-buffer.js fails
+built-ins/TypedArray/prototype/every/callbackfn-arguments-with-thisarg.js fails
+built-ins/TypedArray/prototype/every/callbackfn-arguments-without-thisarg.js fails
+built-ins/TypedArray/prototype/every/callbackfn-detachbuffer.js fails
+built-ins/TypedArray/prototype/every/callbackfn-no-interaction-over-non-integer.js fails
+built-ins/TypedArray/prototype/every/callbackfn-not-called-on-empty.js fails
+built-ins/TypedArray/prototype/every/callbackfn-return-does-not-change-instance.js fails
+built-ins/TypedArray/prototype/every/callbackfn-returns-abrupt.js fails
+built-ins/TypedArray/prototype/every/callbackfn-set-value-during-interaction.js fails
+built-ins/TypedArray/prototype/every/callbackfn-this.js fails
+built-ins/TypedArray/prototype/every/detached-buffer.js fails
+built-ins/TypedArray/prototype/every/get-length-uses-internal-arraylength.js fails
+built-ins/TypedArray/prototype/every/invoked-as-func.js fails
+built-ins/TypedArray/prototype/every/invoked-as-method.js fails
+built-ins/TypedArray/prototype/every/length.js fails
+built-ins/TypedArray/prototype/every/name.js fails
+built-ins/TypedArray/prototype/every/prop-desc.js fails
+built-ins/TypedArray/prototype/every/returns-false-if-any-cb-returns-false.js fails
+built-ins/TypedArray/prototype/every/returns-true-if-every-cb-returns-true.js fails
+built-ins/TypedArray/prototype/every/values-are-not-cached.js fails
+built-ins/TypedArray/prototype/fill/coerced-indexes.js fails
+built-ins/TypedArray/prototype/fill/detached-buffer.js fails
+built-ins/TypedArray/prototype/fill/fill-values-conversion-once.js fails
+built-ins/TypedArray/prototype/fill/fill-values-conversion-operations-consistent-nan.js fails
+built-ins/TypedArray/prototype/fill/fill-values-conversion-operations.js fails
+built-ins/TypedArray/prototype/fill/fill-values-custom-start-and-end.js fails
+built-ins/TypedArray/prototype/fill/fill-values-non-numeric.js fails
+built-ins/TypedArray/prototype/fill/fill-values-relative-end.js fails
+built-ins/TypedArray/prototype/fill/fill-values-relative-start.js fails
+built-ins/TypedArray/prototype/fill/fill-values.js fails
+built-ins/TypedArray/prototype/fill/get-length-ignores-length-prop.js fails
+built-ins/TypedArray/prototype/fill/invoked-as-func.js fails
+built-ins/TypedArray/prototype/fill/invoked-as-method.js fails
+built-ins/TypedArray/prototype/fill/length.js fails
+built-ins/TypedArray/prototype/fill/name.js fails
+built-ins/TypedArray/prototype/fill/prop-desc.js fails
+built-ins/TypedArray/prototype/fill/return-abrupt-from-end.js fails
+built-ins/TypedArray/prototype/fill/return-abrupt-from-set-value.js fails
+built-ins/TypedArray/prototype/fill/return-abrupt-from-start.js fails
+built-ins/TypedArray/prototype/fill/return-this.js fails
+built-ins/TypedArray/prototype/filter/arraylength-internal.js fails
+built-ins/TypedArray/prototype/filter/callbackfn-arguments-with-thisarg.js fails
+built-ins/TypedArray/prototype/filter/callbackfn-arguments-without-thisarg.js fails
+built-ins/TypedArray/prototype/filter/callbackfn-called-before-ctor.js fails
+built-ins/TypedArray/prototype/filter/callbackfn-called-before-species.js fails
+built-ins/TypedArray/prototype/filter/callbackfn-detachbuffer.js fails
+built-ins/TypedArray/prototype/filter/callbackfn-no-iteration-over-non-integer.js fails
+built-ins/TypedArray/prototype/filter/callbackfn-not-called-on-empty.js fails
+built-ins/TypedArray/prototype/filter/callbackfn-return-does-not-change-instance.js fails
+built-ins/TypedArray/prototype/filter/callbackfn-returns-abrupt.js fails
+built-ins/TypedArray/prototype/filter/callbackfn-set-value-during-iteration.js fails
+built-ins/TypedArray/prototype/filter/callbackfn-this.js fails
+built-ins/TypedArray/prototype/filter/detached-buffer.js fails
+built-ins/TypedArray/prototype/filter/invoked-as-func.js fails
+built-ins/TypedArray/prototype/filter/invoked-as-method.js fails
+built-ins/TypedArray/prototype/filter/length.js fails
+built-ins/TypedArray/prototype/filter/name.js fails
+built-ins/TypedArray/prototype/filter/prop-desc.js fails
+built-ins/TypedArray/prototype/filter/result-does-not-share-buffer.js fails
+built-ins/TypedArray/prototype/filter/result-empty-callbackfn-returns-false.js fails
+built-ins/TypedArray/prototype/filter/result-full-callbackfn-returns-true.js fails
+built-ins/TypedArray/prototype/filter/speciesctor-get-ctor-abrupt.js fails
+built-ins/TypedArray/prototype/filter/speciesctor-get-ctor-inherited.js fails
+built-ins/TypedArray/prototype/filter/speciesctor-get-ctor.js fails
+built-ins/TypedArray/prototype/filter/speciesctor-get-species-abrupt.js fails
+built-ins/TypedArray/prototype/filter/speciesctor-get-species-custom-ctor-invocation.js fails
+built-ins/TypedArray/prototype/filter/speciesctor-get-species-custom-ctor-length.js fails
+built-ins/TypedArray/prototype/filter/speciesctor-get-species-custom-ctor-returns-another-instance.js fails
+built-ins/TypedArray/prototype/filter/speciesctor-get-species-custom-ctor.js fails
+built-ins/TypedArray/prototype/filter/speciesctor-get-species-use-default-ctor.js fails
+built-ins/TypedArray/prototype/filter/speciesctor-get-species.js fails
+built-ins/TypedArray/prototype/filter/values-are-not-cached.js fails
+built-ins/TypedArray/prototype/filter/values-are-set.js fails
+built-ins/TypedArray/prototype/find/detached-buffer.js fails
+built-ins/TypedArray/prototype/find/get-length-ignores-length-prop.js fails
+built-ins/TypedArray/prototype/find/invoked-as-func.js fails
+built-ins/TypedArray/prototype/find/invoked-as-method.js fails
+built-ins/TypedArray/prototype/find/length.js fails
+built-ins/TypedArray/prototype/find/name.js fails
+built-ins/TypedArray/prototype/find/predicate-call-changes-value.js fails
+built-ins/TypedArray/prototype/find/predicate-call-parameters.js fails
+built-ins/TypedArray/prototype/find/predicate-call-this-non-strict.js sloppyFails
+built-ins/TypedArray/prototype/find/predicate-call-this-strict.js strictFails
+built-ins/TypedArray/prototype/find/predicate-may-detach-buffer.js fails
+built-ins/TypedArray/prototype/find/predicate-not-called-on-empty-array.js fails
+built-ins/TypedArray/prototype/find/prop-desc.js fails
+built-ins/TypedArray/prototype/find/return-abrupt-from-predicate-call.js fails
+built-ins/TypedArray/prototype/find/return-found-value-predicate-result-is-true.js fails
+built-ins/TypedArray/prototype/find/return-undefined-if-predicate-returns-false-value.js fails
+built-ins/TypedArray/prototype/findIndex/detached-buffer.js fails
+built-ins/TypedArray/prototype/findIndex/get-length-ignores-length-prop.js fails
+built-ins/TypedArray/prototype/findIndex/invoked-as-func.js fails
+built-ins/TypedArray/prototype/findIndex/invoked-as-method.js fails
+built-ins/TypedArray/prototype/findIndex/length.js fails
+built-ins/TypedArray/prototype/findIndex/name.js fails
+built-ins/TypedArray/prototype/findIndex/predicate-call-changes-value.js fails
+built-ins/TypedArray/prototype/findIndex/predicate-call-parameters.js fails
+built-ins/TypedArray/prototype/findIndex/predicate-call-this-non-strict.js sloppyFails
+built-ins/TypedArray/prototype/findIndex/predicate-call-this-strict.js strictFails
+built-ins/TypedArray/prototype/findIndex/predicate-may-detach-buffer.js fails
+built-ins/TypedArray/prototype/findIndex/predicate-not-called-on-empty-array.js fails
+built-ins/TypedArray/prototype/findIndex/prop-desc.js fails
+built-ins/TypedArray/prototype/findIndex/return-abrupt-from-predicate-call.js fails
+built-ins/TypedArray/prototype/findIndex/return-index-predicate-result-is-true.js fails
+built-ins/TypedArray/prototype/findIndex/return-negative-one-if-predicate-returns-false-value.js fails
+built-ins/TypedArray/prototype/forEach/arraylength-internal.js fails
+built-ins/TypedArray/prototype/forEach/callbackfn-arguments-with-thisarg.js fails
+built-ins/TypedArray/prototype/forEach/callbackfn-arguments-without-thisarg.js fails
+built-ins/TypedArray/prototype/forEach/callbackfn-detachbuffer.js fails
+built-ins/TypedArray/prototype/forEach/callbackfn-no-interaction-over-non-integer.js fails
+built-ins/TypedArray/prototype/forEach/callbackfn-not-called-on-empty.js fails
+built-ins/TypedArray/prototype/forEach/callbackfn-return-does-not-change-instance.js fails
+built-ins/TypedArray/prototype/forEach/callbackfn-returns-abrupt.js fails
+built-ins/TypedArray/prototype/forEach/callbackfn-set-value-during-interaction.js fails
+built-ins/TypedArray/prototype/forEach/callbackfn-this.js fails
+built-ins/TypedArray/prototype/forEach/detached-buffer.js fails
+built-ins/TypedArray/prototype/forEach/invoked-as-func.js fails
+built-ins/TypedArray/prototype/forEach/invoked-as-method.js fails
+built-ins/TypedArray/prototype/forEach/length.js fails
+built-ins/TypedArray/prototype/forEach/name.js fails
+built-ins/TypedArray/prototype/forEach/prop-desc.js fails
+built-ins/TypedArray/prototype/forEach/returns-undefined.js fails
+built-ins/TypedArray/prototype/forEach/values-are-not-cached.js fails
+built-ins/TypedArray/prototype/includes/detached-buffer.js fails
+built-ins/TypedArray/prototype/includes/fromIndex-equal-or-greater-length-returns-false.js fails
+built-ins/TypedArray/prototype/includes/fromIndex-infinity.js fails
+built-ins/TypedArray/prototype/includes/fromIndex-minus-zero.js fails
+built-ins/TypedArray/prototype/includes/get-length-uses-internal-arraylength.js fails
+built-ins/TypedArray/prototype/includes/invoked-as-func.js fails
+built-ins/TypedArray/prototype/includes/invoked-as-method.js fails
+built-ins/TypedArray/prototype/includes/length-zero-returns-false.js fails
+built-ins/TypedArray/prototype/includes/length.js fails
+built-ins/TypedArray/prototype/includes/name.js fails
+built-ins/TypedArray/prototype/includes/prop-desc.js fails
+built-ins/TypedArray/prototype/includes/return-abrupt-tointeger-fromindex.js fails
+built-ins/TypedArray/prototype/includes/samevaluezero.js fails
+built-ins/TypedArray/prototype/includes/search-found-returns-true.js fails
+built-ins/TypedArray/prototype/includes/search-not-found-returns-false.js fails
+built-ins/TypedArray/prototype/includes/tointeger-fromindex.js fails
+built-ins/TypedArray/prototype/indexOf/detached-buffer.js fails
+built-ins/TypedArray/prototype/indexOf/fromIndex-equal-or-greater-length-returns-minus-one.js fails
+built-ins/TypedArray/prototype/indexOf/fromIndex-infinity.js fails
+built-ins/TypedArray/prototype/indexOf/fromIndex-minus-zero.js fails
+built-ins/TypedArray/prototype/indexOf/get-length-uses-internal-arraylength.js fails
+built-ins/TypedArray/prototype/indexOf/invoked-as-func.js fails
+built-ins/TypedArray/prototype/indexOf/invoked-as-method.js fails
+built-ins/TypedArray/prototype/indexOf/length-zero-returns-minus-one.js fails
+built-ins/TypedArray/prototype/indexOf/length.js fails
+built-ins/TypedArray/prototype/indexOf/name.js fails
+built-ins/TypedArray/prototype/indexOf/prop-desc.js fails
+built-ins/TypedArray/prototype/indexOf/return-abrupt-tointeger-fromindex.js fails
+built-ins/TypedArray/prototype/indexOf/search-found-returns-index.js fails
+built-ins/TypedArray/prototype/indexOf/search-not-found-returns-minus-one.js fails
+built-ins/TypedArray/prototype/indexOf/strict-comparison.js fails
+built-ins/TypedArray/prototype/indexOf/tointeger-fromindex.js fails
+built-ins/TypedArray/prototype/join/custom-separator-result-from-tostring-on-each-simple-value.js fails
+built-ins/TypedArray/prototype/join/custom-separator-result-from-tostring-on-each-value.js fails
+built-ins/TypedArray/prototype/join/detached-buffer.js fails
+built-ins/TypedArray/prototype/join/empty-instance-empty-string.js fails
+built-ins/TypedArray/prototype/join/get-length-uses-internal-arraylength.js fails
+built-ins/TypedArray/prototype/join/invoked-as-func.js fails
+built-ins/TypedArray/prototype/join/invoked-as-method.js fails
+built-ins/TypedArray/prototype/join/length.js fails
+built-ins/TypedArray/prototype/join/name.js fails
+built-ins/TypedArray/prototype/join/prop-desc.js fails
+built-ins/TypedArray/prototype/join/result-from-tostring-on-each-simple-value.js fails
+built-ins/TypedArray/prototype/join/result-from-tostring-on-each-value.js fails
+built-ins/TypedArray/prototype/join/return-abrupt-from-separator.js fails
+built-ins/TypedArray/prototype/keys/detached-buffer.js fails
+built-ins/TypedArray/prototype/lastIndexOf/detached-buffer.js fails
+built-ins/TypedArray/prototype/lastIndexOf/fromIndex-infinity.js fails
+built-ins/TypedArray/prototype/lastIndexOf/fromIndex-minus-zero.js fails
+built-ins/TypedArray/prototype/lastIndexOf/get-length-uses-internal-arraylength.js fails
+built-ins/TypedArray/prototype/lastIndexOf/invoked-as-func.js fails
+built-ins/TypedArray/prototype/lastIndexOf/invoked-as-method.js fails
+built-ins/TypedArray/prototype/lastIndexOf/length-zero-returns-minus-one.js fails
+built-ins/TypedArray/prototype/lastIndexOf/length.js fails
+built-ins/TypedArray/prototype/lastIndexOf/name.js fails
+built-ins/TypedArray/prototype/lastIndexOf/prop-desc.js fails
+built-ins/TypedArray/prototype/lastIndexOf/return-abrupt-tointeger-fromindex.js fails
+built-ins/TypedArray/prototype/lastIndexOf/search-found-returns-index.js fails
+built-ins/TypedArray/prototype/lastIndexOf/search-not-found-returns-minus-one.js fails
+built-ins/TypedArray/prototype/lastIndexOf/strict-comparison.js fails
+built-ins/TypedArray/prototype/lastIndexOf/tointeger-fromindex.js fails
+built-ins/TypedArray/prototype/length/detached-buffer.js fails
+built-ins/TypedArray/prototype/map/arraylength-internal.js fails
+built-ins/TypedArray/prototype/map/callbackfn-arguments-with-thisarg.js fails
+built-ins/TypedArray/prototype/map/callbackfn-arguments-without-thisarg.js fails
+built-ins/TypedArray/prototype/map/callbackfn-detachbuffer.js fails
+built-ins/TypedArray/prototype/map/callbackfn-no-interaction-over-non-integer-properties.js fails
+built-ins/TypedArray/prototype/map/callbackfn-not-called-on-empty.js fails
+built-ins/TypedArray/prototype/map/callbackfn-return-affects-returned-object.js fails
+built-ins/TypedArray/prototype/map/callbackfn-return-does-not-change-instance.js fails
+built-ins/TypedArray/prototype/map/callbackfn-return-does-not-copy-non-integer-properties.js fails
+built-ins/TypedArray/prototype/map/callbackfn-returns-abrupt.js fails
+built-ins/TypedArray/prototype/map/callbackfn-set-value-during-interaction.js fails
+built-ins/TypedArray/prototype/map/callbackfn-this.js fails
+built-ins/TypedArray/prototype/map/detached-buffer.js fails
+built-ins/TypedArray/prototype/map/invoked-as-func.js fails
+built-ins/TypedArray/prototype/map/invoked-as-method.js fails
+built-ins/TypedArray/prototype/map/length.js fails
+built-ins/TypedArray/prototype/map/name.js fails
+built-ins/TypedArray/prototype/map/prop-desc.js fails
+built-ins/TypedArray/prototype/map/return-new-typedarray-conversion-operation-consistent-nan.js fails
+built-ins/TypedArray/prototype/map/return-new-typedarray-conversion-operation.js fails
+built-ins/TypedArray/prototype/map/return-new-typedarray-from-empty-length.js fails
+built-ins/TypedArray/prototype/map/return-new-typedarray-from-positive-length.js fails
+built-ins/TypedArray/prototype/map/values-are-not-cached.js fails
+built-ins/TypedArray/prototype/reduce/callbackfn-arguments-custom-accumulator.js fails
+built-ins/TypedArray/prototype/reduce/callbackfn-arguments-default-accumulator.js fails
+built-ins/TypedArray/prototype/reduce/callbackfn-detachbuffer.js fails
+built-ins/TypedArray/prototype/reduce/callbackfn-no-iteration-over-non-integer-properties.js fails
+built-ins/TypedArray/prototype/reduce/callbackfn-not-called-on-empty.js fails
+built-ins/TypedArray/prototype/reduce/callbackfn-return-does-not-change-instance.js fails
+built-ins/TypedArray/prototype/reduce/callbackfn-returns-abrupt.js fails
+built-ins/TypedArray/prototype/reduce/callbackfn-set-value-during-iteration.js fails
+built-ins/TypedArray/prototype/reduce/callbackfn-this.js fails
+built-ins/TypedArray/prototype/reduce/detached-buffer.js fails
+built-ins/TypedArray/prototype/reduce/empty-instance-return-initialvalue.js fails
+built-ins/TypedArray/prototype/reduce/get-length-uses-internal-arraylength.js fails
+built-ins/TypedArray/prototype/reduce/invoked-as-func.js fails
+built-ins/TypedArray/prototype/reduce/invoked-as-method.js fails
+built-ins/TypedArray/prototype/reduce/length.js fails
+built-ins/TypedArray/prototype/reduce/name.js fails
+built-ins/TypedArray/prototype/reduce/prop-desc.js fails
+built-ins/TypedArray/prototype/reduce/result-is-last-callbackfn-return.js fails
+built-ins/TypedArray/prototype/reduce/result-of-any-type.js fails
+built-ins/TypedArray/prototype/reduce/return-first-value-without-callbackfn.js fails
+built-ins/TypedArray/prototype/reduce/values-are-not-cached.js fails
+built-ins/TypedArray/prototype/reduceRight/callbackfn-arguments-custom-accumulator.js fails
+built-ins/TypedArray/prototype/reduceRight/callbackfn-arguments-default-accumulator.js fails
+built-ins/TypedArray/prototype/reduceRight/callbackfn-detachbuffer.js fails
+built-ins/TypedArray/prototype/reduceRight/callbackfn-no-iteration-over-non-integer-properties.js fails
+built-ins/TypedArray/prototype/reduceRight/callbackfn-not-called-on-empty.js fails
+built-ins/TypedArray/prototype/reduceRight/callbackfn-return-does-not-change-instance.js fails
+built-ins/TypedArray/prototype/reduceRight/callbackfn-returns-abrupt.js fails
+built-ins/TypedArray/prototype/reduceRight/callbackfn-set-value-during-iteration.js fails
+built-ins/TypedArray/prototype/reduceRight/callbackfn-this.js fails
+built-ins/TypedArray/prototype/reduceRight/detached-buffer.js fails
+built-ins/TypedArray/prototype/reduceRight/empty-instance-return-initialvalue.js fails
+built-ins/TypedArray/prototype/reduceRight/get-length-uses-internal-arraylength.js fails
+built-ins/TypedArray/prototype/reduceRight/invoked-as-func.js fails
+built-ins/TypedArray/prototype/reduceRight/invoked-as-method.js fails
+built-ins/TypedArray/prototype/reduceRight/length.js fails
+built-ins/TypedArray/prototype/reduceRight/name.js fails
+built-ins/TypedArray/prototype/reduceRight/prop-desc.js fails
+built-ins/TypedArray/prototype/reduceRight/result-is-last-callbackfn-return.js fails
+built-ins/TypedArray/prototype/reduceRight/result-of-any-type.js fails
+built-ins/TypedArray/prototype/reduceRight/return-first-value-without-callbackfn.js fails
+built-ins/TypedArray/prototype/reduceRight/values-are-not-cached.js fails
+built-ins/TypedArray/prototype/reverse/detached-buffer.js fails
+built-ins/TypedArray/prototype/reverse/get-length-uses-internal-arraylength.js fails
+built-ins/TypedArray/prototype/reverse/invoked-as-func.js fails
+built-ins/TypedArray/prototype/reverse/invoked-as-method.js fails
+built-ins/TypedArray/prototype/reverse/length.js fails
+built-ins/TypedArray/prototype/reverse/name.js fails
+built-ins/TypedArray/prototype/reverse/preserves-non-numeric-properties.js fails
+built-ins/TypedArray/prototype/reverse/prop-desc.js fails
+built-ins/TypedArray/prototype/reverse/returns-original-object.js fails
+built-ins/TypedArray/prototype/reverse/reverts.js fails
+built-ins/TypedArray/prototype/set/array-arg-set-values-in-order.js fails
+built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-on-get-src-value-throws.js fails
+built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-on-tointeger-offset-throws.js fails
+built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-throws.js fails
+built-ins/TypedArray/prototype/set/typedarray-arg-srcbuffer-detached-during-tointeger-offset-throws.js fails
+built-ins/TypedArray/prototype/set/typedarray-arg-targetbuffer-detached-during-tointeger-offset-throws.js fails
+built-ins/TypedArray/prototype/slice/arraylength-internal.js fails
+built-ins/TypedArray/prototype/slice/bit-precision.js fails
+built-ins/TypedArray/prototype/slice/detached-buffer-zero-count-custom-ctor-other-targettype.js fails
+built-ins/TypedArray/prototype/slice/detached-buffer-zero-count-custom-ctor-same-targettype.js fails
+built-ins/TypedArray/prototype/slice/detached-buffer.js fails
+built-ins/TypedArray/prototype/slice/infinity.js fails
+built-ins/TypedArray/prototype/slice/invoked-as-func.js fails
+built-ins/TypedArray/prototype/slice/invoked-as-method.js fails
+built-ins/TypedArray/prototype/slice/length.js fails
+built-ins/TypedArray/prototype/slice/minus-zero.js fails
+built-ins/TypedArray/prototype/slice/name.js fails
+built-ins/TypedArray/prototype/slice/prop-desc.js fails
+built-ins/TypedArray/prototype/slice/result-does-not-copy-ordinary-properties.js fails
+built-ins/TypedArray/prototype/slice/results-with-different-length.js fails
+built-ins/TypedArray/prototype/slice/results-with-empty-length.js fails
+built-ins/TypedArray/prototype/slice/results-with-same-length.js fails
+built-ins/TypedArray/prototype/slice/return-abrupt-from-end.js fails
+built-ins/TypedArray/prototype/slice/return-abrupt-from-start.js fails
+built-ins/TypedArray/prototype/slice/set-values-from-different-ctor-type.js fails
+built-ins/TypedArray/prototype/slice/speciesctor-get-ctor-abrupt.js fails
+built-ins/TypedArray/prototype/slice/speciesctor-get-ctor-inherited.js fails
+built-ins/TypedArray/prototype/slice/speciesctor-get-ctor.js fails
+built-ins/TypedArray/prototype/slice/speciesctor-get-species-abrupt.js fails
+built-ins/TypedArray/prototype/slice/speciesctor-get-species-custom-ctor-invocation.js fails
+built-ins/TypedArray/prototype/slice/speciesctor-get-species-custom-ctor-length.js fails
+built-ins/TypedArray/prototype/slice/speciesctor-get-species-custom-ctor-returns-another-instance.js fails
+built-ins/TypedArray/prototype/slice/speciesctor-get-species-custom-ctor.js fails
+built-ins/TypedArray/prototype/slice/speciesctor-get-species-use-default-ctor.js fails
+built-ins/TypedArray/prototype/slice/speciesctor-get-species.js fails
+built-ins/TypedArray/prototype/slice/tointeger-end.js fails
+built-ins/TypedArray/prototype/slice/tointeger-start.js fails
+built-ins/TypedArray/prototype/some/callbackfn-arguments-with-thisarg.js fails
+built-ins/TypedArray/prototype/some/callbackfn-arguments-without-thisarg.js fails
+built-ins/TypedArray/prototype/some/callbackfn-detachbuffer.js fails
+built-ins/TypedArray/prototype/some/callbackfn-no-interaction-over-non-integer.js fails
+built-ins/TypedArray/prototype/some/callbackfn-not-called-on-empty.js fails
+built-ins/TypedArray/prototype/some/callbackfn-return-does-not-change-instance.js fails
+built-ins/TypedArray/prototype/some/callbackfn-returns-abrupt.js fails
+built-ins/TypedArray/prototype/some/callbackfn-set-value-during-interaction.js fails
+built-ins/TypedArray/prototype/some/callbackfn-this.js fails
+built-ins/TypedArray/prototype/some/detached-buffer.js fails
+built-ins/TypedArray/prototype/some/get-length-uses-internal-arraylength.js fails
+built-ins/TypedArray/prototype/some/invoked-as-func.js fails
+built-ins/TypedArray/prototype/some/invoked-as-method.js fails
+built-ins/TypedArray/prototype/some/length.js fails
+built-ins/TypedArray/prototype/some/name.js fails
+built-ins/TypedArray/prototype/some/prop-desc.js fails
+built-ins/TypedArray/prototype/some/returns-false-if-every-cb-returns-false.js fails
+built-ins/TypedArray/prototype/some/returns-true-if-any-cb-returns-true.js fails
+built-ins/TypedArray/prototype/some/values-are-not-cached.js fails
+built-ins/TypedArray/prototype/sort/arraylength-internal.js fails
+built-ins/TypedArray/prototype/sort/comparefn-call-throws.js fails
+built-ins/TypedArray/prototype/sort/comparefn-calls.js fails
+built-ins/TypedArray/prototype/sort/detached-buffer-comparefn.js fails
+built-ins/TypedArray/prototype/sort/detached-buffer.js fails
+built-ins/TypedArray/prototype/sort/invoked-as-func.js fails
+built-ins/TypedArray/prototype/sort/invoked-as-method.js fails
+built-ins/TypedArray/prototype/sort/length.js fails
+built-ins/TypedArray/prototype/sort/name.js fails
+built-ins/TypedArray/prototype/sort/prop-desc.js fails
+built-ins/TypedArray/prototype/sort/return-same-instance.js fails
+built-ins/TypedArray/prototype/sort/sortcompare-with-no-tostring.js fails
+built-ins/TypedArray/prototype/sort/sorted-values-nan.js fails
+built-ins/TypedArray/prototype/sort/sorted-values.js fails
+built-ins/TypedArray/prototype/subarray/detached-buffer.js fails
+built-ins/TypedArray/prototype/subarray/length.js fails
+built-ins/TypedArray/prototype/subarray/speciesctor-get-ctor-inherited.js fails
+built-ins/TypedArray/prototype/subarray/speciesctor-get-ctor.js fails
+built-ins/TypedArray/prototype/subarray/speciesctor-get-species-abrupt.js fails
+built-ins/TypedArray/prototype/subarray/speciesctor-get-species-custom-ctor-invocation.js fails
+built-ins/TypedArray/prototype/subarray/speciesctor-get-species-custom-ctor-returns-another-instance.js fails
+built-ins/TypedArray/prototype/subarray/speciesctor-get-species-custom-ctor.js fails
+built-ins/TypedArray/prototype/subarray/speciesctor-get-species-use-default-ctor.js fails
+built-ins/TypedArray/prototype/subarray/speciesctor-get-species.js fails
+built-ins/TypedArray/prototype/toLocaleString/calls-tolocalestring-from-each-value.js fails
+built-ins/TypedArray/prototype/toLocaleString/calls-tostring-from-each-value.js fails
+built-ins/TypedArray/prototype/toLocaleString/calls-valueof-from-each-value.js fails
+built-ins/TypedArray/prototype/toLocaleString/detached-buffer.js fails
+built-ins/TypedArray/prototype/toLocaleString/empty-instance-returns-empty-string.js fails
+built-ins/TypedArray/prototype/toLocaleString/invoked-as-method.js fails
+built-ins/TypedArray/prototype/toLocaleString/prop-desc.js fails
+built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-firstelement-tolocalestring.js fails
+built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-firstelement-tostring.js fails
+built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-firstelement-valueof.js fails
+built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-nextelement-tolocalestring.js fails
+built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-nextelement-tostring.js fails
+built-ins/TypedArray/prototype/toLocaleString/return-abrupt-from-nextelement-valueof.js fails
+built-ins/TypedArray/prototype/toLocaleString/return-result.js fails
+built-ins/TypedArray/prototype/toLocaleString/this-is-not-object.js fails
+built-ins/TypedArray/prototype/toLocaleString/this-is-not-typedarray-instance.js fails
+built-ins/TypedArray/prototype/toString.js fails
+built-ins/TypedArray/prototype/toString/detached-buffer.js fails
+built-ins/TypedArray/prototype/values/detached-buffer.js fails
+built-ins/TypedArrays/ctors/buffer-arg/byteoffset-to-number-detachbuffer.js fails
+built-ins/TypedArrays/ctors/buffer-arg/custom-proto-access-throws.js fails
+built-ins/TypedArrays/ctors/buffer-arg/defined-negative-length.js fails
+built-ins/TypedArrays/ctors/buffer-arg/detachedbuffer.js fails
+built-ins/TypedArrays/ctors/buffer-arg/length-to-number-detachbuffer.js fails
+built-ins/TypedArrays/ctors/buffer-arg/proto-from-ctor-realm.js fails
+built-ins/TypedArrays/ctors/buffer-arg/use-custom-proto-if-object.js fails
+built-ins/TypedArrays/ctors/length-arg/custom-proto-access-throws.js fails
+built-ins/TypedArrays/ctors/length-arg/proto-from-ctor-realm.js fails
+built-ins/TypedArrays/ctors/length-arg/use-custom-proto-if-object.js fails
+built-ins/TypedArrays/ctors/no-args/custom-proto-access-throws.js fails
+built-ins/TypedArrays/ctors/no-args/proto-from-ctor-realm.js fails
+built-ins/TypedArrays/ctors/no-args/use-custom-proto-if-object.js fails
+built-ins/TypedArrays/ctors/object-arg/as-generator-iterable-returns.js fails
+built-ins/TypedArrays/ctors/object-arg/custom-proto-access-throws.js fails
+built-ins/TypedArrays/ctors/object-arg/iterator-not-callable-throws.js fails
+built-ins/TypedArrays/ctors/object-arg/proto-from-ctor-realm.js fails
+built-ins/TypedArrays/ctors/object-arg/use-custom-proto-if-object.js fails
+built-ins/TypedArrays/ctors/typedarray-arg/custom-proto-access-throws.js fails
+built-ins/TypedArrays/ctors/typedarray-arg/detached-when-species-retrieved-different-type.js fails
+built-ins/TypedArrays/ctors/typedarray-arg/detached-when-species-retrieved-same-type.js fails
+built-ins/TypedArrays/ctors/typedarray-arg/other-ctor-buffer-ctor-custom-species-proto-from-ctor-realm.js fails
+built-ins/TypedArrays/ctors/typedarray-arg/other-ctor-buffer-ctor-custom-species.js fails
+built-ins/TypedArrays/ctors/typedarray-arg/other-ctor-buffer-ctor-not-object-throws.js fails
+built-ins/TypedArrays/ctors/typedarray-arg/other-ctor-buffer-ctor-species-not-ctor-throws.js fails
+built-ins/TypedArrays/ctors/typedarray-arg/other-ctor-buffer-ctor-species-prototype-throws.js fails
+built-ins/TypedArrays/ctors/typedarray-arg/proto-from-ctor-realm.js fails
+built-ins/TypedArrays/ctors/typedarray-arg/same-ctor-buffer-ctor-species-custom-proto-from-ctor-realm.js fails
+built-ins/TypedArrays/ctors/typedarray-arg/same-ctor-buffer-ctor-species-custom.js fails
+built-ins/TypedArrays/ctors/typedarray-arg/same-ctor-buffer-ctor-species-not-ctor.js fails
+built-ins/TypedArrays/ctors/typedarray-arg/same-ctor-buffer-ctor-species-prototype-throws.js fails
+built-ins/TypedArrays/ctors/typedarray-arg/same-ctor-buffer-ctor-value-not-obj-throws.js fails
+built-ins/TypedArrays/ctors/typedarray-arg/use-custom-proto-if-object.js fails
+built-ins/TypedArrays/from/arylk-get-length-error.js fails
+built-ins/TypedArrays/from/arylk-to-length-error.js fails
+built-ins/TypedArrays/from/custom-ctor-returns-other-instance.js fails
+built-ins/TypedArrays/from/custom-ctor.js fails
+built-ins/TypedArrays/from/iter-access-error.js fails
+built-ins/TypedArrays/from/iter-invoke-error.js fails
+built-ins/TypedArrays/from/iter-next-error.js fails
+built-ins/TypedArrays/from/iter-next-value-error.js fails
+built-ins/TypedArrays/from/mapfn-abrupt-completion.js fails
+built-ins/TypedArrays/from/mapfn-arguments.js fails
+built-ins/TypedArrays/from/mapfn-this-with-thisarg.js fails
+built-ins/TypedArrays/from/mapfn-this-without-thisarg-non-strict.js sloppyFails
+built-ins/TypedArrays/from/mapfn-this-without-thisarg-strict.js strictFails
+built-ins/TypedArrays/from/nan-conversion.js fails
+built-ins/TypedArrays/from/new-instance-empty.js fails
+built-ins/TypedArrays/from/new-instance-from-ordinary-object.js fails
+built-ins/TypedArrays/from/new-instance-from-sparse-array.js fails
+built-ins/TypedArrays/from/new-instance-from-zero.js fails
+built-ins/TypedArrays/from/new-instance-using-custom-ctor.js fails
+built-ins/TypedArrays/from/new-instance-with-mapfn.js fails
+built-ins/TypedArrays/from/new-instance-without-mapfn.js fails
+built-ins/TypedArrays/from/property-abrupt-completion.js fails
+built-ins/TypedArrays/from/set-value-abrupt-completion.js fails
+built-ins/TypedArrays/internals/DefineOwnProperty/conversion-operation-consistent-nan.js fails
+built-ins/TypedArrays/internals/DefineOwnProperty/conversion-operation.js fails
+built-ins/TypedArrays/internals/DefineOwnProperty/detached-buffer-realm.js fails
+built-ins/TypedArrays/internals/DefineOwnProperty/detached-buffer.js fails
+built-ins/TypedArrays/internals/DefineOwnProperty/key-is-greater-than-last-index.js fails
+built-ins/TypedArrays/internals/DefineOwnProperty/key-is-lower-than-zero.js fails
+built-ins/TypedArrays/internals/DefineOwnProperty/key-is-minus-zero.js fails
+built-ins/TypedArrays/internals/DefineOwnProperty/key-is-not-integer.js fails
+built-ins/TypedArrays/internals/DefineOwnProperty/key-is-numericindex-accessor-desc.js fails
+built-ins/TypedArrays/internals/DefineOwnProperty/key-is-numericindex-desc-configurable.js fails
+built-ins/TypedArrays/internals/DefineOwnProperty/key-is-numericindex-desc-not-enumerable.js fails
+built-ins/TypedArrays/internals/DefineOwnProperty/key-is-numericindex-desc-not-writable.js fails
+built-ins/TypedArrays/internals/DefineOwnProperty/key-is-numericindex.js fails
+built-ins/TypedArrays/internals/DefineOwnProperty/set-value.js fails
+built-ins/TypedArrays/internals/DefineOwnProperty/tonumber-value-detached-buffer.js fails
+built-ins/TypedArrays/internals/Get/detached-buffer-key-is-not-numeric-index.js fails
+built-ins/TypedArrays/internals/Get/detached-buffer-key-is-symbol.js fails
+built-ins/TypedArrays/internals/Get/detached-buffer-realm.js fails
+built-ins/TypedArrays/internals/Get/detached-buffer.js fails
+built-ins/TypedArrays/internals/Get/infinity-detached-buffer.js fails
+built-ins/TypedArrays/internals/Get/key-is-not-integer.js fails
+built-ins/TypedArrays/internals/Get/key-is-not-minus-zero.js fails
+built-ins/TypedArrays/internals/Get/key-is-out-of-bounds.js fails
+built-ins/TypedArrays/internals/GetOwnProperty/detached-buffer-key-is-not-number.js fails
+built-ins/TypedArrays/internals/GetOwnProperty/detached-buffer-key-is-symbol.js fails
+built-ins/TypedArrays/internals/GetOwnProperty/detached-buffer-realm.js fails
+built-ins/TypedArrays/internals/GetOwnProperty/detached-buffer.js fails
+built-ins/TypedArrays/internals/GetOwnProperty/enumerate-detached-buffer.js fails
+built-ins/TypedArrays/internals/GetOwnProperty/index-prop-desc.js fails
+built-ins/TypedArrays/internals/HasProperty/detached-buffer-key-is-not-number.js fails
+built-ins/TypedArrays/internals/HasProperty/detached-buffer-key-is-symbol.js fails
+built-ins/TypedArrays/internals/HasProperty/detached-buffer-realm.js fails
+built-ins/TypedArrays/internals/HasProperty/detached-buffer.js fails
+built-ins/TypedArrays/internals/HasProperty/infinity-with-detached-buffer.js sloppyFails
+built-ins/TypedArrays/internals/HasProperty/key-is-lower-than-zero.js fails
+built-ins/TypedArrays/internals/HasProperty/key-is-minus-zero.js fails
+built-ins/TypedArrays/internals/HasProperty/key-is-not-integer.js fails
+built-ins/TypedArrays/internals/OwnPropertyKeys/integer-indexes-and-string-and-symbol-keys-.js fails
+built-ins/TypedArrays/internals/OwnPropertyKeys/integer-indexes-and-string-keys.js fails
+built-ins/TypedArrays/internals/OwnPropertyKeys/integer-indexes.js fails
+built-ins/TypedArrays/internals/OwnPropertyKeys/not-enumerable-keys.js fails
+built-ins/TypedArrays/internals/Set/detached-buffer-key-is-not-numeric-index.js fails
+built-ins/TypedArrays/internals/Set/detached-buffer-key-is-symbol.js fails
+built-ins/TypedArrays/internals/Set/detached-buffer-realm.js fails
+built-ins/TypedArrays/internals/Set/detached-buffer.js fails
+built-ins/TypedArrays/internals/Set/key-is-minus-zero.js fails
+built-ins/TypedArrays/internals/Set/key-is-not-integer.js fails
+built-ins/TypedArrays/internals/Set/key-is-out-of-bounds.js fails
+built-ins/TypedArrays/internals/Set/tonumber-value-detached-buffer.js fails
+built-ins/TypedArrays/internals/Set/tonumber-value-throws.js strictFails
+built-ins/TypedArrays/of/argument-number-value-throws.js fails
+built-ins/TypedArrays/of/custom-ctor-returns-other-instance.js fails
+built-ins/TypedArrays/of/custom-ctor.js fails
+built-ins/TypedArrays/of/nan-conversion.js fails
+built-ins/TypedArrays/of/new-instance-empty.js fails
+built-ins/TypedArrays/of/new-instance-from-zero.js fails
+built-ins/TypedArrays/of/new-instance-using-custom-ctor.js fails
+built-ins/TypedArrays/of/new-instance.js fails
+built-ins/WeakMap/constructor.js fails
+built-ins/WeakMap/empty-iterable.js fails
+built-ins/WeakMap/get-set-method-failure.js fails
+built-ins/WeakMap/iterable-failure.js fails
+built-ins/WeakMap/iterable.js fails
+built-ins/WeakMap/iterator-close-after-set-failure.js fails
+built-ins/WeakMap/iterator-item-first-entry-returns-abrupt.js fails
+built-ins/WeakMap/iterator-item-second-entry-returns-abrupt.js fails
+built-ins/WeakMap/iterator-items-are-not-object-close-iterator.js fails
+built-ins/WeakMap/iterator-items-are-not-object.js fails
+built-ins/WeakMap/iterator-next-failure.js fails
+built-ins/WeakMap/iterator-value-failure.js fails
+built-ins/WeakMap/length.js fails
+built-ins/WeakMap/name.js fails
+built-ins/WeakMap/no-iterable.js fails
+built-ins/WeakMap/properties-of-map-instances.js fails
+built-ins/WeakMap/properties-of-the-weakmap-prototype-object.js fails
+built-ins/WeakMap/proto-from-ctor-realm.js fails
+built-ins/WeakMap/prototype-of-weakmap.js fails
+built-ins/WeakMap/prototype/Symbol.toStringTag.js fails
+built-ins/WeakMap/prototype/constructor.js fails
+built-ins/WeakMap/prototype/delete/delete-entry-initial-iterable.js fails
+built-ins/WeakMap/prototype/delete/delete-entry.js fails
+built-ins/WeakMap/prototype/delete/delete.js fails
+built-ins/WeakMap/prototype/delete/does-not-have-weakmapdata-internal-slot-array.js fails
+built-ins/WeakMap/prototype/delete/does-not-have-weakmapdata-internal-slot-map.js fails
+built-ins/WeakMap/prototype/delete/does-not-have-weakmapdata-internal-slot-object.js fails
+built-ins/WeakMap/prototype/delete/does-not-have-weakmapdata-internal-slot-set.js fails
+built-ins/WeakMap/prototype/delete/does-not-have-weakmapdata-internal-slot-weakmap-prototype.js fails
+built-ins/WeakMap/prototype/delete/length.js fails
+built-ins/WeakMap/prototype/delete/name.js fails
+built-ins/WeakMap/prototype/delete/returns-false-value-is-not-object.js fails
+built-ins/WeakMap/prototype/delete/returns-false-when-delete-is-noop.js fails
+built-ins/WeakMap/prototype/delete/this-not-object-throw-boolean.js fails
+built-ins/WeakMap/prototype/delete/this-not-object-throw-null.js fails
+built-ins/WeakMap/prototype/delete/this-not-object-throw-number.js fails
+built-ins/WeakMap/prototype/delete/this-not-object-throw-string.js fails
+built-ins/WeakMap/prototype/delete/this-not-object-throw-symbol.js fails
+built-ins/WeakMap/prototype/delete/this-not-object-throw-undefined.js fails
+built-ins/WeakMap/prototype/get/does-not-have-weakmapdata-internal-slot-map.js fails
+built-ins/WeakMap/prototype/get/does-not-have-weakmapdata-internal-slot-set.js fails
+built-ins/WeakMap/prototype/get/does-not-have-weakmapdata-internal-slot.js fails
+built-ins/WeakMap/prototype/get/get.js fails
+built-ins/WeakMap/prototype/get/length.js fails
+built-ins/WeakMap/prototype/get/name.js fails
+built-ins/WeakMap/prototype/get/returns-undefined-key-is-not-object.js fails
+built-ins/WeakMap/prototype/get/returns-undefined.js fails
+built-ins/WeakMap/prototype/get/returns-value.js fails
+built-ins/WeakMap/prototype/get/this-not-object-throw.js fails
+built-ins/WeakMap/prototype/has/does-not-have-weakmapdata-internal-slot-array.js fails
+built-ins/WeakMap/prototype/has/does-not-have-weakmapdata-internal-slot-map.js fails
+built-ins/WeakMap/prototype/has/does-not-have-weakmapdata-internal-slot-object.js fails
+built-ins/WeakMap/prototype/has/does-not-have-weakmapdata-internal-slot-set.js fails
+built-ins/WeakMap/prototype/has/does-not-have-weakmapdata-internal-slot-weakmap-prototype.js fails
+built-ins/WeakMap/prototype/has/has.js fails
+built-ins/WeakMap/prototype/has/length.js fails
+built-ins/WeakMap/prototype/has/name.js fails
+built-ins/WeakMap/prototype/has/returns-false-when-value-is-not-object.js fails
+built-ins/WeakMap/prototype/has/returns-false-when-value-not-present.js fails
+built-ins/WeakMap/prototype/has/returns-true-when-value-present.js fails
+built-ins/WeakMap/prototype/has/this-not-object-throw-boolean.js fails
+built-ins/WeakMap/prototype/has/this-not-object-throw-null.js fails
+built-ins/WeakMap/prototype/has/this-not-object-throw-number.js fails
+built-ins/WeakMap/prototype/has/this-not-object-throw-string.js fails
+built-ins/WeakMap/prototype/has/this-not-object-throw-symbol.js fails
+built-ins/WeakMap/prototype/has/this-not-object-throw-undefined.js fails
+built-ins/WeakMap/prototype/prototype-attributes.js fails
+built-ins/WeakMap/prototype/set/adds-element.js fails
+built-ins/WeakMap/prototype/set/does-not-have-weakmapdata-internal-slot-array.js fails
+built-ins/WeakMap/prototype/set/does-not-have-weakmapdata-internal-slot-map.js fails
+built-ins/WeakMap/prototype/set/does-not-have-weakmapdata-internal-slot-object.js fails
+built-ins/WeakMap/prototype/set/does-not-have-weakmapdata-internal-slot-set.js fails
+built-ins/WeakMap/prototype/set/does-not-have-weakmapdata-internal-slot-weakmap-prototype.js fails
+built-ins/WeakMap/prototype/set/key-not-object-throw.js fails
+built-ins/WeakMap/prototype/set/length.js fails
+built-ins/WeakMap/prototype/set/name.js fails
+built-ins/WeakMap/prototype/set/returns-this-when-ignoring-duplicate.js fails
+built-ins/WeakMap/prototype/set/returns-this.js fails
+built-ins/WeakMap/prototype/set/set.js fails
+built-ins/WeakMap/prototype/set/this-not-object-throw-boolean.js fails
+built-ins/WeakMap/prototype/set/this-not-object-throw-null.js fails
+built-ins/WeakMap/prototype/set/this-not-object-throw-number.js fails
+built-ins/WeakMap/prototype/set/this-not-object-throw-string.js fails
+built-ins/WeakMap/prototype/set/this-not-object-throw-symbol.js fails
+built-ins/WeakMap/prototype/set/this-not-object-throw-undefined.js fails
+built-ins/WeakMap/set-not-callable-throws.js fails
+built-ins/WeakMap/undefined-newtarget.js fails
+built-ins/WeakMap/weakmap.js fails
+built-ins/WeakSet/add-not-callable-throws.js fails
+built-ins/WeakSet/constructor.js fails
+built-ins/WeakSet/empty-iterable.js fails
+built-ins/WeakSet/get-add-method-failure.js fails
+built-ins/WeakSet/iterable-failure.js fails
+built-ins/WeakSet/iterable.js fails
+built-ins/WeakSet/iterator-close-after-add-failure.js fails
+built-ins/WeakSet/iterator-next-failure.js fails
+built-ins/WeakSet/iterator-value-failure.js fails
+built-ins/WeakSet/length.js fails
+built-ins/WeakSet/name.js fails
+built-ins/WeakSet/no-iterable.js fails
+built-ins/WeakSet/properties-of-the-weakset-prototype-object.js fails
+built-ins/WeakSet/proto-from-ctor-realm.js fails
+built-ins/WeakSet/prototype-of-weakset.js fails
+built-ins/WeakSet/prototype/Symbol.toStringTag.js fails
+built-ins/WeakSet/prototype/add/add.js fails
+built-ins/WeakSet/prototype/add/adds-element.js fails
+built-ins/WeakSet/prototype/add/does-not-have-weaksetdata-internal-slot-array.js fails
+built-ins/WeakSet/prototype/add/does-not-have-weaksetdata-internal-slot-map.js fails
+built-ins/WeakSet/prototype/add/does-not-have-weaksetdata-internal-slot-object.js fails
+built-ins/WeakSet/prototype/add/does-not-have-weaksetdata-internal-slot-set.js fails
+built-ins/WeakSet/prototype/add/does-not-have-weaksetdata-internal-slot-weakset-prototype.js fails
+built-ins/WeakSet/prototype/add/length.js fails
+built-ins/WeakSet/prototype/add/name.js fails
+built-ins/WeakSet/prototype/add/returns-this-when-ignoring-duplicate.js fails
+built-ins/WeakSet/prototype/add/returns-this.js fails
+built-ins/WeakSet/prototype/add/this-not-object-throw-boolean.js fails
+built-ins/WeakSet/prototype/add/this-not-object-throw-null.js fails
+built-ins/WeakSet/prototype/add/this-not-object-throw-number.js fails
+built-ins/WeakSet/prototype/add/this-not-object-throw-string.js fails
+built-ins/WeakSet/prototype/add/this-not-object-throw-symbol.js fails
+built-ins/WeakSet/prototype/add/this-not-object-throw-undefined.js fails
+built-ins/WeakSet/prototype/add/value-not-object-throw.js fails
+built-ins/WeakSet/prototype/constructor/weakset-prototype-constructor-intrinsic.js fails
+built-ins/WeakSet/prototype/constructor/weakset-prototype-constructor.js fails
+built-ins/WeakSet/prototype/delete/delete-entry-initial-iterable.js fails
+built-ins/WeakSet/prototype/delete/delete-entry.js fails
+built-ins/WeakSet/prototype/delete/delete.js fails
+built-ins/WeakSet/prototype/delete/does-not-have-weaksetdata-internal-slot-array.js fails
+built-ins/WeakSet/prototype/delete/does-not-have-weaksetdata-internal-slot-map.js fails
+built-ins/WeakSet/prototype/delete/does-not-have-weaksetdata-internal-slot-object.js fails
+built-ins/WeakSet/prototype/delete/does-not-have-weaksetdata-internal-slot-set.js fails
+built-ins/WeakSet/prototype/delete/does-not-have-weaksetdata-internal-slot-weakset-prototype.js fails
+built-ins/WeakSet/prototype/delete/length.js fails
+built-ins/WeakSet/prototype/delete/name.js fails
+built-ins/WeakSet/prototype/delete/returns-false-value-is-not-object.js fails
+built-ins/WeakSet/prototype/delete/returns-false-when-delete-is-noop.js fails
+built-ins/WeakSet/prototype/delete/this-not-object-throw-boolean.js fails
+built-ins/WeakSet/prototype/delete/this-not-object-throw-null.js fails
+built-ins/WeakSet/prototype/delete/this-not-object-throw-number.js fails
+built-ins/WeakSet/prototype/delete/this-not-object-throw-string.js fails
+built-ins/WeakSet/prototype/delete/this-not-object-throw-symbol.js fails
+built-ins/WeakSet/prototype/delete/this-not-object-throw-undefined.js fails
+built-ins/WeakSet/prototype/has/does-not-have-weaksetdata-internal-slot-array.js fails
+built-ins/WeakSet/prototype/has/does-not-have-weaksetdata-internal-slot-map.js fails
+built-ins/WeakSet/prototype/has/does-not-have-weaksetdata-internal-slot-object.js fails
+built-ins/WeakSet/prototype/has/does-not-have-weaksetdata-internal-slot-set.js fails
+built-ins/WeakSet/prototype/has/does-not-have-weaksetdata-internal-slot-weakset-prototype.js fails
+built-ins/WeakSet/prototype/has/has.js fails
+built-ins/WeakSet/prototype/has/length.js fails
+built-ins/WeakSet/prototype/has/name.js fails
+built-ins/WeakSet/prototype/has/returns-false-when-value-is-not-object.js fails
+built-ins/WeakSet/prototype/has/returns-false-when-value-not-present.js fails
+built-ins/WeakSet/prototype/has/returns-true-when-value-present.js fails
+built-ins/WeakSet/prototype/has/this-not-object-throw-boolean.js fails
+built-ins/WeakSet/prototype/has/this-not-object-throw-null.js fails
+built-ins/WeakSet/prototype/has/this-not-object-throw-number.js fails
+built-ins/WeakSet/prototype/has/this-not-object-throw-string.js fails
+built-ins/WeakSet/prototype/has/this-not-object-throw-symbol.js fails
+built-ins/WeakSet/prototype/has/this-not-object-throw-undefined.js fails
+built-ins/WeakSet/prototype/prototype-attributes.js fails
+built-ins/WeakSet/symbol-disallowed-as-weakset-key.js fails
+built-ins/WeakSet/undefined-newtarget.js fails
+built-ins/WeakSet/weakset.js fails
+built-ins/global/global-object.js fails
+built-ins/global/property-descriptor.js fails
+built-ins/isFinite/toprimitive-not-callable-throws.js fails
+built-ins/isNaN/toprimitive-not-callable-throws.js fails
+language/arguments-object/mapped/mapped-arguments-nonconfigurable-2.js sloppyFails
+language/arguments-object/mapped/mapped-arguments-nonconfigurable-3.js sloppyFails
+language/arguments-object/mapped/mapped-arguments-nonconfigurable-4.js sloppyFails
+language/arguments-object/mapped/mapped-arguments-nonconfigurable-delete-2.js sloppyFails
+language/arguments-object/mapped/mapped-arguments-nonconfigurable-delete-3.js sloppyFails
+language/arguments-object/mapped/mapped-arguments-nonconfigurable-delete-4.js sloppyFails
+language/arguments-object/mapped/mapped-arguments-nonconfigurable-nonwritable-1.js sloppyFails
+language/arguments-object/mapped/mapped-arguments-nonconfigurable-nonwritable-3.js sloppyFails
+language/arguments-object/mapped/mapped-arguments-nonconfigurable-nonwritable-4.js sloppyFails
+language/arguments-object/mapped/mapped-arguments-nonconfigurable-nonwritable-5.js sloppyFails
+language/arguments-object/mapped/mapped-arguments-nonconfigurable-strict-delete-2.js sloppyFails
+language/arguments-object/mapped/mapped-arguments-nonconfigurable-strict-delete-3.js sloppyFails
+language/arguments-object/mapped/mapped-arguments-nonconfigurable-strict-delete-4.js sloppyFails
+language/arguments-object/mapped/mapped-arguments-nonwritable-nonconfigurable-1.js sloppyFails
+language/arguments-object/mapped/mapped-arguments-nonwritable-nonconfigurable-3.js sloppyFails
+language/arguments-object/mapped/mapped-arguments-nonwritable-nonconfigurable-4.js sloppyFails
+language/arguments-object/mapped/nonconfigurable-descriptors-set-value-by-arguments.js sloppyFails
+language/arguments-object/mapped/nonconfigurable-descriptors-set-value-with-define-property.js sloppyFails
+language/arguments-object/mapped/nonconfigurable-descriptors-with-param-assign.js sloppyFails
+language/arguments-object/mapped/nonconfigurable-nonenumerable-nonwritable-descriptors-set-by-arguments.js sloppyFails
+language/arguments-object/mapped/nonconfigurable-nonenumerable-nonwritable-descriptors-set-by-param.js sloppyFails
+language/arguments-object/mapped/nonconfigurable-nonwritable-descriptors-set-by-arguments.js sloppyFails
+language/arguments-object/mapped/nonconfigurable-nonwritable-descriptors-set-by-param.js sloppyFails
+language/arguments-object/mapped/nonwritable-nonconfigurable-descriptors-set-by-arguments.js sloppyFails
+language/computed-property-names/class/static/generator-prototype.js fails
+language/computed-property-names/class/static/getter-prototype.js fails
+language/computed-property-names/class/static/method-prototype.js fails
+language/computed-property-names/class/static/method-number.js fails
+language/computed-property-names/class/static/method-string.js fails
+language/computed-property-names/class/static/method-symbol.js fails
+language/computed-property-names/class/static/setter-prototype.js fails
+language/eval-code/direct/lex-env-no-init-cls.js fails
+language/eval-code/direct/lex-env-no-init-const.js fails
+language/eval-code/direct/lex-env-no-init-let.js fails
+language/eval-code/direct/new.target.js fails
+language/eval-code/direct/new.target-arrow.js fails
+language/eval-code/direct/new.target-fn.js fails
+language/eval-code/direct/non-definable-function-with-function.js sloppyFails
+language/eval-code/direct/non-definable-function-with-variable.js sloppyFails
+language/eval-code/direct/non-definable-global-function.js sloppyFails
+language/eval-code/direct/non-definable-global-generator.js sloppyFails
+language/eval-code/direct/super-call-arrow.js fails
+language/eval-code/direct/super-call-fn.js fails
+language/eval-code/direct/super-call-method.js fails
+language/eval-code/direct/super-call.js fails
+language/eval-code/direct/super-prop-arrow.js fails
+language/eval-code/direct/super-prop-dot-no-home.js fails
+language/eval-code/direct/super-prop-expr-no-home-no-eval.js fails
+language/eval-code/direct/super-prop-expr-no-home.js fails
+language/eval-code/direct/super-prop.js fails
+language/eval-code/direct/this-value-func-strict-source.js sloppyFails
+language/eval-code/direct/var-env-func-init-global-update-configurable.js sloppyFails
+language/eval-code/direct/var-env-global-lex-non-strict.js sloppyFails
+language/eval-code/direct/var-env-lower-lex-catch-non-strict.js sloppyFails
+language/eval-code/direct/var-env-lower-lex-non-strict.js sloppyFails
+language/eval-code/indirect/always-non-strict.js strictFails
+language/eval-code/indirect/lex-env-no-init-cls.js fails
+language/eval-code/indirect/lex-env-no-init-const.js fails
+language/eval-code/indirect/lex-env-no-init-let.js fails
+language/eval-code/indirect/new.target.js fails
+language/eval-code/indirect/non-definable-function-with-function.js sloppyFails
+language/eval-code/indirect/non-definable-function-with-variable.js sloppyFails
+language/eval-code/indirect/non-definable-global-function.js fails
+language/eval-code/indirect/non-definable-global-generator.js fails
+language/eval-code/indirect/realm.js fails
+language/eval-code/indirect/super-call.js fails
+language/eval-code/indirect/super-prop.js fails
+language/eval-code/indirect/this-value-func.js strictFails
+language/eval-code/indirect/var-env-func-init-global-new.js strictFails
+language/eval-code/indirect/var-env-func-init-global-update-configurable.js fails
+language/eval-code/indirect/var-env-func-init-multi.js strictFails
+language/eval-code/indirect/var-env-func-non-strict.js strictFails
+language/eval-code/indirect/var-env-global-lex-non-strict.js fails
+language/eval-code/indirect/var-env-var-init-global-exstng.js strictFails
+language/eval-code/indirect/var-env-var-init-global-new.js strictFails
+language/eval-code/indirect/var-env-var-non-strict.js strictFails
+language/expressions/arrow-function/cannot-override-this-with-thisArg.js fails
+language/expressions/arrow-function/dflt-params-ref-later.js fails
+language/expressions/arrow-function/dflt-params-ref-self.js fails
+language/expressions/arrow-function/lexical-arguments.js fails
+language/expressions/arrow-function/lexical-new.target-closure-returned.js fails
+language/expressions/arrow-function/lexical-new.target.js fails
+language/expressions/arrow-function/lexical-super-call-from-within-constructor.js fails
+language/expressions/arrow-function/lexical-super-property-from-within-constructor.js fails
+language/expressions/arrow-function/lexical-super-property.js fails
+language/expressions/arrow-function/lexical-supercall-from-immediately-invoked-arrow.js fails
+language/expressions/arrow-function/lexical-this.js fails
+language/expressions/arrow-function/prototype-rules.js fails
+language/expressions/arrow-function/scope-body-lex-distinct.js sloppyFails
+language/expressions/arrow-function/scope-param-elem-var-close.js sloppyFails
+language/expressions/arrow-function/scope-param-elem-var-open.js sloppyFails
+language/expressions/arrow-function/scope-param-rest-elem-var-close.js sloppyFails
+language/expressions/arrow-function/scope-param-rest-elem-var-open.js sloppyFails
+language/expressions/arrow-function/scope-paramsbody-var-open.js fails
+language/expressions/arrow-function/throw-new.js fails
+language/expressions/assignment/S11.13.1_A5_T1.js sloppyFails
+language/expressions/assignment/S11.13.1_A5_T2.js sloppyFails
+language/expressions/assignment/S11.13.1_A5_T3.js sloppyFails
+language/expressions/assignment/S11.13.1_A5_T4.js sloppyFails
+language/expressions/assignment/S11.13.1_A5_T5.js fails
+language/expressions/assignment/S11.13.1_A6_T1.js sloppyFails
+language/expressions/assignment/S11.13.1_A6_T2.js sloppyFails
+language/expressions/assignment/S11.13.1_A6_T3.js sloppyFails
+language/expressions/assignment/S11.13.1_A7_T1.js fails
+language/expressions/assignment/S11.13.1_A7_T2.js fails
+language/expressions/assignment/S11.13.1_A7_T3.js fails
+language/expressions/assignment/destructuring/iterator-destructuring-property-reference-target-evaluation-order.js fails
+language/expressions/assignment/destructuring/keyed-destructuring-property-reference-target-evaluation-order.js fails
+language/expressions/assignment/dstr-array-elem-init-let.js fails
+language/expressions/assignment/dstr-array-elem-iter-rtrn-close-err.js fails
+language/expressions/assignment/dstr-array-elem-iter-rtrn-close-null.js fails
+language/expressions/assignment/dstr-array-elem-iter-rtrn-close.js fails
+language/expressions/assignment/dstr-array-elem-iter-thrw-close-err.js fails
+language/expressions/assignment/dstr-array-elem-iter-thrw-close.js fails
+language/expressions/assignment/dstr-array-elem-put-let.js fails
+language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close-err.js fails
+language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close-null.js fails
+language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close.js fails
+language/expressions/assignment/dstr-array-elem-trlg-iter-list-thrw-close-err.js fails
+language/expressions/assignment/dstr-array-elem-trlg-iter-list-thrw-close.js fails
+language/expressions/assignment/dstr-array-elem-trlg-iter-rest-rtrn-close-err.js fails
+language/expressions/assignment/dstr-array-elem-trlg-iter-rest-rtrn-close-null.js fails
+language/expressions/assignment/dstr-array-elem-trlg-iter-rest-rtrn-close.js fails
+language/expressions/assignment/dstr-array-elem-trlg-iter-rest-thrw-close-err.js fails
+language/expressions/assignment/dstr-array-elem-trlg-iter-rest-thrw-close.js fails
+language/expressions/assignment/dstr-array-rest-iter-rtrn-close-err.js fails
+language/expressions/assignment/dstr-array-rest-iter-rtrn-close-null.js fails
+language/expressions/assignment/dstr-array-rest-iter-rtrn-close.js fails
+language/expressions/assignment/dstr-array-rest-iter-thrw-close-err.js fails
+language/expressions/assignment/dstr-array-rest-iter-thrw-close.js fails
+language/expressions/assignment/dstr-array-rest-lref-err.js fails
+language/expressions/assignment/dstr-array-rest-put-let.js fails
+language/expressions/assignment/dstr-obj-empty-null.js fails
+language/expressions/assignment/dstr-obj-empty-undef.js fails
+language/expressions/assignment/dstr-obj-id-init-let.js fails
+language/expressions/assignment/dstr-obj-id-put-let.js fails
+language/expressions/assignment/dstr-obj-prop-elem-init-let.js fails
+language/expressions/assignment/dstr-obj-prop-put-let.js fails
+language/expressions/assignment/fn-name-lhs-cover.js fails
+language/expressions/assignment/fn-name-lhs-member.js fails
+language/expressions/async-function/expression-returns-promise.js fails
+language/expressions/async-function/syntax-expression-is-PrimaryExpression.js fails
+language/expressions/await/await-BindingIdentifier-in-global.js fails
+language/expressions/await/await-in-nested-function.js fails
+language/expressions/await/await-in-nested-generator.js fails
+language/expressions/await/await-throws-rejections.js fails
+language/expressions/call/11.2.3-3_3.js fails
+language/expressions/call/eval-realm-indirect.js sloppyFails
+language/expressions/call/eval-spread-empty-leading.js fails
+language/expressions/call/eval-spread-empty-trailing.js fails
+language/expressions/call/eval-spread.js fails
+language/expressions/call/scope-lex-open.js fails
+language/expressions/call/tco-call-args.js strictFails
+language/expressions/call/tco-cross-realm-class-construct.js fails
+language/expressions/call/tco-cross-realm-class-derived-construct.js fails
+language/expressions/call/tco-cross-realm-fun-call.js fails
+language/expressions/call/tco-cross-realm-fun-construct.js fails
+language/expressions/call/tco-member-args.js strictFails
+language/expressions/call/tco-non-eval-function-dynamic.js sloppyFails
+language/expressions/call/tco-non-eval-function.js sloppyFails
+language/expressions/call/tco-non-eval-global.js sloppyFails
+language/expressions/call/tco-non-eval-with.js sloppyFails
+language/expressions/class/gen-meth-dflt-params-ref-later.js fails
+language/expressions/class/gen-meth-dflt-params-ref-self.js fails
+language/expressions/class/gen-meth-static-dflt-params-ref-later.js fails
+language/expressions/class/gen-meth-static-dflt-params-ref-self.js fails
+language/expressions/class/meth-dflt-params-ref-later.js fails
+language/expressions/class/meth-dflt-params-ref-self.js fails
+language/expressions/class/meth-static-dflt-params-ref-later.js fails
+language/expressions/class/meth-static-dflt-params-ref-self.js fails
+language/expressions/class/name.js fails
+language/expressions/class/scope-gen-meth-paramsbody-var-open.js fails
+language/expressions/class/scope-meth-paramsbody-var-open.js fails
+language/expressions/class/scope-setter-paramsbody-var-open.js fails
+language/expressions/class/scope-static-gen-meth-paramsbody-var-open.js fails
+language/expressions/class/scope-static-meth-paramsbody-var-open.js fails
+language/expressions/class/scope-static-setter-paramsbody-var-open.js fails
+language/expressions/comma/tco-final.js strictFails
+language/expressions/compound-assignment/S11.13.2_A5.10_T1.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.10_T2.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.10_T3.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.10_T4.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.10_T5.js fails
+language/expressions/compound-assignment/S11.13.2_A5.11_T1.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.11_T2.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.11_T3.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.11_T4.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.11_T5.js fails
+language/expressions/compound-assignment/S11.13.2_A5.1_T1.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.1_T2.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.1_T3.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.1_T4.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.1_T5.js fails
+language/expressions/compound-assignment/S11.13.2_A5.2_T1.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.2_T2.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.2_T3.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.2_T4.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.2_T5.js fails
+language/expressions/compound-assignment/S11.13.2_A5.3_T1.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.3_T2.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.3_T3.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.3_T4.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.3_T5.js fails
+language/expressions/compound-assignment/S11.13.2_A5.4_T1.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.4_T2.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.4_T3.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.4_T4.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.4_T5.js fails
+language/expressions/compound-assignment/S11.13.2_A5.5_T1.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.5_T2.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.5_T3.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.5_T4.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.5_T5.js fails
+language/expressions/compound-assignment/S11.13.2_A5.6_T1.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.6_T2.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.6_T3.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.6_T4.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.6_T5.js fails
+language/expressions/compound-assignment/S11.13.2_A5.7_T1.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.7_T2.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.7_T3.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.7_T4.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.7_T5.js fails
+language/expressions/compound-assignment/S11.13.2_A5.8_T1.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.8_T2.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.8_T3.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.8_T4.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.8_T5.js fails
+language/expressions/compound-assignment/S11.13.2_A5.9_T1.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.9_T2.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.9_T3.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.9_T4.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A5.9_T5.js fails
+language/expressions/compound-assignment/S11.13.2_A6.10_T1.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A6.11_T1.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A6.1_T1.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A6.2_T1.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A6.3_T1.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A6.4_T1.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A6.5_T1.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A6.6_T1.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A6.7_T1.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A6.8_T1.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A6.9_T1.js sloppyFails
+language/expressions/compound-assignment/S11.13.2_A7.10_T4.js fails
+language/expressions/compound-assignment/S11.13.2_A7.11_T4.js fails
+language/expressions/compound-assignment/S11.13.2_A7.1_T4.js fails
+language/expressions/compound-assignment/S11.13.2_A7.2_T4.js fails
+language/expressions/compound-assignment/S11.13.2_A7.3_T4.js fails
+language/expressions/compound-assignment/S11.13.2_A7.4_T4.js fails
+language/expressions/compound-assignment/S11.13.2_A7.5_T4.js fails
+language/expressions/compound-assignment/S11.13.2_A7.6_T4.js fails
+language/expressions/compound-assignment/S11.13.2_A7.7_T4.js fails
+language/expressions/compound-assignment/S11.13.2_A7.8_T4.js fails
+language/expressions/compound-assignment/S11.13.2_A7.9_T4.js fails
+language/expressions/delete/super-property.js fails
+language/expressions/conditional/tco-cond.js strictFails
+language/expressions/conditional/tco-pos.js strictFails
+language/expressions/function/arguments-with-arguments-fn.js sloppyFails
+language/expressions/function/arguments-with-arguments-lex.js sloppyFails
+language/expressions/function/dflt-params-ref-later.js fails
+language/expressions/function/dflt-params-ref-self.js fails
+language/expressions/function/name.js fails
+language/expressions/function/param-dflt-yield-non-strict.js sloppyFails
+language/expressions/function/scope-body-lex-distinct.js sloppyFails
+language/expressions/function/scope-name-var-open-non-strict.js sloppyFails
+language/expressions/function/scope-name-var-open-strict.js strictFails
+language/expressions/function/scope-param-elem-var-close.js sloppyFails
+language/expressions/function/scope-param-elem-var-open.js sloppyFails
+language/expressions/function/scope-param-rest-elem-var-close.js sloppyFails
+language/expressions/function/scope-param-rest-elem-var-open.js sloppyFails
+language/expressions/function/scope-paramsbody-var-open.js fails
+language/expressions/generators/arguments-with-arguments-fn.js sloppyFails
+language/expressions/generators/arguments-with-arguments-lex.js sloppyFails
+language/expressions/generators/default-proto.js fails
+language/expressions/generators/dflt-params-ref-later.js fails
+language/expressions/generators/dflt-params-ref-self.js fails
+language/expressions/generators/eval-body-proto-realm.js fails
+language/expressions/generators/name.js fails
+language/expressions/generators/named-yield-identifier-non-strict.js sloppyFails
+language/expressions/generators/scope-body-lex-distinct.js sloppyFails
+language/expressions/generators/scope-name-var-open-non-strict.js sloppyFails
+language/expressions/generators/scope-name-var-open-strict.js strictFails
+language/expressions/generators/scope-param-elem-var-close.js sloppyFails
+language/expressions/generators/scope-param-elem-var-open.js sloppyFails
+language/expressions/generators/scope-param-rest-elem-var-close.js sloppyFails
+language/expressions/generators/scope-param-rest-elem-var-open.js sloppyFails
+language/expressions/generators/scope-paramsbody-var-open.js fails
+language/expressions/generators/yield-as-function-expression-binding-identifier.js sloppyFails
+language/expressions/generators/yield-as-identifier-in-nested-function.js sloppyFails
+language/expressions/generators/yield-as-literal-property-name.js fails
+language/expressions/generators/yield-as-property-name.js fails
+language/expressions/generators/yield-identifier-non-strict.js sloppyFails
+language/expressions/generators/yield-star-before-newline.js fails
+language/expressions/instanceof/prototype-getter-with-object-throws.js fails
+language/expressions/instanceof/prototype-getter-with-object.js fails
+language/expressions/logical-and/tco-right.js strictFails
+language/expressions/logical-or/tco-right.js strictFails
+language/expressions/new.target/value-via-reflect-construct.js fails
+language/expressions/new.target/value-via-super-call.js fails
+language/expressions/new.target/value-via-super-property.js fails
+language/expressions/new/non-ctor-err-realm.js fails
+language/expressions/object/fn-name-accessor-get.js fails
+language/expressions/object/fn-name-accessor-set.js fails
+language/expressions/object/fn-name-arrow.js fails
+language/expressions/object/fn-name-class.js fails
+language/expressions/object/fn-name-cover.js fails
+language/expressions/object/fn-name-fn.js fails
+language/expressions/object/fn-name-gen.js fails
+language/expressions/object/let-non-strict-access.js sloppyFails
+language/expressions/object/let-non-strict-syntax.js sloppyFails
+language/expressions/object/method-definition/fn-name-fn.js fails
+language/expressions/object/method-definition/fn-name-gen.js fails
+language/expressions/object/method-definition/gen-meth-dflt-params-ref-later.js fails
+language/expressions/object/method-definition/gen-meth-dflt-params-ref-self.js fails
+language/expressions/object/method-definition/gen-yield-identifier-non-strict.js sloppyFails
+language/expressions/object/method-definition/generator-name-prop-symbol.js fails
+language/expressions/object/method-definition/meth-dflt-params-ref-later.js fails
+language/expressions/object/method-definition/meth-dflt-params-ref-self.js fails
+language/expressions/object/method-definition/name-invoke-ctor.js fails
+language/expressions/object/method-definition/name-name-prop-symbol.js fails
+language/expressions/object/method-definition/name-prototype-prop.js fails
+language/expressions/object/method-definition/object-method-returns-promise.js fails
+language/expressions/object/method-definition/yield-as-function-expression-binding-identifier.js sloppyFails
+language/expressions/object/method-definition/yield-as-identifier-in-nested-function.js sloppyFails
+language/expressions/object/method-definition/yield-as-literal-property-name.js fails
+language/expressions/object/method-definition/yield-as-property-name.js fails
+language/expressions/object/method-definition/yield-star-before-newline.js fails
+language/expressions/object/prop-def-id-eval-error-2.js sloppyFails
+language/expressions/object/properties-names-eval-arguments.js strictFails
+language/expressions/object/scope-gen-meth-body-lex-distinct.js sloppyFails
+language/expressions/object/scope-gen-meth-param-elem-var-close.js sloppyFails
+language/expressions/object/scope-gen-meth-param-elem-var-open.js sloppyFails
+language/expressions/object/scope-gen-meth-param-rest-elem-var-close.js sloppyFails
+language/expressions/object/scope-gen-meth-param-rest-elem-var-open.js sloppyFails
+language/expressions/object/scope-gen-meth-paramsbody-var-open.js fails
+language/expressions/object/scope-getter-body-lex-distinc.js sloppyFails
+language/expressions/object/scope-meth-body-lex-distinct.js sloppyFails
+language/expressions/object/scope-meth-param-elem-var-close.js sloppyFails
+language/expressions/object/scope-meth-param-elem-var-open.js sloppyFails
+language/expressions/object/scope-meth-param-rest-elem-var-close.js sloppyFails
+language/expressions/object/scope-meth-param-rest-elem-var-open.js sloppyFails
+language/expressions/object/scope-meth-paramsbody-var-open.js fails
+language/expressions/object/scope-setter-body-lex-distinc.js sloppyFails
+language/expressions/object/scope-setter-paramsbody-var-open.js fails
+language/expressions/postfix-decrement/S11.3.2_A5_T1.js sloppyFails
+language/expressions/postfix-decrement/S11.3.2_A5_T2.js sloppyFails
+language/expressions/postfix-decrement/S11.3.2_A5_T3.js sloppyFails
+language/expressions/postfix-decrement/S11.3.2_A5_T4.js sloppyFails
+language/expressions/postfix-decrement/S11.3.2_A5_T5.js fails
+language/expressions/postfix-decrement/S11.3.2_A6_T3.js fails
+language/expressions/postfix-increment/S11.3.1_A5_T1.js sloppyFails
+language/expressions/postfix-increment/S11.3.1_A5_T2.js sloppyFails
+language/expressions/postfix-increment/S11.3.1_A5_T3.js sloppyFails
+language/expressions/postfix-increment/S11.3.1_A5_T4.js sloppyFails
+language/expressions/postfix-increment/S11.3.1_A5_T5.js fails
+language/expressions/postfix-increment/S11.3.1_A6_T3.js fails
+language/expressions/prefix-decrement/S11.4.5_A5_T1.js sloppyFails
+language/expressions/prefix-decrement/S11.4.5_A5_T2.js sloppyFails
+language/expressions/prefix-decrement/S11.4.5_A5_T3.js sloppyFails
+language/expressions/prefix-decrement/S11.4.5_A5_T4.js sloppyFails
+language/expressions/prefix-decrement/S11.4.5_A5_T5.js fails
+language/expressions/prefix-decrement/S11.4.5_A6_T3.js fails
+language/expressions/prefix-increment/S11.4.4_A5_T1.js sloppyFails
+language/expressions/prefix-increment/S11.4.4_A5_T2.js sloppyFails
+language/expressions/prefix-increment/S11.4.4_A5_T3.js sloppyFails
+language/expressions/prefix-increment/S11.4.4_A5_T4.js sloppyFails
+language/expressions/prefix-increment/S11.4.4_A5_T5.js fails
+language/expressions/prefix-increment/S11.4.4_A6_T3.js fails
+language/expressions/super/call-bind-this-value-twice.js fails
+language/expressions/super/call-construct-invocation.js fails
+language/expressions/super/call-proto-not-ctor.js fails
+language/expressions/super/prop-dot-cls-null-proto.js fails
+language/expressions/super/prop-dot-cls-ref-strict.js fails
+language/expressions/super/prop-dot-cls-ref-this.js fails
+language/expressions/super/prop-dot-cls-this-uninit.js fails
+language/expressions/super/prop-dot-cls-val-from-arrow.js fails
+language/expressions/super/prop-dot-obj-null-proto.js fails
+language/expressions/super/prop-dot-obj-ref-non-strict.js sloppyFails
+language/expressions/super/prop-dot-obj-ref-strict.js strictFails
+language/expressions/super/prop-dot-obj-ref-this.js fails
+language/expressions/super/prop-dot-obj-val-from-arrow.js fails
+language/expressions/super/prop-expr-cls-key-err.js fails
+language/expressions/super/prop-expr-cls-null-proto.js fails
+language/expressions/super/prop-expr-cls-ref-strict.js fails
+language/expressions/super/prop-expr-cls-ref-this.js fails
+language/expressions/super/prop-expr-cls-this-uninit.js fails
+language/expressions/super/prop-expr-cls-val-from-arrow.js fails
+language/expressions/super/prop-expr-obj-key-err.js fails
+language/expressions/super/prop-expr-obj-null-proto.js fails
+language/expressions/super/prop-expr-obj-ref-non-strict.js sloppyFails
+language/expressions/super/prop-expr-obj-ref-strict.js strictFails
+language/expressions/super/prop-expr-obj-ref-this.js fails
+language/expressions/super/prop-expr-obj-val-from-arrow.js fails
+language/expressions/super/realm.js fails
+language/expressions/tagged-template/cache-different-functions-same-site.js fails
+language/expressions/tagged-template/cache-eval-inner-function.js fails
+language/expressions/tagged-template/cache-realm.js fails
+language/expressions/tagged-template/cache-same-site-top-level.js fails
+language/expressions/tagged-template/cache-same-site.js fails
+language/expressions/tagged-template/invalid-escape-sequences.js fails
+language/expressions/tagged-template/tco-call.js strictFails
+language/expressions/tagged-template/tco-member.js strictFails
+language/expressions/tagged-template/template-object-frozen-non-strict.js sloppyFails
+language/expressions/tagged-template/template-object-frozen-strict.js strictFails
+language/expressions/tagged-template/template-object.js fails
+language/expressions/tco-pos.js strictFails
+language/expressions/template-literal/tv-character-escape-sequence.js fails
+language/expressions/template-literal/tv-hex-escape-sequence.js fails
+language/expressions/template-literal/tv-line-continuation.js fails
+language/expressions/template-literal/tv-line-terminator-sequence.js fails
+language/expressions/template-literal/tv-no-substitution.js fails
+language/expressions/template-literal/tv-null-character-escape-sequence.js fails
+language/expressions/template-literal/tv-template-character.js fails
+language/expressions/template-literal/tv-template-characters.js fails
+language/expressions/template-literal/tv-template-head.js fails
+language/expressions/template-literal/tv-template-middle.js fails
+language/expressions/template-literal/tv-template-tail.js fails
+language/expressions/template-literal/tv-utf16-escape-sequence.js fails
+language/expressions/template-literal/tv-zwnbsp.js fails
+language/expressions/yield/star-array.js fails
+language/expressions/yield/star-in-rltn-expr.js fails
+language/expressions/yield/star-iterable.js fails
+language/expressions/yield/star-rhs-iter-get-call-err.js fails
+language/expressions/yield/star-rhs-iter-get-call-non-obj.js fails
+language/expressions/yield/star-rhs-iter-get-get-err.js fails
+language/expressions/yield/star-rhs-iter-nrml-next-call-err.js fails
+language/expressions/yield/star-rhs-iter-nrml-next-call-non-obj.js fails
+language/expressions/yield/star-rhs-iter-nrml-next-get-err.js fails
+language/expressions/yield/star-rhs-iter-nrml-next-invoke.js fails
+language/expressions/yield/star-rhs-iter-nrml-res-done-err.js fails
+language/expressions/yield/star-rhs-iter-nrml-res-done-no-value.js fails
+language/expressions/yield/star-rhs-iter-nrml-res-value-err.js fails
+language/expressions/yield/star-rhs-iter-nrml-res-value-final.js fails
+language/expressions/yield/star-rhs-iter-rtrn-no-rtrn.js fails
+language/expressions/yield/star-rhs-iter-rtrn-res-done-err.js fails
+language/expressions/yield/star-rhs-iter-rtrn-res-done-no-value.js fails
+language/expressions/yield/star-rhs-iter-rtrn-res-value-err.js fails
+language/expressions/yield/star-rhs-iter-rtrn-res-value-final.js fails
+language/expressions/yield/star-rhs-iter-rtrn-rtrn-call-err.js fails
+language/expressions/yield/star-rhs-iter-rtrn-rtrn-call-non-obj.js fails
+language/expressions/yield/star-rhs-iter-rtrn-rtrn-get-err.js fails
+language/expressions/yield/star-rhs-iter-rtrn-rtrn-invoke.js fails
+language/expressions/yield/star-rhs-iter-thrw-res-done-err.js fails
+language/expressions/yield/star-rhs-iter-thrw-res-done-no-value.js fails
+language/expressions/yield/star-rhs-iter-thrw-res-value-err.js fails
+language/expressions/yield/star-rhs-iter-thrw-res-value-final.js fails
+language/expressions/yield/star-rhs-iter-thrw-thrw-call-err.js fails
+language/expressions/yield/star-rhs-iter-thrw-thrw-call-non-obj.js fails
+language/expressions/yield/star-rhs-iter-thrw-thrw-get-err.js fails
+language/expressions/yield/star-rhs-iter-thrw-thrw-invoke.js fails
+language/expressions/yield/star-rhs-iter-thrw-violation-no-rtrn.js fails
+language/expressions/yield/star-rhs-iter-thrw-violation-rtrn-call-err.js fails
+language/expressions/yield/star-rhs-iter-thrw-violation-rtrn-call-non-obj.js fails
+language/expressions/yield/star-rhs-iter-thrw-violation-rtrn-get-err.js fails
+language/expressions/yield/star-rhs-iter-thrw-violation-rtrn-invoke.js fails
+language/expressions/yield/star-rhs-unresolvable.js fails
+language/expressions/yield/star-string.js fails
+language/function-code/each-param-has-own-non-shared-eval-scope.js sloppyFails
+language/function-code/each-param-has-own-scope.js sloppyFails
+language/function-code/eval-param-env-with-computed-key.js sloppyFails
+language/function-code/eval-param-env-with-prop-initializer.js sloppyFails
+language/global-code/decl-lex-restricted-global.js fails
+language/global-code/script-decl-func-dups.js fails
+language/global-code/script-decl-func-err-non-configurable.js fails
+language/global-code/script-decl-func-err-non-extensible.js fails
+language/global-code/script-decl-func.js fails
+language/global-code/script-decl-lex-deletion.js sloppyFails
+language/global-code/script-decl-lex-lex.js fails
+language/global-code/script-decl-lex-restricted-global.js fails
+language/global-code/script-decl-lex-var.js fails
+language/global-code/script-decl-lex.js fails
+language/global-code/script-decl-var-collision.js fails
+language/global-code/script-decl-var-err.js fails
+language/global-code/script-decl-var.js fails
+language/identifiers/other_id_continue.js fails
+language/identifiers/other_id_start-escaped.js fails
+language/identifiers/other_id_start.js fails
+language/literals/regexp/u-astral.js fails
+language/literals/regexp/u-case-mapping.js fails
+language/literals/regexp/u-surrogate-pairs-atom-char-class.js fails
+language/literals/regexp/u-surrogate-pairs-atom-dot.js fails
+language/literals/regexp/u-surrogate-pairs-atom-escape-char-class.js fails
+language/literals/regexp/u-surrogate-pairs-atom-escape-decimal.js fails
+language/literals/regexp/u-surrogate-pairs.js fails
+language/literals/regexp/u-unicode-esc.js fails
+language/literals/regexp/y-assertion-start.js fails
+language/module-code/eval-gtbndng-indirect-trlng-comma_FIXTURE.js fails
+language/module-code/eval-gtbndng-indirect-update-as_FIXTURE.js fails
+language/module-code/eval-gtbndng-indirect-update-dflt_FIXTURE.js fails
+language/module-code/eval-gtbndng-indirect-update_FIXTURE.js fails
+language/module-code/eval-rqstd-abrupt-err-type_FIXTURE.js fails
+language/module-code/eval-rqstd-abrupt-err-uri_FIXTURE.js fails
+language/module-code/eval-rqstd-once_FIXTURE.js fails
+language/module-code/eval-rqstd-order-4_FIXTURE.js fails
+language/module-code/eval-rqstd-order-6_FIXTURE.js fails
+language/module-code/eval-rqstd-order-8_FIXTURE.js fails
+language/module-code/instn-iee-bndng-cls_FIXTURE.js fails
+language/module-code/instn-iee-bndng-const_FIXTURE.js fails
+language/module-code/instn-iee-bndng-fun_FIXTURE.js fails
+language/module-code/instn-iee-bndng-gen_FIXTURE.js fails
+language/module-code/instn-iee-bndng-let_FIXTURE.js fails
+language/module-code/instn-iee-bndng-var_FIXTURE.js fails
+language/module-code/instn-iee-err-ambiguous-1_FIXTURE.js fails
+language/module-code/instn-iee-err-ambiguous-2_FIXTURE.js fails
+language/module-code/instn-iee-err-ambiguous_FIXTURE.js fails
+language/module-code/instn-iee-err-circular_FIXTURE.js fails
+language/module-code/instn-iee-err-dflt-thru-star-dflt_FIXTURE.js fails
+language/module-code/instn-iee-err-dflt-thru-star-int_FIXTURE.js fails
+language/module-code/instn-iee-iee-cycle-2_FIXTURE.js fails
+language/module-code/instn-iee-star-cycle-2_FIXTURE.js fails
+language/module-code/instn-iee-star-cycle-indirect-x_FIXTURE.js fails
+language/module-code/instn-iee-trlng-comma_FIXTURE.js fails
+language/module-code/instn-named-err-ambiguous-1_FIXTURE.js fails
+language/module-code/instn-named-err-ambiguous-2_FIXTURE.js fails
+language/module-code/instn-named-err-ambiguous_FIXTURE.js fails
+language/module-code/instn-named-err-dflt-thru-star-dflt_FIXTURE.js fails
+language/module-code/instn-named-err-dflt-thru-star-int_FIXTURE.js fails
+language/module-code/instn-named-iee-cycle-2_FIXTURE.js fails
+language/module-code/instn-named-star-cycle-2_FIXTURE.js fails
+language/module-code/instn-named-star-cycle-indirect-x_FIXTURE.js fails
+language/module-code/instn-resolve-empty-export_FIXTURE.js fails
+language/module-code/instn-resolve-empty-import_FIXTURE.js fails
+language/module-code/instn-resolve-err-reference_FIXTURE.js fails
+language/module-code/instn-resolve-err-syntax_FIXTURE.js fails
+language/module-code/instn-resolve-order-depth-child_FIXTURE.js fails
+language/module-code/instn-resolve-order-depth-reference_FIXTURE.js fails
+language/module-code/instn-resolve-order-depth-syntax_FIXTURE.js fails
+language/module-code/instn-resolve-order-src-reference_FIXTURE.js fails
+language/module-code/instn-resolve-order-src-syntax_FIXTURE.js fails
+language/module-code/instn-star-ambiguous-1_FIXTURE.js fails
+language/module-code/instn-star-ambiguous-2_FIXTURE.js fails
+language/module-code/instn-star-ambiguous_FIXTURE.js fails
+language/module-code/instn-star-equality-other_FIXTURE.js fails
+language/module-code/instn-star-err-not-found-faulty_FIXTURE.js fails
+language/module-code/instn-star-iee-cycle-2_FIXTURE.js fails
+language/module-code/instn-star-props-circular-a_FIXTURE.js fails
+language/module-code/instn-star-props-circular-b_FIXTURE.js fails
+language/module-code/instn-star-props-dflt-keep-indirect-def_FIXTURE.js fails
+language/module-code/instn-star-props-dflt-keep-indirect-reexport_FIXTURE.js fails
+language/module-code/instn-star-props-dflt-keep-local-named_FIXTURE.js fails
+language/module-code/instn-star-props-dflt-keep-local-prod_FIXTURE.js fails
+language/module-code/instn-star-props-dflt-skip-named_FIXTURE.js fails
+language/module-code/instn-star-props-dflt-skip-prod_FIXTURE.js fails
+language/module-code/instn-star-props-dflt-skip-star-named_FIXTURE.js fails
+language/module-code/instn-star-props-dflt-skip-star-prod_FIXTURE.js fails
+language/module-code/instn-star-props-nrml-1_FIXTURE.js fails
+language/module-code/instn-star-props-nrml-indirect_FIXTURE.js fails
+language/module-code/instn-star-props-nrml-star_FIXTURE.js fails
+language/module-code/instn-star-star-cycle-2_FIXTURE.js fails
+language/module-code/instn-star-star-cycle-indirect-x_FIXTURE.js fails
+language/module-code/namespace/internals/own-property-keys-binding-types_FIXTURE.js fails
+language/statements/async-function/cptn-decl.js fails
+language/statements/async-function/declaration-returns-promise.js fails
+language/statements/async-function/evaluation-body.js fails
+language/statements/async-function/syntax-declaration-line-terminators-allowed.js fails
+language/statements/block/tco-stmt-list.js strictFails
+language/statements/block/tco-stmt.js strictFails
+language/statements/class/constructor-inferred-observable-iteration.js fails
+language/statements/class/cptn-decl.js fails
+language/statements/class/definition/accessors.js fails
+language/statements/class/definition/class-method-returns-promise.js fails
+language/statements/class/definition/fn-name-accessor-get.js fails
+language/statements/class/definition/fn-name-accessor-set.js fails
+language/statements/class/definition/fn-name-gen-method.js fails
+language/statements/class/definition/fn-name-method.js fails
+language/statements/class/definition/getters-non-configurable-err.js fails
+language/statements/class/definition/getters-prop-desc.js fails
+language/statements/class/definition/getters-restricted-ids.js fails
+language/statements/class/definition/invalid-extends.js strictFails
+language/statements/class/definition/methods-gen-yield-as-literal-property-name.js fails
+language/statements/class/definition/methods-gen-yield-as-property-name.js fails
+language/statements/class/definition/methods-gen-yield-star-before-newline.js fails
+language/statements/class/definition/methods-named-eval-arguments.js fails
+language/statements/class/definition/methods.js fails
+language/statements/class/definition/numeric-property-names.js fails
+language/statements/class/definition/prototype-getter.js fails
+language/statements/class/definition/prototype-property.js fails
+language/statements/class/definition/prototype-setter.js fails
+language/statements/class/definition/prototype-wiring.js fails
+language/statements/class/definition/setters-non-configurable-err.js fails
+language/statements/class/definition/setters-prop-desc.js fails
+language/statements/class/definition/setters-restricted-ids.js fails
+language/statements/class/definition/this-access-restriction-2.js fails
+language/statements/class/definition/this-access-restriction.js fails
+language/statements/class/definition/this-check-ordering.js fails
+language/statements/class/gen-meth-dflt-params-ref-later.js fails
+language/statements/class/gen-meth-dflt-params-ref-self.js fails
+language/statements/class/gen-meth-static-dflt-params-ref-later.js fails
+language/statements/class/gen-meth-static-dflt-params-ref-self.js fails
+language/statements/class/meth-dflt-params-ref-later.js fails
+language/statements/class/meth-dflt-params-ref-self.js fails
+language/statements/class/meth-static-dflt-params-ref-later.js fails
+language/statements/class/meth-static-dflt-params-ref-self.js fails
+language/statements/class/name-binding/in-extends-expression-assigned.js fails
+language/statements/class/name-binding/in-extends-expression-grouped.js fails
+language/statements/class/name-binding/in-extends-expression.js fails
+language/statements/class/scope-gen-meth-paramsbody-var-open.js fails
+language/statements/class/scope-meth-paramsbody-var-open.js fails
+language/statements/class/scope-setter-paramsbody-var-open.js fails
+language/statements/class/scope-static-gen-meth-paramsbody-var-open.js fails
+language/statements/class/scope-static-meth-paramsbody-var-open.js fails
+language/statements/class/scope-static-setter-paramsbody-var-open.js fails
+language/statements/class/static-method-gen-non-configurable-err.js fails
+language/statements/class/static-method-non-configurable-err.js fails
+language/statements/class/subclass/bound-function.js fails
+language/statements/class/subclass/builtin-objects/Array/super-must-be-called.js fails
+language/statements/class/subclass/builtin-objects/ArrayBuffer/regular-subclassing.js fails
+language/statements/class/subclass/builtin-objects/ArrayBuffer/super-must-be-called.js fails
+language/statements/class/subclass/builtin-objects/Boolean/super-must-be-called.js fails
+language/statements/class/subclass/builtin-objects/DataView/super-must-be-called.js fails
+language/statements/class/subclass/builtin-objects/Date/super-must-be-called.js fails
+language/statements/class/subclass/builtin-objects/Error/message-property-assignment.js fails
+language/statements/class/subclass/builtin-objects/Error/super-must-be-called.js fails
+language/statements/class/subclass/builtin-objects/Function/super-must-be-called.js fails
+language/statements/class/subclass/builtin-objects/GeneratorFunction/super-must-be-called.js fails
+language/statements/class/subclass/builtin-objects/Map/regular-subclassing.js fails
+language/statements/class/subclass/builtin-objects/Map/super-must-be-called.js fails
+language/statements/class/subclass/builtin-objects/NativeError/EvalError-message.js fails
+language/statements/class/subclass/builtin-objects/NativeError/EvalError-super.js fails
+language/statements/class/subclass/builtin-objects/NativeError/RangeError-message.js fails
+language/statements/class/subclass/builtin-objects/NativeError/RangeError-super.js fails
+language/statements/class/subclass/builtin-objects/NativeError/ReferenceError-message.js fails
+language/statements/class/subclass/builtin-objects/NativeError/ReferenceError-super.js fails
+language/statements/class/subclass/builtin-objects/NativeError/SyntaxError-message.js fails
+language/statements/class/subclass/builtin-objects/NativeError/SyntaxError-super.js fails
+language/statements/class/subclass/builtin-objects/NativeError/TypeError-message.js fails
+language/statements/class/subclass/builtin-objects/NativeError/TypeError-super.js fails
+language/statements/class/subclass/builtin-objects/NativeError/URIError-message.js fails
+language/statements/class/subclass/builtin-objects/NativeError/URIError-super.js fails
+language/statements/class/subclass/builtin-objects/Number/super-must-be-called.js fails
+language/statements/class/subclass/builtin-objects/Object/constructor-return-undefined-throws.js fails
+language/statements/class/subclass/builtin-objects/Promise/regular-subclassing.js fails
+language/statements/class/subclass/builtin-objects/Promise/super-must-be-called.js fails
+language/statements/class/subclass/builtin-objects/RegExp/super-must-be-called.js fails
+language/statements/class/subclass/builtin-objects/Set/super-must-be-called.js fails
+language/statements/class/subclass/builtin-objects/String/super-must-be-called.js fails
+language/statements/class/subclass/builtin-objects/TypedArray/super-must-be-called.js fails
+language/statements/class/subclass/builtin-objects/WeakMap/regular-subclassing.js fails
+language/statements/class/subclass/builtin-objects/WeakMap/super-must-be-called.js fails
+language/statements/class/subclass/builtin-objects/WeakSet/regular-subclassing.js fails
+language/statements/class/subclass/builtin-objects/WeakSet/super-must-be-called.js fails
+language/statements/class/subclass/builtins.js fails
+language/statements/class/subclass/class-definition-null-proto-super.js fails
+language/statements/class/subclass/class-definition-null-proto-this.js fails
+language/statements/class/subclass/class-definition-superclass-generator.js fails
+language/statements/class/subclass/default-constructor-spread-override.js fails
+language/statements/class/super/in-methods.js fails
+language/statements/const/block-local-closure-get-before-initialization.js fails
+language/statements/const/block-local-use-before-initialization-in-declaration-statement.js fails
+language/statements/const/block-local-use-before-initialization-in-prior-statement.js fails
+language/statements/const/function-local-closure-get-before-initialization.js fails
+language/statements/const/function-local-use-before-initialization-in-declaration-statement.js fails
+language/statements/const/function-local-use-before-initialization-in-prior-statement.js fails
+language/statements/const/global-closure-get-before-initialization.js fails
+language/statements/const/global-use-before-initialization-in-declaration-statement.js fails
+language/statements/const/global-use-before-initialization-in-prior-statement.js fails
+language/statements/const/syntax/const-invalid-assignment-statement-body-for-in.js fails
+language/statements/const/syntax/const-invalid-assignment-statement-body-for-of.js fails
+language/statements/do-while/tco-body.js strictFails
+language/statements/for-in/head-const-bound-names-fordecl-tdz.js fails
+language/statements/for-in/head-const-fresh-binding-per-iteration.js fails
+language/statements/for-in/head-let-bound-names-fordecl-tdz.js fails
+language/statements/for-in/head-lhs-let.js sloppyFails
+language/statements/for-in/head-var-bound-names-let.js sloppyFails
+language/statements/for-in/identifier-let-allowed-as-lefthandside-expression-not-strict.js sloppyFails
+language/statements/for-in/scope-body-lex-open.js fails
+language/statements/for-in/scope-head-lex-close.js fails
+language/statements/for-in/scope-head-lex-open.js fails
+language/statements/for-of/body-dstr-assign-error.js fails
+language/statements/for-of/body-put-error.js fails
+language/statements/for-of/dstr-array-elem-init-let.js fails
+language/statements/for-of/dstr-array-elem-iter-rtrn-close-err.js fails
+language/statements/for-of/dstr-array-elem-iter-rtrn-close-null.js fails
+language/statements/for-of/dstr-array-elem-iter-rtrn-close.js fails
+language/statements/for-of/dstr-array-elem-iter-thrw-close-err.js fails
+language/statements/for-of/dstr-array-elem-iter-thrw-close.js fails
+language/statements/for-of/dstr-array-elem-put-let.js fails
+language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close-err.js fails
+language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close-null.js fails
+language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close.js fails
+language/statements/for-of/dstr-array-elem-trlg-iter-list-thrw-close-err.js fails
+language/statements/for-of/dstr-array-elem-trlg-iter-list-thrw-close.js fails
+language/statements/for-of/dstr-array-elem-trlg-iter-rest-rtrn-close-err.js fails
+language/statements/for-of/dstr-array-elem-trlg-iter-rest-rtrn-close-null.js fails
+language/statements/for-of/dstr-array-elem-trlg-iter-rest-rtrn-close.js fails
+language/statements/for-of/dstr-array-elem-trlg-iter-rest-thrw-close-err.js fails
+language/statements/for-of/dstr-array-elem-trlg-iter-rest-thrw-close.js fails
+language/statements/for-of/dstr-array-rest-iter-rtrn-close-err.js fails
+language/statements/for-of/dstr-array-rest-iter-rtrn-close-null.js fails
+language/statements/for-of/dstr-array-rest-iter-rtrn-close.js fails
+language/statements/for-of/dstr-array-rest-iter-thrw-close-err.js fails
+language/statements/for-of/dstr-array-rest-iter-thrw-close.js fails
+language/statements/for-of/dstr-array-rest-lref-err.js fails
+language/statements/for-of/dstr-array-rest-put-let.js fails
+language/statements/for-of/dstr-obj-empty-null.js fails
+language/statements/for-of/dstr-obj-empty-undef.js fails
+language/statements/for-of/dstr-obj-id-init-let.js fails
+language/statements/for-of/dstr-obj-id-put-let.js fails
+language/statements/for-of/dstr-obj-prop-elem-init-let.js fails
+language/statements/for-of/dstr-obj-prop-put-let.js fails
+language/statements/for-of/generator-close-via-continue.js fails
+language/statements/for-of/generator-close-via-return.js fails
+language/statements/for-of/generator-close-via-throw.js fails
+language/statements/for-of/head-const-bound-names-fordecl-tdz.js fails
+language/statements/for-of/head-const-fresh-binding-per-iteration.js fails
+language/statements/for-of/head-let-bound-names-fordecl-tdz.js fails
+language/statements/for-of/head-var-bound-names-let.js sloppyFails
+language/statements/for-of/iterator-close-via-continue.js fails
+language/statements/for-of/iterator-close-via-return.js fails
+language/statements/for-of/iterator-close-via-throw.js fails
+language/statements/for-of/iterator-next-reference.js fails
+language/statements/for-of/scope-body-lex-open.js fails
+language/statements/for-of/scope-head-lex-close.js fails
+language/statements/for-of/scope-head-lex-open.js fails
+language/statements/for-of/yield-star-from-catch.js fails
+language/statements/for-of/yield-star-from-finally.js fails
+language/statements/for-of/yield-star-from-try.js fails
+language/statements/for-of/yield-star.js fails
+language/statements/for/head-lhs-let.js sloppyFails
+language/statements/for/scope-body-lex-open.js fails
+language/statements/for/tco-const-body.js strictFails
+language/statements/for/tco-let-body.js strictFails
+language/statements/for/tco-lhs-body.js strictFails
+language/statements/for/tco-var-body.js strictFails
+language/statements/function/13.2-30-s.js fails
+language/statements/function/S13_A15_T4.js sloppyFails
+language/statements/function/arguments-with-arguments-fn.js sloppyFails
+language/statements/function/arguments-with-arguments-lex.js sloppyFails
+language/statements/function/dflt-params-ref-later.js fails
+language/statements/function/dflt-params-ref-self.js fails
+language/statements/function/param-dflt-yield-non-strict.js sloppyFails
+language/statements/function/scope-body-lex-distinct.js sloppyFails
+language/statements/function/scope-param-elem-var-close.js sloppyFails
+language/statements/function/scope-param-elem-var-open.js sloppyFails
+language/statements/function/scope-param-rest-elem-var-close.js sloppyFails
+language/statements/function/scope-param-rest-elem-var-open.js sloppyFails
+language/statements/function/scope-paramsbody-var-open.js fails
+language/statements/generators/arguments-with-arguments-fn.js sloppyFails
+language/statements/generators/arguments-with-arguments-lex.js sloppyFails
+language/statements/generators/default-proto.js fails
+language/statements/generators/dflt-params-ref-later.js fails
+language/statements/generators/dflt-params-ref-self.js fails
+language/statements/generators/scope-body-lex-distinct.js sloppyFails
+language/statements/generators/scope-param-elem-var-close.js sloppyFails
+language/statements/generators/scope-param-elem-var-open.js sloppyFails
+language/statements/generators/scope-param-rest-elem-var-close.js sloppyFails
+language/statements/generators/scope-param-rest-elem-var-open.js sloppyFails
+language/statements/generators/scope-paramsbody-var-open.js fails
+language/statements/generators/yield-as-function-expression-binding-identifier.js sloppyFails
+language/statements/generators/yield-as-identifier-in-nested-function.js sloppyFails
+language/statements/generators/yield-as-literal-property-name.js fails
+language/statements/generators/yield-as-property-name.js fails
+language/statements/generators/yield-identifier-non-strict.js sloppyFails
+language/statements/generators/yield-star-before-newline.js fails
+language/statements/if/tco-else-body.js strictFails
+language/statements/if/tco-if-body.js strictFails
+language/statements/labeled/tco.js strictFails
+language/statements/let/block-local-closure-get-before-initialization.js fails
+language/statements/let/block-local-closure-set-before-initialization.js fails
+language/statements/let/block-local-use-before-initialization-in-declaration-statement.js fails
+language/statements/let/block-local-use-before-initialization-in-prior-statement.js fails
+language/statements/let/function-local-closure-get-before-initialization.js fails
+language/statements/let/function-local-closure-set-before-initialization.js fails
+language/statements/let/function-local-use-before-initialization-in-declaration-statement.js fails
+language/statements/let/function-local-use-before-initialization-in-prior-statement.js fails
+language/statements/let/global-closure-get-before-initialization.js fails
+language/statements/let/global-closure-set-before-initialization.js fails
+language/statements/let/global-use-before-initialization-in-declaration-statement.js fails
+language/statements/let/global-use-before-initialization-in-prior-statement.js fails
+language/statements/let/syntax/let.js fails
+language/statements/return/tco.js strictFails
+language/statements/switch/scope-lex-open-case.js fails
+language/statements/switch/scope-lex-open-dflt.js fails
+language/statements/switch/tco-case-body-dflt.js strictFails
+language/statements/switch/tco-case-body.js strictFails
+language/statements/switch/tco-dftl-body.js strictFails
+language/statements/throw/S12.13_A2_T6.js strictFails
+language/statements/try/S12.14_A18_T6.js strictFails
+language/statements/try/scope-catch-block-lex-open.js fails
+language/statements/try/tco-catch-finally.js strictFails
+language/statements/try/tco-catch.js strictFails
+language/statements/try/tco-finally.js strictFails
+language/statements/variable/binding-resolution.js sloppyFails
+language/statements/while/tco-body.js strictFails
+language/statements/with/binding-blocked-by-unscopables.js sloppyFails
+language/statements/with/has-property-err.js sloppyFails
+language/statements/with/unscopables-inc-dec.js sloppyFails
+language/types/reference/get-value-prop-base-primitive-realm.js fails
+language/types/reference/put-value-prop-base-primitive-realm.js fails
+language/types/reference/put-value-prop-base-primitive.js fails
diff --git a/tests/auto/qml/ecmascripttests/ecmascripttests.pro b/tests/auto/qml/ecmascripttests/ecmascripttests.pro
index 6d3ee12307..9c09ee701e 100644
--- a/tests/auto/qml/ecmascripttests/ecmascripttests.pro
+++ b/tests/auto/qml/ecmascripttests/ecmascripttests.pro
@@ -1,20 +1,13 @@
-CONFIG += testcase
-TARGET = tst_ecmascripttests
-QT += testlib
-macos:CONFIG -= app_bundle
-SOURCES += tst_ecmascripttests.cpp
-DEFINES += SRCDIR=\\\"$$PWD\\\"
-
-TESTSCRIPT=$$PWD/test262.py
-isEmpty(V4CMD): V4CMD = qmljs
+TEMPLATE = subdirs
+SUBDIRS = testcase.pro qjstest
checkjittarget.target = check-jit
-checkjittarget.commands = python $$TESTSCRIPT --command=$$V4CMD --parallel --with-test-expectations --update-expectations
+checkjittarget.commands = qjstest --jit --parallel --with-test-expectations --update-expectations
checkjittarget.depends = all
QMAKE_EXTRA_TARGETS += checkjittarget
checkmothtarget.target = check-interpreter
-checkmothtarget.commands = python $$TESTSCRIPT --command=\"$$V4CMD --interpret\" --parallel --with-test-expectations
+checkmothtarget.commands = qjstest --interpret --parallel --with-test-expectations
checkmothtarget.depends = all
QMAKE_EXTRA_TARGETS += checkmothtarget
diff --git a/tests/auto/qml/ecmascripttests/qjstest/main.cpp b/tests/auto/qml/ecmascripttests/qjstest/main.cpp
new file mode 100644
index 0000000000..4a3541d892
--- /dev/null
+++ b/tests/auto/qml/ecmascripttests/qjstest/main.cpp
@@ -0,0 +1,114 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the V4VM module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QJSEngine>
+#include <QCoreApplication>
+#include <QCommandLineParser>
+#include <qdebug.h>
+#include <stdlib.h>
+
+#include "test262runner.h"
+
+int main(int argc, char **argv)
+{
+ QCoreApplication app(argc, argv);
+
+
+ QCommandLineParser parser;
+ parser.addHelpOption();
+ parser.addVersionOption();
+ QCommandLineOption verbose("verbose", "Verbose output");
+ parser.addOption(verbose);
+ QCommandLineOption commandOption("command", "Javascript command line interpreter", "command");
+ parser.addOption(commandOption);
+ QCommandLineOption testDir("tests", "path to the tests", "tests", "test262");
+ parser.addOption(testDir);
+ QCommandLineOption cat("cat", "Print packaged test code that would be run");
+ parser.addOption(cat);
+ QCommandLineOption parallel("parallel", "Run tests in parallel");
+ parser.addOption(parallel);
+ QCommandLineOption jit("jit", "JIT all code");
+ parser.addOption(jit);
+ QCommandLineOption bytecode("interpret", "Run using the bytecode interpreter");
+ parser.addOption(bytecode);
+ QCommandLineOption withExpectations("with-test-expectations", "Parse TestExpectations to deal with known failures");
+ parser.addOption(withExpectations);
+ QCommandLineOption updateExpectations("update-expectations", "Update TestExpectations to remove unexepected passes");
+ parser.addOption(updateExpectations);
+ QCommandLineOption writeExpectations("write-expectations", "Generate a new TestExpectations file based on the results of the run");
+ parser.addOption(writeExpectations);
+ parser.addPositionalArgument("[filter]", "Only run tests that contain filter in their name");
+
+ parser.process(app);
+
+ Test262Runner testRunner(parser.value(commandOption), parser.value(testDir));
+
+ QStringList otherArgs = parser.positionalArguments();
+ if (otherArgs.size() > 1) {
+ qWarning() << "too many arguments";
+ return 1;
+ } else if (otherArgs.size()) {
+ testRunner.setFilter(otherArgs.at(0));
+ }
+
+ if (parser.isSet(cat)) {
+ testRunner.cat();
+ return 0;
+ }
+
+ if (parser.isSet(updateExpectations) && parser.isSet(writeExpectations)) {
+ qWarning() << "Can only specify one of --update-expectations and --write-expectations.";
+ exit(1);
+ }
+
+ if (parser.isSet(jit) && parser.isSet(bytecode)) {
+ qWarning() << "Can only specify one of --jit and --interpret.";
+ exit(1);
+ }
+
+ int flags = 0;
+ if (parser.isSet(verbose))
+ flags |= Test262Runner::Verbose;
+ if (parser.isSet(parallel))
+ flags |= Test262Runner::Parallel;
+ if (parser.isSet(jit))
+ flags |= Test262Runner::ForceJIT;
+ if (parser.isSet(bytecode))
+ flags |= Test262Runner::ForceBytecode;
+ if (parser.isSet(withExpectations))
+ flags |= Test262Runner::WithTestExpectations;
+ if (parser.isSet(updateExpectations))
+ flags |= Test262Runner::UpdateTestExpectations;
+ if (parser.isSet(writeExpectations))
+ flags |= Test262Runner::WriteTestExpectations;
+ testRunner.setFlags(flags);
+
+ if (testRunner.run())
+ return EXIT_SUCCESS;
+ else
+ return EXIT_FAILURE;
+}
diff --git a/tests/auto/qml/ecmascripttests/qjstest/qjstest.pro b/tests/auto/qml/ecmascripttests/qjstest/qjstest.pro
new file mode 100644
index 0000000000..6dec5f8f23
--- /dev/null
+++ b/tests/auto/qml/ecmascripttests/qjstest/qjstest.pro
@@ -0,0 +1,13 @@
+TEMPLATE = app
+TARGET = qjstest
+QT += qml-private
+INCLUDEPATH += .
+
+DEFINES += QT_DEPRECATED_WARNINGS
+
+HEADERS += test262runner.h
+SOURCES += main.cpp test262runner.cpp
+
+QMAKE_TARGET_DESCRIPTION = Javascript test runner
+
+load(qt_tool)
diff --git a/tests/auto/qml/ecmascripttests/qjstest/test262runner.cpp b/tests/auto/qml/ecmascripttests/qjstest/test262runner.cpp
new file mode 100644
index 0000000000..bd945047c1
--- /dev/null
+++ b/tests/auto/qml/ecmascripttests/qjstest/test262runner.cpp
@@ -0,0 +1,760 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the V4VM module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "test262runner.h"
+
+#include <qfile.h>
+#include <qdir.h>
+#include <qdiriterator.h>
+#include <qdebug.h>
+#include <qprocess.h>
+#include <qtemporaryfile.h>
+
+#include <private/qv4script_p.h>
+#include "private/qv4globalobject_p.h"
+#include "private/qqmlbuiltinfunctions_p.h"
+
+#include "qrunnable.h"
+
+static const char *excludedFeatures[] = {
+ "BigInt",
+ "class-fields-public",
+ "class-fields-private",
+ "Promise.prototype.finally",
+ "async-iteration",
+ "Symbol.asyncIterator",
+ "object-rest",
+ "object-spread",
+ "optional-catch-binding",
+ "regexp-dotall",
+ "regexp-lookbehind",
+ "regexp-named-groups",
+ "regexp-unicode-property-escapes",
+ "Atomics",
+ "SharedArrayBuffer",
+ "Array.prototype.flatten",
+ "Array.prototype.flatMap",
+ "string-trimming",
+ "String.prototype.trimEnd",
+ "String.prototype.trimStart",
+ "numeric-separator-literal",
+
+ // optional features, not supported by us
+ "caller",
+ nullptr
+};
+
+Test262Runner::Test262Runner(const QString &command, const QString &dir)
+ : command(command), testDir(dir)
+{
+ if (testDir.endsWith(QLatin1Char('/')))
+ testDir = testDir.chopped(1);
+}
+
+Test262Runner::~Test262Runner()
+{
+ delete threadPool;
+}
+
+void Test262Runner::cat()
+{
+ if (!loadTests())
+ return;
+
+ if (testCases.size() != 1)
+ qWarning() << "test262 --cat: Ambiguous test case, using" << testCases.begin().key();
+ TestData data = getTestData(testCases.begin().value());
+ printf("%s", data.content.constData());
+}
+
+bool Test262Runner::run()
+{
+ if (!loadTests())
+ return false;
+
+ if (flags & Parallel) {
+ threadPool = new QThreadPool;
+ threadPool->setStackSize(16*1024*1024);
+ if (flags & Verbose)
+ qDebug() << "Running in parallel with" << QThread::idealThreadCount() << "threads.";
+ }
+
+ if (flags & ForceJIT)
+ qputenv("QV4_JIT_CALL_THRESHOLD", QByteArray("0"));
+ else if (flags & ForceBytecode)
+ qputenv("QV4_FORCE_INTERPRETER", QByteArray("1"));
+
+ if (flags & WithTestExpectations)
+ loadTestExpectations();
+
+ for (auto it = testCases.constBegin(); it != testCases.constEnd(); ++it) {
+ auto c = it.value();
+ if (!c.skipTestCase) {
+ int result = runSingleTest(c);
+ if (result == -2)
+ return false;
+ }
+ }
+
+ if (threadPool)
+ threadPool->waitForDone();
+
+ const bool testsOk = report();
+
+ if (flags & WriteTestExpectations)
+ writeTestExpectations();
+ else if (flags & UpdateTestExpectations)
+ updateTestExpectations();
+
+ return testsOk;
+}
+
+bool Test262Runner::report()
+{
+ qDebug() << "Test execution summary:";
+ qDebug() << " Executed" << testCases.size() << "test cases.";
+ QStringList crashes;
+ QStringList unexpectedFailures;
+ QStringList unexpectedPasses;
+ for (auto it = testCases.constBegin(); it != testCases.constEnd(); ++it) {
+ const auto c = it.value();
+ if (c.strictResult == c.strictExpectation && c.sloppyResult == c.sloppyExpectation)
+ continue;
+ auto report = [&] (TestCase::Result expected, TestCase::Result result, const char *s) {
+ if (result == TestCase::Crashes)
+ crashes << (it.key() + " crashed in " + s + " mode");
+ if (result == TestCase::Fails && expected == TestCase::Passes)
+ unexpectedFailures << (it.key() + " failed in " + s + " mode");
+ if (result == TestCase::Passes && expected == TestCase::Fails)
+ unexpectedPasses << (it.key() + " unexpectedly passed in " + s + " mode");
+ };
+ report(c.strictExpectation, c.strictResult, "strict");
+ report(c.sloppyExpectation, c.sloppyResult, "sloppy");
+ }
+ if (!crashes.isEmpty()) {
+ qDebug() << " Encountered" << crashes.size() << "crashes in the following files:";
+ for (const QString &f : qAsConst(crashes))
+ qDebug() << " " << f;
+ }
+ if (!unexpectedFailures.isEmpty()) {
+ qDebug() << " Encountered" << unexpectedFailures.size() << "unexpected failures in the following files:";
+ for (const QString &f : qAsConst(unexpectedFailures))
+ qDebug() << " " << f;
+ }
+ if (!unexpectedPasses.isEmpty()) {
+ qDebug() << " Encountered" << unexpectedPasses.size() << "unexpected passes in the following files:";
+ for (const QString &f : qAsConst(unexpectedPasses))
+ qDebug() << " " << f;
+ }
+ return crashes.isEmpty() && unexpectedFailures.isEmpty() && unexpectedPasses.isEmpty();
+}
+
+bool Test262Runner::loadTests()
+{
+ QDir dir(testDir + "/test");
+ if (!dir.exists()) {
+ qWarning() << "Could not load tests," << dir.path() << "does not exist.";
+ return false;
+ }
+
+ QString annexB = "annexB";
+ QString harness = "harness";
+ QString intl402 = "intl402";
+
+ int pathlen = dir.path().length() + 1;
+ QDirIterator it(dir, QDirIterator::Subdirectories);
+ while (it.hasNext()) {
+ QString file = it.next().mid(pathlen);
+ if (!file.endsWith(".js"))
+ continue;
+ if (!filter.isEmpty() && !file.contains(filter))
+ continue;
+ if (file.startsWith(annexB) || file.startsWith(harness) || file.startsWith(intl402))
+ continue;
+
+ testCases.insert(file, TestCase{ file });
+ }
+ if (testCases.isEmpty()) {
+ qWarning() << "No tests to run.";
+ return false;
+ }
+
+ return true;
+}
+
+
+struct TestExpectationLine {
+ TestExpectationLine(const QByteArray &line);
+ enum State {
+ Fails,
+ SloppyFails,
+ StrictFails,
+ Skip,
+ Passes
+ } state;
+ QString testCase;
+
+ QByteArray toLine() const;
+ void update(const TestCase &testCase);
+
+ static TestExpectationLine fromTestCase(const TestCase &testCase);
+private:
+ TestExpectationLine() = default;
+ static State stateFromTestCase(const TestCase &testCase);
+};
+
+TestExpectationLine::TestExpectationLine(const QByteArray &line)
+{
+ int space = line.indexOf(' ');
+
+ testCase = QString::fromUtf8(space > 0 ? line.left(space) : line);
+ if (!testCase.endsWith(".js"))
+ testCase += ".js";
+
+ state = Fails;
+ if (space < 0)
+ return;
+ QByteArray qualifier = line.mid(space + 1);
+ if (qualifier == "skip")
+ state = Skip;
+ else if (qualifier == "strictFails")
+ state = StrictFails;
+ else if (qualifier == "sloppyFails")
+ state = SloppyFails;
+ else if (qualifier == "fails")
+ state = Fails;
+ else
+ qWarning() << "illegal format in TestExpectations, line" << line;
+}
+
+QByteArray TestExpectationLine::toLine() const {
+ const char *res = nullptr;
+ switch (state) {
+ case Fails:
+ res = " fails\n";
+ break;
+ case SloppyFails:
+ res = " sloppyFails\n";
+ break;
+ case StrictFails:
+ res = " strictFails\n";
+ break;
+ case Skip:
+ res = " skip\n";
+ break;
+ case Passes:
+ // no need for an entry
+ return QByteArray();
+ }
+ QByteArray result = testCase.toUtf8() + res;
+ return result;
+}
+
+void TestExpectationLine::update(const TestCase &testCase)
+{
+ Q_ASSERT(testCase.test == this->testCase);
+
+ State resultState = stateFromTestCase(testCase);
+ switch (resultState) {
+ case Fails:
+ // no improvement, don't update
+ break;
+ case SloppyFails:
+ if (state == Fails)
+ state = SloppyFails;
+ else if (state == StrictFails)
+ // we have a regression in sloppy mode, but strict now passes
+ state = Passes;
+ break;
+ case StrictFails:
+ if (state == Fails)
+ state = StrictFails;
+ else if (state == SloppyFails)
+ // we have a regression in strict mode, but sloppy now passes
+ state = Passes;
+ break;
+ case Skip:
+ Q_ASSERT(state == Skip);
+ // nothing to do
+ break;
+ case Passes:
+ state = Passes;
+ }
+}
+
+TestExpectationLine TestExpectationLine::fromTestCase(const TestCase &testCase)
+{
+ TestExpectationLine l;
+ l.testCase = testCase.test;
+ l.state = stateFromTestCase(testCase);
+ return l;
+}
+
+TestExpectationLine::State TestExpectationLine::stateFromTestCase(const TestCase &testCase)
+{
+ // keep skipped tests
+ if (testCase.skipTestCase)
+ return Skip;
+
+ bool strictFails = (testCase.strictResult == TestCase::Crashes || testCase.strictResult == TestCase::Fails);
+ bool sloppyFails = (testCase.sloppyResult == TestCase::Crashes || testCase.sloppyResult == TestCase::Fails);
+ if (strictFails && sloppyFails)
+ return Fails;
+ if (strictFails)
+ return StrictFails;
+ if (sloppyFails)
+ return SloppyFails;
+ return Passes;
+}
+
+
+void Test262Runner::loadTestExpectations()
+{
+ QFile file("TestExpectations");
+ if (!file.open(QFile::ReadOnly)) {
+ qWarning() << "Could not open TestExpectations file.";
+ return;
+ }
+
+ int line = 0;
+ while (!file.atEnd()) {
+ ++line;
+ QByteArray line = file.readLine().trimmed();
+ if (line.startsWith('#') || line.isEmpty())
+ continue;
+ TestExpectationLine expectation(line);
+ if (!filter.isEmpty() && !expectation.testCase.contains(filter))
+ continue;
+
+ if (!testCases.contains(expectation.testCase))
+ qWarning() << "Unknown test case" << expectation.testCase << "in TestExpectations file.";
+ //qDebug() << "TestExpectations:" << expectation.testCase << expectation.state;
+ TestCase &s = testCases[expectation.testCase];
+ switch (expectation.state) {
+ case TestExpectationLine::Fails:
+ s.strictExpectation = TestCase::Fails;
+ s.sloppyExpectation = TestCase::Fails;
+ break;
+ case TestExpectationLine::SloppyFails:
+ s.strictExpectation = TestCase::Passes;
+ s.sloppyExpectation = TestCase::Fails;
+ break;
+ case TestExpectationLine::StrictFails:
+ s.strictExpectation = TestCase::Fails;
+ s.sloppyExpectation = TestCase::Passes;
+ break;
+ case TestExpectationLine::Skip:
+ s.skipTestCase = true;
+ break;
+ case TestExpectationLine::Passes:
+ Q_UNREACHABLE();
+ }
+ }
+}
+
+void Test262Runner::updateTestExpectations()
+{
+ QFile file("TestExpectations");
+ if (!file.open(QFile::ReadOnly)) {
+ qWarning() << "Could not open TestExpectations file.";
+ return;
+ }
+
+ QTemporaryFile updatedExpectations;
+ updatedExpectations.open();
+
+ int line = 0;
+ while (!file.atEnd()) {
+ ++line;
+ QByteArray originalLine = file.readLine();
+ QByteArray line = originalLine.trimmed();
+ if (line.startsWith('#') || line.isEmpty()) {
+ updatedExpectations.write(originalLine);
+ continue;
+ }
+
+ TestExpectationLine expectation(line);
+// qDebug() << "checking: " << expectation.testCase;
+ if (!testCases.contains(expectation.testCase)) {
+ updatedExpectations.write(originalLine);
+ continue;
+ }
+ const TestCase &testcase = testCases.value(expectation.testCase);
+ expectation.update(testcase);
+
+ line = expectation.toLine();
+// qDebug() << "updated line:" << line;
+ updatedExpectations.write(line);
+ }
+ file.close();
+ updatedExpectations.close();
+ file.remove();
+ qDebug() << updatedExpectations.fileName() << file.fileName();
+ updatedExpectations.copy(file.fileName());
+ qDebug() << "Updated TestExpectations file written!";
+}
+
+void Test262Runner::writeTestExpectations()
+{
+ QFile file("TestExpectations");
+
+ QTemporaryFile expectations;
+ expectations.open();
+
+ for (auto c : qAsConst(testCases)) {
+ TestExpectationLine line = TestExpectationLine::fromTestCase(c);
+ expectations.write(line.toLine());
+ }
+
+ expectations.close();
+ if (file.exists())
+ file.remove();
+ qDebug() << expectations.fileName() << file.fileName();
+ expectations.copy(file.fileName());
+ qDebug() << "new TestExpectations file written!";
+
+}
+
+static bool executeTest(const QByteArray &data)
+{
+ QString testData = QString::fromUtf8(data);
+
+ QV4::ExecutionEngine vm;
+
+ QV4::Scope scope(&vm);
+ QV4::ScopedContext ctx(scope, vm.rootContext());
+
+ QV4::GlobalExtensions::init(vm.globalObject, QJSEngine::ConsoleExtension | QJSEngine::GarbageCollectionExtension);
+
+ QV4::Script script(ctx, QV4::Compiler::ContextType::Global, testData, QString());
+ script.parse();
+
+ QV4::ScopedValue result(scope);
+ if (!scope.engine->hasException)
+ result = script.run();
+
+ if (scope.engine->hasException)
+ return false;
+ return true;
+}
+
+class SingleTest : public QRunnable
+{
+public:
+ SingleTest(Test262Runner *runner, const TestData &data)
+ : runner(runner), data(data)
+ {
+ command = runner->command;
+ }
+ void run();
+
+ void runExternalTest();
+
+ QString command;
+ Test262Runner *runner;
+ TestData data;
+};
+
+void SingleTest::run()
+{
+ if (!command.isEmpty()) {
+ runExternalTest();
+ return;
+ }
+
+ if (data.runInSloppyMode) {
+ bool ok = ::executeTest(data.content);
+ if (data.negative)
+ ok = !ok;
+
+ data.sloppyResult = ok ? TestCase::Passes : TestCase::Fails;
+ } else {
+ data.sloppyResult = TestCase::Skipped;
+ }
+ if (data.runInStrictMode) {
+ QByteArray c = "'use strict';\n" + data.content;
+ bool ok = ::executeTest(c);
+ if (data.negative)
+ ok = !ok;
+
+ data.strictResult = ok ? TestCase::Passes : TestCase::Fails;
+ } else {
+ data.strictResult = TestCase::Skipped;
+ }
+ runner->addResult(data);
+}
+
+void SingleTest::runExternalTest()
+{
+ auto runTest = [=] (const char *header, TestCase::Result *result) {
+ QTemporaryFile tempFile;
+ tempFile.open();
+ tempFile.write(header);
+ tempFile.write(data.content);
+ tempFile.close();
+
+ QProcess process;
+// if (flags & Verbose)
+// process.setReadChannelMode(QProcess::ForwardedChannels);
+
+ process.start(command, QStringList(tempFile.fileName()));
+ if (!process.waitForFinished(-1) || process.error() == QProcess::FailedToStart) {
+ qWarning() << "Could not execute" << command;
+ *result = TestCase::Crashes;
+ }
+ if (process.exitStatus() != QProcess::NormalExit) {
+ *result = TestCase::Crashes;
+ }
+ bool ok = (process.exitCode() == EXIT_SUCCESS);
+ if (data.negative)
+ ok = !ok;
+ *result = ok ? TestCase::Passes : TestCase::Fails;
+ };
+
+ if (data.runInSloppyMode)
+ runTest("", &data.sloppyResult);
+ if (data.runInStrictMode)
+ runTest("'use strict';\n", &data.strictResult);
+
+ runner->addResult(data);
+}
+
+int Test262Runner::runSingleTest(TestCase testCase)
+{
+ TestData data = getTestData(testCase);
+// qDebug() << "starting test" << data.test;
+
+ if (data.isExcluded || data.async || data.runAsModuleCode)
+ return 0;
+
+ if (threadPool) {
+ SingleTest *test = new SingleTest(this, data);
+ threadPool->start(test);
+ return 0;
+ }
+ SingleTest test(this, data);
+ test.run();
+ return 0;
+}
+
+void Test262Runner::addResult(TestCase result)
+{
+ {
+ QMutexLocker locker(&mutex);
+ Q_ASSERT(result.strictExpectation == testCases[result.test].strictExpectation);
+ Q_ASSERT(result.sloppyExpectation == testCases[result.test].sloppyExpectation);
+ testCases[result.test] = result;
+ }
+
+ if (!(flags & Verbose))
+ return;
+
+ QString test = result.test;
+ if (result.strictResult == TestCase::Skipped) {
+ ;
+ } else if (result.strictResult == TestCase::Crashes) {
+ qDebug() << "FAIL:" << test << "crashed in strict mode!";
+ } else if ((result.strictResult == TestCase::Fails) && (result.strictExpectation == TestCase::Fails)) {
+ qDebug() << "PASS:" << test << "failed in strict mode as expected";
+ } else if ((result.strictResult == TestCase::Passes) == (result.strictExpectation == TestCase::Passes)) {
+ qDebug() << "PASS:" << test << "passed in strict mode";
+ } else if (!(result.strictExpectation == TestCase::Fails)) {
+ qDebug() << "FAIL:" << test << "failed in strict mode";
+ } else {
+ qDebug() << "XPASS:" << test << "unexpectedly passed in strict mode";
+ }
+
+ if (result.sloppyResult == TestCase::Skipped) {
+ ;
+ } else if (result.sloppyResult == TestCase::Crashes) {
+ qDebug() << "FAIL:" << test << "crashed in sloppy mode!";
+ } else if ((result.sloppyResult == TestCase::Fails) && (result.sloppyExpectation == TestCase::Fails)) {
+ qDebug() << "PASS:" << test << "failed in sloppy mode as expected";
+ } else if ((result.sloppyResult == TestCase::Passes) == (result.sloppyExpectation == TestCase::Passes)) {
+ qDebug() << "PASS:" << test << "passed in sloppy mode";
+ } else if (!(result.sloppyExpectation == TestCase::Fails)) {
+ qDebug() << "FAIL:" << test << "failed in sloppy mode";
+ } else {
+ qDebug() << "XPASS:" << test << "unexpectedly passed in sloppy mode";
+ }
+}
+
+TestData Test262Runner::getTestData(const TestCase &testCase)
+{
+ QFile testFile(testDir + "/test/" + testCase.test);
+ if (!testFile.open(QFile::ReadOnly)) {
+ qWarning() << "wrong test file" << testCase.test;
+ exit(1);
+ }
+ QByteArray content = testFile.readAll();
+ content.replace(QByteArrayLiteral("\r\n"), "\n");
+
+// qDebug() << "parsing test file" << test;
+
+ TestData data(testCase);
+ parseYaml(content, &data);
+
+ data.content += harness("assert.js");
+ data.content += harness("sta.js");
+
+ for (QByteArray inc : qAsConst(data.includes)) {
+ inc = inc.trimmed();
+ data.content += harness(inc);
+ }
+
+ if (data.async)
+ data.content += harness("doneprintHandle.js");
+
+ data.content += content;
+
+ return data;
+}
+
+struct YamlSection {
+ YamlSection(const QByteArray &yaml, const char *sectionName);
+
+ bool contains(const char *keyword) const;
+ QList<QByteArray> keywords() const;
+
+ QByteArray yaml;
+ int start = -1;
+ int length = 0;
+ bool shortSection = false;
+};
+
+YamlSection::YamlSection(const QByteArray &yaml, const char *sectionName)
+ : yaml(yaml)
+{
+ start = yaml.indexOf(sectionName);
+ if (start < 0)
+ return;
+ start += static_cast<int>(strlen(sectionName));
+ int end = yaml.indexOf('\n', start + 1);
+ if (end < 0)
+ end = yaml.length();
+
+ int s = yaml.indexOf('[', start);
+ if (s > 0 && s < end) {
+ shortSection = true;
+ start = s + 1;
+ end = yaml.indexOf(']', s);
+ } else {
+ while (end < yaml.size() - 1 && yaml.at(end + 1) == ' ')
+ end = yaml.indexOf('\n', end + 1);
+ }
+ length = end - start;
+}
+
+bool YamlSection::contains(const char *keyword) const
+{
+ if (start < 0)
+ return false;
+ int idx = yaml.indexOf(keyword, start);
+ if (idx >= start && idx < start + length)
+ return true;
+ return false;
+}
+
+QList<QByteArray> YamlSection::keywords() const
+{
+ if (start < 0)
+ return QList<QByteArray>();
+
+ QByteArray content = yaml.mid(start, length);
+ QList<QByteArray> keywords;
+ if (shortSection) {
+ keywords = content.split(',');
+ } else {
+ const QList<QByteArray> list = content.split('\n');
+ for (const QByteArray &l : list) {
+ int i = 0;
+ while (i < l.size() && (l.at(i) == ' ' || l.at(i) == '-'))
+ ++i;
+ QByteArray entry = l.mid(i);
+ if (!entry.isEmpty())
+ keywords.append(entry);
+ }
+ }
+// qDebug() << "keywords:" << keywords;
+ return keywords;
+}
+
+
+void Test262Runner::parseYaml(const QByteArray &content, TestData *data)
+{
+ int start = content.indexOf("/*---");
+ if (start < 0)
+ return;
+ start += sizeof("/*---");
+
+ int end = content.indexOf("---*/");
+ if (end < 0)
+ return;
+
+ QByteArray yaml = content.mid(start, end - start);
+
+ if (yaml.contains("negative:"))
+ data->negative = true;
+
+ YamlSection flags(yaml, "flags:");
+ data->runInSloppyMode = !flags.contains("onlyStrict");
+ data->runInStrictMode = !flags.contains("noStrict") && !flags.contains("raw");
+ data->runAsModuleCode = flags.contains("module");
+ data->async = flags.contains("async");
+
+ YamlSection includes(yaml, "includes:");
+ data->includes = includes.keywords();
+
+ YamlSection features = YamlSection(yaml, "features:");
+
+ const char **f = excludedFeatures;
+ while (*f) {
+ if (features.contains(*f)) {
+ data->isExcluded = true;
+ break;
+ }
+ ++f;
+ }
+
+// qDebug() << "Yaml:\n" << yaml;
+}
+
+QByteArray Test262Runner::harness(const QByteArray &name)
+{
+ if (harnessFiles.contains(name))
+ return harnessFiles.value(name);
+
+ QFile h(testDir + QLatin1String("/harness/") + name);
+ if (!h.open(QFile::ReadOnly)) {
+ qWarning() << "Illegal test harness file" << name;
+ exit(1);
+ }
+
+ QByteArray content = h.readAll();
+ harnessFiles.insert(name, content);
+ return content;
+}
diff --git a/tests/auto/qml/ecmascripttests/qjstest/test262runner.h b/tests/auto/qml/ecmascripttests/qjstest/test262runner.h
new file mode 100644
index 0000000000..6b64298f42
--- /dev/null
+++ b/tests/auto/qml/ecmascripttests/qjstest/test262runner.h
@@ -0,0 +1,131 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the V4VM module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef TEST262RUNNER_H
+#define TEST262RUNNER_H
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qset.h>
+#include <qmap.h>
+#include <qmutex.h>
+#include <qthreadpool.h>
+
+struct TestCase {
+ TestCase() = default;
+ TestCase(const QString &test)
+ : test(test) {}
+ enum Result {
+ Skipped,
+ Passes,
+ Fails,
+ Crashes
+ };
+ bool skipTestCase = false;
+ Result strictExpectation = Passes;
+ Result sloppyExpectation = Passes;
+ Result strictResult = Skipped;
+ Result sloppyResult = Skipped;
+
+ QString test;
+};
+
+struct TestData : TestCase {
+ TestData(const TestCase &testCase)
+ : TestCase(testCase) {}
+ // flags
+ bool negative = false;
+ bool runInStrictMode = true;
+ bool runInSloppyMode = true;
+ bool runAsModuleCode = false;
+ bool async = false;
+
+ bool isExcluded = false;
+
+ QList<QByteArray> includes;
+
+ QByteArray content;
+};
+
+class Test262Runner
+{
+public:
+ Test262Runner(const QString &command, const QString &testDir);
+ ~Test262Runner();
+
+ enum Mode {
+ Sloppy = 0,
+ Strict = 1
+ };
+
+ enum Flags {
+ Verbose = 0x1,
+ Parallel = 0x2,
+ ForceBytecode = 0x4,
+ ForceJIT = 0x8,
+ WithTestExpectations = 0x10,
+ UpdateTestExpectations = 0x20,
+ WriteTestExpectations = 0x40,
+ };
+ void setFlags(int f) { flags = f; }
+
+ void setFilter(const QString &f) { filter = f; }
+
+ void cat();
+ bool run();
+
+ bool report();
+
+private:
+ friend class SingleTest;
+ bool loadTests();
+ void loadTestExpectations();
+ void updateTestExpectations();
+ void writeTestExpectations();
+ int runSingleTest(TestCase testCase);
+
+ TestData getTestData(const TestCase &testCase);
+ void parseYaml(const QByteArray &content, TestData *data);
+
+ QByteArray harness(const QByteArray &name);
+
+ void addResult(TestCase result);
+
+ QString command;
+ QString testDir;
+ int flags = 0;
+
+ QMutex mutex;
+ QString filter;
+
+ QMap<QString, TestCase> testCases;
+ QHash<QByteArray, QByteArray> harnessFiles;
+
+ QThreadPool *threadPool = nullptr;
+};
+
+
+#endif
diff --git a/tests/auto/qml/ecmascripttests/test262 b/tests/auto/qml/ecmascripttests/test262
-Subproject 40b4f28e98c416a092e26aa17489bf94ccb8bf4
+Subproject 3c69133cc419840c1be34638039cd8c48a7ef58
diff --git a/tests/auto/qml/ecmascripttests/test262.py b/tests/auto/qml/ecmascripttests/test262.py
index e055c7a8e7..19551e3ba2 100755
--- a/tests/auto/qml/ecmascripttests/test262.py
+++ b/tests/auto/qml/ecmascripttests/test262.py
@@ -61,6 +61,35 @@ from parseTestRecord import parseTestRecord, stripHeader
from packagerConfig import *
+# excluded features that are still experimental and not part of any official standard
+# see also the features.txt file in test262/
+excludedFeatures = [
+ "BigInt",
+ "class-fields-public",
+ "class-fields-private",
+ "Promise.prototype.finally",
+ "async-iteration",
+ "Symbol.asyncIterator",
+ "object-rest",
+ "object-spread",
+ "optional-catch-binding",
+ "regexp-dotall",
+ "regexp-lookbehind",
+ "regexp-named-groups",
+ "regexp-unicode-property-escapes",
+ "Atomics",
+ "SharedArrayBuffer",
+ "Array.prototype.flatten",
+ "Array.prototype.flatMap",
+ "string-trimming",
+ "String.prototype.trimEnd",
+ "String.prototype.trimStart",
+ "numeric-separator-literal",
+
+ # optional features, not supported by us
+ "caller"
+]
+
# ############# Helpers needed for parallel multi-process test execution ############
def runTest(case, args):
@@ -95,19 +124,19 @@ class TestExpectations:
continue
record = line.split()
if len(record) == 1:
- self.testsToSkip.append(record[0])
+ self.failingTests.append(record[0])
else:
test = record[0]
expectation = record[1]
- if expectation == "failing":
- self.failingTests.append(test)
+ if expectation == "skip":
+ self.testsToSkip.append(test)
f.close()
def update(self, progress):
- unexpectedPasses = [c.case.name[-1] for c in progress.failed_tests if c.case.IsNegative()]
+ unexpectedPasses = [c.case.name for c in progress.failed_tests if c.case.IsNegative()]
# If a test fails that we expected to fail, then it actually passed unexpectedly.
- failures = [c.case.name[-1] for c in progress.failed_tests if not c.case.IsNegative()]
+ failures = [c.case.name for c in progress.failed_tests if not c.case.IsNegative()]
for failure in failures:
if failure in self.failingTests:
unexpectedPasses.append(failure)
@@ -116,7 +145,7 @@ class TestExpectations:
lines = f.read().splitlines()
oldLen = len(lines)
for result in unexpectedPasses:
- expectationLine = result + " failing"
+ expectationLine = result
try:
lines.remove(expectationLine)
except ValueError:
@@ -277,14 +306,17 @@ class TestCase(object):
f.close()
testRecord = parseTestRecord(self.contents, name)
self.test = testRecord["test"]
+ if 'features' in testRecord:
+ self.features = testRecord["features"];
+ else:
+ self.features = []
del testRecord["test"]
del testRecord["header"]
- del testRecord["commentary"]
self.testRecord = testRecord;
def GetName(self):
- return path.join(*self.name)
+ return self.name
def GetMode(self):
if self.strict_mode:
@@ -310,14 +342,20 @@ class TestCase(object):
def IsNoStrict(self):
return 'noStrict' in self.testRecord
+ def IsExperimental(self):
+ for f in self.features:
+ if excludedFeatures.count(f) >= 1:
+ return True;
+ return False
+
def GetSource(self):
# "var testDescrip = " + str(self.testRecord) + ';\n\n' + \
- source = self.suite.GetInclude("cth.js") + \
+ source = self.suite.GetInclude("assert.js") + \
self.suite.GetInclude("sta.js") + \
- self.suite.GetInclude("ed.js") + \
- self.suite.GetInclude("testBuiltInObject.js") + \
- self.suite.GetInclude("testIntl.js") + \
self.test + '\n'
+ if 'includes' in self.testRecord:
+ for inc in self.testRecord['includes']:
+ source += self.suite.GetInclude(inc);
if self.strict_mode:
source = '"use strict";\nvar strict_mode = true;\n' + source
@@ -403,14 +441,23 @@ class TestSuite(object):
def __init__(self, root, strict_only, non_strict_only, unmarked_default, load_expectations):
# TODO: derive from packagerConfig.py
- self.test_root = path.join(root, 'test', 'suite')
- self.lib_root = path.join(root, 'test', 'harness')
+ self.test_root = path.join(root, 'test')
+ self.lib_root = path.join(root, 'harness')
self.strict_only = strict_only
self.non_strict_only = non_strict_only
self.unmarked_default = unmarked_default
self.include_cache = { }
self.expectations = TestExpectations(load_expectations)
+ def IsExcludedTest(self, path):
+ if path.startswith('annexB'):
+ return True;
+ if path.startswith('harness'):
+ return True;
+ if path.startswith('intl402'):
+ return True;
+ return False;
+
def Validate(self):
if not path.exists(self.test_root):
ReportError("No test repository found")
@@ -459,25 +506,25 @@ class TestSuite(object):
else:
logging.warning("Unexpected path %s", full_path)
rel_path = full_path
- if self.ShouldRun(rel_path, tests) and not rel_path.startswith("intl402" + os.sep):
+ if self.ShouldRun(rel_path, tests) and not self.IsExcludedTest(rel_path):
basename = path.basename(full_path)[:-3]
- name = rel_path.split(path.sep)[:-1] + [basename]
- if EXCLUDE_LIST.count(basename) >= 1 or self.expectations.testsToSkip.count(basename) >= 1:
- print 'Excluded: ' + basename
+ name = rel_path.replace('.js', '')
+ if EXCLUDE_LIST.count(basename) >= 1 or self.expectations.testsToSkip.count(name) >= 1:
+ print 'Excluded: ' + rel_path
else:
if not self.non_strict_only:
strict_case = TestCase(self, name, full_path, True)
- if self.expectations.failingTests.count(basename) >= 1:
+ if self.expectations.failingTests.count(name) >= 1:
strict_case.NegateResult()
- if not strict_case.IsNoStrict():
+ if not strict_case.IsNoStrict() and not strict_case.IsExperimental():
if strict_case.IsOnlyStrict() or \
self.unmarked_default in ['both', 'strict']:
cases.append(strict_case)
if not self.strict_only:
non_strict_case = TestCase(self, name, full_path, False)
- if self.expectations.failingTests.count(basename) >= 1:
+ if self.expectations.failingTests.count(name) >= 1:
non_strict_case.NegateResult()
- if not non_strict_case.IsOnlyStrict():
+ if not non_strict_case.IsOnlyStrict() and not non_strict_case.IsExperimental():
if non_strict_case.IsNoStrict() or \
self.unmarked_default in ['both', 'non_strict']:
cases.append(non_strict_case)
diff --git a/tests/auto/qml/ecmascripttests/testcase.pro b/tests/auto/qml/ecmascripttests/testcase.pro
new file mode 100644
index 0000000000..5bf7ecd696
--- /dev/null
+++ b/tests/auto/qml/ecmascripttests/testcase.pro
@@ -0,0 +1,15 @@
+CONFIG += testcase
+TARGET = tst_ecmascripttests
+QT += testlib qml-private
+macos:CONFIG -= app_bundle
+SOURCES += tst_ecmascripttests.cpp qjstest/test262runner.cpp
+HEADERS += qjstest/test262runner.h
+DEFINES += SRCDIR=\\\"$$PWD\\\"
+
+# The ES test suite takes approximately 5 mins to run, on a fairly
+# vanilla developer machine, so the default watchdog timer kills the
+# test some of the time. Fix by raising time-out to 400s when
+# invoking tst_ecmascripttests:
+checkenv.name = QTEST_FUNCTION_TIMEOUT
+checkenv.value = 500000
+QT_TOOL_ENV += checkenv
diff --git a/tests/auto/qml/ecmascripttests/tst_ecmascripttests.cpp b/tests/auto/qml/ecmascripttests/tst_ecmascripttests.cpp
index 0d58d045b9..418dd4dc53 100644
--- a/tests/auto/qml/ecmascripttests/tst_ecmascripttests.cpp
+++ b/tests/auto/qml/ecmascripttests/tst_ecmascripttests.cpp
@@ -30,55 +30,37 @@
#include <QtTest/QtTest>
#include <QProcess>
#include <QLibraryInfo>
+#include <qjstest/test262runner.h>
class tst_EcmaScriptTests : public QObject
{
Q_OBJECT
- void runTests(bool interpret);
-
private slots:
void runInterpreted();
void runJitted();
};
-void tst_EcmaScriptTests::runTests(bool interpret)
-{
-#if defined(Q_OS_LINUX) && defined(Q_PROCESSOR_X86_64)
- QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
- if (interpret)
- env.insert("QV4_FORCE_INTERPRETER", "1");
- else
- env.insert("QV4_JIT_CALL_THRESHOLD", "0");
-
- QProcess process;
- process.setProcessChannelMode(QProcess::ForwardedChannels);
- process.setWorkingDirectory(QLatin1String(SRCDIR));
- process.setProgram("python");
- process.setProcessEnvironment(env);
- process.setArguments(QStringList() << "test262.py" << "--command=" + QLibraryInfo::location(QLibraryInfo::BinariesPath) + "/qmljs" << "--parallel" << "--with-test-expectations");
-
- qDebug() << "Going to run" << process.program() << process.arguments() << "in" << process.workingDirectory();
-
- process.start();
- QVERIFY(process.waitForStarted());
- const int timeoutInMSecs = 20 * 60 * 1000;
- QVERIFY2(process.waitForFinished(timeoutInMSecs), "Tests did not terminate in time -- see output above for details");
- QVERIFY2(process.exitStatus() == QProcess::NormalExit, "Running the test harness failed -- see output above for details");
- QVERIFY2(process.exitCode() == 0, "Tests failed -- see output above for details");
-#else
- QSKIP("Currently the ecmascript tests are only run on Linux/x86-64");
-#endif
-}
-
void tst_EcmaScriptTests::runInterpreted()
{
- runTests(true);
+#if defined(Q_PROCESSOR_X86_64) && !defined(Q_OS_DARWIN)
+ QDir::setCurrent(QLatin1String(SRCDIR));
+ Test262Runner runner(QString(), "test262");
+ runner.setFlags(Test262Runner::ForceBytecode|Test262Runner::WithTestExpectations|Test262Runner::Parallel|Test262Runner::Verbose);
+ bool result = runner.run();
+ QVERIFY(result);
+#endif
}
void tst_EcmaScriptTests::runJitted()
{
- runTests(false);
+#if defined(Q_PROCESSOR_X86_64) && !defined(Q_OS_DARWIN)
+ QDir::setCurrent(QLatin1String(SRCDIR));
+ Test262Runner runner(QString(), "test262");
+ runner.setFlags(Test262Runner::ForceJIT|Test262Runner::WithTestExpectations|Test262Runner::Parallel|Test262Runner::Verbose);
+ bool result = runner.run();
+ QVERIFY(result);
+#endif
}
QTEST_GUILESS_MAIN(tst_EcmaScriptTests)
diff --git a/tests/auto/qml/qjsengine/tst_qjsengine.cpp b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
index bb923951a8..935fd53a42 100644
--- a/tests/auto/qml/qjsengine/tst_qjsengine.cpp
+++ b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
@@ -39,6 +39,7 @@
#include <qqmlcomponent.h>
#include <stdlib.h>
#include <private/qv4alloca_p.h>
+#include <private/qjsvalue_p.h>
#ifdef Q_CC_MSVC
#define NO_INLINE __declspec(noinline)
@@ -206,7 +207,24 @@ private slots:
void scriptScopes();
+ void binaryNumbers();
+ void octalNumbers();
+
+ void incrementAfterNewline();
+
+ void deleteInsideForIn();
+
+ void functionToString_data();
+ void functionToString();
+
void protoChanges_QTBUG68369();
+ void multilineStrings();
+
+ void throwError();
+ void mathMinMax();
+
+public:
+ Q_INVOKABLE QJSValue throwingCppMethod();
signals:
void testSignal();
@@ -942,6 +960,7 @@ void tst_QJSEngine::globalObjectProperties_enumerate()
<< "decodeURIComponent"
<< "Date"
<< "Array"
+ << "Symbol"
<< "escape"
<< "unescape"
<< "SyntaxError"
@@ -958,6 +977,10 @@ void tst_QJSEngine::globalObjectProperties_enumerate()
<< "Uint32Array"
<< "Float32Array"
<< "Float64Array"
+ << "Set"
+ << "Map"
+ << "Reflect"
+ << "Proxy"
;
QSet<QString> actualNames;
{
@@ -3207,9 +3230,7 @@ void tst_QJSEngine::threadedEngine()
void tst_QJSEngine::functionDeclarationsInConditionals()
{
- // Even though this is bad practice (and test262 covers it with best practices test cases),
- // we do allow for function declarations in if and while statements, as unfortunately that's
- // real world JavaScript. (QTBUG-33064 for example)
+ // Visibility of function declarations inside blocks is limited to the block
QJSEngine eng;
QJSValue result = eng.evaluate("if (true) {\n"
" function blah() { return false; }\n"
@@ -3217,8 +3238,7 @@ void tst_QJSEngine::functionDeclarationsInConditionals()
" function blah() { return true; }\n"
"}\n"
"blah();");
- QVERIFY(result.isBool());
- QCOMPARE(result.toBool(), true);
+ QVERIFY(result.isError());
}
void tst_QJSEngine::arrayPop_QTBUG_35979()
@@ -4169,6 +4189,88 @@ void tst_QJSEngine::scriptScopes()
QCOMPARE(use.toInt(), 42);
}
+void tst_QJSEngine::binaryNumbers()
+{
+ QJSEngine engine;
+
+ QJSValue result = engine.evaluate("0b1001");
+ QVERIFY(result.isNumber());
+ QVERIFY(result.toNumber() == 9);
+
+ result = engine.evaluate("0B1001");
+ QVERIFY(result.isNumber());
+ QVERIFY(result.toNumber() == 9);
+
+ result = engine.evaluate("0b2");
+ QVERIFY(result.isError());
+}
+
+void tst_QJSEngine::octalNumbers()
+{
+ QJSEngine engine;
+
+ QJSValue result = engine.evaluate("0o11");
+ QVERIFY(result.isNumber());
+ QVERIFY(result.toNumber() == 9);
+
+ result = engine.evaluate("0O11");
+ QVERIFY(result.isNumber());
+ QVERIFY(result.toNumber() == 9);
+
+ result = engine.evaluate("0o9");
+ QVERIFY(result.isError());
+}
+
+void tst_QJSEngine::incrementAfterNewline()
+{
+ QJSEngine engine;
+
+ QJSValue result = engine.evaluate("var x = 0; if (\n++x) x; else -x;");
+ QVERIFY(result.isNumber());
+ QVERIFY(result.toNumber() == 1);
+
+ result = engine.evaluate("var x = 0; if (\n--x) x; else -x;");
+ QVERIFY(result.isNumber());
+ QVERIFY(result.toNumber() == -1);
+}
+
+void tst_QJSEngine::deleteInsideForIn()
+{
+ QJSEngine engine;
+
+ QJSValue iterationCount = engine.evaluate(
+ "var o = { a: 1, b: 2, c: 3, d: 4};\n"
+ "var count = 0;\n"
+ "for (var prop in o) { count++; delete o[prop]; }\n"
+ "count");
+ QVERIFY(iterationCount.isNumber());
+ QCOMPARE(iterationCount.toInt(), 4);
+}
+
+void tst_QJSEngine::functionToString_data()
+{
+ QTest::addColumn<QString>("source");
+ QTest::addColumn<QString>("expectedString");
+
+ QTest::newRow("named function") << QString::fromLatin1("function f() {}; f.toString()")
+ << QString::fromLatin1("function f() { [code] }");
+ QTest::newRow("anonymous function") << QString::fromLatin1("(function() {}).toString()")
+ << QString::fromLatin1("function() { [code] }");
+}
+
+// Tests that function.toString() prints the function's name.
+void tst_QJSEngine::functionToString()
+{
+ QFETCH(QString, source);
+ QFETCH(QString, expectedString);
+
+ QJSEngine engine;
+ engine.installExtensions(QJSEngine::AllExtensions);
+ QJSValue evaluationResult = engine.evaluate(source);
+ QVERIFY(!evaluationResult.isError());
+ QCOMPARE(evaluationResult.toString(), expectedString);
+}
+
void tst_QJSEngine::protoChanges_QTBUG68369()
{
QJSEngine engine;
@@ -4185,6 +4287,62 @@ void tst_QJSEngine::protoChanges_QTBUG68369()
QVERIFY(ok.toBool() == true);
}
+void tst_QJSEngine::multilineStrings()
+{
+ QJSEngine engine;
+ QJSValue result = engine.evaluate(
+ "var x = `a\nb`; x;"
+ );
+ QVERIFY(result.isString());
+ QVERIFY(result.toString() == QStringLiteral("a\nb"));
+
+}
+
+void tst_QJSEngine::throwError()
+{
+ QJSEngine engine;
+ QJSValue wrappedThis = engine.newQObject(this);
+ QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
+ engine.globalObject().setProperty("testCase", wrappedThis);
+
+ QJSValue result = engine.evaluate(
+ "function test(){\n"
+ "try {\n"
+ " return testCase.throwingCppMethod();\n"
+ "} catch (error) {\n"
+ " return error;\n"
+ "}\n"
+ "return \"not reached!\";\n"
+ "}\n"
+ "test();"
+ );
+ QVERIFY(result.isError());
+ QCOMPARE(result.property("lineNumber").toString(), "3");
+ QCOMPARE(result.property("message").toString(), "blub");
+ QVERIFY(!result.property("stack").isUndefined());
+}
+
+QJSValue tst_QJSEngine::throwingCppMethod()
+{
+ qjsEngine(this)->throwError("blub");
+ return QJSValue(47);
+}
+
+void tst_QJSEngine::mathMinMax()
+{
+ QJSEngine engine;
+
+ QJSValue result = engine.evaluate("var a = .5; Math.min(1, 2, 3.5 + a, '5')");
+ QCOMPARE(result.toNumber(), 1.0);
+ QVERIFY(QJSValuePrivate::getValue(&result) != nullptr);
+ QVERIFY(QJSValuePrivate::getValue(&result)->isInteger());
+
+ result = engine.evaluate("var a = .5; Math.max('0', 1, 2, 3.5 + a)");
+ QCOMPARE(result.toNumber(), 4.0);
+ QVERIFY(QJSValuePrivate::getValue(&result) != nullptr);
+ QVERIFY(QJSValuePrivate::getValue(&result)->isInteger());
+}
+
QTEST_MAIN(tst_QJSEngine)
#include "tst_qjsengine.moc"
diff --git a/tests/auto/qml/qjsvalue/tst_qjsvalue.cpp b/tests/auto/qml/qjsvalue/tst_qjsvalue.cpp
index 6587408ae4..6384369ef0 100644
--- a/tests/auto/qml/qjsvalue/tst_qjsvalue.cpp
+++ b/tests/auto/qml/qjsvalue/tst_qjsvalue.cpp
@@ -1638,7 +1638,7 @@ void tst_QJSValue::getSetPrototype_evalCyclicPrototype()
QJSEngine eng;
QJSValue ret = eng.evaluate("o = { }; p = { }; o.__proto__ = p; p.__proto__ = o");
QCOMPARE(ret.isError(), true);
- QCOMPARE(ret.toString(), QLatin1String("TypeError: Cyclic __proto__ value"));
+ QCOMPARE(ret.toString(), QLatin1String("TypeError: Could not change prototype."));
}
void tst_QJSValue::getSetPrototype_eval()
diff --git a/tests/auto/qml/qml.pro b/tests/auto/qml/qml.pro
index 3433b56864..1bd23573b0 100644
--- a/tests/auto/qml/qml.pro
+++ b/tests/auto/qml/qml.pro
@@ -71,6 +71,7 @@ PRIVATETESTS += \
qqmlobjectmodel \
qv4assembler \
qv4mm \
+ qv4identifiertable \
ecmascripttests \
bindingdependencyapi
diff --git a/tests/auto/qml/qmldiskcache/tst_qmldiskcache.cpp b/tests/auto/qml/qmldiskcache/tst_qmldiskcache.cpp
index f5905758f3..d363180c06 100644
--- a/tests/auto/qml/qmldiskcache/tst_qmldiskcache.cpp
+++ b/tests/auto/qml/qmldiskcache/tst_qmldiskcache.cpp
@@ -106,7 +106,7 @@ struct TestCompiler
{
closeMapping();
testFilePath = baseDirectory + QStringLiteral("/test.qml");
- cacheFilePath = baseDirectory + QStringLiteral("/test.qmlc");
+ cacheFilePath = QV4::CompiledData::CompilationUnit::localCacheFilePath(QUrl::fromLocalFile(testFilePath));
mappedFile.setFileName(cacheFilePath);
}
@@ -499,7 +499,7 @@ void tst_qmldiskcache::fileSelectors()
QVERIFY(!obj.isNull());
QCOMPARE(obj->property("value").toInt(), 42);
- QFile cacheFile(testFilePath + "c");
+ QFile cacheFile(QV4::CompiledData::CompilationUnit::localCacheFilePath(QUrl::fromLocalFile(testFilePath)));
QVERIFY2(cacheFile.exists(), qPrintable(cacheFile.fileName()));
}
@@ -514,7 +514,7 @@ void tst_qmldiskcache::fileSelectors()
QVERIFY(!obj.isNull());
QCOMPARE(obj->property("value").toInt(), 100);
- QFile cacheFile(selectedTestFilePath + "c");
+ QFile cacheFile(QV4::CompiledData::CompilationUnit::localCacheFilePath(QUrl::fromLocalFile(selectedTestFilePath)));
QVERIFY2(cacheFile.exists(), qPrintable(cacheFile.fileName()));
}
}
@@ -667,7 +667,7 @@ void tst_qmldiskcache::stableOrderOfDependentCompositeTypes()
QVERIFY2(firstDependentTypeClassName.contains("QMLTYPE"), firstDependentTypeClassName.constData());
QVERIFY2(secondDependentTypeClassName.contains("QMLTYPE"), secondDependentTypeClassName.constData());
- const QString testFileCachePath = testFilePath + QLatin1Char('c');
+ const QString testFileCachePath = QV4::CompiledData::CompilationUnit::localCacheFilePath(QUrl::fromLocalFile(testFilePath));
QVERIFY(QFile::exists(testFileCachePath));
QDateTime initialCacheTimeStamp = QFileInfo(testFileCachePath).lastModified();
@@ -745,7 +745,7 @@ void tst_qmldiskcache::singletonDependency()
QCOMPARE(obj->property("value").toInt(), 42);
}
- const QString testFileCachePath = testFilePath + QLatin1Char('c');
+ const QString testFileCachePath = QV4::CompiledData::CompilationUnit::localCacheFilePath(QUrl::fromLocalFile(testFilePath));
QVERIFY(QFile::exists(testFileCachePath));
QDateTime initialCacheTimeStamp = QFileInfo(testFileCachePath).lastModified();
@@ -802,7 +802,7 @@ void tst_qmldiskcache::cppRegisteredSingletonDependency()
QCOMPARE(value.toInt(), 42);
}
- const QString testFileCachePath = testFilePath + QLatin1Char('c');
+ const QString testFileCachePath = QV4::CompiledData::CompilationUnit::localCacheFilePath(QUrl::fromLocalFile(testFilePath));
QVERIFY(QFile::exists(testFileCachePath));
QDateTime initialCacheTimeStamp = QFileInfo(testFileCachePath).lastModified();
diff --git a/tests/auto/qml/qmlmin/tst_qmlmin.cpp b/tests/auto/qml/qmlmin/tst_qmlmin.cpp
index 5941385c80..c393149f59 100644
--- a/tests/auto/qml/qmlmin/tst_qmlmin.cpp
+++ b/tests/auto/qml/qmlmin/tst_qmlmin.cpp
@@ -125,6 +125,9 @@ void tst_qmlmin::initTestCase()
invalidFiles << "tests/auto/qml/qqmlecmascript/data/stringParsing_error.6.qml";
invalidFiles << "tests/auto/qml/qqmlecmascript/data/numberParsing_error.1.qml";
invalidFiles << "tests/auto/qml/qqmlecmascript/data/numberParsing_error.2.qml";
+ invalidFiles << "tests/auto/qml/parserstress/tests/ecma_3/FunExpr/fe-001.js";
+ invalidFiles << "tests/auto/qml/qjsengine/script/com/trolltech/syntaxerror/__init__.js";
+ invalidFiles << "tests/auto/qml/debugger/qqmlpreview/data/broken.qml";
}
QStringList tst_qmlmin::findFiles(const QDir &d)
diff --git a/tests/auto/qml/qqmlcomponent/tst_qqmlcomponent.cpp b/tests/auto/qml/qqmlcomponent/tst_qqmlcomponent.cpp
index 3a70890362..efd5bb571b 100644
--- a/tests/auto/qml/qqmlcomponent/tst_qqmlcomponent.cpp
+++ b/tests/auto/qml/qqmlcomponent/tst_qqmlcomponent.cpp
@@ -116,6 +116,7 @@ private slots:
void onDestructionCount();
void recursion();
void recursionContinuation();
+ void partialComponentCreation();
void callingContextForInitialProperties();
void setNonExistentInitialProperty();
void relativeUrl_data();
@@ -527,6 +528,29 @@ void tst_qqmlcomponent::recursionContinuation()
QVERIFY(object->property("success").toBool());
}
+void tst_qqmlcomponent::partialComponentCreation()
+{
+ const int maxCount = 17;
+ QQmlEngine engine;
+ QScopedPointer<QQmlComponent> components[maxCount];
+ QScopedPointer<QObject> objects[maxCount];
+ QQmlTestMessageHandler messageHandler;
+
+ QCOMPARE(engine.outputWarningsToStandardError(), true);
+
+ for (int i = 0; i < maxCount; i++) {
+ components[i].reset(new QQmlComponent(&engine, testFileUrl("QtObjectComponent.qml")));
+ objects[i].reset(components[i]->beginCreate(engine.rootContext()));
+ QVERIFY(objects[i].isNull() == false);
+ }
+ QVERIFY2(messageHandler.messages().isEmpty(), qPrintable(messageHandler.messageString()));
+
+ for (int i = 0; i < maxCount; i++) {
+ components[i]->completeCreate();
+ }
+ QVERIFY2(messageHandler.messages().isEmpty(), qPrintable(messageHandler.messageString()));
+}
+
class CallingContextCheckingClass : public QObject
{
Q_OBJECT
diff --git a/tests/auto/qml/qqmlconsole/data/categorized_logging.qml b/tests/auto/qml/qqmlconsole/data/categorized_logging.qml
index d19b6ecc41..d593f0dfa1 100644
--- a/tests/auto/qml/qqmlconsole/data/categorized_logging.qml
+++ b/tests/auto/qml/qqmlconsole/data/categorized_logging.qml
@@ -37,7 +37,7 @@
**
****************************************************************************/
-import QtQuick 2.8
+import QtQuick 2.12
Item {
id:root
@@ -48,6 +48,12 @@ Item {
}
LoggingCategory {
+ id: testCategoryStartingFromWarning
+ name: "qt.test.warning"
+ defaultLogLevel: LoggingCategory.Warning
+ }
+
+ LoggingCategory {
id: emptyCategory
}
@@ -57,8 +63,14 @@ Item {
console.info(testCategory, "console.info");
console.warn(testCategory, "console.warn");
console.error(testCategory, "console.error");
+ console.debug(testCategoryStartingFromWarning, "console.debug");
+ console.log(testCategoryStartingFromWarning, "console.log");
+ console.info(testCategoryStartingFromWarning, "console.info");
+ console.warn(testCategoryStartingFromWarning, "console.warn");
+ console.error(testCategoryStartingFromWarning, "console.error");
testCategory.name = "qt.test2";
+ testCategory.defaultLogLevel = LoggingCategory.Debug;
console.error(emptyCategory, "console.error");
}
diff --git a/tests/auto/qml/qqmlconsole/data/logging.qml b/tests/auto/qml/qqmlconsole/data/logging.qml
index d55c99bcbd..0764ad7545 100644
--- a/tests/auto/qml/qqmlconsole/data/logging.qml
+++ b/tests/auto/qml/qqmlconsole/data/logging.qml
@@ -67,6 +67,8 @@ QtObject {
console.log(1, "pong!", new Object);
console.log(1, ["ping","pong"], new Object, 2);
+ console.log(contextStringListProperty);
+
try {
console.log(exception);
} catch (e) {
diff --git a/tests/auto/qml/qqmlconsole/tst_qqmlconsole.cpp b/tests/auto/qml/qqmlconsole/tst_qqmlconsole.cpp
index 0d915f98f8..77805bbbac 100644
--- a/tests/auto/qml/qqmlconsole/tst_qqmlconsole.cpp
+++ b/tests/auto/qml/qqmlconsole/tst_qqmlconsole.cpp
@@ -29,6 +29,7 @@
#include <QDebug>
#include <QQmlEngine>
#include <QQmlComponent>
+#include <QQmlContext>
#include <QLoggingCategory>
#include "../../shared/util.h"
@@ -74,18 +75,22 @@ void tst_qqmlconsole::logging()
QTest::ignoreMessage(QtDebugMsg, "{\"a\":\"hello\",\"d\":1}");
QTest::ignoreMessage(QtDebugMsg, "undefined");
QTest::ignoreMessage(QtDebugMsg, "12");
- QTest::ignoreMessage(QtDebugMsg, "function() { [code] }");
+ QTest::ignoreMessage(QtDebugMsg, "function e() { [code] }");
QTest::ignoreMessage(QtDebugMsg, "true");
// Printing QML object prints out the class/type of QML object with the memory address
// QTest::ignoreMessage(QtDebugMsg, "QtObject_QML_0(0xABCD..)");
// QTest::ignoreMessage(QtDebugMsg, "[object Object]");
QTest::ignoreMessage(QtDebugMsg, "1 pong! [object Object]");
QTest::ignoreMessage(QtDebugMsg, "1 [ping,pong] [object Object] 2");
+ QTest::ignoreMessage(QtDebugMsg, "[Hello,World]");
+
+ QScopedPointer<QQmlContext> loggingContext(new QQmlContext(engine.rootContext()));
+ QStringList stringList; stringList << QStringLiteral("Hello") << QStringLiteral("World");
+ loggingContext->setContextProperty("contextStringListProperty", stringList);
QQmlComponent component(&engine, testUrl);
- QObject *object = component.create();
+ QScopedPointer<QObject> object(component.create(loggingContext.data()));
QVERIFY(object != nullptr);
- delete object;
}
void tst_qqmlconsole::categorized_logging()
@@ -107,8 +112,13 @@ void tst_qqmlconsole::categorized_logging()
QVERIFY(messageHandler.messages().contains("qt.test: console.info"));
QVERIFY(messageHandler.messages().contains("qt.test: console.warn"));
QVERIFY(messageHandler.messages().contains("qt.test: console.error"));
+ QVERIFY(!messageHandler.messages().contains("qt.test.warning: console.debug"));
+ QVERIFY(!messageHandler.messages().contains("qt.test.warning: console.log"));
+ QVERIFY(!messageHandler.messages().contains("qt.test.warning: console.info"));
+ QVERIFY(messageHandler.messages().contains("qt.test.warning: console.warn"));
+ QVERIFY(messageHandler.messages().contains("qt.test.warning: console.error"));
- QString emptyCategory = "default: " + QString::fromLatin1("%1:%2:%3: ").arg(testUrl.toString()).arg(50).arg(5) +
+ QString emptyCategory = "default: " + QString::fromLatin1("%1:%2:%3: ").arg(testUrl.toString()).arg(56).arg(5) +
"QML LoggingCategory: Declaring the name of the LoggingCategory is mandatory and cannot be changed later !";
QVERIFY(messageHandler.messages().contains(emptyCategory));
@@ -116,7 +126,11 @@ void tst_qqmlconsole::categorized_logging()
"QML LoggingCategory: The name of a LoggingCategory cannot be changed after the Item is created";
QVERIFY(messageHandler.messages().contains(changedCategory));
- QString useEmptyCategory = "default: " + QString::fromLatin1("%1:%2: ").arg(testUrl.toString()).arg(63) +
+ QString changedDefaultLogLevel = "default: " + QString::fromLatin1("%1:%2:%3: ").arg(testUrl.toString()).arg(45).arg(5) +
+ "QML LoggingCategory: The defaultLogLevel of a LoggingCategory cannot be changed after the Item is created";
+ QVERIFY(messageHandler.messages().contains(changedDefaultLogLevel));
+
+ QString useEmptyCategory = "default: " + QString::fromLatin1("%1:%2: ").arg(testUrl.toString()).arg(75) +
"Error: A QmlLoggingCatgory was provided without a valid name";
QVERIFY(messageHandler.messages().contains(useEmptyCategory));
diff --git a/tests/auto/qml/qqmlcontext/tst_qqmlcontext.cpp b/tests/auto/qml/qqmlcontext/tst_qqmlcontext.cpp
index 5999bc42e9..990e364c76 100644
--- a/tests/auto/qml/qqmlcontext/tst_qqmlcontext.cpp
+++ b/tests/auto/qml/qqmlcontext/tst_qqmlcontext.cpp
@@ -803,7 +803,7 @@ void tst_qqmlcontext::contextLeak()
{
QV4::Scope scope(ddata->jsWrapper.engine());
QV4::ScopedValue scriptContextWrapper(scope);
- scriptContextWrapper = context->importedScripts.valueRef()->as<QV4::Object>()->getIndexed(0);
+ scriptContextWrapper = context->importedScripts.valueRef()->as<QV4::Object>()->get(uint(0));
scriptContext = scriptContextWrapper->as<QV4::QQmlContextWrapper>()->getContext();
}
}
diff --git a/tests/auto/qml/qqmlecmascript/data/assignSequenceTypes.8.qml b/tests/auto/qml/qqmlecmascript/data/assignSequenceTypes.8.qml
new file mode 100644
index 0000000000..3f838fe8f2
--- /dev/null
+++ b/tests/auto/qml/qqmlecmascript/data/assignSequenceTypes.8.qml
@@ -0,0 +1,16 @@
+import QtQml 2.0
+QtObject {
+ function tryWritingReadOnlySequence() {
+ try {
+ Qt.application.arguments.push("hello")
+ } catch (e) {
+
+ try {
+ Qt.application.arguments.sort()
+ } catch (e) {
+ return true
+ }
+ }
+ return false
+ }
+}
diff --git a/tests/auto/qml/qqmlecmascript/data/include_pragma_shadow.js b/tests/auto/qml/qqmlecmascript/data/include_pragma_shadow.js
new file mode 100644
index 0000000000..500f04bec7
--- /dev/null
+++ b/tests/auto/qml/qqmlecmascript/data/include_pragma_shadow.js
@@ -0,0 +1,7 @@
+.pragma library
+var Shadowed = 2;
+var global = (function(){return this})()
+
+// set Shadowed on the global object as well. This should be different from
+// the variable above, as the library has it's on context
+global.Shadowed = 1;
diff --git a/tests/auto/qml/qqmlecmascript/data/include_pragma_shadow.qml b/tests/auto/qml/qqmlecmascript/data/include_pragma_shadow.qml
new file mode 100644
index 0000000000..7cac09d342
--- /dev/null
+++ b/tests/auto/qml/qqmlecmascript/data/include_pragma_shadow.qml
@@ -0,0 +1,15 @@
+import QtQuick 2.0
+import "include_pragma_shadow.js" as Shadowed
+import "include_pragma_shadow.js" as Other
+
+Item {
+ property bool result
+
+ Component.onCompleted: {
+ result = false;
+ var global = (function(){return this})()
+ if (Shadowed.Shadowed === 2 && Other.Shadowed === 2 && global.Shadowed === 1)
+ result = true;
+ }
+}
+
diff --git a/tests/auto/qml/qqmlecmascript/data/jsimport/importPragmaLibraryWithPragmaLibraryImports.js b/tests/auto/qml/qqmlecmascript/data/jsimport/importPragmaLibraryWithPragmaLibraryImports.js
index fa6497d99b..66e18ac2a9 100644
--- a/tests/auto/qml/qqmlecmascript/data/jsimport/importPragmaLibraryWithPragmaLibraryImports.js
+++ b/tests/auto/qml/qqmlecmascript/data/jsimport/importPragmaLibraryWithPragmaLibraryImports.js
@@ -7,5 +7,5 @@ function importIncrementedValue() {
i = i + 1;
// because LibraryImport is shared, and used in previous tests,
// the value will be large (already incremented a bunch of times).
- return (i + LibraryImport.importIncrementedValue());
+ return (i + LibraryImport.importIncrementedValue()); // 11 + 5
}
diff --git a/tests/auto/qml/qqmlecmascript/data/jsimport/testImportPragmaLibraryWithPragmaLibraryImports.qml b/tests/auto/qml/qqmlecmascript/data/jsimport/testImportPragmaLibraryWithPragmaLibraryImports.qml
index 01f08dbdc3..8264b7229d 100644
--- a/tests/auto/qml/qqmlecmascript/data/jsimport/testImportPragmaLibraryWithPragmaLibraryImports.qml
+++ b/tests/auto/qml/qqmlecmascript/data/jsimport/testImportPragmaLibraryWithPragmaLibraryImports.qml
@@ -3,5 +3,5 @@ import "importPragmaLibraryWithPragmaLibraryImports.js" as LibraryImport
QtObject {
id: root
- property int testValue: LibraryImport.importIncrementedValue(); // 10 + 1 + (7 due to previous tests) = 18
+ property int testValue: LibraryImport.importIncrementedValue(); // 16
}
diff --git a/tests/auto/qml/qqmlecmascript/data/jsimport/testJsImport.qml b/tests/auto/qml/qqmlecmascript/data/jsimport/testJsImport.qml
index ae43e90210..0e314b20ea 100644
--- a/tests/auto/qml/qqmlecmascript/data/jsimport/testJsImport.qml
+++ b/tests/auto/qml/qqmlecmascript/data/jsimport/testJsImport.qml
@@ -1,7 +1,7 @@
import QtQuick 2.0
-import com.nokia.JsModule 1.0
-import com.nokia.JsModule 1.0 as RenamedModule
+import com.qt.JsModule 1.0
+import com.qt.JsModule 1.0 as RenamedModule
import "testJsModuleImport.js" as TestJsModuleImport
QtObject {
diff --git a/tests/auto/qml/qqmlecmascript/data/jsimport/testJsModuleImport.js b/tests/auto/qml/qqmlecmascript/data/jsimport/testJsModuleImport.js
index 2d21953d2c..7440f610c1 100644
--- a/tests/auto/qml/qqmlecmascript/data/jsimport/testJsModuleImport.js
+++ b/tests/auto/qml/qqmlecmascript/data/jsimport/testJsModuleImport.js
@@ -1,4 +1,4 @@
-.import com.nokia.JsModule 1.0 as JsModule
+.import com.qt.JsModule 1.0 as JsModule
function importedValue() {
return JsModule.ScriptAPI.greeting();
diff --git a/tests/auto/qml/qqmlecmascript/data/jsimport/testJsModuleRemoteImport.js b/tests/auto/qml/qqmlecmascript/data/jsimport/testJsModuleRemoteImport.js
index e6e41bc6b2..6826f09da2 100644
--- a/tests/auto/qml/qqmlecmascript/data/jsimport/testJsModuleRemoteImport.js
+++ b/tests/auto/qml/qqmlecmascript/data/jsimport/testJsModuleRemoteImport.js
@@ -1,4 +1,4 @@
-.import com.nokia.JsRemoteModule 1.0 as JsModule
+.import com.qt.JsRemoteModule 1.0 as JsModule
function importedValue() {
return JsModule.ScriptAPI.greeting();
diff --git a/tests/auto/qml/qqmlecmascript/data/jsimport/testJsRemoteImport.qml b/tests/auto/qml/qqmlecmascript/data/jsimport/testJsRemoteImport.qml
index 4199bb022d..f49b38df23 100644
--- a/tests/auto/qml/qqmlecmascript/data/jsimport/testJsRemoteImport.qml
+++ b/tests/auto/qml/qqmlecmascript/data/jsimport/testJsRemoteImport.qml
@@ -1,7 +1,7 @@
import QtQuick 2.0
-import com.nokia.JsModule 1.0
-import com.nokia.JsModule 1.0 as RenamedModule
+import com.qt.JsModule 1.0
+import com.qt.JsModule 1.0 as RenamedModule
import "testJsModuleRemoteImport.js" as TestJsModuleImport
QtObject {
diff --git a/tests/auto/qml/qqmlecmascript/data/lib/com/nokia/JsModule/ScriptAPI.js b/tests/auto/qml/qqmlecmascript/data/lib/com/qt/JsModule/ScriptAPI.js
index b90033eeb4..b90033eeb4 100644
--- a/tests/auto/qml/qqmlecmascript/data/lib/com/nokia/JsModule/ScriptAPI.js
+++ b/tests/auto/qml/qqmlecmascript/data/lib/com/qt/JsModule/ScriptAPI.js
diff --git a/tests/auto/qml/qqmlecmascript/data/lib/com/nokia/JsModule/qmldir b/tests/auto/qml/qqmlecmascript/data/lib/com/qt/JsModule/qmldir
index c33d1e7a0d..c33d1e7a0d 100644
--- a/tests/auto/qml/qqmlecmascript/data/lib/com/nokia/JsModule/qmldir
+++ b/tests/auto/qml/qqmlecmascript/data/lib/com/qt/JsModule/qmldir
diff --git a/tests/auto/qml/qqmlecmascript/data/remote/com/nokia/JsRemoteModule/ScriptAPI.js b/tests/auto/qml/qqmlecmascript/data/remote/com/qt/JsRemoteModule/ScriptAPI.js
index b90033eeb4..b90033eeb4 100644
--- a/tests/auto/qml/qqmlecmascript/data/remote/com/nokia/JsRemoteModule/ScriptAPI.js
+++ b/tests/auto/qml/qqmlecmascript/data/remote/com/qt/JsRemoteModule/ScriptAPI.js
diff --git a/tests/auto/qml/qqmlecmascript/data/remote/com/nokia/JsRemoteModule/qmldir b/tests/auto/qml/qqmlecmascript/data/remote/com/qt/JsRemoteModule/qmldir
index c33d1e7a0d..c33d1e7a0d 100644
--- a/tests/auto/qml/qqmlecmascript/data/remote/com/nokia/JsRemoteModule/qmldir
+++ b/tests/auto/qml/qqmlecmascript/data/remote/com/qt/JsRemoteModule/qmldir
diff --git a/tests/auto/qml/qqmlecmascript/data/removeBindingsWithNoDependencies.qml b/tests/auto/qml/qqmlecmascript/data/removeBindingsWithNoDependencies.qml
new file mode 100644
index 0000000000..aacf16474d
--- /dev/null
+++ b/tests/auto/qml/qqmlecmascript/data/removeBindingsWithNoDependencies.qml
@@ -0,0 +1,9 @@
+import QtQuick 2.0
+Item {
+ property rect placement: Qt.rect(0, 0, 100, 100)
+
+ function someFunction() { return 42; }
+
+ property rect partialPlacement
+ partialPlacement.x: someFunction()
+}
diff --git a/tests/auto/qml/qqmlecmascript/data/tryStatement.3.qml b/tests/auto/qml/qqmlecmascript/data/tryStatement.3.qml
index 04b39f73d5..7f5a22a459 100644
--- a/tests/auto/qml/qqmlecmascript/data/tryStatement.3.qml
+++ b/tests/auto/qml/qqmlecmascript/data/tryStatement.3.qml
@@ -8,6 +8,6 @@ MyQmlObject {
return 321
}
- value: try { var p = go() } catch(e) { var p = defaultValue } finally { p == 123 }
+ qjsvalue: try { var p = go() } catch(e) { var p = defaultValue } finally { p == 123 }
}
diff --git a/tests/auto/qml/qqmlecmascript/data/tryStatement.4.qml b/tests/auto/qml/qqmlecmascript/data/tryStatement.4.qml
index 231aaf0683..39d4f74e97 100644
--- a/tests/auto/qml/qqmlecmascript/data/tryStatement.4.qml
+++ b/tests/auto/qml/qqmlecmascript/data/tryStatement.4.qml
@@ -7,6 +7,6 @@ MyQmlObject {
return 321
}
- value: try { var p = go() } catch(e) { var p = defaultValue } finally { p == 321 }
+ qjsvalue: try { var p = go() } catch(e) { var p = defaultValue } finally { p == 321 }
}
diff --git a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp
index f40a9758f7..69b62c733c 100644
--- a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp
+++ b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp
@@ -49,6 +49,8 @@
#include <private/qv4object_p.h>
#include <private/qqmlcomponentattached_p.h>
#include <private/qv4objectiterator_p.h>
+#include <private/qqmlabstractbinding_p.h>
+#include <private/qqmlvaluetypeproxybinding_p.h>
#ifdef Q_CC_MSVC
#define NO_INLINE __declspec(noinline)
@@ -353,11 +355,11 @@ private slots:
void anotherNaN();
void callPropertyOnUndefined();
void jumpStrictNotEqualUndefined();
+ void removeBindingsWithNoDependencies();
private:
// static void propertyVarWeakRefCallback(v8::Persistent<v8::Value> object, void* parameter);
static void verifyContextLifetime(QQmlContextData *ctxt);
- QQmlEngine engine;
// When calling into JavaScript, the specific type of the return value can differ if that return
// value is a number. This is not only the case for non-integral numbers, or numbers that do not
@@ -384,13 +386,11 @@ void tst_qqmlecmascript::initTestCase()
{
QQmlDataTest::initTestCase();
registerTypes();
-
- QString dataDir(dataDirectory() + QLatin1Char('/') + QLatin1String("lib"));
- engine.addImportPath(dataDir);
}
void tst_qqmlecmascript::assignBasicTypes()
{
+ QQmlEngine engine;
{
QQmlComponent component(&engine, testFileUrl("assignBasicTypes.qml"));
MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
@@ -470,6 +470,7 @@ void tst_qqmlecmascript::assignDate()
QFETCH(QUrl, source);
QFETCH(int, timeOffset);
+ QQmlEngine engine;
QQmlComponent component(&engine, source);
QScopedPointer<QObject> obj(component.create());
MyTypeObject *object = qobject_cast<MyTypeObject *>(obj.data());
@@ -550,6 +551,7 @@ void tst_qqmlecmascript::exportDate()
void tst_qqmlecmascript::idShortcutInvalidates()
{
+ QQmlEngine engine;
{
QQmlComponent component(&engine, testFileUrl("idShortcutInvalidates.qml"));
MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
@@ -573,6 +575,7 @@ void tst_qqmlecmascript::idShortcutInvalidates()
void tst_qqmlecmascript::boolPropertiesEvaluateAsBool()
{
+ QQmlEngine engine;
{
QQmlComponent component(&engine, testFileUrl("boolPropertiesEvaluateAsBool.1.qml"));
MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
@@ -591,6 +594,7 @@ void tst_qqmlecmascript::boolPropertiesEvaluateAsBool()
void tst_qqmlecmascript::signalAssignment()
{
+ QQmlEngine engine;
{
QQmlComponent component(&engine, testFileUrl("signalAssignment.1.qml"));
MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
@@ -628,6 +632,7 @@ void tst_qqmlecmascript::signalAssignment()
void tst_qqmlecmascript::signalArguments()
{
+ QQmlEngine engine;
{
QQmlComponent component(&engine, testFileUrl("signalArguments.1.qml"));
MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
@@ -653,6 +658,7 @@ void tst_qqmlecmascript::signalArguments()
void tst_qqmlecmascript::methods()
{
+ QQmlEngine engine;
{
QQmlComponent component(&engine, testFileUrl("methods.1.qml"));
MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
@@ -706,6 +712,7 @@ void tst_qqmlecmascript::methods()
void tst_qqmlecmascript::bindingLoop()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("bindingLoop.qml"));
QString warning = component.url().toString() + ":9:9: QML MyQmlObject: Binding loop detected for property \"stringProperty\"";
QTest::ignoreMessage(QtWarningMsg, warning.toLatin1().constData());
@@ -747,6 +754,8 @@ void tst_qqmlecmascript::basicExpressions()
QFETCH(QVariant, result);
QFETCH(bool, nest);
+ QQmlEngine engine;
+
MyQmlObject object1;
MyQmlObject object2;
MyQmlObject object3;
@@ -779,6 +788,7 @@ void tst_qqmlecmascript::arrayExpressions()
QObject obj2;
QObject obj3;
+ QQmlEngine engine;
QQmlContext context(engine.rootContext());
context.setContextProperty("a", &obj1);
context.setContextProperty("b", &obj2);
@@ -798,6 +808,7 @@ void tst_qqmlecmascript::arrayExpressions()
// Tests that modifying a context property will reevaluate expressions
void tst_qqmlecmascript::contextPropertiesTriggerReeval()
{
+ QQmlEngine engine;
QQmlContext context(engine.rootContext());
MyQmlObject object1;
MyQmlObject object2;
@@ -861,6 +872,7 @@ void tst_qqmlecmascript::contextPropertiesTriggerReeval()
void tst_qqmlecmascript::objectPropertiesTriggerReeval()
{
+ QQmlEngine engine;
QQmlContext context(engine.rootContext());
MyQmlObject object1;
MyQmlObject object2;
@@ -927,6 +939,7 @@ void tst_qqmlecmascript::dependenciesWithFunctions()
void tst_qqmlecmascript::deferredProperties()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("deferredProperties.qml"));
MyDeferredObject *object =
qobject_cast<MyDeferredObject *>(component.create());
@@ -950,6 +963,7 @@ void tst_qqmlecmascript::deferredProperties()
// Check errors on deferred properties are correctly emitted
void tst_qqmlecmascript::deferredPropertiesErrors()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("deferredPropertiesErrors.qml"));
MyDeferredObject *object =
qobject_cast<MyDeferredObject *>(component.create());
@@ -958,7 +972,7 @@ void tst_qqmlecmascript::deferredPropertiesErrors()
QVERIFY(!object->objectProperty());
QVERIFY(!object->objectProperty2());
- QString warning = component.url().toString() + ":6:21: Unable to assign [undefined] to QObject*";
+ QString warning = component.url().toString() + ":6:5: Unable to assign [undefined] to QObject*";
QTest::ignoreMessage(QtWarningMsg, qPrintable(warning));
qmlExecuteDeferred(object);
@@ -969,6 +983,7 @@ void tst_qqmlecmascript::deferredPropertiesErrors()
void tst_qqmlecmascript::deferredPropertiesInComponents()
{
// Test that it works when the property is set inside and outside component
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("deferredPropertiesInComponents.qml"));
QObject *object = component.create();
if (!object)
@@ -1002,6 +1017,7 @@ void tst_qqmlecmascript::deferredPropertiesInDestruction()
//Test that the component does not get created at all if creation is deferred until the containing context is destroyed
//Very specific operation ordering is needed for this to occur, currently accessing object from object destructor.
//
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("deferredPropertiesInDestruction.qml"));
QObject *object = component.create();
if (!object)
@@ -1012,6 +1028,7 @@ void tst_qqmlecmascript::deferredPropertiesInDestruction()
void tst_qqmlecmascript::extensionObjects()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("extensionObjects.qml"));
MyExtendedObject *object =
qobject_cast<MyExtendedObject *>(component.create());
@@ -1037,6 +1054,7 @@ void tst_qqmlecmascript::extensionObjects()
void tst_qqmlecmascript::overrideExtensionProperties()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("extensionObjectsPropertyOverride.qml"));
OverrideDefaultPropertyObject *object =
qobject_cast<OverrideDefaultPropertyObject *>(component.create());
@@ -1049,6 +1067,8 @@ void tst_qqmlecmascript::overrideExtensionProperties()
void tst_qqmlecmascript::attachedProperties()
{
+ QQmlEngine engine;
+
{
QQmlComponent component(&engine, testFileUrl("attachedProperty.qml"));
QObject *object = component.create();
@@ -1090,6 +1110,8 @@ void tst_qqmlecmascript::attachedProperties()
void tst_qqmlecmascript::enums()
{
+ QQmlEngine engine;
+
// Existent enums
{
QQmlComponent component(&engine, testFileUrl("enums.1.qml"));
@@ -1119,13 +1141,13 @@ void tst_qqmlecmascript::enums()
{
QUrl file = testFileUrl("enums.2.qml");
QString w1 = QLatin1String("QMetaProperty::read: Unable to handle unregistered datatype 'MyEnum' for property 'MyUnregisteredEnumTypeObject::enumProperty'");
- QString w2 = QLatin1String("QQmlExpression: Expression ") + testFileUrl("enums.2.qml").toString() + QLatin1String(":9:21 depends on non-NOTIFYable properties:");
+ QString w2 = QLatin1String("QQmlExpression: Expression ") + testFileUrl("enums.2.qml").toString() + QLatin1String(":9:5 depends on non-NOTIFYable properties:");
QString w3 = QLatin1String(" MyUnregisteredEnumTypeObject::enumProperty");
- QString w4 = file.toString() + ":7:21: Unable to assign [undefined] to int";
- QString w5 = file.toString() + ":8:21: Unable to assign [undefined] to int";
- QString w6 = file.toString() + ":9:21: Unable to assign [undefined] to int";
- QString w7 = file.toString() + ":13:23: Unable to assign [undefined] to [unknown property type]";
- QString w8 = file.toString() + ":31:23: Unable to assign int to [unknown property type]";
+ QString w4 = file.toString() + ":7:5: Unable to assign [undefined] to int";
+ QString w5 = file.toString() + ":8:5: Unable to assign [undefined] to int";
+ QString w6 = file.toString() + ":9:5: Unable to assign [undefined] to int";
+ QString w7 = file.toString() + ":13:9: Unable to assign [undefined] to [unknown property type]";
+ QString w8 = file.toString() + ":31:9: Unable to assign int to [unknown property type]";
QTest::ignoreMessage(QtWarningMsg, qPrintable(w1));
QTest::ignoreMessage(QtWarningMsg, qPrintable(w2));
QTest::ignoreMessage(QtWarningMsg, qPrintable(w3));
@@ -1196,6 +1218,7 @@ void tst_qqmlecmascript::enums()
void tst_qqmlecmascript::valueTypeFunctions()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("valueTypeFunctions.qml"));
MyTypeObject *obj = qobject_cast<MyTypeObject*>(component.create());
QVERIFY(obj != nullptr);
@@ -1211,6 +1234,8 @@ binding.
*/
void tst_qqmlecmascript::constantsOverrideBindings()
{
+ QQmlEngine engine;
+
// From ECMAScript
{
QQmlComponent component(&engine, testFileUrl("constantsOverrideBindings.1.qml"));
@@ -1288,6 +1313,7 @@ the original binding to be disabled.
*/
void tst_qqmlecmascript::outerBindingOverridesInnerBinding()
{
+ QQmlEngine engine;
QQmlComponent component(&engine,
testFileUrl("outerBindingOverridesInnerBinding.qml"));
MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
@@ -1317,9 +1343,10 @@ Tests for a regression where this used to crash.
*/
void tst_qqmlecmascript::nonExistentAttachedObject()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("nonExistentAttachedObject.qml"));
- QString warning = component.url().toString() + ":4:21: Unable to assign [undefined] to QString";
+ QString warning = component.url().toString() + ":4:5: Unable to assign [undefined] to QString";
QTest::ignoreMessage(QtWarningMsg, qPrintable(warning));
QObject *object = component.create();
@@ -1330,6 +1357,8 @@ void tst_qqmlecmascript::nonExistentAttachedObject()
void tst_qqmlecmascript::scope()
{
+ QQmlEngine engine;
+
{
QQmlComponent component(&engine, testFileUrl("scope.qml"));
QObject *object = component.create();
@@ -1420,6 +1449,7 @@ void tst_qqmlecmascript::scope()
// importing context
void tst_qqmlecmascript::importScope()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("importScope.qml"));
QObject *o = component.create();
QVERIFY(o != nullptr);
@@ -1435,6 +1465,7 @@ is essentially a test of QQmlMetaType::copy()
*/
void tst_qqmlecmascript::signalParameterTypes()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("signalParameterTypes.qml"));
MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
QVERIFY(object != nullptr);
@@ -1462,6 +1493,7 @@ Test that two JS objects for the same QObject compare as equal.
*/
void tst_qqmlecmascript::objectsCompareAsEqual()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("objectsCompareAsEqual.qml"));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -1482,6 +1514,7 @@ Tests for a regression where the binding would not reevaluate.
*/
void tst_qqmlecmascript::aliasPropertyAndBinding()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("aliasPropertyAndBinding.qml"));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -1503,6 +1536,7 @@ and that the aliased property is reset correctly if possible.
*/
void tst_qqmlecmascript::aliasPropertyReset()
{
+ QQmlEngine engine;
QObject *object = nullptr;
// test that a manual write (of undefined) to a resettable aliased property succeeds
@@ -1631,6 +1665,7 @@ void tst_qqmlecmascript::componentCreation()
QFETCH(QString, creationError);
QFETCH(QString, createdParent);
+ QQmlEngine engine;
QUrl testUrl(testFileUrl("componentCreation.qml"));
if (!creationError.isEmpty()) {
@@ -1677,6 +1712,7 @@ void tst_qqmlecmascript::dynamicCreation()
QFETCH(QString, method);
QFETCH(QString, createdName);
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("dynamicCreation.qml"));
MyQmlObject *object = qobject_cast<MyQmlObject*>(component.create());
QVERIFY(object != nullptr);
@@ -1694,6 +1730,8 @@ void tst_qqmlecmascript::dynamicCreation()
*/
void tst_qqmlecmascript::dynamicDestruction()
{
+ QQmlEngine engine;
+
{
QQmlComponent component(&engine, testFileUrl("dynamicDeletion.qml"));
QPointer<MyQmlObject> object = qobject_cast<MyQmlObject*>(component.create());
@@ -1777,6 +1815,7 @@ void tst_qqmlecmascript::dynamicDestruction()
*/
void tst_qqmlecmascript::objectToString()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("qmlToString.qml"));
MyQmlObject *object = qobject_cast<MyQmlObject*>(component.create());
QVERIFY(object != nullptr);
@@ -1797,6 +1836,7 @@ void tst_qqmlecmascript::objectHasOwnProperty()
QString warning2 = url.toString() + ":64: TypeError: Cannot call method 'hasOwnProperty' of undefined";
QString warning3 = url.toString() + ":69: TypeError: Cannot call method 'hasOwnProperty' of undefined";
+ QQmlEngine engine;
QQmlComponent component(&engine, url);
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -1843,6 +1883,8 @@ This test is best run under valgrind to ensure no invalid memory access occur.
*/
void tst_qqmlecmascript::selfDeletingBinding()
{
+ QQmlEngine engine;
+
{
QQmlComponent component(&engine, testFileUrl("selfDeletingBinding.qml"));
QObject *object = component.create();
@@ -1869,6 +1911,7 @@ and no synthesiszed properties).
*/
void tst_qqmlecmascript::extendedObjectPropertyLookup()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("extendedObjectPropertyLookup.qml"));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -1880,6 +1923,7 @@ Test that extended object properties can be accessed correctly.
*/
void tst_qqmlecmascript::extendedObjectPropertyLookup2()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("extendedObjectPropertyLookup2.qml"));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -1896,6 +1940,7 @@ Test failure when trying to create and uncreatable extended type object.
*/
void tst_qqmlecmascript::uncreatableExtendedObjectFailureCheck()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("uncreatableExtendedObjectFailureCheck.qml"));
QObject *object = component.create();
@@ -1907,6 +1952,7 @@ Test that an subclass of an uncreatable extended object contains all the require
*/
void tst_qqmlecmascript::extendedObjectPropertyLookup3()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("extendedObjectPropertyLookup3.qml"));
QObject *object = component.create();
@@ -1927,6 +1973,7 @@ Test file/lineNumbers for binding/Script errors.
*/
void tst_qqmlecmascript::scriptErrors()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("scriptErrors.qml"));
QString url = component.url().toString();
@@ -1935,7 +1982,7 @@ void tst_qqmlecmascript::scriptErrors()
QString warning3 = url.left(url.length() - 3) + "js:4: Error: Invalid write to global property \"a\"";
QString warning4 = url + ":13: ReferenceError: a is not defined";
QString warning5 = url + ":11: ReferenceError: a is not defined";
- QString warning6 = url + ":10:21: Unable to assign [undefined] to int";
+ QString warning6 = url + ":10:5: Unable to assign [undefined] to int";
QString warning7 = url + ":15: TypeError: Cannot assign to read-only property \"trueProperty\"";
QString warning8 = url + ":16: Error: Cannot assign to non-existent property \"fakeProperty\"";
@@ -1964,6 +2011,7 @@ Test file/lineNumbers for inline functions.
*/
void tst_qqmlecmascript::functionErrors()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("functionErrors.qml"));
QString url = component.url().toString();
@@ -1994,6 +2042,7 @@ Test various errors that can occur when assigning a property from script
*/
void tst_qqmlecmascript::propertyAssignmentErrors()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("propertyAssignmentErrors.qml"));
QString url = component.url().toString();
@@ -2013,6 +2062,7 @@ a signal script.
*/
void tst_qqmlecmascript::signalTriggeredBindings()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("signalTriggeredBindings.qml"));
MyQmlObject *object = qobject_cast<MyQmlObject*>(component.create());
QVERIFY(object != nullptr);
@@ -2041,6 +2091,7 @@ Test that list properties can be iterated from ECMAScript
*/
void tst_qqmlecmascript::listProperties()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("listProperties.qml"));
MyQmlObject *object = qobject_cast<MyQmlObject*>(component.create());
QVERIFY(object != nullptr);
@@ -2055,6 +2106,7 @@ void tst_qqmlecmascript::listProperties()
void tst_qqmlecmascript::exceptionClearsOnReeval()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("exceptionClearsOnReeval.qml"));
QString url = component.url().toString();
@@ -2078,6 +2130,7 @@ void tst_qqmlecmascript::exceptionClearsOnReeval()
void tst_qqmlecmascript::exceptionSlotProducesWarning()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("exceptionProducesWarning.qml"));
QString url = component.url().toString();
@@ -2091,6 +2144,7 @@ void tst_qqmlecmascript::exceptionSlotProducesWarning()
void tst_qqmlecmascript::exceptionBindingProducesWarning()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("exceptionProducesWarning2.qml"));
QString url = component.url().toString();
@@ -2105,6 +2159,7 @@ void tst_qqmlecmascript::exceptionBindingProducesWarning()
void tst_qqmlecmascript::compileInvalidBinding()
{
// QTBUG-23387: ensure that invalid bindings don't cause a crash.
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("v8bindingException.qml"));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -2114,6 +2169,8 @@ void tst_qqmlecmascript::compileInvalidBinding()
// Check that transient binding errors are not displayed
void tst_qqmlecmascript::transientErrors()
{
+ QQmlEngine engine;
+
{
QQmlComponent component(&engine, testFileUrl("transientErrors.qml"));
@@ -2145,6 +2202,7 @@ void tst_qqmlecmascript::transientErrors()
// Check that errors during shutdown are minimized
void tst_qqmlecmascript::shutdownErrors()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("shutdownErrors.qml"));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -2158,6 +2216,7 @@ void tst_qqmlecmascript::shutdownErrors()
void tst_qqmlecmascript::compositePropertyType()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("compositePropertyType.qml"));
QTest::ignoreMessage(QtDebugMsg, "hello world");
@@ -2168,6 +2227,7 @@ void tst_qqmlecmascript::compositePropertyType()
// QTBUG-5759
void tst_qqmlecmascript::jsObject()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("jsObject.qml"));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -2179,6 +2239,8 @@ void tst_qqmlecmascript::jsObject()
void tst_qqmlecmascript::undefinedResetsProperty()
{
+ QQmlEngine engine;
+
{
QQmlComponent component(&engine, testFileUrl("undefinedResetsProperty.qml"));
QObject *object = component.create();
@@ -2214,6 +2276,7 @@ void tst_qqmlecmascript::undefinedResetsProperty()
// Aliases to variant properties should work
void tst_qqmlecmascript::qtbug_22464()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("qtbug_22464.qml"));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -2225,6 +2288,7 @@ void tst_qqmlecmascript::qtbug_22464()
void tst_qqmlecmascript::qtbug_21580()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("qtbug_21580.qml"));
QObject *object = component.create();
@@ -2238,6 +2302,7 @@ void tst_qqmlecmascript::qtbug_21580()
// Causes a v8 binding, but not all v8 bindings to be destroyed during evaluation
void tst_qqmlecmascript::singleV8BindingDestroyedDuringEvaluation()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("singleV8BindingDestroyedDuringEvaluation.qml"));
QObject *object = component.create();
@@ -2248,6 +2313,7 @@ void tst_qqmlecmascript::singleV8BindingDestroyedDuringEvaluation()
// QTBUG-6781
void tst_qqmlecmascript::bug1()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("bug.1.qml"));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -2268,6 +2334,7 @@ void tst_qqmlecmascript::bug1()
#ifndef QT_NO_WIDGETS
void tst_qqmlecmascript::bug2()
{
+ QQmlEngine engine;
QQmlComponent component(&engine);
component.setData("import Qt.test 1.0;\nQPlainTextEdit { width: 100 }", QUrl());
@@ -2281,6 +2348,7 @@ void tst_qqmlecmascript::bug2()
// Don't crash in createObject when the component has errors.
void tst_qqmlecmascript::dynamicCreationCrash()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("dynamicCreation.qml"));
MyQmlObject *object = qobject_cast<MyQmlObject*>(component.create());
QVERIFY(object != nullptr);
@@ -2331,6 +2399,8 @@ void tst_qqmlecmascript::dynamicCreationOwnership()
void tst_qqmlecmascript::regExpBug()
{
+ QQmlEngine engine;
+
//QTBUG-9367
{
QQmlComponent component(&engine, testFileUrl("regExp.qml"));
@@ -2357,7 +2427,7 @@ static inline bool evaluate_error(QV4::ExecutionEngine *v4, const QV4::Value &o,
QLatin1String(source) + QLatin1String(" })");
QV4::Scope scope(v4);
- QV4::Script program(QV4::ScopedContext(scope, scope.engine->rootContext()), QV4::Compiler::EvalCode, functionSource);
+ QV4::Script program(QV4::ScopedContext(scope, scope.engine->rootContext()), QV4::Compiler::ContextType::Eval, functionSource);
program.inheritContext = true;
QV4::ScopedFunctionObject function(scope, program.run());
@@ -2383,7 +2453,7 @@ static inline bool evaluate_value(QV4::ExecutionEngine *v4, const QV4::Value &o,
QLatin1String(source) + QLatin1String(" })");
QV4::Scope scope(v4);
- QV4::Script program(QV4::ScopedContext(scope, scope.engine->rootContext()), QV4::Compiler::EvalCode, functionSource);
+ QV4::Script program(QV4::ScopedContext(scope, scope.engine->rootContext()), QV4::Compiler::ContextType::Eval, functionSource);
program.inheritContext = true;
QV4::ScopedFunctionObject function(scope, program.run());
@@ -2414,7 +2484,7 @@ static inline QV4::ReturnedValue evaluate(QV4::ExecutionEngine *v4, const QV4::V
QV4::Scope scope(v4);
- QV4::Script program(QV4::ScopedContext(scope, scope.engine->rootContext()), QV4::Compiler::EvalCode, functionSource);
+ QV4::Script program(QV4::ScopedContext(scope, scope.engine->rootContext()), QV4::Compiler::ContextType::Eval, functionSource);
program.inheritContext = true;
QV4::ScopedFunctionObject function(scope, program.run());
@@ -3058,6 +3128,7 @@ void tst_qqmlecmascript::resolveClashingProperties()
// QTBUG-13047 (check that you can pass registered object types as args)
void tst_qqmlecmascript::invokableObjectArg()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("invokableObjectArg.qml"));
QObject *o = component.create();
@@ -3072,6 +3143,7 @@ void tst_qqmlecmascript::invokableObjectArg()
// QTBUG-13047 (check that you can return registered object types from methods)
void tst_qqmlecmascript::invokableObjectRet()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("invokableObjectRet.qml"));
QObject *o = component.create();
@@ -3082,6 +3154,7 @@ void tst_qqmlecmascript::invokableObjectRet()
void tst_qqmlecmascript::invokableEnumRet()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("invokableEnumRet.qml"));
QObject *o = component.create();
@@ -3093,6 +3166,7 @@ void tst_qqmlecmascript::invokableEnumRet()
// QTBUG-5675
void tst_qqmlecmascript::listToVariant()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("listToVariant.qml"));
MyQmlContainer container;
@@ -3113,6 +3187,7 @@ void tst_qqmlecmascript::listToVariant()
// QTBUG-16316
void tst_qqmlecmascript::listAssignment()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("listAssignment.qml"));
QObject *obj = component.create();
QCOMPARE(obj->property("list1length").toInt(), 2);
@@ -3151,6 +3226,7 @@ void tst_qqmlecmascript::multiEngineObject()
// Test that references to QObjects are cleanup when the object is destroyed
void tst_qqmlecmascript::deletedObject()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("deletedObject.qml"));
QObject *object = component.create();
@@ -3165,6 +3241,7 @@ void tst_qqmlecmascript::deletedObject()
void tst_qqmlecmascript::attachedPropertyScope()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("attachedPropertyScope.qml"));
QObject *object = component.create();
@@ -3185,6 +3262,8 @@ void tst_qqmlecmascript::attachedPropertyScope()
void tst_qqmlecmascript::scriptConnect()
{
+ QQmlEngine engine;
+
{
QQmlComponent component(&engine, testFileUrl("scriptConnect.1.qml"));
@@ -3266,6 +3345,8 @@ void tst_qqmlecmascript::scriptConnect()
void tst_qqmlecmascript::scriptDisconnect()
{
+ QQmlEngine engine;
+
{
QQmlComponent component(&engine, testFileUrl("scriptDisconnect.1.qml"));
@@ -3356,6 +3437,7 @@ public slots:
void tst_qqmlecmascript::ownership()
{
+ QQmlEngine engine;
OwnershipObject own;
QQmlContext *context = new QQmlContext(engine.rootContext());
context->setContextObject(&own);
@@ -3453,6 +3535,7 @@ void tst_qqmlecmascript::cppOwnershipReturnValue()
// QTBUG-15697
void tst_qqmlecmascript::ownershipCustomReturnValue()
{
+ QQmlEngine engine;
CppOwnershipReturnValue source;
{
@@ -3496,6 +3579,7 @@ public slots:
void tst_qqmlecmascript::ownershipRootObject()
{
+ QQmlEngine engine;
OwnershipChangingObject own;
QQmlContext *context = new QQmlContext(engine.rootContext());
context->setContextObject(&own);
@@ -3517,6 +3601,7 @@ void tst_qqmlecmascript::ownershipRootObject()
void tst_qqmlecmascript::ownershipConsistency()
{
+ QQmlEngine engine;
OwnershipChangingObject own;
QQmlContext *context = new QQmlContext(engine.rootContext());
context->setContextObject(&own);
@@ -3547,6 +3632,7 @@ void tst_qqmlecmascript::ownershipConsistency()
void tst_qqmlecmascript::ownershipQmlIncubated()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("ownershipQmlIncubated.qml"));
QObject *object = component.create();
QVERIFY(object);
@@ -3586,6 +3672,7 @@ private:
// Tests that returning a QList<QObject*> from a method works
void tst_qqmlecmascript::qlistqobjectMethods()
{
+ QQmlEngine engine;
QListQObjectMethodsObject obj;
QQmlContext *context = new QQmlContext(engine.rootContext());
context->setContextObject(&obj);
@@ -3604,6 +3691,7 @@ void tst_qqmlecmascript::qlistqobjectMethods()
// QTBUG-9205
void tst_qqmlecmascript::strictlyEquals()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("strictlyEquals.qml"));
QObject *object = component.create();
@@ -3623,6 +3711,7 @@ void tst_qqmlecmascript::strictlyEquals()
void tst_qqmlecmascript::compiled()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("compiled.qml"));
QObject *object = component.create();
@@ -3663,6 +3752,7 @@ void tst_qqmlecmascript::compiled()
// Test that numbers assigned in bindings as strings work consistently
void tst_qqmlecmascript::numberAssignment()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("numberAssignment.qml"));
QObject *object = component.create();
@@ -3689,6 +3779,7 @@ void tst_qqmlecmascript::numberAssignment()
void tst_qqmlecmascript::propertySplicing()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("propertySplicing.qml"));
QObject *object = component.create();
@@ -3702,6 +3793,7 @@ void tst_qqmlecmascript::propertySplicing()
// QTBUG-16683
void tst_qqmlecmascript::signalWithUnknownTypes()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("signalWithUnknownTypes.qml"));
MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
@@ -3755,6 +3847,7 @@ void tst_qqmlecmascript::signalWithJSValueInVariant()
QFETCH(QString, expression);
QFETCH(QString, compare);
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("signalWithJSValueInVariant.qml"));
QScopedPointer<MyQmlObject> object(qobject_cast<MyQmlObject *>(component.create()));
QVERIFY(object != nullptr);
@@ -3779,6 +3872,7 @@ void tst_qqmlecmascript::signalWithJSValueInVariant_twoEngines()
QFETCH(QString, expression);
QFETCH(QString, compare);
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("signalWithJSValueInVariant.qml"));
QScopedPointer<MyQmlObject> object(qobject_cast<MyQmlObject *>(component.create()));
QVERIFY(object != nullptr);
@@ -3809,6 +3903,7 @@ void tst_qqmlecmascript::signalWithQJSValue()
QFETCH(QString, expression);
QFETCH(QString, compare);
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("signalWithQJSValue.qml"));
QScopedPointer<MyQmlObject> object(qobject_cast<MyQmlObject *>(component.create()));
QVERIFY(object != nullptr);
@@ -4029,6 +4124,7 @@ void tst_qqmlecmascript::singletonTypeCaching()
void tst_qqmlecmascript::singletonTypeImportOrder()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("singletontype/singletonTypeImportOrder.qml"));
QObject *object = component.create();
QVERIFY(object);
@@ -4038,6 +4134,7 @@ void tst_qqmlecmascript::singletonTypeImportOrder()
void tst_qqmlecmascript::singletonTypeResolution()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("singletontype/singletonTypeResolution.qml"));
QObject *object = component.create();
QVERIFY(object);
@@ -4055,7 +4152,7 @@ void tst_qqmlecmascript::verifyContextLifetime(QQmlContextData *ctxt) {
QV4::Scoped<QV4::QQmlContextWrapper> qml(scope);
for (quint32 i = 0; i < scripts->getLength(); ++i) {
QQmlContextData *scriptContext, *newContext;
- qml = scripts->getIndexed(i);
+ qml = scripts->get(i);
scriptContext = qml ? qml->getContext() : nullptr;
qml = QV4::Encode::undefined();
@@ -4067,7 +4164,7 @@ void tst_qqmlecmascript::verifyContextLifetime(QQmlContextData *ctxt) {
}
ctxt->engine->collectGarbage();
- qml = scripts->getIndexed(i);
+ qml = scripts->get(i);
newContext = qml ? qml->getContext() : nullptr;
QCOMPARE(scriptContext, newContext);
}
@@ -4181,7 +4278,7 @@ void tst_qqmlecmascript::importScripts_data()
<< QString()
<< QStringList()
<< (QStringList() << QLatin1String("testValue"))
- << (QVariantList() << QVariant(18));
+ << (QVariantList() << QVariant(16));
QTest::newRow("import singleton type into js import")
<< testFileUrl("jsimport/testImportSingletonType.qml")
@@ -4315,6 +4412,10 @@ void tst_qqmlecmascript::importScripts()
ThreadedTestHTTPServer server(dataDirectory() + "/remote");
+ QQmlEngine engine;
+ QString dataDir(dataDirectory() + QLatin1Char('/') + QLatin1String("lib"));
+ engine.addImportPath(dataDir);
+
QStringList importPathList = engine.importPathList();
QString remotePath(server.urlString("/"));
@@ -4358,6 +4459,7 @@ void tst_qqmlecmascript::importScripts()
void tst_qqmlecmascript::importCreationContext()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("jsimport/creationContext.qml"));
QScopedPointer<QObject> object(component.create());
QVERIFY(!object.isNull());
@@ -4378,6 +4480,7 @@ void tst_qqmlecmascript::scarceResources_other()
QPixmap origPixmap(100, 100);
origPixmap.fill(Qt::blue);
QString srp_name, expectedWarning;
+ QQmlEngine engine;
QV4::ExecutionEngine *v4 = engine.handle();
ScarceResourceObject *eo = nullptr;
QObject *srsc = nullptr;
@@ -4749,6 +4852,7 @@ void tst_qqmlecmascript::scarceResources()
QFETCH(QVariantList, expectedValues);
QFETCH(QStringList, expectedErrors);
+ QQmlEngine engine;
QV4::ExecutionEngine *v4 = engine.handle();
ScarceResourceObject *eo = nullptr;
QObject *object = nullptr;
@@ -4781,6 +4885,7 @@ void tst_qqmlecmascript::scarceResources()
void tst_qqmlecmascript::propertyChangeSlots()
{
// ensure that allowable property names are allowed and onPropertyNameChanged slots are generated correctly.
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("changeslots/propertyChangeSlots.qml"));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -4847,6 +4952,7 @@ void tst_qqmlecmascript::propertyVar()
{
QFETCH(QUrl, qmlFile);
+ QQmlEngine engine;
QQmlComponent component(&engine, qmlFile);
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -4886,6 +4992,7 @@ void tst_qqmlecmascript::propertyQJSValue()
{
QFETCH(QUrl, qmlFile);
+ QQmlEngine engine;
QQmlComponent component(&engine, qmlFile);
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -4903,6 +5010,7 @@ void tst_qqmlecmascript::propertyVarCpp()
// ensure that writing to and reading from a var property from cpp works as required.
// Literal values stored in var properties can be read and written as QVariants
// of a specific type, whereas object values are read as QVariantMaps.
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("propertyVarCpp.qml"));
object = component.create();
QVERIFY(object != nullptr);
@@ -4924,6 +5032,8 @@ void tst_qqmlecmascript::propertyVarCpp()
void tst_qqmlecmascript::propertyVarOwnership()
{
+ QQmlEngine engine;
+
// Referenced JS objects are not collected
{
QQmlComponent component(&engine, testFileUrl("propertyVarOwnership.qml"));
@@ -5005,6 +5115,7 @@ void tst_qqmlecmascript::propertyVarImplicitOwnership()
// The childObject has a reference to a different QObject. We want to ensure
// that the different item will not be cleaned up until required. IE, the childObject
// has implicit ownership of the constructed QObject.
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("propertyVarImplicitOwnership.qml"));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -5032,6 +5143,7 @@ void tst_qqmlecmascript::propertyVarImplicitOwnership()
void tst_qqmlecmascript::propertyVarReparent()
{
// ensure that nothing breaks if we re-parent objects
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("propertyVar.reparent.qml"));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -5074,6 +5186,7 @@ void tst_qqmlecmascript::propertyVarReparentNullContext()
// sometimes reparenting can cause problems
// (eg, if the ctxt is collected, varproperties are no longer available)
// this test ensures that no crash occurs in that situation.
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("propertyVar.reparent.qml"));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -5110,6 +5223,7 @@ void tst_qqmlecmascript::propertyVarReparentNullContext()
void tst_qqmlecmascript::propertyVarCircular()
{
// enforce behaviour regarding circular references - ensure qdvmemo deletion.
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("propertyVar.circular.qml"));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -5142,6 +5256,7 @@ void tst_qqmlecmascript::propertyVarCircular2()
{
// track deletion of JS-owned parent item with Cpp-owned child
// where the child has a var property referencing its parent.
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("propertyVar.circular.2.qml"));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -5170,6 +5285,7 @@ void tst_qqmlecmascript::propertyVarInheritance()
{
// enforce behaviour regarding element inheritance - ensure handle disposal.
// The particular component under test here has a chain of references.
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("propertyVar.inherit.qml"));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -5215,6 +5331,7 @@ void tst_qqmlecmascript::propertyVarInheritance2()
{
// The particular component under test here does NOT have a chain of references; the
// only link between rootObject and childObject is that rootObject is the parent of childObject.
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("propertyVar.circular.2.qml"));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -5248,6 +5365,7 @@ void tst_qqmlecmascript::propertyVarInheritance2()
// Ensure that QObject type conversion works on binding assignment
void tst_qqmlecmascript::elementAssign()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("elementAssign.qml"));
QObject *object = component.create();
@@ -5261,6 +5379,7 @@ void tst_qqmlecmascript::elementAssign()
// QTBUG-12457
void tst_qqmlecmascript::objectPassThroughSignals()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("objectsPassThroughSignals.qml"));
QObject *object = component.create();
@@ -5274,6 +5393,7 @@ void tst_qqmlecmascript::objectPassThroughSignals()
// QTBUG-21626
void tst_qqmlecmascript::objectConversion()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("objectConversion.qml"));
QObject *object = component.create();
@@ -5289,6 +5409,7 @@ void tst_qqmlecmascript::objectConversion()
// QTBUG-20242
void tst_qqmlecmascript::booleanConversion()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("booleanConversion.qml"));
QObject *object = component.create();
@@ -5401,6 +5522,7 @@ void tst_qqmlecmascript::handleReferenceManagement()
void tst_qqmlecmascript::stringArg()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("stringArg.qml"));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -5417,6 +5539,7 @@ void tst_qqmlecmascript::stringArg()
void tst_qqmlecmascript::readonlyDeclaration()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("readonlyDeclaration.qml"));
QObject *object = component.create();
@@ -5434,6 +5557,8 @@ Q_DECLARE_METATYPE(QList<QString>)
Q_DECLARE_METATYPE(QList<QUrl>)
void tst_qqmlecmascript::sequenceConversionRead()
{
+ QQmlEngine engine;
+
{
QUrl qmlFile = testFileUrl("sequenceConversion.read.qml");
QQmlComponent component(&engine, qmlFile);
@@ -5514,6 +5639,7 @@ void tst_qqmlecmascript::sequenceConversionRead()
void tst_qqmlecmascript::sequenceConversionWrite()
{
+ QQmlEngine engine;
{
QUrl qmlFile = testFileUrl("sequenceConversion.write.qml");
QQmlComponent component(&engine, qmlFile);
@@ -5562,6 +5688,7 @@ void tst_qqmlecmascript::sequenceConversionArray()
{
// ensure that in JS the returned sequences act just like normal JS Arrays.
QUrl qmlFile = testFileUrl("sequenceConversion.array.qml");
+ QQmlEngine engine;
QQmlComponent component(&engine, qmlFile);
QScopedPointer<QObject> object(component.create());
QVERIFY(object != nullptr);
@@ -5583,6 +5710,7 @@ void tst_qqmlecmascript::sequenceConversionIndexes()
// ensure that we gracefully fail if unsupported index values are specified.
// Qt container classes only support non-negative, signed integer index values.
QUrl qmlFile = testFileUrl("sequenceConversion.indexes.qml");
+ QQmlEngine engine;
QQmlComponent component(&engine, qmlFile);
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -5604,6 +5732,7 @@ void tst_qqmlecmascript::sequenceConversionThreads()
// ensure that sequence conversion operations work correctly in a worker thread
// and that serialisation between the main and worker thread succeeds.
QUrl qmlFile = testFileUrl("sequenceConversion.threads.qml");
+ QQmlEngine engine;
QQmlComponent component(&engine, qmlFile);
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -5641,6 +5770,7 @@ void tst_qqmlecmascript::sequenceConversionThreads()
void tst_qqmlecmascript::sequenceConversionBindings()
{
+ QQmlEngine engine;
{
QUrl qmlFile = testFileUrl("sequenceConversion.bindings.qml");
QQmlComponent component(&engine, qmlFile);
@@ -5656,7 +5786,7 @@ void tst_qqmlecmascript::sequenceConversionBindings()
{
QUrl qmlFile = testFileUrl("sequenceConversion.bindings.error.qml");
- QString warning = QString(QLatin1String("%1:17:27: Unable to assign QList<int> to QList<bool>")).arg(qmlFile.toString());
+ QString warning = QString(QLatin1String("%1:17:9: Unable to assign QList<int> to QList<bool>")).arg(qmlFile.toString());
QTest::ignoreMessage(QtWarningMsg, warning.toLatin1().constData());
QQmlComponent component(&engine, qmlFile);
QObject *object = component.create();
@@ -5668,6 +5798,7 @@ void tst_qqmlecmascript::sequenceConversionBindings()
void tst_qqmlecmascript::sequenceConversionCopy()
{
QUrl qmlFile = testFileUrl("sequenceConversion.copy.qml");
+ QQmlEngine engine;
QQmlComponent component(&engine, qmlFile);
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -5686,6 +5817,8 @@ void tst_qqmlecmascript::sequenceConversionCopy()
void tst_qqmlecmascript::assignSequenceTypes()
{
+ QQmlEngine engine;
+
// test binding array to sequence type property
{
QQmlComponent component(&engine, testFileUrl("assignSequenceTypes.1.qml"));
@@ -5784,12 +5917,23 @@ void tst_qqmlecmascript::assignSequenceTypes()
QCOMPARE(msco5->urlListProperty(), (QList<QUrl>() << QUrl(testFileUrl("example.html")) << QUrl(testFileUrl("example2.html"))));
delete object;
}
+
+ {
+ QQmlComponent component(&engine, testFileUrl("assignSequenceTypes.8.qml"));
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object != nullptr);
+ QVariant result;
+ QMetaObject::invokeMethod(object.data(), "tryWritingReadOnlySequence", Q_RETURN_ARG(QVariant, result));
+ QVERIFY(result.type() == QVariant::Bool);
+ QVERIFY(result.toBool());
+ }
}
// Test that assigning a null object works
// Regressed with: df1788b4dbbb2826ae63f26bdf166342595343f4
void tst_qqmlecmascript::nullObjectBinding()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("nullObjectBinding.qml"));
QObject *object = component.create();
@@ -5802,6 +5946,7 @@ void tst_qqmlecmascript::nullObjectBinding()
void tst_qqmlecmascript::nullObjectInitializer()
{
+ QQmlEngine engine;
{
QQmlComponent component(&engine, testFileUrl("nullObjectInitializer.qml"));
QScopedPointer<QObject> obj(component.create());
@@ -5832,7 +5977,7 @@ void tst_qqmlecmascript::nullObjectInitializer()
{
const int propertyIndex = obj->metaObject()->indexOfProperty("testProperty");
QVERIFY(propertyIndex > 0);
- QVERIFY(ddata->hasBindingBit(propertyIndex));
+ QVERIFY(!ddata->hasBindingBit(propertyIndex));
}
QVERIFY(obj->property("success").toBool());
@@ -5869,6 +6014,7 @@ void tst_qqmlecmascript::deletedEngine()
// Test the crashing part of QTBUG-9705
void tst_qqmlecmascript::libraryScriptAssert()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("libraryScriptAssert.qml"));
QObject *object = component.create();
@@ -5879,6 +6025,7 @@ void tst_qqmlecmascript::libraryScriptAssert()
void tst_qqmlecmascript::variantsAssignedUndefined()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("variantsAssignedUndefined.qml"));
QObject *object = component.create();
@@ -5898,6 +6045,7 @@ void tst_qqmlecmascript::variantsAssignedUndefined()
void tst_qqmlecmascript::variants()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("variants.qml"));
QObject *object = component.create();
@@ -5921,6 +6069,7 @@ void tst_qqmlecmascript::variants()
void tst_qqmlecmascript::qtbug_9792()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("qtbug_9792.qml"));
QQmlContext *context = new QQmlContext(engine.rootContext());
@@ -5945,6 +6094,7 @@ void tst_qqmlecmascript::qtbug_9792()
// Verifies that QPointer<>s used in the vmemetaobject are cleaned correctly
void tst_qqmlecmascript::qtcreatorbug_1289()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("qtcreatorbug_1289.qml"));
QObject *o = component.create();
@@ -5966,6 +6116,7 @@ void tst_qqmlecmascript::qtcreatorbug_1289()
// Test that we shut down without stupid warnings
void tst_qqmlecmascript::noSpuriousWarningsAtShutdown()
{
+ QQmlEngine engine;
{
QQmlComponent component(&engine, testFileUrl("noSpuriousWarningsAtShutdown.qml"));
@@ -5994,6 +6145,7 @@ void tst_qqmlecmascript::noSpuriousWarningsAtShutdown()
void tst_qqmlecmascript::canAssignNullToQObject()
{
+ QQmlEngine engine;
{
QQmlComponent component(&engine, testFileUrl("canAssignNullToQObject.1.qml"));
@@ -6023,13 +6175,14 @@ void tst_qqmlecmascript::canAssignNullToQObject()
void tst_qqmlecmascript::functionAssignment_fromBinding()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("functionAssignment.1.qml"));
QString url = component.url().toString();
- QString w1 = url + ":4:25: Unable to assign a function to a property of any type other than var.";
- QString w2 = url + ":5:25: Invalid use of Qt.binding() in a binding declaration.";
- QString w3 = url + ":6:21: Invalid use of Qt.binding() in a binding declaration.";
- QString w4 = url + ":7:15: Invalid use of Qt.binding() in a binding declaration.";
+ QString w1 = url + ":4:5: Unable to assign a function to a property of any type other than var.";
+ QString w2 = url + ":5:5: Invalid use of Qt.binding() in a binding declaration.";
+ QString w3 = url + ":6:5: Invalid use of Qt.binding() in a binding declaration.";
+ QString w4 = url + ":7:5: Invalid use of Qt.binding() in a binding declaration.";
QTest::ignoreMessage(QtWarningMsg, w1.toLatin1().constData());
QTest::ignoreMessage(QtWarningMsg, w2.toLatin1().constData());
QTest::ignoreMessage(QtWarningMsg, w3.toLatin1().constData());
@@ -6047,6 +6200,7 @@ void tst_qqmlecmascript::functionAssignment_fromJS()
{
QFETCH(QString, triggerProperty);
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("functionAssignment.2.qml"));
QVERIFY2(component.errorString().isEmpty(), qPrintable(component.errorString()));
@@ -6079,6 +6233,7 @@ void tst_qqmlecmascript::functionAssignment_fromJS_data()
void tst_qqmlecmascript::functionAssignmentfromJS_invalid()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("functionAssignment.2.qml"));
QVERIFY2(component.errorString().isEmpty(), qPrintable(component.errorString()));
@@ -6103,6 +6258,7 @@ void tst_qqmlecmascript::functionAssignmentfromJS_invalid()
void tst_qqmlecmascript::functionAssignment_afterBinding()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("functionAssignment.3.qml"));
QString url = component.url().toString();
@@ -6119,6 +6275,7 @@ void tst_qqmlecmascript::functionAssignment_afterBinding()
void tst_qqmlecmascript::eval()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("eval.qml"));
QObject *o = component.create();
@@ -6135,6 +6292,7 @@ void tst_qqmlecmascript::eval()
void tst_qqmlecmascript::function()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("function.qml"));
QObject *o = component.create();
@@ -6150,6 +6308,7 @@ void tst_qqmlecmascript::function()
// Test the "Qt.include" method
void tst_qqmlecmascript::include()
{
+ QQmlEngine engine;
// Non-library relative include
{
QQmlComponent component(&engine, testFileUrl("include.qml"));
@@ -6208,6 +6367,14 @@ void tst_qqmlecmascript::include()
delete o;
}
+ // Including file with ".pragma library", shadowing a global var
+ {
+ QQmlComponent component(&engine, testFileUrl("include_pragma_shadow.qml"));
+ QScopedPointer<QObject> o(component.create());
+ QVERIFY(!o.isNull());
+ QCOMPARE(o->property("result").toBool(), true);
+ }
+
// Remote - error
{
TestHTTPServer server;
@@ -6254,6 +6421,7 @@ void tst_qqmlecmascript::includeRemoteSuccess()
QVERIFY2(server.listen(), qPrintable(server.errorString()));
server.serveDirectory(dataDirectory());
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("include_remote.qml"));
QObject *o = component.beginCreate(engine.rootContext());
QVERIFY(o != nullptr);
@@ -6280,6 +6448,7 @@ void tst_qqmlecmascript::includeRemoteSuccess()
void tst_qqmlecmascript::signalHandlers()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("signalHandlers.qml"));
QScopedPointer<QObject> o(component.create());
QVERIFY(o != nullptr);
@@ -6340,6 +6509,7 @@ void tst_qqmlecmascript::qtbug_37351()
void tst_qqmlecmascript::qtbug_10696()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("qtbug_10696.qml"));
QObject *o = component.create();
QVERIFY(o != nullptr);
@@ -6348,6 +6518,7 @@ void tst_qqmlecmascript::qtbug_10696()
void tst_qqmlecmascript::qtbug_11606()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("qtbug_11606.qml"));
QObject *o = component.create();
QVERIFY(o != nullptr);
@@ -6357,6 +6528,7 @@ void tst_qqmlecmascript::qtbug_11606()
void tst_qqmlecmascript::qtbug_11600()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("qtbug_11600.qml"));
QObject *o = component.create();
QVERIFY(o != nullptr);
@@ -6366,6 +6538,7 @@ void tst_qqmlecmascript::qtbug_11600()
void tst_qqmlecmascript::qtbug_21864()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("qtbug_21864.qml"));
QObject *o = component.create();
QVERIFY(o != nullptr);
@@ -6375,6 +6548,7 @@ void tst_qqmlecmascript::qtbug_21864()
void tst_qqmlecmascript::rewriteMultiLineStrings()
{
+ QQmlEngine engine;
{
// QTBUG-23387
QQmlComponent component(&engine, testFileUrl("rewriteMultiLineStrings.qml"));
@@ -6395,6 +6569,7 @@ void tst_qqmlecmascript::rewriteMultiLineStrings()
void tst_qqmlecmascript::qobjectConnectionListExceptionHandling()
{
// QTBUG-23375
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("qobjectConnectionListExceptionHandling.qml"));
QString warning = component.url().toString() + QLatin1String(":13: TypeError: Cannot read property 'undefined' of undefined");
QTest::ignoreMessage(QtWarningMsg, qPrintable(warning));
@@ -6409,6 +6584,7 @@ void tst_qqmlecmascript::qobjectConnectionListExceptionHandling()
// Reading and writing non-scriptable properties should fail
void tst_qqmlecmascript::nonscriptable()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("nonscriptable.qml"));
QObject *o = component.create();
QVERIFY(o != nullptr);
@@ -6420,6 +6596,7 @@ void tst_qqmlecmascript::nonscriptable()
// deleteLater() should not be callable from QML
void tst_qqmlecmascript::deleteLater()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("deleteLater.qml"));
QObject *o = component.create();
QVERIFY(o != nullptr);
@@ -6430,6 +6607,7 @@ void tst_qqmlecmascript::deleteLater()
// objectNameChanged() should be usable from QML
void tst_qqmlecmascript::objectNameChangedSignal()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("objectNameChangedSignal.qml"));
QObject *o = component.create();
QVERIFY(o != nullptr);
@@ -6442,6 +6620,7 @@ void tst_qqmlecmascript::objectNameChangedSignal()
// destroyed() should not be usable from QML
void tst_qqmlecmascript::destroyedSignal()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("destroyedSignal.qml"));
QVERIFY(component.isError());
@@ -6451,6 +6630,7 @@ void tst_qqmlecmascript::destroyedSignal()
void tst_qqmlecmascript::in()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("in.qml"));
QObject *o = component.create();
QVERIFY(o != nullptr);
@@ -6461,6 +6641,7 @@ void tst_qqmlecmascript::in()
void tst_qqmlecmascript::typeOf()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("typeOf.qml"));
QObject *o = component.create();
@@ -6481,6 +6662,7 @@ void tst_qqmlecmascript::typeOf()
void tst_qqmlecmascript::qtbug_24448()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("qtbug_24448.qml"));
QScopedPointer<QObject> o(component.create());
QVERIFY(o != nullptr);
@@ -6489,6 +6671,7 @@ void tst_qqmlecmascript::qtbug_24448()
void tst_qqmlecmascript::sharedAttachedObject()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("sharedAttachedObject.qml"));
QObject *o = component.create();
QVERIFY(o != nullptr);
@@ -6500,6 +6683,7 @@ void tst_qqmlecmascript::sharedAttachedObject()
// QTBUG-13999
void tst_qqmlecmascript::objectName()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("objectName.qml"));
QObject *o = component.create();
QVERIFY(o != nullptr);
@@ -6517,6 +6701,7 @@ void tst_qqmlecmascript::objectName()
void tst_qqmlecmascript::writeRemovesBinding()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("writeRemovesBinding.qml"));
QObject *o = component.create();
QVERIFY(o != nullptr);
@@ -6529,6 +6714,7 @@ void tst_qqmlecmascript::writeRemovesBinding()
// Test bindings assigned to alias properties actually assign to the alias' target
void tst_qqmlecmascript::aliasBindingsAssignCorrectly()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("aliasBindingsAssignCorrectly.qml"));
QObject *o = component.create();
QVERIFY(o != nullptr);
@@ -6541,6 +6727,7 @@ void tst_qqmlecmascript::aliasBindingsAssignCorrectly()
// Test bindings assigned to alias properties override a binding on the target (QTBUG-13719)
void tst_qqmlecmascript::aliasBindingsOverrideTarget()
{
+ QQmlEngine engine;
{
QQmlComponent component(&engine, testFileUrl("aliasBindingsOverrideTarget.qml"));
QObject *o = component.create();
@@ -6575,6 +6762,7 @@ void tst_qqmlecmascript::aliasBindingsOverrideTarget()
// Test that writes to alias properties override bindings on the alias target (QTBUG-13719)
void tst_qqmlecmascript::aliasWritesOverrideBindings()
{
+ QQmlEngine engine;
{
QQmlComponent component(&engine, testFileUrl("aliasWritesOverrideBindings.qml"));
QObject *o = component.create();
@@ -6610,6 +6798,7 @@ void tst_qqmlecmascript::aliasWritesOverrideBindings()
// QTBUG-20200
void tst_qqmlecmascript::aliasToCompositeElement()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("aliasToCompositeElement.qml"));
QObject *object = component.create();
@@ -6620,6 +6809,7 @@ void tst_qqmlecmascript::aliasToCompositeElement()
void tst_qqmlecmascript::qtbug_20344()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("qtbug_20344.qml"));
QString warning = component.url().toString() + ":5: Error: Exception thrown from within QObject slot";
@@ -6633,6 +6823,7 @@ void tst_qqmlecmascript::qtbug_20344()
void tst_qqmlecmascript::revisionErrors()
{
+ QQmlEngine engine;
{
QQmlComponent component(&engine, testFileUrl("metaobjectRevisionErrors.qml"));
QString url = component.url().toString();
@@ -6690,6 +6881,7 @@ void tst_qqmlecmascript::revisionErrors()
void tst_qqmlecmascript::revision()
{
+ QQmlEngine engine;
{
QQmlComponent component(&engine, testFileUrl("metaobjectRevision.qml"));
QString url = component.url().toString();
@@ -6736,6 +6928,7 @@ void tst_qqmlecmascript::revision()
void tst_qqmlecmascript::realToInt()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("realToInt.qml"));
MyQmlObject *object = qobject_cast<MyQmlObject*>(component.create());
QVERIFY(object != nullptr);
@@ -6748,6 +6941,7 @@ void tst_qqmlecmascript::realToInt()
void tst_qqmlecmascript::urlProperty()
{
+ QQmlEngine engine;
{
QQmlComponent component(&engine, testFileUrl("urlProperty.1.qml"));
MyQmlObject *object = qobject_cast<MyQmlObject*>(component.create());
@@ -6762,6 +6956,7 @@ void tst_qqmlecmascript::urlProperty()
void tst_qqmlecmascript::urlPropertyWithEncoding()
{
+ QQmlEngine engine;
{
QQmlComponent component(&engine, testFileUrl("urlProperty.2.qml"));
MyQmlObject *object = qobject_cast<MyQmlObject*>(component.create());
@@ -6776,6 +6971,7 @@ void tst_qqmlecmascript::urlPropertyWithEncoding()
void tst_qqmlecmascript::urlListPropertyWithEncoding()
{
+ QQmlEngine engine;
{
QQmlComponent component(&engine, testFileUrl("urlListProperty.qml"));
QObject *object = component.create();
@@ -6796,6 +6992,7 @@ void tst_qqmlecmascript::urlListPropertyWithEncoding()
void tst_qqmlecmascript::dynamicString()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("dynamicString.qml"));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -6805,6 +7002,7 @@ void tst_qqmlecmascript::dynamicString()
void tst_qqmlecmascript::deleteLaterObjectMethodCall()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("deleteLaterObjectMethodCall.qml"));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -6812,6 +7010,7 @@ void tst_qqmlecmascript::deleteLaterObjectMethodCall()
void tst_qqmlecmascript::automaticSemicolon()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("automaticSemicolon.qml"));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -6819,6 +7018,7 @@ void tst_qqmlecmascript::automaticSemicolon()
void tst_qqmlecmascript::compatibilitySemicolon()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("compatibilitySemicolon.qml"));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -6826,6 +7026,7 @@ void tst_qqmlecmascript::compatibilitySemicolon()
void tst_qqmlecmascript::incrDecrSemicolon1()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("incrDecrSemicolon1.qml"));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -6833,6 +7034,7 @@ void tst_qqmlecmascript::incrDecrSemicolon1()
void tst_qqmlecmascript::incrDecrSemicolon2()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("incrDecrSemicolon2.qml"));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -6840,6 +7042,7 @@ void tst_qqmlecmascript::incrDecrSemicolon2()
void tst_qqmlecmascript::incrDecrSemicolon_error1()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("incrDecrSemicolon_error1.qml"));
QObject *object = component.create();
QVERIFY(!object);
@@ -6847,6 +7050,7 @@ void tst_qqmlecmascript::incrDecrSemicolon_error1()
void tst_qqmlecmascript::unaryExpression()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("unaryExpression.qml"));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -6855,6 +7059,7 @@ void tst_qqmlecmascript::unaryExpression()
// Makes sure that a binding isn't double re-evaluated when it depends on the same variable twice
void tst_qqmlecmascript::doubleEvaluate()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("doubleEvaluate.qml"));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -6871,6 +7076,7 @@ void tst_qqmlecmascript::doubleEvaluate()
void tst_qqmlecmascript::nonNotifyable()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("nonNotifyable.qml"));
QQmlTestMessageHandler messageHandler;
@@ -6881,7 +7087,7 @@ void tst_qqmlecmascript::nonNotifyable()
QString expected1 = QLatin1String("QQmlExpression: Expression ") +
component.url().toString() +
- QLatin1String(":5:24 depends on non-NOTIFYable properties:");
+ QLatin1String(":5:5 depends on non-NOTIFYable properties:");
QString expected2 = QLatin1String(" ") +
QLatin1String(object->metaObject()->className()) +
QLatin1String("::value");
@@ -6895,6 +7101,7 @@ void tst_qqmlecmascript::nonNotifyable()
void tst_qqmlecmascript::nonNotifyableConstant()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("nonNotifyableConstant.qml"));
QQmlTestMessageHandler messageHandler;
@@ -6907,6 +7114,7 @@ void tst_qqmlecmascript::nonNotifyableConstant()
void tst_qqmlecmascript::forInLoop()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("forInLoop.qml"));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -6927,6 +7135,7 @@ void tst_qqmlecmascript::forInLoop()
// An object the binding depends on is deleted while the binding is still running
void tst_qqmlecmascript::deleteWhileBindingRunning()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("deleteWhileBindingRunning.qml"));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -6937,6 +7146,7 @@ void tst_qqmlecmascript::qtbug_22679()
{
MyQmlObject object;
object.setStringProperty(QLatin1String("Please work correctly"));
+ QQmlEngine engine;
engine.rootContext()->setContextProperty("contextProp", &object);
QQmlComponent component(&engine, testFileUrl("qtbug_22679.qml"));
@@ -6966,6 +7176,7 @@ void tst_qqmlecmascript::qtbug_22843()
fileName += QLatin1String(".library");
fileName += QLatin1String(".qml");
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl(fileName));
QString url = component.url().toString();
@@ -6978,6 +7189,7 @@ void tst_qqmlecmascript::qtbug_22843()
void tst_qqmlecmascript::switchStatement()
{
+ QQmlEngine engine;
{
QQmlComponent component(&engine, testFileUrl("switchStatement.1.qml"));
MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
@@ -7050,7 +7262,7 @@ void tst_qqmlecmascript::switchStatement()
{
QQmlComponent component(&engine, testFileUrl("switchStatement.4.qml"));
- QString warning = component.url().toString() + ":4:12: Unable to assign [undefined] to int";
+ QString warning = component.url().toString() + ":4:5: Unable to assign [undefined] to int";
QTest::ignoreMessage(QtWarningMsg, qPrintable(warning));
MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
@@ -7124,6 +7336,7 @@ void tst_qqmlecmascript::switchStatement()
void tst_qqmlecmascript::withStatement()
{
+ QQmlEngine engine;
{
QUrl url = testFileUrl("withStatement.1.qml");
QQmlComponent component(&engine, url);
@@ -7136,6 +7349,7 @@ void tst_qqmlecmascript::withStatement()
void tst_qqmlecmascript::tryStatement()
{
+ QQmlEngine engine;
{
QQmlComponent component(&engine, testFileUrl("tryStatement.1.qml"));
MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
@@ -7157,7 +7371,7 @@ void tst_qqmlecmascript::tryStatement()
MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
QVERIFY(object != nullptr);
- QCOMPARE(object->value(), 1);
+ QVERIFY(object->qjsvalue().isUndefined());
}
{
@@ -7165,7 +7379,7 @@ void tst_qqmlecmascript::tryStatement()
MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
QVERIFY(object != nullptr);
- QCOMPARE(object->value(), 1);
+ QVERIFY(object->qjsvalue().isUndefined());
}
}
@@ -7211,6 +7425,7 @@ void tst_qqmlecmascript::invokableWithQObjectDerived()
void tst_qqmlecmascript::realTypePrecision()
{
// Properties and signal parameters of type real should have double precision.
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("realTypePrecision.qml"));
QScopedPointer<QObject> object(component.create());
QVERIFY(object != nullptr);
@@ -7261,8 +7476,8 @@ void tst_qqmlecmascript::bindingBoundFunctions()
void tst_qqmlecmascript::deleteRootObjectInCreation()
{
- {
QQmlEngine engine;
+ {
QQmlComponent c(&engine, testFileUrl("deleteRootObjectInCreation.qml"));
QObject *obj = c.create();
QVERIFY(obj != nullptr);
@@ -7401,7 +7616,7 @@ void tst_qqmlecmascript::onDestructionViaGC()
QVERIFY2(!weakReferenceMutator.isNull(), qPrintable(component.errorString()));
weakReferenceMutator->init(v4, weakRef.data(), &mutatorResult);
- v4->memoryManager->allocObject<QV4::WeakReferenceSentinel>(weakRef.data(), &sentinelResult);
+ v4->memoryManager->allocate<QV4::WeakReferenceSentinel>(weakRef.data(), &sentinelResult);
}
gc(engine);
@@ -7475,6 +7690,7 @@ void tst_qqmlecmascript::signalEmitted()
// QTBUG-25647
void tst_qqmlecmascript::threadSignal()
{
+ QQmlEngine engine;
{
QQmlComponent c(&engine, testFileUrl("threadSignal.qml"));
QScopedPointer<QObject> object(c.create());
@@ -7493,6 +7709,7 @@ void tst_qqmlecmascript::threadSignal()
// ensure that the qqmldata::destroyed() handler doesn't cause problems
void tst_qqmlecmascript::qqmldataDestroyed()
{
+ QQmlEngine engine;
// gc cleans up a qobject, later the qqmldata destroyed handler will run.
{
QQmlComponent c(&engine, testFileUrl("qqmldataDestroyed.qml"));
@@ -7526,6 +7743,7 @@ void tst_qqmlecmascript::qqmldataDestroyed()
void tst_qqmlecmascript::secondAlias()
{
+ QQmlEngine engine;
QQmlComponent c(&engine, testFileUrl("secondAlias.qml"));
QObject *object = c.create();
QVERIFY(object != nullptr);
@@ -7536,6 +7754,7 @@ void tst_qqmlecmascript::secondAlias()
// An alias to a var property works
void tst_qqmlecmascript::varAlias()
{
+ QQmlEngine engine;
QQmlComponent c(&engine, testFileUrl("varAlias.qml"));
QObject *object = c.create();
QVERIFY(object != nullptr);
@@ -7546,6 +7765,7 @@ void tst_qqmlecmascript::varAlias()
// Used to trigger an assert in the lazy meta object creation stage
void tst_qqmlecmascript::overrideDataAssert()
{
+ QQmlEngine engine;
QQmlComponent c(&engine, testFileUrl("overrideDataAssert.qml"));
QObject *object = c.create();
QVERIFY(object != nullptr);
@@ -7571,6 +7791,7 @@ void tst_qqmlecmascript::fallbackBindings()
{
QFETCH(QString, source);
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl(source));
QScopedPointer<QObject> object(component.create());
QVERIFY(object != nullptr);
@@ -7580,6 +7801,7 @@ void tst_qqmlecmascript::fallbackBindings()
void tst_qqmlecmascript::propertyOverride()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("propertyOverride.qml"));
QScopedPointer<QObject> object(component.create());
QVERIFY(object != nullptr);
@@ -7615,6 +7837,7 @@ void tst_qqmlecmascript::sequenceSort()
QFETCH(QString, function);
QFETCH(bool, useComparer);
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("sequenceSort.qml"));
QObject *object = component.create();
@@ -7631,6 +7854,7 @@ void tst_qqmlecmascript::sequenceSort()
void tst_qqmlecmascript::dateParse()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("date.qml"));
QObject *object = component.create();
@@ -7651,6 +7875,7 @@ void tst_qqmlecmascript::dateParse()
void tst_qqmlecmascript::utcDate()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("utcdate.qml"));
QObject *object = component.create();
@@ -7666,6 +7891,7 @@ void tst_qqmlecmascript::utcDate()
void tst_qqmlecmascript::negativeYear()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("negativeyear.qml"));
QObject *object = component.create();
@@ -7687,6 +7913,7 @@ void tst_qqmlecmascript::negativeYear()
void tst_qqmlecmascript::concatenatedStringPropertyAccess()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("concatenatedStringPropertyAccess.qml"));
QObject *object = component.create();
QVERIFY(object);
@@ -7732,6 +7959,7 @@ void tst_qqmlecmascript::updateCall()
// documented it can be called from within QML. Make sure
// we don't crash when calling it.
QString file("updateCall.qml");
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl(file));
QObject *object = component.create();
QVERIFY(object != nullptr);
@@ -7739,6 +7967,7 @@ void tst_qqmlecmascript::updateCall()
void tst_qqmlecmascript::numberParsing()
{
+ QQmlEngine engine;
for (int i = 1; i < 8; ++i) {
QString file("numberParsing.%1.qml");
file = file.arg(i);
@@ -7756,6 +7985,7 @@ void tst_qqmlecmascript::numberParsing()
void tst_qqmlecmascript::stringParsing()
{
+ QQmlEngine engine;
for (int i = 1; i < 7; ++i) {
QString file("stringParsing_error.%1.qml");
file = file.arg(i);
@@ -7779,6 +8009,7 @@ void tst_qqmlecmascript::push_and_shift()
void tst_qqmlecmascript::qtbug_32801()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("qtbug_32801.qml"));
QScopedPointer<QObject> obj(component.create());
@@ -7791,6 +8022,7 @@ void tst_qqmlecmascript::qtbug_32801()
void tst_qqmlecmascript::thisObject()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("thisObject.qml"));
QObject *object = component.create();
QVERIFY(object);
@@ -7800,6 +8032,7 @@ void tst_qqmlecmascript::thisObject()
void tst_qqmlecmascript::qtbug_33754()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("qtbug_33754.qml"));
QScopedPointer<QObject> obj(component.create());
@@ -7808,6 +8041,7 @@ void tst_qqmlecmascript::qtbug_33754()
void tst_qqmlecmascript::qtbug_34493()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("qtbug_34493.qml"));
QScopedPointer<QObject> obj(component.create());
@@ -7823,6 +8057,7 @@ void tst_qqmlecmascript::qtbug_34493()
// as its type*, it's parent type* and as QObject*
void tst_qqmlecmascript::singletonFromQMLToCpp()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFile("singletonTest.qml"));
QScopedPointer<QObject> obj(component.create());
if (component.errors().size())
@@ -7840,6 +8075,7 @@ void tst_qqmlecmascript::singletonFromQMLToCpp()
// and correctly compares to itself
void tst_qqmlecmascript::singletonFromQMLAndBackAndCompare()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFile("singletonTest2.qml"));
QScopedPointer<QObject> o(component.create());
if (component.errors().size())
@@ -7864,9 +8100,10 @@ void tst_qqmlecmascript::singletonFromQMLAndBackAndCompare()
void tst_qqmlecmascript::setPropertyOnInvalid()
{
+ QQmlEngine engine;
{
QQmlComponent component(&engine, testFileUrl("setPropertyOnNull.qml"));
- QString warning = component.url().toString() + ":4: TypeError: Type error";
+ QString warning = component.url().toString() + ":4: TypeError: Value is null and could not be converted to an object";
QTest::ignoreMessage(QtWarningMsg, qPrintable(warning));
QObject *object = component.create();
QVERIFY(object);
@@ -7875,7 +8112,7 @@ void tst_qqmlecmascript::setPropertyOnInvalid()
{
QQmlComponent component(&engine, testFileUrl("setPropertyOnUndefined.qml"));
- QString warning = component.url().toString() + ":4: TypeError: Type error";
+ QString warning = component.url().toString() + ":4: TypeError: Value is undefined and could not be converted to an object";
QTest::ignoreMessage(QtWarningMsg, qPrintable(warning));
QObject *object = component.create();
QVERIFY(object);
@@ -7885,6 +8122,7 @@ void tst_qqmlecmascript::setPropertyOnInvalid()
void tst_qqmlecmascript::miscTypeTest()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("misctypetest.qml"));
QObject *object = component.create();
@@ -7913,6 +8151,7 @@ void tst_qqmlecmascript::stackLimits()
void tst_qqmlecmascript::idsAsLValues()
{
+ QQmlEngine engine;
QString err = QString(QLatin1String("%1:5 left-hand side of assignment operator is not an lvalue\n")).arg(testFileUrl("idAsLValue.qml").toString());
QQmlComponent component(&engine, testFileUrl("idAsLValue.qml"));
QTest::ignoreMessage(QtWarningMsg, "QQmlComponent: Component is not ready");
@@ -7923,6 +8162,7 @@ void tst_qqmlecmascript::idsAsLValues()
void tst_qqmlecmascript::qtbug_34792()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("qtbug34792.qml"));
QObject *object = component.create();
@@ -7934,6 +8174,7 @@ void tst_qqmlecmascript::qtbug_34792()
void tst_qqmlecmascript::noCaptureWhenWritingProperty()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("noCaptureWhenWritingProperty.qml"));
QScopedPointer<QObject> obj(component.create());
QVERIFY(!obj.isNull());
@@ -7942,6 +8183,7 @@ void tst_qqmlecmascript::noCaptureWhenWritingProperty()
void tst_qqmlecmascript::singletonWithEnum()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("singletontype/singletonWithEnum.qml"));
QScopedPointer<QObject> obj(component.create());
if (obj.isNull())
@@ -7963,48 +8205,53 @@ void tst_qqmlecmascript::singletonWithEnum()
void tst_qqmlecmascript::lazyBindingEvaluation()
{
- QQmlComponent component(&engine, testFileUrl("lazyBindingEvaluation.qml"));
- QScopedPointer<QObject> obj(component.create());
- if (obj.isNull())
+ QQmlEngine engine;
+ QQmlComponent component(&engine, testFileUrl("lazyBindingEvaluation.qml"));
+ QScopedPointer<QObject> obj(component.create());
+ if (obj.isNull())
qDebug() << component.errors().first().toString();
- QVERIFY(!obj.isNull());
- QVariant prop = obj->property("arrayLength");
- QCOMPARE(prop.type(), QVariant::Int);
- QCOMPARE(prop.toInt(), 2);
+ QVERIFY(!obj.isNull());
+ QVariant prop = obj->property("arrayLength");
+ QCOMPARE(prop.type(), QVariant::Int);
+ QCOMPARE(prop.toInt(), 2);
}
void tst_qqmlecmascript::varPropertyAccessOnObjectWithInvalidContext()
{
- QQmlComponent component(&engine, testFileUrl("varPropertyAccessOnObjectWithInvalidContext.qml"));
- QScopedPointer<QObject> obj(component.create());
- if (obj.isNull())
+ QQmlEngine engine;
+ QQmlComponent component(&engine, testFileUrl("varPropertyAccessOnObjectWithInvalidContext.qml"));
+ QScopedPointer<QObject> obj(component.create());
+ if (obj.isNull())
qDebug() << component.errors().first().toString();
- QVERIFY(!obj.isNull());
- QVERIFY(obj->property("success").toBool());
+ QVERIFY(!obj.isNull());
+ QVERIFY(obj->property("success").toBool());
}
void tst_qqmlecmascript::importedScriptsAccessOnObjectWithInvalidContext()
{
- QQmlComponent component(&engine, testFileUrl("importedScriptsAccessOnObjectWithInvalidContext.qml"));
- QScopedPointer<QObject> obj(component.create());
- if (obj.isNull())
+ QQmlEngine engine;
+ QQmlComponent component(&engine, testFileUrl("importedScriptsAccessOnObjectWithInvalidContext.qml"));
+ QScopedPointer<QObject> obj(component.create());
+ if (obj.isNull())
qDebug() << component.errors().first().toString();
- QVERIFY(!obj.isNull());
- QTRY_VERIFY(obj->property("success").toBool());
+ QVERIFY(!obj.isNull());
+ QTRY_VERIFY(obj->property("success").toBool());
}
void tst_qqmlecmascript::importedScriptsWithoutQmlMode()
{
- QQmlComponent component(&engine, testFileUrl("importScriptsWithoutQmlMode.qml"));
- QScopedPointer<QObject> obj(component.create());
- if (obj.isNull())
+ QQmlEngine engine;
+ QQmlComponent component(&engine, testFileUrl("importScriptsWithoutQmlMode.qml"));
+ QScopedPointer<QObject> obj(component.create());
+ if (obj.isNull())
qDebug() << component.errors().first().toString();
- QVERIFY(!obj.isNull());
- QTRY_VERIFY(obj->property("success").toBool());
+ QVERIFY(!obj.isNull());
+ QTRY_VERIFY(obj->property("success").toBool());
}
void tst_qqmlecmascript::contextObjectOnLazyBindings()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("contextObjectOnLazyBindings.qml"));
QScopedPointer<QObject> obj(component.create());
if (obj.isNull())
@@ -8017,6 +8264,7 @@ void tst_qqmlecmascript::contextObjectOnLazyBindings()
void tst_qqmlecmascript::garbageCollectionDuringCreation()
{
+ QQmlEngine engine;
QQmlComponent component(&engine);
component.setData("import Qt.test 1.0\n"
"QObjectContainerWithGCOnAppend {\n"
@@ -8044,6 +8292,7 @@ void tst_qqmlecmascript::garbageCollectionDuringCreation()
void tst_qqmlecmascript::qtbug_39520()
{
+ QQmlEngine engine;
QQmlComponent component(&engine);
component.setData("import QtQuick 2.0\n"
"Item {\n"
@@ -8165,6 +8414,7 @@ void tst_qqmlecmascript::switchExpression()
void tst_qqmlecmascript::qtbug_46022()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("qtbug_46022.qml"));
QScopedPointer<QObject> obj(component.create());
@@ -8175,6 +8425,7 @@ void tst_qqmlecmascript::qtbug_46022()
void tst_qqmlecmascript::qtbug_52340()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("qtbug_52340.qml"));
QScopedPointer<QObject> object(component.create());
QVERIFY(!object.isNull());
@@ -8186,6 +8437,7 @@ void tst_qqmlecmascript::qtbug_52340()
void tst_qqmlecmascript::qtbug_54589()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("qtbug_54589.qml"));
QScopedPointer<QObject> obj(component.create());
@@ -8197,11 +8449,12 @@ void tst_qqmlecmascript::qtbug_54687()
{
QJSEngine e;
// it's simple: this shouldn't crash.
- engine.evaluate("12\n----12");
+ e.evaluate("12\n----12");
}
void tst_qqmlecmascript::stringify_qtbug_50592()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("stringify_qtbug_50592.qml"));
QScopedPointer<QObject> obj(component.create());
@@ -8389,6 +8642,7 @@ void tst_qqmlecmascript::freeze_empty_object()
void tst_qqmlecmascript::singleBlockLoops()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("qtbug_59012.qml"));
QScopedPointer<QObject> obj(component.create());
@@ -8400,6 +8654,7 @@ void tst_qqmlecmascript::singleBlockLoops()
// This fix ensures it looks up the right thing.
void tst_qqmlecmascript::qtbug_60547()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("qtbug60547/main.qml"));
QScopedPointer<QObject> object(component.create());
QVERIFY2(!object.isNull(), qPrintable(component.errorString()));
@@ -8408,6 +8663,7 @@ void tst_qqmlecmascript::qtbug_60547()
void tst_qqmlecmascript::anotherNaN()
{
+ QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("nans.qml"));
QScopedPointer<QObject> object(component.create());
QVERIFY2(!object.isNull(), qPrintable(component.errorString()));
@@ -8513,6 +8769,35 @@ void tst_qqmlecmascript::jumpStrictNotEqualUndefined()
QCOMPARE(v.toInt(), 2);
}
+void tst_qqmlecmascript::removeBindingsWithNoDependencies()
+{
+ QQmlEngine engine;
+ QQmlComponent component(&engine, testFileUrl("removeBindingsWithNoDependencies.qml"));
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(!object.isNull());
+ QVariant rect = object->property("placement");
+ QCOMPARE(rect.toRectF(), QRectF(0, 0, 100, 100));
+ const QMetaObject *metaObject = object->metaObject();
+
+ {
+ const QMetaProperty prop = metaObject->property(metaObject->indexOfProperty("placement"));
+ QVERIFY(prop.isValid());
+ QVERIFY(!QQmlPropertyPrivate::binding(object.data(), QQmlPropertyIndex(prop.propertyIndex())));
+ }
+
+ {
+ const QMetaProperty prop = metaObject->property(metaObject->indexOfProperty("partialPlacement"));
+ QVERIFY(prop.isValid());
+ QQmlAbstractBinding *vtProxyBinding = QQmlPropertyPrivate::binding(object.data(), QQmlPropertyIndex(prop.propertyIndex()));
+ QVERIFY(vtProxyBinding);
+ QVERIFY(vtProxyBinding->isValueTypeProxy());
+
+ QQmlValueTypeProxyBinding *proxy = static_cast<QQmlValueTypeProxyBinding*>(vtProxyBinding);
+ QVERIFY(!proxy->subBindings());
+ }
+
+}
+
QTEST_MAIN(tst_qqmlecmascript)
#include "tst_qqmlecmascript.moc"
diff --git a/tests/auto/qml/qqmlengine/tst_qqmlengine.cpp b/tests/auto/qml/qqmlengine/tst_qqmlengine.cpp
index 95098648fa..f58ae38264 100644
--- a/tests/auto/qml/qqmlengine/tst_qqmlengine.cpp
+++ b/tests/auto/qml/qqmlengine/tst_qqmlengine.cpp
@@ -79,6 +79,7 @@ private slots:
void componentFromEval();
void qrcUrls();
void cppSignalAndEval();
+ void singletonInstance();
public slots:
QObject *createAQObjectForOwnershipTest ()
@@ -543,7 +544,7 @@ void tst_qqmlengine::outputWarningsToStandardError()
delete o;
QCOMPARE(messageHandler.messages().count(), 1);
- QCOMPARE(messageHandler.messages().at(0), QLatin1String("<Unknown File>:1:48: Unable to assign [undefined] to int"));
+ QCOMPARE(messageHandler.messages().at(0), QLatin1String("<Unknown File>:1:32: Unable to assign [undefined] to int"));
messageHandler.clear();
engine.setOutputWarningsToStandardError(false);
@@ -905,23 +906,19 @@ void tst_qqmlengine::qrcUrls()
QQmlEnginePrivate *pEngine = QQmlEnginePrivate::get(&engine);
{
- QQmlRefPointer<QQmlTypeData> oneQml(pEngine->typeLoader.getType(QUrl("qrc:/qrcurls.qml")),
- QQmlRefPointer<QQmlTypeData>::Adopt);
- QVERIFY(oneQml != nullptr);
- QQmlRefPointer<QQmlTypeData> twoQml(pEngine->typeLoader.getType(QUrl("qrc:///qrcurls.qml")),
- QQmlRefPointer<QQmlTypeData>::Adopt);
- QVERIFY(twoQml != nullptr);
- QCOMPARE(oneQml, twoQml);
+ QQmlRefPointer<QQmlTypeData> oneQml(pEngine->typeLoader.getType(QUrl("qrc:/qrcurls.qml")));
+ QVERIFY(oneQml.data() != nullptr);
+ QQmlRefPointer<QQmlTypeData> twoQml(pEngine->typeLoader.getType(QUrl("qrc:///qrcurls.qml")));
+ QVERIFY(twoQml.data() != nullptr);
+ QCOMPARE(oneQml.data(), twoQml.data());
}
{
- QQmlRefPointer<QQmlTypeData> oneJS(pEngine->typeLoader.getType(QUrl("qrc:/qrcurls.js")),
- QQmlRefPointer<QQmlTypeData>::Adopt);
- QVERIFY(oneJS != nullptr);
- QQmlRefPointer<QQmlTypeData> twoJS(pEngine->typeLoader.getType(QUrl("qrc:///qrcurls.js")),
- QQmlRefPointer<QQmlTypeData>::Adopt);
- QVERIFY(twoJS != nullptr);
- QCOMPARE(oneJS, twoJS);
+ QQmlRefPointer<QQmlTypeData> oneJS(pEngine->typeLoader.getType(QUrl("qrc:/qrcurls.js")));
+ QVERIFY(oneJS.data() != nullptr);
+ QQmlRefPointer<QQmlTypeData> twoJS(pEngine->typeLoader.getType(QUrl("qrc:///qrcurls.js")));
+ QVERIFY(twoJS.data() != nullptr);
+ QCOMPARE(oneJS.data(), twoJS.data());
}
}
@@ -956,6 +953,96 @@ void tst_qqmlengine::cppSignalAndEval()
QCOMPARE(object->property("r"), 1.1234);
}
+class CppSingleton : public QObject {
+ Q_OBJECT
+public:
+ CppSingleton() {}
+
+ static QObject *create(QQmlEngine *qmlEngine, QJSEngine *jsEngine)
+ {
+ Q_UNUSED(qmlEngine);
+ Q_UNUSED(jsEngine);
+ return new CppSingleton();
+ }
+};
+
+class JsSingleton : public QObject {
+ Q_OBJECT
+public:
+ JsSingleton() {}
+
+ static QJSValue create(QQmlEngine *qmlEngine, QJSEngine *jsEngine)
+ {
+ Q_UNUSED(qmlEngine);
+ QJSValue value = jsEngine->newQObject(new JsSingleton());
+ return value;
+ }
+};
+
+class SomeQObjectClass : public QObject {
+ Q_OBJECT
+public:
+ SomeQObjectClass() : QObject(nullptr){}
+};
+
+void tst_qqmlengine::singletonInstance()
+{
+ QQmlEngine engine;
+
+ int cppSingletonTypeId = qmlRegisterSingletonType<CppSingleton>("Test", 1, 0, "CppSingleton", &CppSingleton::create);
+ int jsValueSingletonTypeId = qmlRegisterSingletonType("Test", 1, 0, "JsSingleton", &JsSingleton::create);
+
+ {
+ // Cpp QObject singleton type
+ QJSValue value = engine.singletonInstance<QJSValue>(cppSingletonTypeId);
+ QVERIFY(!value.isUndefined());
+ QVERIFY(value.isQObject());
+ QObject *instance = value.toQObject();
+ QVERIFY(instance);
+ QCOMPARE(instance->metaObject()->className(), "CppSingleton");
+ }
+
+ {
+ // QJSValue QObject singleton type
+ QJSValue value = engine.singletonInstance<QJSValue>(jsValueSingletonTypeId);
+ QVERIFY(!value.isUndefined());
+ QVERIFY(value.isQObject());
+ QObject *instance = value.toQObject();
+ QVERIFY(instance);
+ QCOMPARE(instance->metaObject()->className(), "JsSingleton");
+ }
+
+ {
+ // Invalid types
+ QJSValue value;
+ value = engine.singletonInstance<QJSValue>(-4711);
+ QVERIFY(value.isUndefined());
+ value = engine.singletonInstance<QJSValue>(1701);
+ QVERIFY(value.isUndefined());
+ }
+
+ {
+ // Valid, but non-singleton type
+ int typeId = qmlRegisterType<CppSingleton>("Test", 1, 0, "NotASingleton");
+ QJSValue value = engine.singletonInstance<QJSValue>(typeId);
+ QVERIFY(value.isUndefined());
+ }
+
+ {
+ // Cpp QObject singleton type
+ CppSingleton *instance = engine.singletonInstance<CppSingleton*>(cppSingletonTypeId);
+ QVERIFY(instance);
+ QCOMPARE(instance->metaObject()->className(), "CppSingleton");
+ QCOMPARE(instance, engine.singletonInstance<QJSValue>(cppSingletonTypeId).toQObject());
+ }
+
+ {
+ // Wrong destination type
+ SomeQObjectClass * instance = engine.singletonInstance<SomeQObjectClass*>(cppSingletonTypeId);
+ QVERIFY(!instance);
+ }
+}
+
QTEST_MAIN(tst_qqmlengine)
#include "tst_qqmlengine.moc"
diff --git a/tests/auto/qml/qqmllanguage/data/dynamicMeta.5.errors.txt b/tests/auto/qml/qqmllanguage/data/dynamicMeta.5.errors.txt
index 015d55b03b..30b5193cd5 100644
--- a/tests/auto/qml/qqmllanguage/data/dynamicMeta.5.errors.txt
+++ b/tests/auto/qml/qqmllanguage/data/dynamicMeta.5.errors.txt
@@ -1 +1 @@
-3:1:UnknownType is not a type
+4:5:UnknownType is not a type
diff --git a/tests/auto/qml/qqmllanguage/data/incorrectCase.errors.insensitive.txt b/tests/auto/qml/qqmllanguage/data/incorrectCase.errors.insensitive.txt
index 3813680562..4f3f758b7e 100644
--- a/tests/auto/qml/qqmllanguage/data/incorrectCase.errors.insensitive.txt
+++ b/tests/auto/qml/qqmllanguage/data/incorrectCase.errors.insensitive.txt
@@ -1,2 +1,2 @@
-3:1:Type IncorrectCaseType unavailable
+3:1:IncorrectCaseType is not a type
-1:-1:File name case mismatch
diff --git a/tests/auto/qml/qqmllanguage/data/objectValueTypeProperty.errors.txt b/tests/auto/qml/qqmllanguage/data/objectValueTypeProperty.errors.txt
index db7d9c0f60..cefd62f9d4 100644
--- a/tests/auto/qml/qqmllanguage/data/objectValueTypeProperty.errors.txt
+++ b/tests/auto/qml/qqmllanguage/data/objectValueTypeProperty.errors.txt
@@ -1 +1 @@
-4:18:Unexpected object assignment
+4:18:Unexpected object assignment for property "x"
diff --git a/tests/auto/qml/qqmllanguage/data/property.4.errors.txt b/tests/auto/qml/qqmllanguage/data/property.4.errors.txt
index b447186849..2807384ec4 100644
--- a/tests/auto/qml/qqmllanguage/data/property.4.errors.txt
+++ b/tests/auto/qml/qqmllanguage/data/property.4.errors.txt
@@ -1 +1 @@
-5:1:Syntax error
+5:1:Expected token `:'
diff --git a/tests/auto/qml/qqmllanguage/data/singletonTest18.qml b/tests/auto/qml/qqmllanguage/data/singletonTest18.qml
new file mode 100644
index 0000000000..7616c23531
--- /dev/null
+++ b/tests/auto/qml/qqmllanguage/data/singletonTest18.qml
@@ -0,0 +1,9 @@
+import QtQuick 2.0
+import "singleton"
+import Test 1.0
+
+Item {
+ property var qmlSingleton: SingletonType
+ property var jsSingleton: MyQJSValueQObjectSingleton
+ property var cppSingleton: MyTypeObjectSingleton
+}
diff --git a/tests/auto/qml/qqmllanguage/data/wrongType.16.errors.txt b/tests/auto/qml/qqmllanguage/data/wrongType.16.errors.txt
index 77cf210918..cedae349d2 100644
--- a/tests/auto/qml/qqmllanguage/data/wrongType.16.errors.txt
+++ b/tests/auto/qml/qqmllanguage/data/wrongType.16.errors.txt
@@ -1 +1 @@
-4:24:Cannot assign object to property
+4:24:Cannot assign object of type "QtObject" to property of type "MyQmlObject*" as the former is neither the same as the latter nor a sub-class of it.
diff --git a/tests/auto/qml/qqmllanguage/testtypes.cpp b/tests/auto/qml/qqmllanguage/testtypes.cpp
index 0eb4f26878..7e247b1906 100644
--- a/tests/auto/qml/qqmllanguage/testtypes.cpp
+++ b/tests/auto/qml/qqmllanguage/testtypes.cpp
@@ -35,6 +35,14 @@ static QObject *myTypeObjectSingleton(QQmlEngine *engine, QJSEngine *scriptEngin
return new MyTypeObject();
}
+static QJSValue myQJSValueQObjectSingleton(QQmlEngine *engine, QJSEngine *scriptEngine)
+{
+ Q_UNUSED(engine)
+
+ QJSValue value = scriptEngine->newQObject(new MyTypeObject());
+ return value;
+}
+
void registerTypes()
{
qmlRegisterInterface<MyInterface>("MyInterface");
@@ -101,6 +109,7 @@ void registerTypes()
qmlRegisterType<MyCompositeBaseType>("Test", 1, 0, "MyCompositeBaseType");
qmlRegisterSingletonType<MyTypeObjectSingleton>("Test", 1, 0, "MyTypeObjectSingleton", myTypeObjectSingleton);
+ qmlRegisterSingletonType("Test", 1, 0, "MyQJSValueQObjectSingleton", myQJSValueQObjectSingleton);
qmlRegisterType<MyArrayBufferTestClass>("Test", 1, 0, "MyArrayBufferTestClass");
diff --git a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp
index 8913528d79..f3569c2efe 100644
--- a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp
+++ b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp
@@ -246,6 +246,8 @@ private slots:
void compositeSingletonRegistered();
void compositeSingletonCircular();
+ void singletonsHaveContextAndEngine();
+
void customParserBindingScopes();
void customParserEvaluateEnum();
void customParserProperties();
@@ -288,6 +290,8 @@ private slots:
void valueTypeGroupPropertiesInBehavior();
+ void retrieveQmlTypeId();
+
private:
QQmlEngine engine;
QStringList defaultImportPathList;
@@ -2193,7 +2197,7 @@ void tst_qqmllanguage::scriptStringWithoutSourceCode()
QUrl url = testFileUrl("scriptString7.qml");
{
QQmlEnginePrivate *eng = QQmlEnginePrivate::get(&engine);
- QQmlTypeData *td = eng->typeLoader.getType(url);
+ QQmlRefPointer<QQmlTypeData> td = eng->typeLoader.getType(url);
Q_ASSERT(td);
const QV4::CompiledData::Unit *readOnlyQmlUnit = td->compilationUnit()->data;
@@ -3923,11 +3927,13 @@ void tst_qqmllanguage::getSingletonInstance(QObject* o, const char* propertyName
return;
QVariant variant = o->property(propertyName);
- QVERIFY(variant.userType() == qMetaTypeId<QObject *>());
+ QVERIFY(variant.isValid());
QObject *singleton = nullptr;
- if (variant.canConvert<QObject*>())
+ if (variant.userType() == qMetaTypeId<QObject *>())
singleton = variant.value<QObject*>();
+ else if (variant.userType() == qMetaTypeId<QJSValue>())
+ singleton = variant.value<QJSValue>().toQObject();
QVERIFY(singleton != nullptr);
*result = singleton;
@@ -4232,6 +4238,24 @@ void tst_qqmllanguage::compositeSingletonCircular()
QCOMPARE(o->property("value").toInt(), 2);
}
+void tst_qqmllanguage::singletonsHaveContextAndEngine()
+{
+ QObject *qmlSingleton = nullptr;
+ getSingletonInstance(engine, "singletonTest18.qml", "qmlSingleton", &qmlSingleton);
+ QVERIFY(qmlContext(qmlSingleton));
+ QCOMPARE(qmlEngine(qmlSingleton), &engine);
+
+ QObject *jsSingleton = nullptr;
+ getSingletonInstance(engine, "singletonTest18.qml", "jsSingleton", &jsSingleton);
+ QVERIFY(qmlContext(jsSingleton));
+ QCOMPARE(qmlEngine(jsSingleton), &engine);
+
+ QObject *cppSingleton = nullptr;
+ getSingletonInstance(engine, "singletonTest18.qml", "cppSingleton", &cppSingleton);
+ QVERIFY(qmlContext(cppSingleton));
+ QCOMPARE(qmlEngine(cppSingleton), &engine);
+}
+
void tst_qqmllanguage::customParserBindingScopes()
{
QQmlComponent component(&engine, testFile("customParserBindingScopes.qml"));
@@ -4934,6 +4958,26 @@ void tst_qqmllanguage::valueTypeGroupPropertiesInBehavior()
QCOMPARE(animation->property("easing").value<QEasingCurve>().type(), QEasingCurve::InOutQuad);
}
+void tst_qqmllanguage::retrieveQmlTypeId()
+{
+ // Register in reverse order to provoke wrong minor version matching.
+ int id2 = qmlRegisterType<QObject>("Test", 2, 3, "SomeTestType");
+ int id1 = qmlRegisterType<QObject>("Test", 2, 1, "SomeTestType");
+ QCOMPARE(qmlTypeId("Test", 2, 1, "SomeTestType"), id1);
+ QCOMPARE(qmlTypeId("Test", 2, 2, "SomeTestType"), id1);
+ QCOMPARE(qmlTypeId("Test", 2, 3, "SomeTestType"), id2);
+
+ // Error cases
+ QCOMPARE(qmlTypeId("Test", 2, 0, "SomeTestType"), -1);
+ QCOMPARE(qmlTypeId("Test", 2, 3, "DoesNotExist"), -1);
+ QCOMPARE(qmlTypeId("DoesNotExist", 2, 3, "SomeTestType"), -1);
+
+ // Must also work for other types (defined in testtpes.cpp)
+ QVERIFY(qmlTypeId("Test", 1, 0, "MyExtendedUncreateableBaseClass") >= 0);
+ QVERIFY(qmlTypeId("Test", 1, 0, "MyUncreateableBaseClass") >= 0);
+ QVERIFY(qmlTypeId("Test", 1, 0, "MyTypeObjectSingleton") >= 0);
+}
+
QTEST_MAIN(tst_qqmllanguage)
#include "tst_qqmllanguage.moc"
diff --git a/tests/auto/qml/qqmllistmodel/data/dynamicroles.qml b/tests/auto/qml/qqmllistmodel/data/dynamicroles.qml
new file mode 100644
index 0000000000..7d3650c3b9
--- /dev/null
+++ b/tests/auto/qml/qqmllistmodel/data/dynamicroles.qml
@@ -0,0 +1,21 @@
+import QtQuick 2.0
+
+Item {
+ id: root
+
+ ListModel {
+ id: listModel
+ objectName: "listModel"
+ dynamicRoles: true
+
+ // have to add elements dynamically when dynamicRoles = true
+ function appendNewElement() {
+ listModel.append({"name": "test", "obj": null})
+ }
+
+ function setElementAgain() {
+ var element = listModel.get(0)
+ listModel.set(0, element)
+ }
+ }
+}
diff --git a/tests/auto/qml/qqmllistmodel/data/qtbug38907.qml b/tests/auto/qml/qqmllistmodel/data/qtbug38907.qml
new file mode 100644
index 0000000000..0abf221f60
--- /dev/null
+++ b/tests/auto/qml/qqmllistmodel/data/qtbug38907.qml
@@ -0,0 +1,25 @@
+import QtQuick 2.0
+import QtTest 1.0
+
+Item {
+
+ Item {
+ id : testItem
+ property string name : "testObject"
+ property var object : this
+ function testMethod() {
+ return -1;
+ }
+ }
+
+ ListModel {
+ id : listModel
+ dynamicRoles : true
+ }
+
+ function exec() {
+ listModel.append(testItem);
+ listModel.append({ item : testItem });
+ return true;
+ }
+}
diff --git a/tests/auto/qml/qqmllistmodel/tst_qqmllistmodel.cpp b/tests/auto/qml/qqmllistmodel/tst_qqmllistmodel.cpp
index 9fdc54f067..771f3e5c4e 100644
--- a/tests/auto/qml/qqmllistmodel/tst_qqmllistmodel.cpp
+++ b/tests/auto/qml/qqmllistmodel/tst_qqmllistmodel.cpp
@@ -106,6 +106,7 @@ private slots:
void get_nested_data();
void crash_model_with_multiple_roles();
void crash_model_with_unknown_roles();
+ void crash_model_with_dynamic_roles();
void set_model_cache();
void property_changes();
void property_changes_data();
@@ -126,6 +127,7 @@ private slots:
void stringifyModelEntry();
void qobjectTrackerForDynamicModelObjects();
void crash_append_empty_array();
+ void dynamic_roles_crash_QTBUG_38907();
};
bool tst_qqmllistmodel::compareVariantList(const QVariantList &testList, QVariant object)
@@ -984,6 +986,97 @@ void tst_qqmllistmodel::crash_model_with_unknown_roles()
model->index(0, 0, QModelIndex()).data(Qt::UserRole);
}
+//QTBUG-35639
+void tst_qqmllistmodel::crash_model_with_dynamic_roles()
+{
+ {
+ // setting a dynamic role to a QObject value, then triggering dtor
+ QQmlEngine eng;
+ QQmlComponent component(&eng, testFileUrl("dynamicroles.qml"));
+ QObject *rootItem = component.create();
+ qWarning() << component.errorString();
+ QVERIFY(component.errorString().isEmpty());
+ QVERIFY(rootItem != 0);
+ QQmlListModel *model = rootItem->findChild<QQmlListModel*>("listModel");
+ QVERIFY(model != 0);
+
+ QMetaObject::invokeMethod(model, "appendNewElement");
+
+ QObject *testObj = new QObject;
+ model->setProperty(0, "obj", QVariant::fromValue<QObject*>(testObj));
+ delete testObj;
+
+ // delete the root item, which will cause the model dtor to run
+ // previously, this would crash as it attempted to delete testObj.
+ delete rootItem;
+ }
+
+ {
+ // setting a dynamic role to a QObject value, then triggering
+ // DynamicRoleModelNode::updateValues() to trigger unsafe qobject_cast
+ QQmlEngine eng;
+ QQmlComponent component(&eng, testFileUrl("dynamicroles.qml"));
+ QObject *rootItem = component.create();
+ qWarning() << component.errorString();
+ QVERIFY(component.errorString().isEmpty());
+ QVERIFY(rootItem != 0);
+ QQmlListModel *model = rootItem->findChild<QQmlListModel*>("listModel");
+ QVERIFY(model != 0);
+
+ QMetaObject::invokeMethod(model, "appendNewElement");
+
+ QObject *testObj = new QObject;
+ model->setProperty(0, "obj", QVariant::fromValue<QObject*>(testObj));
+ delete testObj;
+
+ QMetaObject::invokeMethod(model, "setElementAgain");
+
+ delete rootItem;
+ }
+
+ {
+ // setting a dynamic role to a QObject value, then triggering
+ // DynamicRoleModelNodeMetaObject::propertyWrite()
+
+ /*
+ XXX TODO: I couldn't reproduce this one simply - I think it
+ requires a WorkerScript sync() call, and that's non-trivial.
+ I thought I could do it simply via:
+
+ QQmlEngine eng;
+ QQmlComponent component(&eng, testFileUrl("dynamicroles.qml"));
+ QObject *rootItem = component.create();
+ qWarning() << component.errorString();
+ QVERIFY(component.errorString().isEmpty());
+ QVERIFY(rootItem != 0);
+ QQmlListModel *model = rootItem->findChild<QQmlListModel*>("listModel");
+ QVERIFY(model != 0);
+
+ QMetaObject::invokeMethod(model, "appendNewElement");
+
+ QObject *testObj = new QObject;
+ model->setProperty(0, "obj", QVariant::fromValue<QObject*>(testObj));
+ delete testObj;
+ QObject *testObj2 = new QObject;
+ model->setProperty(0, "obj", QVariant::fromValue<QObject*>(testObj2));
+
+ But it turns out that that doesn't work (the setValue() call within
+ setProperty() doesn't seem to trigger the right codepath, for some
+ reason), and you can't trigger it manually via:
+
+ QObject *testObj2 = new QObject;
+ void *a[] = { testObj2, 0 };
+ QMetaObject::metacall(dynamicNodeModel, QMetaObject::WriteProperty, 0, a);
+
+ because the dynamicNodeModel for that index cannot be retrieved
+ using the public API.
+
+ But, anyway, I think the above two test cases are sufficient to
+ show that QObject* values should be guarded internally.
+ */
+ }
+}
+
//QTBUG-15190
void tst_qqmllistmodel::set_model_cache()
{
@@ -1556,6 +1649,24 @@ void tst_qqmllistmodel::crash_append_empty_array()
QCOMPARE(spy.count(), 0);
}
+void tst_qqmllistmodel::dynamic_roles_crash_QTBUG_38907()
+{
+ QQmlEngine eng;
+ QQmlComponent component(&eng, testFileUrl("qtbug38907.qml"));
+ QVERIFY(!component.isError());
+ QScopedPointer<QQuickItem> item(qobject_cast<QQuickItem*>(component.create()));
+ QVERIFY(item != 0);
+
+ QVariant retVal;
+
+ QMetaObject::invokeMethod(item.data(),
+ "exec",
+ Qt::DirectConnection,
+ Q_RETURN_ARG(QVariant, retVal));
+
+ QVERIFY(retVal.toBool());
+}
+
QTEST_MAIN(tst_qqmllistmodel)
#include "tst_qqmllistmodel.moc"
diff --git a/tests/auto/qml/qqmlopenmetaobject/tst_qqmlopenmetaobject.cpp b/tests/auto/qml/qqmlopenmetaobject/tst_qqmlopenmetaobject.cpp
index 7fd4d69b5e..44ce1d6987 100644
--- a/tests/auto/qml/qqmlopenmetaobject/tst_qqmlopenmetaobject.cpp
+++ b/tests/auto/qml/qqmlopenmetaobject/tst_qqmlopenmetaobject.cpp
@@ -53,7 +53,7 @@ void tst_qqmlopenmetaobject::createProperties()
QQmlEngine engine;
CustomObject object;
const QQmlRefPointer<QQmlOpenMetaObjectType> mot = new QQmlOpenMetaObjectType(object.metaObject(), &engine);
- QQmlOpenMetaObject *const mo = new QQmlOpenMetaObject(&object, mot);
+ QQmlOpenMetaObject *const mo = new QQmlOpenMetaObject(&object, mot.data());
mo->setCached(true);
mot->createProperty("customProperty");
QVERIFY(true);
diff --git a/tests/auto/qml/qqmlparser/tst_qqmlparser.cpp b/tests/auto/qml/qqmlparser/tst_qqmlparser.cpp
index ba2b836a6d..ce9d0ac894 100644
--- a/tests/auto/qml/qqmlparser/tst_qqmlparser.cpp
+++ b/tests/auto/qml/qqmlparser/tst_qqmlparser.cpp
@@ -50,6 +50,9 @@ private slots:
void qmlParser();
#endif
void invalidEscapeSequence();
+ void stringLiteral();
+ void noSubstitutionTemplateLiteral();
+ void templateLiteral();
private:
QStringList excludedDirs;
@@ -78,6 +81,13 @@ public:
const quint32 parentBegin = parent->firstSourceLocation().begin();
const quint32 parentEnd = parent->lastSourceLocation().end();
+ if (node->firstSourceLocation().begin() < parentBegin)
+ qDebug() << "first source loc failed: node:" << node->kind << "at" << node->firstSourceLocation().startLine << "/" << node->firstSourceLocation().startColumn
+ << "parent" << parent->kind << "at" << parent->firstSourceLocation().startLine << "/" << parent->firstSourceLocation().startColumn;
+ if (node->lastSourceLocation().end() > parentEnd)
+ qDebug() << "first source loc failed: node:" << node->kind << "at" << node->lastSourceLocation().startLine << "/" << node->lastSourceLocation().startColumn
+ << "parent" << parent->kind << "at" << parent->lastSourceLocation().startLine << "/" << parent->lastSourceLocation().startColumn;
+
QVERIFY(node->firstSourceLocation().begin() >= parentBegin);
QVERIFY(node->lastSourceLocation().end() <= parentEnd);
}
@@ -183,13 +193,12 @@ void tst_qqmlparser::qmlParser()
Lexer lexer(&engine);
lexer.setCode(code, 1, qmlMode);
Parser parser(&engine);
- if (qmlMode)
- parser.parse();
- else
- parser.parseProgram();
+ bool ok = qmlMode ? parser.parse() : parser.parseProgram();
- check::Check chk;
- chk(parser.rootNode());
+ if (ok) {
+ check::Check chk;
+ chk(parser.rootNode());
+ }
}
#endif
@@ -204,6 +213,67 @@ void tst_qqmlparser::invalidEscapeSequence()
parser.parse();
}
+void tst_qqmlparser::stringLiteral()
+{
+ using namespace QQmlJS;
+
+ Engine engine;
+ Lexer lexer(&engine);
+ QLatin1String code("'hello string'");
+ lexer.setCode(code , 1);
+ Parser parser(&engine);
+ QVERIFY(parser.parseExpression());
+ AST::ExpressionNode *expression = parser.expression();
+ QVERIFY(expression);
+ auto *literal = QQmlJS::AST::cast<QQmlJS::AST::StringLiteral *>(expression);
+ QVERIFY(literal);
+ QCOMPARE(literal->value, "hello string");
+ QCOMPARE(literal->firstSourceLocation().begin(), 0);
+ QCOMPARE(literal->lastSourceLocation().end(), code.size());
+}
+
+void tst_qqmlparser::noSubstitutionTemplateLiteral()
+{
+ using namespace QQmlJS;
+
+ Engine engine;
+ Lexer lexer(&engine);
+ QLatin1String code("`hello template`");
+ lexer.setCode(code, 1);
+ Parser parser(&engine);
+ QVERIFY(parser.parseExpression());
+ AST::ExpressionNode *expression = parser.expression();
+ QVERIFY(expression);
+
+ auto *literal = QQmlJS::AST::cast<QQmlJS::AST::TemplateLiteral *>(expression);
+ QVERIFY(literal);
+
+ QCOMPARE(literal->value, "hello template");
+ QCOMPARE(literal->firstSourceLocation().begin(), 0);
+ QCOMPARE(literal->lastSourceLocation().end(), code.size());
+}
+
+void tst_qqmlparser::templateLiteral()
+{
+ using namespace QQmlJS;
+
+ Engine engine;
+ Lexer lexer(&engine);
+ QLatin1String code("`one plus one equals ${1+1}!`");
+ lexer.setCode(code, 1);
+ Parser parser(&engine);
+ QVERIFY(parser.parseExpression());
+ AST::ExpressionNode *expression = parser.expression();
+ QVERIFY(expression);
+
+ auto *templateLiteral = QQmlJS::AST::cast<QQmlJS::AST::TemplateLiteral *>(expression);
+ QVERIFY(templateLiteral);
+
+ QCOMPARE(templateLiteral->firstSourceLocation().begin(), 0);
+ auto *e = templateLiteral->expression;
+ QVERIFY(e);
+}
+
QTEST_MAIN(tst_qqmlparser)
#include "tst_qqmlparser.moc"
diff --git a/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp b/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp
index ef2136bc64..ba7c85df15 100644
--- a/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp
+++ b/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp
@@ -2007,15 +2007,15 @@ void tst_qqmlproperty::warnOnInvalidBinding()
QString expectedWarning;
// V4 error message for property-to-property binding
- expectedWarning = testUrl.toString() + QString::fromLatin1(":6:36: Unable to assign QQuickText to QQuickRectangle");
+ expectedWarning = testUrl.toString() + QString::fromLatin1(":6:5: Unable to assign QQuickText to QQuickRectangle");
QTest::ignoreMessage(QtWarningMsg, expectedWarning.toLatin1().constData());
// V8 error message for function-to-property binding
- expectedWarning = testUrl.toString() + QString::fromLatin1(":7:36: Unable to assign QQuickText to QQuickRectangle");
+ expectedWarning = testUrl.toString() + QString::fromLatin1(":7:5: Unable to assign QQuickText to QQuickRectangle");
QTest::ignoreMessage(QtWarningMsg, expectedWarning.toLatin1().constData());
// V8 error message for invalid binding to anchor
- expectedWarning = testUrl.toString() + QString::fromLatin1(":14:33: Unable to assign QQuickItem_QML_8 to QQuickAnchorLine");
+ expectedWarning = testUrl.toString() + QString::fromLatin1(":14:9: Unable to assign QQuickItem_QML_8 to QQuickAnchorLine");
QTest::ignoreMessage(QtWarningMsg, expectedWarning.toLatin1().constData());
QQmlComponent component(&engine, testUrl);
@@ -2064,14 +2064,15 @@ void tst_qqmlproperty::floatToStringPrecision_data()
QTest::addColumn<QString>("propertyName");
QTest::addColumn<double>("number");
QTest::addColumn<QString>("qtString");
+ QTest::addColumn<QString>("alternateQtString");
QTest::addColumn<QString>("jsString");
- QTest::newRow("3.4") << "a" << 3.4 << "3.4" << "3.4";
- QTest::newRow("0.035003945") << "b" << 0.035003945 << "0.035003945" << "0.035003945";
- QTest::newRow("0.0000012345") << "c" << 0.0000012345 << "1.2345e-06" << "0.0000012345";
- QTest::newRow("0.00000012345") << "d" << 0.00000012345 << "1.2345e-07" << "1.2345e-7";
- QTest::newRow("1e20") << "e" << 1e20 << "1e+20" << "100000000000000000000";
- QTest::newRow("1e21") << "f" << 1e21 << "1e+21" << "1e+21";
+ QTest::newRow("3.4") << "a" << 3.4 << "3.4" << "3.4" << "3.4";
+ QTest::newRow("0.035003945") << "b" << 0.035003945 << "0.035003945" << "0.0035003945" << "0.035003945";
+ QTest::newRow("0.0000012345") << "c" << 0.0000012345 << "1.2345e-6" << "1.2345e-06" << "0.0000012345";
+ QTest::newRow("0.00000012345") << "d" << 0.00000012345 << "1.2345e-7" << "1.2345e-07" << "1.2345e-7";
+ QTest::newRow("1e20") << "e" << 1e20 << "1e+20" << "1e+20" << "100000000000000000000";
+ QTest::newRow("1e21") << "f" << 1e21 << "1e+21" << "1e+21" << "1e+21";
}
void tst_qqmlproperty::floatToStringPrecision()
@@ -2083,15 +2084,24 @@ void tst_qqmlproperty::floatToStringPrecision()
QFETCH(QString, propertyName);
QFETCH(double, number);
QFETCH(QString, qtString);
+ QFETCH(QString, alternateQtString);
QFETCH(QString, jsString);
QByteArray name = propertyName.toLatin1();
QCOMPARE(obj->property(name).toDouble(), number);
- QCOMPARE(obj->property(name).toString(), qtString);
+ if (obj->property(name).toString() != qtString) {
+ QCOMPARE(obj->property(name).toString(), alternateQtString);
+ } else {
+ QCOMPARE(obj->property(name).toString(), qtString);
+ }
QByteArray name1 = (propertyName + QLatin1Char('1')).toLatin1();
QCOMPARE(obj->property(name1).toDouble(), number);
- QCOMPARE(obj->property(name1).toString(), qtString);
+ if (obj->property(name1).toString() != qtString) {
+ QCOMPARE(obj->property(name1).toString(), alternateQtString);
+ } else {
+ QCOMPARE(obj->property(name1).toString(), qtString);
+ }
QByteArray name2 = (propertyName + QLatin1Char('2')).toLatin1();
QCOMPARE(obj->property(name2).toDouble(), number);
diff --git a/tests/auto/qml/qqmlpropertycache/tst_qqmlpropertycache.cpp b/tests/auto/qml/qqmlpropertycache/tst_qqmlpropertycache.cpp
index b9e56b39a2..29f70c4e46 100644
--- a/tests/auto/qml/qqmlpropertycache/tst_qqmlpropertycache.cpp
+++ b/tests/auto/qml/qqmlpropertycache/tst_qqmlpropertycache.cpp
@@ -95,7 +95,7 @@ Q_SIGNALS:
void signalB();
};
-QQmlPropertyData *cacheProperty(QQmlPropertyCache *cache, const char *name)
+QQmlPropertyData *cacheProperty(const QQmlRefPointer<QQmlPropertyCache> &cache, const char *name)
{
return cache->property(QLatin1String(name), nullptr, nullptr);
}
diff --git a/tests/auto/qml/qqmlqt/tst_qqmlqt.cpp b/tests/auto/qml/qqmlqt/tst_qqmlqt.cpp
index b96eecafe8..2d8115e867 100644
--- a/tests/auto/qml/qqmlqt/tst_qqmlqt.cpp
+++ b/tests/auto/qml/qqmlqt/tst_qqmlqt.cpp
@@ -505,8 +505,14 @@ void tst_qqmlqt::font()
QObject *object = component.create();
QVERIFY(object != nullptr);
- QCOMPARE(qvariant_cast<QFont>(object->property("test1")), QFont("Arial", 22));
- QCOMPARE(qvariant_cast<QFont>(object->property("test2")), QFont("Arial", 20, QFont::DemiBold, true));
+ QFont f;
+ f.setFamily("Arial");
+ f.setPointSize(22);
+ QCOMPARE(qvariant_cast<QFont>(object->property("test1")), f);
+ f.setPointSize(20);
+ f.setWeight(QFont::DemiBold);
+ f.setItalic(true);
+ QCOMPARE(qvariant_cast<QFont>(object->property("test2")), f);
QCOMPARE(qvariant_cast<QFont>(object->property("test3")), QFont());
QCOMPARE(qvariant_cast<QFont>(object->property("test4")), QFont());
diff --git a/tests/auto/qml/qqmltranslation/data/translationChange.qml b/tests/auto/qml/qqmltranslation/data/translationChange.qml
index c48a482138..ae3231935c 100644
--- a/tests/auto/qml/qqmltranslation/data/translationChange.qml
+++ b/tests/auto/qml/qqmltranslation/data/translationChange.qml
@@ -3,6 +3,13 @@ import QtQuick 2.0
TranslationChangeBase {
id: root
+ ListModel {
+ id: listModel
+ ListElement {
+ text: qsTr("translate me")
+ }
+ }
+
baseProperty: "do not translate"
property string text1: qsTr("translate me")
function weDoTranslations() {
@@ -10,6 +17,7 @@ TranslationChangeBase {
}
property string text2: weDoTranslations()
property string text3
+ property string fromListModel: listModel.get(0).text
states: [
State {
diff --git a/tests/auto/qml/qqmltranslation/tst_qqmltranslation.cpp b/tests/auto/qml/qqmltranslation/tst_qqmltranslation.cpp
index 1c67ba5541..5042a236d4 100644
--- a/tests/auto/qml/qqmltranslation/tst_qqmltranslation.cpp
+++ b/tests/auto/qml/qqmltranslation/tst_qqmltranslation.cpp
@@ -76,7 +76,7 @@ void tst_qqmltranslation::translation()
if (verifyCompiledData) {
QQmlContext *context = qmlContext(object);
QQmlEnginePrivate *engine = QQmlEnginePrivate::get(context->engine());
- QQmlTypeData *typeData = engine->typeLoader.getType(context->baseUrl());
+ QQmlRefPointer<QQmlTypeData> typeData = engine->typeLoader.getType(context->baseUrl());
QV4::CompiledData::CompilationUnit *compilationUnit = typeData->compilationUnit();
QVERIFY(compilationUnit);
@@ -136,7 +136,7 @@ void tst_qqmltranslation::idTranslation()
{
QQmlContext *context = qmlContext(object);
QQmlEnginePrivate *engine = QQmlEnginePrivate::get(context->engine());
- QQmlTypeData *typeData = engine->typeLoader.getType(context->baseUrl());
+ QQmlRefPointer<QQmlTypeData> typeData = engine->typeLoader.getType(context->baseUrl());
QV4::CompiledData::CompilationUnit *compilationUnit = typeData->compilationUnit();
QVERIFY(compilationUnit);
@@ -195,6 +195,7 @@ void tst_qqmltranslation::translationChange()
QCOMPARE(object->property("text1").toString(), QString::fromUtf8("translate me"));
QCOMPARE(object->property("text2").toString(), QString::fromUtf8("translate me"));
QCOMPARE(object->property("text3").toString(), QString::fromUtf8("translate me"));
+ QCOMPARE(object->property("fromListModel").toString(), QString::fromUtf8("translate me"));
DummyTranslator translator;
QCoreApplication::installTranslator(&translator);
@@ -206,6 +207,7 @@ void tst_qqmltranslation::translationChange()
QCOMPARE(object->property("text1").toString(), QString::fromUtf8("xxx"));
QCOMPARE(object->property("text2").toString(), QString::fromUtf8("xxx"));
QCOMPARE(object->property("text3").toString(), QString::fromUtf8("xxx"));
+ QCOMPARE(object->property("fromListModel").toString(), QString::fromUtf8("xxx"));
QCoreApplication::removeTranslator(&translator);
}
diff --git a/tests/auto/qml/qqmltypeloader/tst_qqmltypeloader.cpp b/tests/auto/qml/qqmltypeloader/tst_qqmltypeloader.cpp
index d336d033a3..cf3bc8b050 100644
--- a/tests/auto/qml/qqmltypeloader/tst_qqmltypeloader.cpp
+++ b/tests/auto/qml/qqmltypeloader/tst_qqmltypeloader.cpp
@@ -87,7 +87,7 @@ void tst_QQMLTypeLoader::trimCache()
QUrl url = testFileUrl("trim_cache.qml");
url.setQuery(QString::number(i));
- QQmlTypeData *data = loader.getType(url);
+ QQmlTypeData *data = loader.getType(url).take();
// Run an event loop to receive the callback that release()es.
QTRY_COMPARE(data->count(), 2);
diff --git a/tests/auto/qml/qqmlvaluetypes/tst_qqmlvaluetypes.cpp b/tests/auto/qml/qqmlvaluetypes/tst_qqmlvaluetypes.cpp
index a456facd2f..1ee4510e30 100644
--- a/tests/auto/qml/qqmlvaluetypes/tst_qqmlvaluetypes.cpp
+++ b/tests/auto/qml/qqmlvaluetypes/tst_qqmlvaluetypes.cpp
@@ -1020,7 +1020,7 @@ void tst_qqmlvaluetypes::bindingAssignment()
// function assignment should fail without crashing
{
- QString warning1 = testFileUrl("bindingAssignment.2.qml").toString() + QLatin1String(":6:13: Invalid use of Qt.binding() in a binding declaration.");
+ QString warning1 = testFileUrl("bindingAssignment.2.qml").toString() + QLatin1String(":6:5: Invalid use of Qt.binding() in a binding declaration.");
QString warning2 = testFileUrl("bindingAssignment.2.qml").toString() + QLatin1String(":10: Cannot assign JavaScript function to value-type property");
QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
@@ -1125,7 +1125,7 @@ void tst_qqmlvaluetypes::autoBindingRemoval()
{
QQmlComponent component(&engine, testFileUrl("autoBindingRemoval.3.qml"));
- QString warning = component.url().toString() + ":6:11: Unable to assign [undefined] to QRect";
+ QString warning = component.url().toString() + ":6:5: Unable to assign [undefined] to QRect";
QTest::ignoreMessage(QtWarningMsg, qPrintable(warning));
MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
QVERIFY(object != nullptr);
diff --git a/tests/auto/qml/qv4identifiertable/qv4identifiertable.pro b/tests/auto/qml/qv4identifiertable/qv4identifiertable.pro
new file mode 100644
index 0000000000..64dc822367
--- /dev/null
+++ b/tests/auto/qml/qv4identifiertable/qv4identifiertable.pro
@@ -0,0 +1,8 @@
+CONFIG += testcase
+TARGET = tst_qv4identifiertable
+macos:CONFIG -= app_bundle
+
+SOURCES += tst_qv4identifiertable.cpp
+
+QT += qml qml-private testlib
+
diff --git a/tests/auto/qml/qv4identifiertable/tst_qv4identifiertable.cpp b/tests/auto/qml/qv4identifiertable/tst_qv4identifiertable.cpp
new file mode 100644
index 0000000000..b2908ac5bb
--- /dev/null
+++ b/tests/auto/qml/qv4identifiertable/tst_qv4identifiertable.cpp
@@ -0,0 +1,305 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 basysKom GmbH.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qtest.h>
+#include <QQmlEngine>
+#include <private/qv4identifiertable_p.h>
+
+class tst_qv4identifiertable : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void sweepFirstEntryInBucket();
+ void sweepCenterEntryInBucket();
+ void sweepLastEntryInBucket();
+ void sweepFirstEntryInSameBucketWithDifferingHash();
+ void dontSweepAcrossBucketBoundaries();
+ void sweepAcrossBucketBoundariesIfFirstBucketFull();
+};
+
+void tst_qv4identifiertable::sweepFirstEntryInBucket()
+{
+ QV4::ExecutionEngine engine;
+ QV4::IdentifierTable table(&engine, /*numBits*/1);
+
+ auto entry1 = engine.newString(QStringLiteral("one"));
+ auto entry2 = engine.newString(QStringLiteral("two"));
+ auto entry3 = engine.newString(QStringLiteral("three"));
+
+ entry1->createHashValue();
+ entry2->createHashValue();
+ entry3->createHashValue();
+
+ // All strings go into the same bucket
+ entry1->stringHash = 0;
+ entry2->stringHash = 0;
+ entry3->stringHash = 0;
+
+ // trigger insertion
+ table.asPropertyKey(entry1);
+ table.asPropertyKey(entry2);
+ table.asPropertyKey(entry3);
+
+ QCOMPARE(table.size, 3);
+ QCOMPARE(table.alloc, 5);
+
+ QCOMPARE(table.entriesByHash[0], entry1);
+ QCOMPARE(table.entriesByHash[1], entry2);
+ QCOMPARE(table.entriesByHash[2], entry3);
+ QCOMPARE(table.entriesByHash[3], nullptr);
+
+ // first entry not marked
+ entry2->setMarkBit();
+ entry3->setMarkBit();
+
+ table.sweep();
+
+ QCOMPARE(table.entriesByHash[0], entry2);
+ QCOMPARE(table.entriesByHash[1], entry3);
+ QCOMPARE(table.entriesByHash[2], nullptr);
+ QCOMPARE(table.entriesByHash[3], nullptr);
+}
+
+void tst_qv4identifiertable::sweepCenterEntryInBucket()
+{
+ QV4::ExecutionEngine engine;
+ QV4::IdentifierTable table(&engine, /*numBits*/1);
+
+ auto entry1 = engine.newString(QStringLiteral("one"));
+ auto entry2 = engine.newString(QStringLiteral("two"));
+ auto entry3 = engine.newString(QStringLiteral("three"));
+
+ entry1->createHashValue();
+ entry2->createHashValue();
+ entry3->createHashValue();
+
+ // All strings go into the same bucket
+ entry1->stringHash = 0;
+ entry2->stringHash = 0;
+ entry3->stringHash = 0;
+
+ // trigger insertion
+ table.asPropertyKey(entry1);
+ table.asPropertyKey(entry2);
+ table.asPropertyKey(entry3);
+
+ QCOMPARE(table.size, 3);
+ QCOMPARE(table.alloc, 5);
+
+ QCOMPARE(table.entriesByHash[0], entry1);
+ QCOMPARE(table.entriesByHash[1], entry2);
+ QCOMPARE(table.entriesByHash[2], entry3);
+ QCOMPARE(table.entriesByHash[3], nullptr);
+
+ entry1->setMarkBit();
+ // second entry not marked
+ entry3->setMarkBit();
+
+ table.sweep();
+
+ QCOMPARE(table.entriesByHash[0], entry1);
+ QCOMPARE(table.entriesByHash[1], entry3);
+ QCOMPARE(table.entriesByHash[2], nullptr);
+ QCOMPARE(table.entriesByHash[3], nullptr);
+}
+
+void tst_qv4identifiertable::sweepLastEntryInBucket()
+{
+ QV4::ExecutionEngine engine;
+ QV4::IdentifierTable table(&engine, /*numBits*/1);
+
+ auto entry1 = engine.newString(QStringLiteral("one"));
+ auto entry2 = engine.newString(QStringLiteral("two"));
+ auto entry3 = engine.newString(QStringLiteral("three"));
+
+ entry1->createHashValue();
+ entry2->createHashValue();
+ entry3->createHashValue();
+
+ // All strings go into the same bucket
+ entry1->stringHash = 0;
+ entry2->stringHash = 0;
+ entry3->stringHash = 0;
+
+ // trigger insertion
+ table.asPropertyKey(entry1);
+ table.asPropertyKey(entry2);
+ table.asPropertyKey(entry3);
+
+ QCOMPARE(table.size, 3);
+ QCOMPARE(table.alloc, 5);
+
+ QCOMPARE(table.entriesByHash[0], entry1);
+ QCOMPARE(table.entriesByHash[1], entry2);
+ QCOMPARE(table.entriesByHash[2], entry3);
+ QCOMPARE(table.entriesByHash[3], nullptr);
+
+ entry1->setMarkBit();
+ entry2->setMarkBit();
+ // third entry not marked
+
+ table.sweep();
+
+ QCOMPARE(table.entriesByHash[0], entry1);
+ QCOMPARE(table.entriesByHash[1], entry2);
+ QCOMPARE(table.entriesByHash[2], nullptr);
+ QCOMPARE(table.entriesByHash[3], nullptr);
+}
+
+void tst_qv4identifiertable::sweepFirstEntryInSameBucketWithDifferingHash()
+{
+ QV4::ExecutionEngine engine;
+ QV4::IdentifierTable table(&engine, /*numBits*/1);
+
+ auto entry1 = engine.newString(QStringLiteral("one"));
+ auto entry2 = engine.newString(QStringLiteral("two"));
+
+ entry1->createHashValue();
+ entry2->createHashValue();
+
+ // First and second entry have differing hash but end up in the
+ // same bucket after modulo alloc.
+ entry1->stringHash = 0;
+ entry2->stringHash = 5;
+
+ // trigger insertion
+ table.asPropertyKey(entry1);
+ table.asPropertyKey(entry2);
+
+ QCOMPARE(table.size, 2);
+ QCOMPARE(table.alloc, 5);
+
+ QCOMPARE(table.entriesByHash[0], entry1);
+ QCOMPARE(table.entriesByHash[1], entry2);
+ QCOMPARE(table.entriesByHash[2], nullptr);
+
+ // first entry not marked
+ entry2->setMarkBit();
+
+ table.sweep();
+
+ QCOMPARE(table.entriesByHash[0], entry2);
+ QCOMPARE(table.entriesByHash[1], nullptr);
+ QCOMPARE(table.entriesByHash[2], nullptr);
+}
+
+void tst_qv4identifiertable::dontSweepAcrossBucketBoundaries()
+{
+ QV4::ExecutionEngine engine;
+ QV4::IdentifierTable table(&engine, /*numBits*/1);
+
+ auto entry1 = engine.newString(QStringLiteral("one"));
+ auto entry2 = engine.newString(QStringLiteral("two"));
+ auto entry3 = engine.newString(QStringLiteral("three"));
+
+ entry1->createHashValue();
+ entry2->createHashValue();
+ entry3->createHashValue();
+
+ // Different buckets for both entries.
+ entry1->stringHash = 0;
+ entry2->stringHash = 1;
+
+ // trigger insertion
+ table.asPropertyKey(entry1);
+ table.asPropertyKey(entry2);
+
+ QCOMPARE(table.size, 2);
+ QCOMPARE(table.alloc, 5);
+
+ QCOMPARE(table.entriesByHash[0], entry1);
+ QCOMPARE(table.entriesByHash[1], entry2);
+ QCOMPARE(table.entriesByHash[2], nullptr);
+
+ // first entry not marked
+ entry2->setMarkBit();
+
+ table.sweep();
+
+ QCOMPARE(table.entriesByHash[0], nullptr);
+ QCOMPARE(table.entriesByHash[1], entry2);
+ QCOMPARE(table.entriesByHash[2], nullptr);
+}
+
+void tst_qv4identifiertable::sweepAcrossBucketBoundariesIfFirstBucketFull()
+{
+ QV4::ExecutionEngine engine;
+ QV4::IdentifierTable table(&engine, /*numBits*/3);
+
+ auto entry1 = engine.newString(QStringLiteral("one"));
+ auto entry2 = engine.newString(QStringLiteral("two"));
+ auto entry3 = engine.newString(QStringLiteral("three"));
+ auto entry4 = engine.newString(QStringLiteral("four"));
+
+ entry1->createHashValue();
+ entry2->createHashValue();
+ entry3->createHashValue();
+ entry4->createHashValue();
+
+ // First, third and fourth entry have the same bucket (after modulo) and
+ // would typically end up in order [entry1, entry3, entry4, entry2]. However
+ // since null termination isn't guaranteed, an insertion order of
+ // entry1, entry2, entry3 and entry4 results in a
+ // table [entry1, entry2, entry3, entry4].
+ entry1->stringHash = 0;
+ entry2->stringHash = 1;
+ entry3->stringHash = 11;
+ entry4->stringHash = 11;
+
+ // trigger insertion
+ table.asPropertyKey(entry1);
+ table.asPropertyKey(entry2);
+ table.asPropertyKey(entry3);
+ table.asPropertyKey(entry4);
+
+ QCOMPARE(table.size, 4);
+ QCOMPARE(table.alloc, 11);
+
+ QCOMPARE(table.entriesByHash[0], entry1);
+ QCOMPARE(table.entriesByHash[1], entry2);
+ QCOMPARE(table.entriesByHash[2], entry3);
+ QCOMPARE(table.entriesByHash[3], entry4);
+ QCOMPARE(table.entriesByHash[4], nullptr);
+
+ // first entry not marked
+ entry2->setMarkBit();
+ entry3->setMarkBit();
+ entry4->setMarkBit();
+
+ table.sweep();
+
+ QCOMPARE(table.entriesByHash[0], entry3);
+ QCOMPARE(table.entriesByHash[1], entry2);
+ QCOMPARE(table.entriesByHash[2], entry4);
+ QCOMPARE(table.entriesByHash[3], nullptr);
+}
+
+QTEST_MAIN(tst_qv4identifiertable)
+
+#include "tst_qv4identifiertable.moc"
diff --git a/tests/auto/qml/qv4mm/tst_qv4mm.cpp b/tests/auto/qml/qv4mm/tst_qv4mm.cpp
index d4ba363d00..07f8e9f1d1 100644
--- a/tests/auto/qml/qv4mm/tst_qv4mm.cpp
+++ b/tests/auto/qml/qv4mm/tst_qv4mm.cpp
@@ -28,6 +28,7 @@
#include <qtest.h>
#include <QQmlEngine>
+#include <QLoggingCategory>
#include <private/qv4mm_p.h>
class tst_qv4mm : public QObject
@@ -36,23 +37,15 @@ class tst_qv4mm : public QObject
private slots:
void gcStats();
- void tweaks();
};
void tst_qv4mm::gcStats()
{
- qputenv(QV4_MM_STATS, "1");
+ QLoggingCategory::setFilterRules("qt.qml.gc.*=true");
QQmlEngine engine;
engine.collectGarbage();
}
-void tst_qv4mm::tweaks()
-{
- qputenv(QV4_MM_MAXBLOCK_SHIFT, "5");
- qputenv(QV4_MM_MAX_CHUNK_SIZE, "65536");
- QQmlEngine engine;
-}
-
QTEST_MAIN(tst_qv4mm)
#include "tst_qv4mm.moc"
diff --git a/tests/auto/qmltest/rectangle/tst_rectangle.qml b/tests/auto/qmltest/rectangle/tst_rectangle.qml
index 9af55b6a79..cf57da0d73 100644
--- a/tests/auto/qmltest/rectangle/tst_rectangle.qml
+++ b/tests/auto/qmltest/rectangle/tst_rectangle.qml
@@ -48,7 +48,7 @@
**
****************************************************************************/
-import QtQuick 2.0
+import QtQuick 2.12
import QtTest 1.1
Item {
@@ -83,6 +83,17 @@ Item {
}
Rectangle {
+ id: horizontalGradient
+ width: 300
+ height: 100
+ gradient: Gradient {
+ orientation: Gradient.Horizontal
+ GradientStop { position: 0.0; color: "red" }
+ GradientStop { position: 1.0; color: "green" }
+ }
+ }
+
+ Rectangle {
id: rectangleborder
width: 300
height: 150
@@ -132,8 +143,18 @@ Item {
compare(gstops[0].color.toString(), "#ff0000")
compare(gstops[1].color.toString(), "#ffff00")
compare(gstops[2].color.toString(), "#008000")
+ compare(grad.orientation, Gradient.Vertical)
+ }
+
+ function test_horizontalGradient() {
+ var grad = horizontalGradient.gradient;
+ var gstops = grad.stops;
+ compare(gstops[0].color.toString(), "#ff0000")
+ compare(gstops[1].color.toString(), "#008000")
+ compare(grad.orientation, Gradient.Horizontal)
}
+
function test_borders() {
compare(rectangleborder.border.width, 1)
compare(rectangleborder.border.color.toString(), "#808080")
diff --git a/tests/auto/quick/examples/tst_examples.cpp b/tests/auto/quick/examples/tst_examples.cpp
index eee8dfcf26..ea8830fefa 100644
--- a/tests/auto/quick/examples/tst_examples.cpp
+++ b/tests/auto/quick/examples/tst_examples.cpp
@@ -74,7 +74,6 @@ tst_examples::tst_examples()
{
// Add files to exclude here
excludedFiles << "snippets/qml/listmodel/listmodel.qml"; //Just a ListModel, no root QQuickItem
- excludedFiles << "examples/quick/demos/photosurface/photosurface.qml"; // root item is Window rather than Item
// Add directories you want excluded here
excludedDirs << "shared"; //Not an example
@@ -91,9 +90,6 @@ tst_examples::tst_examples()
excludedFiles << "examples/quick/shapes/content/interactive.qml"; // relies on resources
#ifdef QT_NO_XMLPATTERNS
- excludedDirs << "demos/twitter";
- excludedDirs << "demos/flickr";
- excludedDirs << "demos/photoviewer";
excludedFiles << "snippets/qml/xmlrole.qml";
excludedFiles << "particles/itemparticle/particleview.qml";
excludedFiles << "views/visualdatamodel/slideshow.qml";
diff --git a/tests/auto/quick/pointerhandlers/flickableinterop/data/GrooveDragSlider.qml b/tests/auto/quick/pointerhandlers/flickableinterop/data/GrooveDragSlider.qml
new file mode 100644
index 0000000000..485c6ce914
--- /dev/null
+++ b/tests/auto/quick/pointerhandlers/flickableinterop/data/GrooveDragSlider.qml
@@ -0,0 +1,123 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.8
+import Qt.labs.handlers 1.0
+
+Item {
+ id: root
+ property int value: 50
+ property int maximumValue: 99
+ property alias label: label.text
+ property alias tapEnabled: tap.enabled
+ property alias pressed: tap.pressed
+ signal tapped
+
+ DragHandler {
+ id: dragHandler
+ objectName: root.objectName + " DragHandler"
+ target: knob
+ xAxis.enabled: false
+ yAxis.minimum: slot.y
+ yAxis.maximum: slot.height + slot.y - knob.height
+ }
+
+ Rectangle {
+ id: slot
+ anchors.top: parent.top
+ anchors.bottom: parent.bottom
+ anchors.margins: 10
+ anchors.topMargin: 30
+ anchors.bottomMargin: 30
+ anchors.horizontalCenter: parent.horizontalCenter
+ width: 10
+ color: "black"
+ radius: width / 2
+ smooth: true
+ }
+
+ Rectangle {
+ id: glow
+ anchors.fill: knob
+ anchors.margins: -5
+ anchors.leftMargin: -2
+ anchors.horizontalCenterOffset: 1
+ radius: 5
+ color: "#4400FFFF"
+ opacity: tap.pressed || tapFlash.running ? 1 : 0
+ FlashAnimation on visible {
+ id: tapFlash
+ }
+ }
+ Rectangle {
+ id: knob
+ objectName: "Slider Knob"
+ width: parent.width - 2
+ height: 20
+ radius: 5
+ color: "darkgray"
+ border.color: "black"
+ property bool programmatic: false
+ property real multiplier: root.maximumValue / (dragHandler.yAxis.maximum - dragHandler.yAxis.minimum)
+ onYChanged: if (!programmatic) root.value = root.maximumValue - (knob.y - dragHandler.yAxis.minimum) * multiplier
+ transformOrigin: Item.Center
+ function setValue(value) { knob.y = dragHandler.yAxis.maximum - value / knob.multiplier }
+ TapHandler {
+ id: tap
+ objectName: root.objectName + " TapHandler"
+ gesturePolicy: TapHandler.DragThreshold
+ onTapped: {
+ tapFlash.start()
+ root.tapped
+ }
+ }
+ }
+
+ Text {
+ color: "red"
+ anchors.top: slot.bottom
+ anchors.horizontalCenter: parent.horizontalCenter
+ text: root.value
+ }
+
+ Text {
+ id: label
+ font.pointSize: 9
+ color: "red"
+ anchors.bottom: slot.top
+ anchors.bottomMargin: 5
+ anchors.horizontalCenter: parent.horizontalCenter
+ verticalAlignment: Text.AlignBottom
+ }
+
+ Component.onCompleted: {
+ knob.programmatic = true
+ knob.setValue(root.value)
+ knob.programmatic = false
+ }
+}
diff --git a/tests/auto/quick/pointerhandlers/flickableinterop/data/Slider.qml b/tests/auto/quick/pointerhandlers/flickableinterop/data/KnobDragSlider.qml
index f6acd53615..7f6535651c 100644
--- a/tests/auto/quick/pointerhandlers/flickableinterop/data/Slider.qml
+++ b/tests/auto/quick/pointerhandlers/flickableinterop/data/KnobDragSlider.qml
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2017 The Qt Company Ltd.
+** Copyright (C) 2018 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the test suite of the Qt Toolkit.
@@ -80,14 +80,14 @@ Item {
function setValue(value) { knob.y = dragHandler.yAxis.maximum - value / knob.multiplier }
DragHandler {
id: dragHandler
- objectName: label.text + " DragHandler"
+ objectName: root.objectName + " DragHandler"
xAxis.enabled: false
yAxis.minimum: slot.y
yAxis.maximum: slot.height + slot.y - knob.height
}
TapHandler {
id: tap
- objectName: label.text + " TapHandler"
+ objectName: root.objectName + " TapHandler"
gesturePolicy: TapHandler.DragThreshold
onTapped: {
tapFlash.start()
@@ -97,20 +97,20 @@ Item {
}
Text {
- font.pointSize: 16
color: "red"
- anchors.bottom: parent.bottom
+ anchors.top: slot.bottom
anchors.horizontalCenter: parent.horizontalCenter
text: root.value
}
Text {
id: label
- font.pointSize: 12
+ font.pointSize: 9
color: "red"
- anchors.top: parent.top
- anchors.topMargin: 5
+ anchors.bottom: slot.top
+ anchors.bottomMargin: 5
anchors.horizontalCenter: parent.horizontalCenter
+ verticalAlignment: Text.AlignBottom
}
Component.onCompleted: {
diff --git a/tests/auto/quick/pointerhandlers/flickableinterop/data/flickableWithHandlers.qml b/tests/auto/quick/pointerhandlers/flickableinterop/data/flickableWithHandlers.qml
index 7d7f53dd15..8adec58621 100644
--- a/tests/auto/quick/pointerhandlers/flickableinterop/data/flickableWithHandlers.qml
+++ b/tests/auto/quick/pointerhandlers/flickableinterop/data/flickableWithHandlers.qml
@@ -46,10 +46,15 @@ Rectangle {
Row {
spacing: 6
- Slider {
- label: "DragHandler"
- objectName: "Slider"
- value: 49; width: 100; height: 400
+ KnobDragSlider {
+ label: "Slider with\nDH on knob"
+ objectName: "knobSlider"
+ value: 49; width: 120; height: 400
+ }
+ GrooveDragSlider {
+ label: "Slider with\nDH on root"
+ objectName: "grooveSlider"
+ value: 49; width: 120; height: 400
}
Column {
spacing: 6
@@ -80,6 +85,7 @@ Rectangle {
objectName: "drag"
DragHandler {
id: drag1
+ objectName: "drag1"
}
Text {
anchors.centerIn: parent
@@ -96,6 +102,7 @@ Rectangle {
border.width: 3
TapHandler {
id: tap1
+ objectName: "tap1"
gesturePolicy: TapHandler.DragThreshold
}
Text {
@@ -113,9 +120,11 @@ Rectangle {
objectName: "dragAndTap"
DragHandler {
id: drag2
+ objectName: "drag2"
}
TapHandler {
id: tap2
+ objectName: "tap2"
gesturePolicy: TapHandler.DragThreshold
}
Text {
@@ -133,10 +142,12 @@ Rectangle {
objectName: "tapAndDrag"
TapHandler {
id: tap3
+ objectName: "tap3"
gesturePolicy: TapHandler.DragThreshold
}
DragHandler {
id: drag3
+ objectName: "drag3"
}
Text {
anchors.centerIn: parent
diff --git a/tests/auto/quick/pointerhandlers/flickableinterop/tst_flickableinterop.cpp b/tests/auto/quick/pointerhandlers/flickableinterop/tst_flickableinterop.cpp
index f3513881cd..6aa2eaa3cb 100644
--- a/tests/auto/quick/pointerhandlers/flickableinterop/tst_flickableinterop.cpp
+++ b/tests/auto/quick/pointerhandlers/flickableinterop/tst_flickableinterop.cpp
@@ -69,6 +69,7 @@ private slots:
void mouseDragFlickableBehindButton();
void touchDragSlider();
void touchDragFlickableBehindSlider();
+ void mouseDragSlider_data();
void mouseDragSlider();
void mouseDragFlickableBehindSlider();
void touchDragFlickableBehindItemWithHandlers_data();
@@ -293,7 +294,7 @@ void tst_FlickableInterop::touchDragSlider()
createView(windowPtr, "flickableWithHandlers.qml");
QQuickView * window = windowPtr.data();
- QQuickItem *slider = window->rootObject()->findChild<QQuickItem*>("Slider");
+ QQuickItem *slider = window->rootObject()->findChild<QQuickItem*>("knobSlider");
QVERIFY(slider);
QQuickDragHandler *drag = slider->findChild<QQuickDragHandler*>();
QVERIFY(drag);
@@ -339,6 +340,26 @@ void tst_FlickableInterop::touchDragSlider()
QCOMPARE(translationChangedSpy.count(), 1);
}
+void tst_FlickableInterop::mouseDragSlider_data()
+{
+ QTest::addColumn<QString>("nameOfSliderToDrag");
+ QTest::addColumn<QPoint>("pressPositionRelativeToKnob");
+ QTest::addColumn<QPoint>("dragDirection"); // a unit vector
+ QTest::addColumn<bool>("expectedTapHandlerPressed");
+ QTest::addColumn<bool>("expectedDragHandlerActive");
+ QTest::addColumn<bool>("expectedFlickableMoving");
+
+ QTest::newRow("drag down on knob of knobSlider") << "knobSlider" << QPoint(0, 0) << QPoint(0, 1) << true << true << false;
+ QTest::newRow("drag sideways on knob of knobSlider") << "knobSlider" << QPoint(0, 0) << QPoint(1, 0) << true << false << true;
+ QTest::newRow("drag down on groove of knobSlider") << "knobSlider" << QPoint(0, 20) << QPoint(0, 1) << false << false << true;
+ QTest::newRow("drag sideways on groove of knobSlider") << "knobSlider" << QPoint(0, 20) << QPoint(1, 0) << false << false << true;
+
+ QTest::newRow("drag down on knob of grooveSlider") << "grooveSlider" << QPoint(0, 0) << QPoint(0, 1) << true << true << false;
+ QTest::newRow("drag sideways on knob of grooveSlider") << "grooveSlider" << QPoint(0, 0) << QPoint(1, 0) << true << false << true;
+ QTest::newRow("drag down on groove of grooveSlider") << "grooveSlider" << QPoint(0, 20) << QPoint(0, 1) << false << true << false;
+ QTest::newRow("drag sideways on groove of grooveSlider") << "grooveSlider" << QPoint(0, 20) << QPoint(1, 0) << false << false << true;
+}
+
void tst_FlickableInterop::mouseDragSlider()
{
const int dragThreshold = QGuiApplication::styleHints()->startDragDistance();
@@ -346,7 +367,14 @@ void tst_FlickableInterop::mouseDragSlider()
createView(windowPtr, "flickableWithHandlers.qml");
QQuickView * window = windowPtr.data();
- QQuickItem *slider = window->rootObject()->findChild<QQuickItem*>("Slider");
+ QFETCH(QString, nameOfSliderToDrag);
+ QFETCH(QPoint, pressPositionRelativeToKnob);
+ QFETCH(QPoint, dragDirection); // a unit vector
+ QFETCH(bool, expectedTapHandlerPressed);
+ QFETCH(bool, expectedDragHandlerActive);
+ QFETCH(bool, expectedFlickableMoving);
+
+ QQuickItem *slider = window->rootObject()->findChild<QQuickItem*>(nameOfSliderToDrag);
QVERIFY(slider);
QQuickDragHandler *drag = slider->findChild<QQuickDragHandler*>();
QVERIFY(drag);
@@ -357,33 +385,40 @@ void tst_FlickableInterop::mouseDragSlider()
QSignalSpy tappedSpy(knob->parent(), SIGNAL(tapped()));
QSignalSpy translationChangedSpy(drag, SIGNAL(translationChanged()));
- // Drag the slider in the allowed (vertical) direction
+ // Drag the slider
tappedSpy.clear();
- QPoint p1 = knob->mapToScene(knob->clipRect().center()).toPoint();
+ QPoint p1 = knob->mapToScene(knob->clipRect().center()).toPoint() + pressPositionRelativeToKnob;
QTest::mousePress(window, Qt::LeftButton, Qt::NoModifier, p1);
- QTRY_VERIFY(slider->property("pressed").toBool());
- p1 += QPoint(0, dragThreshold);
+ QTRY_COMPARE(slider->property("pressed").toBool(), expectedTapHandlerPressed);
+ p1 += QPoint(dragThreshold * dragDirection.x(), dragThreshold * dragDirection.y());
QTest::mouseMove(window, p1);
- QVERIFY(slider->property("pressed").toBool());
+ QCOMPARE(drag->active(), false);
+ QCOMPARE(slider->property("pressed").toBool(), expectedTapHandlerPressed);
QCOMPARE(slider->property("value").toInt(), 49);
- p1 += QPoint(0, 1);
+ p1 += dragDirection; // one more pixel
QTest::mouseMove(window, p1);
- p1 += QPoint(0, 10);
+ QCOMPARE(drag->active(), expectedDragHandlerActive);
+ // drag farther, to make sure the knob gets adjusted significantly
+ p1 += QPoint(10 * dragDirection.x(), 10 * dragDirection.y());
QTest::mouseMove(window, p1);
- QVERIFY(slider->property("value").toInt() < 49);
- QVERIFY(!flickable->isMoving());
- QVERIFY(!slider->property("pressed").toBool());
+ if (expectedDragHandlerActive && dragDirection.y() > 0)
+ QVERIFY(slider->property("value").toInt() < 49);
+ // by now, Flickable will have stolen the grab, if it decided that it wanted to during filtering of the last event
+ QCOMPARE(flickable->isMoving(), expectedFlickableMoving);
+ QCOMPARE(slider->property("pressed").toBool(), false);
- // Now that the DragHandler is active, the Flickable will not steal the grab
+ // If the DragHandler is active, the Flickable will not steal the grab
// even if we move a large distance horizontally
- p1 += QPoint(dragThreshold * 2, 0);
- QTest::mouseMove(window, p1);
- QVERIFY(!flickable->isMoving());
+ if (expectedDragHandlerActive) {
+ p1 += QPoint(dragThreshold * 2, 0);
+ QTest::mouseMove(window, p1);
+ QCOMPARE(flickable->isMoving(), false);
+ }
// Release, and do not expect the tapped signal
QTest::mouseRelease(window, Qt::LeftButton, Qt::NoModifier, p1);
QCOMPARE(tappedSpy.count(), 0);
- QCOMPARE(translationChangedSpy.count(), 1);
+ QCOMPARE(translationChangedSpy.count(), expectedDragHandlerActive ? 1 : 0);
}
void tst_FlickableInterop::touchDragFlickableBehindSlider()
@@ -393,7 +428,7 @@ void tst_FlickableInterop::touchDragFlickableBehindSlider()
createView(windowPtr, "flickableWithHandlers.qml");
QQuickView * window = windowPtr.data();
- QQuickItem *slider = window->rootObject()->findChild<QQuickItem*>("Slider");
+ QQuickItem *slider = window->rootObject()->findChild<QQuickItem*>("knobSlider");
QVERIFY(slider);
QQuickDragHandler *drag = slider->findChild<QQuickDragHandler*>();
QVERIFY(drag);
@@ -439,7 +474,7 @@ void tst_FlickableInterop::mouseDragFlickableBehindSlider()
createView(windowPtr, "flickableWithHandlers.qml");
QQuickView * window = windowPtr.data();
- QQuickItem *slider = window->rootObject()->findChild<QQuickItem*>("Slider");
+ QQuickItem *slider = window->rootObject()->findChild<QQuickItem*>("knobSlider");
QVERIFY(slider);
QQuickDragHandler *drag = slider->findChild<QQuickDragHandler*>();
QVERIFY(drag);
@@ -568,7 +603,7 @@ void tst_FlickableInterop::touchDragSliderAndFlickable()
createView(windowPtr, "flickableWithHandlers.qml");
QQuickView * window = windowPtr.data();
- QQuickItem *slider = window->rootObject()->findChild<QQuickItem*>("Slider");
+ QQuickItem *slider = window->rootObject()->findChild<QQuickItem*>("knobSlider");
QVERIFY(slider);
QQuickDragHandler *drag = slider->findChild<QQuickDragHandler*>();
QVERIFY(drag);
@@ -576,6 +611,7 @@ void tst_FlickableInterop::touchDragSliderAndFlickable()
QVERIFY(knob);
QQuickFlickable *flickable = window->rootObject()->findChild<QQuickFlickable*>();
QVERIFY(flickable);
+ QTest::QTouchEventSequence touchSeq = QTest::touchEvent(window, touchDevice, false);
// The knob is initially centered over the slider's "groove"
qreal initialXOffset = qAbs(knob->mapToScene(knob->clipRect().center()).x() - slider->mapToScene
@@ -584,57 +620,36 @@ void tst_FlickableInterop::touchDragSliderAndFlickable()
// Drag the slider in the allowed (vertical) direction with one finger
QPoint p1 = knob->mapToScene(knob->clipRect().center()).toPoint();
- QTest::touchEvent(window, touchDevice).press(1, p1, window);
+ touchSeq.press(1, p1, window).commit();
QQuickTouchUtils::flush(window);
p1 += QPoint(0, dragThreshold);
- QTest::touchEvent(window, touchDevice).move(1, p1, window);
+ touchSeq.move(1, p1, window).commit();
QQuickTouchUtils::flush(window);
p1 += QPoint(0, dragThreshold);
- QTest::touchEvent(window, touchDevice).move(1, p1, window);
+ touchSeq.move(1, p1, window).commit();
QQuickTouchUtils::flush(window);
p1 += QPoint(0, dragThreshold);
- QTest::touchEvent(window, touchDevice).move(1, p1, window);
+ touchSeq.move(1, p1, window).commit();
QQuickTouchUtils::flush(window);
QTRY_VERIFY(slider->property("value").toInt() < 49);
QVERIFY(!flickable->isMoving());
// Drag the Flickable with a second finger
QPoint p2(300,300);
- QTest::touchEvent(window, touchDevice).stationary(1).press(2, p2, window);
- QQuickTouchUtils::flush(window);
- p1 += QPoint(-10, -10);
- p2 += QPoint(dragThreshold, 0);
- QTest::touchEvent(window, touchDevice).move(1, p1, window).stationary(2);
- QQuickTouchUtils::flush(window);
- p1 += QPoint(-10, -10);
- p2 += QPoint(dragThreshold, 0);
- QTest::touchEvent(window, touchDevice).stationary(1).move(2, p2, window);
+ touchSeq.stationary(1).press(2, p2, window).commit();
QQuickTouchUtils::flush(window);
- p1 += QPoint(-10, -10);
- p2 += QPoint(dragThreshold, 0);
- QTest::touchEvent(window, touchDevice).move(1, p1, window).stationary(2);
- QQuickTouchUtils::flush(window);
- p1 += QPoint(-10, -10);
- p2 += QPoint(dragThreshold, 0);
- QTest::touchEvent(window, touchDevice).stationary(1).move(2, p2, window);
- QQuickTouchUtils::flush(window);
- p1 += QPoint(-10, -10);
- p2 += QPoint(dragThreshold, 0);
- QTest::touchEvent(window, touchDevice).move(1, p1, window).stationary(2);
- QQuickTouchUtils::flush(window);
- p1 += QPoint(-10, -10);
- p2 += QPoint(dragThreshold, 0);
- QTest::touchEvent(window, touchDevice).stationary(1).move(2, p2, window);
- QQuickTouchUtils::flush(window);
- p1 += QPoint(-10, -10);
- p2 += QPoint(dragThreshold, 0);
- QTest::touchEvent(window, touchDevice).move(1, p1, window).stationary(2);
- QQuickTouchUtils::flush(window);
- p1 += QPoint(-10, -10);
- p2 += QPoint(dragThreshold, 0);
- QTest::touchEvent(window, touchDevice).stationary(1).move(2, p2, window);
- QQuickTouchUtils::flush(window);
- QTRY_VERIFY(flickable->isMoving());
+ for (int i = 0; i < 4; ++i) {
+ p1 += QPoint(-10, -10);
+ p2 += QPoint(dragThreshold, 0);
+ touchSeq.move(1, p1, window).stationary(2).commit();
+ QQuickTouchUtils::flush(window);
+ p1 += QPoint(-10, -10);
+ p2 += QPoint(dragThreshold, 0);
+ touchSeq.stationary(1).move(2, p2, window).commit();
+ QQuickTouchUtils::flush(window);
+ qCDebug(lcPointerTests) << "step" << i << ": fingers @" << p1 << p2 << "is Flickable moving yet?" << flickable->isMoving();
+ }
+ QVERIFY(flickable->isMoving());
qreal knobSliderXOffset = qAbs(knob->mapToScene(knob->clipRect().center()).toPoint().x() -
slider->mapToScene(slider->clipRect().center()).toPoint().x()) - initialXOffset;
if (knobSliderXOffset > 1)
@@ -643,7 +658,7 @@ void tst_FlickableInterop::touchDragSliderAndFlickable()
QVERIFY(qAbs(knobSliderXOffset) <= 1);
// Release
- QTest::touchEvent(window, touchDevice).release(1, p1, window).release(2, p2, window);
+ touchSeq.release(1, p1, window).release(2, p2, window).commit();
}
QTEST_MAIN(tst_FlickableInterop)
diff --git a/tests/auto/quick/pointerhandlers/multipointtoucharea_interop/tst_multipointtoucharea_interop.cpp b/tests/auto/quick/pointerhandlers/multipointtoucharea_interop/tst_multipointtoucharea_interop.cpp
index 4b096f9c3a..0561a9e4f1 100644
--- a/tests/auto/quick/pointerhandlers/multipointtoucharea_interop/tst_multipointtoucharea_interop.cpp
+++ b/tests/auto/quick/pointerhandlers/multipointtoucharea_interop/tst_multipointtoucharea_interop.cpp
@@ -210,9 +210,9 @@ void tst_MptaInterop::touchesThenPinch()
if (!pinchStoleGrab && pointerEvent->point(0)->exclusiveGrabber() == pinch)
pinchStoleGrab = i;
}
- qCDebug(lcPointerTests) << "pinch started after" << pinchStoleGrab << "moves; ended with scale" << pinch->scale() << "rot" << pinch->rotation();
+ qCDebug(lcPointerTests) << "pinch started after" << pinchStoleGrab << "moves; ended with scale" << pinch->activeScale() << "rot" << pinch->rotation();
QTRY_VERIFY(pinch->rotation() > 4);
- QVERIFY(pinch->scale() > 1);
+ QVERIFY(pinch->activeScale() > 1);
// Press one more point (pinkie finger)
QPoint p4 = mpta->mapToScene(QPointF(300, 200)).toPoint();
diff --git a/tests/auto/quick/pointerhandlers/qquickdraghandler/tst_qquickdraghandler.cpp b/tests/auto/quick/pointerhandlers/qquickdraghandler/tst_qquickdraghandler.cpp
index 53bb10b7b8..0271924c9b 100644
--- a/tests/auto/quick/pointerhandlers/qquickdraghandler/tst_qquickdraghandler.cpp
+++ b/tests/auto/quick/pointerhandlers/qquickdraghandler/tst_qquickdraghandler.cpp
@@ -256,8 +256,9 @@ void tst_DragHandler::touchDragMulti()
QPointF ball2Center = ball2->clipRect().center();
QPointF scenePressPos2 = ball2->mapToScene(ball2Center);
QPoint p2 = scenePressPos2.toPoint();
+ QTest::QTouchEventSequence touchSeq = QTest::touchEvent(window, touchDevice, false);
- QTest::touchEvent(window, touchDevice).press(1, p1, window).press(2, p2, window);
+ touchSeq.press(1, p1, window).press(2, p2, window).commit();
QQuickTouchUtils::flush(window);
QVERIFY(!dragHandler1->active());
QCOMPARE(dragHandler1->point().position(), ball1Center);
@@ -271,12 +272,12 @@ void tst_DragHandler::touchDragMulti()
QCOMPARE(dragHandler2->point().scenePressPosition(), scenePressPos2);
p1 += QPoint(dragThreshold, 0);
p2 += QPoint(0, dragThreshold);
- QTest::touchEvent(window, touchDevice).move(1, p1, window).move(2, p2, window);
+ touchSeq.move(1, p1, window).move(2, p2, window).commit();
QQuickTouchUtils::flush(window);
QVERIFY(!dragHandler1->active());
p1 += QPoint(1, 0);
p2 += QPoint(0, 1);
- QTest::touchEvent(window, touchDevice).move(1, p1, window).move(2, p2, window);
+ touchSeq.move(1, p1, window).move(2, p2, window).commit();
QQuickTouchUtils::flush(window);
QTRY_VERIFY(dragHandler1->active());
QVERIFY(dragHandler2->active());
@@ -292,7 +293,7 @@ void tst_DragHandler::touchDragMulti()
QCOMPARE(translationChangedSpy2.count(), 0);
QCOMPARE(dragHandler2->translation().x(), 0.0);
QCOMPARE(dragHandler2->point().sceneGrabPosition(), sceneGrabPos2);
- QTest::touchEvent(window, touchDevice).move(1, p1, window).move(2, p2, window);
+ touchSeq.move(1, p1, window).move(2, p2, window).commit();
QQuickTouchUtils::flush(window);
QVERIFY(dragHandler1->active());
QVERIFY(dragHandler2->active());
@@ -310,14 +311,14 @@ void tst_DragHandler::touchDragMulti()
QCOMPARE(dragHandler2->point().sceneGrabPosition(), sceneGrabPos2);
QCOMPARE(dragHandler2->translation().x(), 0.0);
QCOMPARE(dragHandler2->translation().y(), dragThreshold + 20.0);
- QTest::touchEvent(window, touchDevice).release(1, p1, window).stationary(2);
+ touchSeq.release(1, p1, window).stationary(2).commit();
QQuickTouchUtils::flush(window);
QTRY_VERIFY(!dragHandler1->active());
QVERIFY(dragHandler2->active());
QCOMPARE(dragHandler1->point().pressedButtons(), Qt::NoButton);
QCOMPARE(ball1->mapToScene(ball1Center).toPoint(), p1);
QCOMPARE(translationChangedSpy1.count(), 1);
- QTest::touchEvent(window, touchDevice).release(2, p2, window);
+ touchSeq.release(2, p2, window).commit();
QQuickTouchUtils::flush(window);
QTRY_VERIFY(!dragHandler2->active());
QCOMPARE(ball2->mapToScene(ball2Center).toPoint(), p2);
diff --git a/tests/auto/quick/pointerhandlers/qquicktaphandler/tst_qquicktaphandler.cpp b/tests/auto/quick/pointerhandlers/qquicktaphandler/tst_qquicktaphandler.cpp
index cf18b5eca1..f9970df9f0 100644
--- a/tests/auto/quick/pointerhandlers/qquicktaphandler/tst_qquicktaphandler.cpp
+++ b/tests/auto/quick/pointerhandlers/qquicktaphandler/tst_qquicktaphandler.cpp
@@ -526,23 +526,24 @@ void tst_TapHandler::buttonsMultiTouch()
QQuickItem *buttonReleaseWithinBounds = window->rootObject()->findChild<QQuickItem*>("ReleaseWithinBounds");
QVERIFY(buttonReleaseWithinBounds);
QSignalSpy releaseWithinBoundsTappedSpy(buttonReleaseWithinBounds, SIGNAL(tapped()));
+ QTest::QTouchEventSequence touchSeq = QTest::touchEvent(window, touchDevice, false);
// can press multiple buttons at the same time
QPoint p1 = buttonDragThreshold->mapToScene(QPointF(20, 20)).toPoint();
- QTest::touchEvent(window, touchDevice).press(1, p1, window);
+ touchSeq.press(1, p1, window).commit();
QQuickTouchUtils::flush(window);
QTRY_VERIFY(buttonDragThreshold->property("pressed").toBool());
QPoint p2 = buttonWithinBounds->mapToScene(QPointF(20, 20)).toPoint();
- QTest::touchEvent(window, touchDevice).stationary(1).press(2, p2, window);
+ touchSeq.stationary(1).press(2, p2, window).commit();
QQuickTouchUtils::flush(window);
QTRY_VERIFY(buttonWithinBounds->property("pressed").toBool());
QPoint p3 = buttonReleaseWithinBounds->mapToScene(QPointF(20, 20)).toPoint();
- QTest::touchEvent(window, touchDevice).stationary(1).stationary(2).press(3, p3, window);
+ touchSeq.stationary(1).stationary(2).press(3, p3, window).commit();
QQuickTouchUtils::flush(window);
QTRY_VERIFY(buttonReleaseWithinBounds->property("pressed").toBool());
// can release top button and press again: others stay pressed the whole time
- QTest::touchEvent(window, touchDevice).stationary(2).stationary(3).release(1, p1, window);
+ touchSeq.stationary(2).stationary(3).release(1, p1, window).commit();
QQuickTouchUtils::flush(window);
QTRY_VERIFY(!buttonDragThreshold->property("pressed").toBool());
QCOMPARE(dragThresholdTappedSpy.count(), 1);
@@ -550,14 +551,14 @@ void tst_TapHandler::buttonsMultiTouch()
QCOMPARE(withinBoundsTappedSpy.count(), 0);
QVERIFY(buttonReleaseWithinBounds->property("pressed").toBool());
QCOMPARE(releaseWithinBoundsTappedSpy.count(), 0);
- QTest::touchEvent(window, touchDevice).stationary(2).stationary(3).press(1, p1, window);
+ touchSeq.stationary(2).stationary(3).press(1, p1, window).commit();
QQuickTouchUtils::flush(window);
QTRY_VERIFY(buttonDragThreshold->property("pressed").toBool());
QVERIFY(buttonWithinBounds->property("pressed").toBool());
QVERIFY(buttonReleaseWithinBounds->property("pressed").toBool());
// can release middle button and press again: others stay pressed the whole time
- QTest::touchEvent(window, touchDevice).stationary(1).stationary(3).release(2, p2, window);
+ touchSeq.stationary(1).stationary(3).release(2, p2, window).commit();
QQuickTouchUtils::flush(window);
QTRY_VERIFY(!buttonWithinBounds->property("pressed").toBool());
QCOMPARE(withinBoundsTappedSpy.count(), 1);
@@ -565,21 +566,21 @@ void tst_TapHandler::buttonsMultiTouch()
QCOMPARE(dragThresholdTappedSpy.count(), 1);
QVERIFY(buttonReleaseWithinBounds->property("pressed").toBool());
QCOMPARE(releaseWithinBoundsTappedSpy.count(), 0);
- QTest::touchEvent(window, touchDevice).stationary(1).stationary(3).press(2, p2, window);
+ touchSeq.stationary(1).stationary(3).press(2, p2, window).commit();
QQuickTouchUtils::flush(window);
QVERIFY(buttonDragThreshold->property("pressed").toBool());
QVERIFY(buttonWithinBounds->property("pressed").toBool());
QVERIFY(buttonReleaseWithinBounds->property("pressed").toBool());
// can release bottom button and press again: others stay pressed the whole time
- QTest::touchEvent(window, touchDevice).stationary(1).stationary(2).release(3, p3, window);
+ touchSeq.stationary(1).stationary(2).release(3, p3, window).commit();
QQuickTouchUtils::flush(window);
QCOMPARE(releaseWithinBoundsTappedSpy.count(), 1);
QVERIFY(buttonWithinBounds->property("pressed").toBool());
QCOMPARE(withinBoundsTappedSpy.count(), 1);
QVERIFY(!buttonReleaseWithinBounds->property("pressed").toBool());
QCOMPARE(dragThresholdTappedSpy.count(), 1);
- QTest::touchEvent(window, touchDevice).stationary(1).stationary(2).press(3, p3, window);
+ touchSeq.stationary(1).stationary(2).press(3, p3, window).commit();
QQuickTouchUtils::flush(window);
QTRY_VERIFY(buttonDragThreshold->property("pressed").toBool());
QVERIFY(buttonWithinBounds->property("pressed").toBool());
@@ -599,8 +600,8 @@ void tst_TapHandler::componentUserBehavioralOverride()
QQuickTapHandler *userTapHandler = button->findChild<QQuickTapHandler*>("override");
QVERIFY(userTapHandler);
QSignalSpy tappedSpy(button, SIGNAL(tapped()));
- QSignalSpy innerGrabChangedSpy(innerTapHandler, SIGNAL(grabChanged(QQuickEventPoint *)));
- QSignalSpy userGrabChangedSpy(userTapHandler, SIGNAL(grabChanged(QQuickEventPoint *)));
+ QSignalSpy innerGrabChangedSpy(innerTapHandler, SIGNAL(grabChanged(QQuickEventPoint::GrabState, QQuickEventPoint *)));
+ QSignalSpy userGrabChangedSpy(userTapHandler, SIGNAL(grabChanged(QQuickEventPoint::GrabState, QQuickEventPoint *)));
QSignalSpy innerPressedChangedSpy(innerTapHandler, SIGNAL(pressedChanged()));
QSignalSpy userPressedChangedSpy(userTapHandler, SIGNAL(pressedChanged()));
diff --git a/tests/auto/quick/qquickanimatedsprite/data/infiniteLoops.qml b/tests/auto/quick/qquickanimatedsprite/data/infiniteLoops.qml
new file mode 100644
index 0000000000..551329a457
--- /dev/null
+++ b/tests/auto/quick/qquickanimatedsprite/data/infiniteLoops.qml
@@ -0,0 +1,38 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+AnimatedSprite {
+ loops: AnimatedSprite.Infinite
+ source: "squarefacesprite.png"
+ frameCount: 6
+ frameDuration: 240
+ width: 160
+ height: 160
+}
diff --git a/tests/auto/quick/qquickanimatedsprite/tst_qquickanimatedsprite.cpp b/tests/auto/quick/qquickanimatedsprite/tst_qquickanimatedsprite.cpp
index d24ebd9878..4ca31fd957 100644
--- a/tests/auto/quick/qquickanimatedsprite/tst_qquickanimatedsprite.cpp
+++ b/tests/auto/quick/qquickanimatedsprite/tst_qquickanimatedsprite.cpp
@@ -53,6 +53,7 @@ private slots:
void test_largeAnimation();
void test_reparenting();
void test_changeSourceToSmallerImgKeepingBigFrameSize();
+ void test_infiniteLoops();
void test_implicitSize();
};
@@ -79,8 +80,13 @@ void tst_qquickanimatedsprite::test_properties()
QVERIFY(sprite->interpolate());
QCOMPARE(sprite->loops(), 30);
+ QSignalSpy finishedSpy(sprite, SIGNAL(finished()));
+ QVERIFY(finishedSpy.isValid());
+
sprite->setRunning(false);
QVERIFY(!sprite->running());
+ // The finished() signal shouldn't be emitted when running is manually set to false.
+ QCOMPARE(finishedSpy.count(), 0);
sprite->setInterpolate(false);
QVERIFY(!sprite->interpolate());
}
@@ -100,10 +106,15 @@ void tst_qquickanimatedsprite::test_runningChangedSignal()
QVERIFY(!sprite->running());
QSignalSpy runningChangedSpy(sprite, SIGNAL(runningChanged(bool)));
+ QSignalSpy finishedSpy(sprite, SIGNAL(finished()));
+ QVERIFY(finishedSpy.isValid());
+
sprite->setRunning(true);
QTRY_COMPARE(runningChangedSpy.count(), 1);
+ QCOMPARE(finishedSpy.count(), 0);
QTRY_VERIFY(!sprite->running());
QTRY_COMPARE(runningChangedSpy.count(), 2);
+ QCOMPARE(finishedSpy.count(), 1);
}
template <typename T>
@@ -357,6 +368,28 @@ void tst_qquickanimatedsprite::test_implicitSize()
QCOMPARE(frameImplicitHeightChangedSpy.count(), 1);
}
+void tst_qquickanimatedsprite::test_infiniteLoops()
+{
+ QQuickView window;
+ window.setSource(testFileUrl("infiniteLoops.qml"));
+ window.show();
+ QVERIFY(QTest::qWaitForWindowExposed(&window));
+ QVERIFY(window.rootObject());
+
+ QQuickAnimatedSprite* sprite = qobject_cast<QQuickAnimatedSprite*>(window.rootObject());
+ QVERIFY(sprite);
+
+ QTRY_VERIFY(sprite->running());
+
+ QSignalSpy finishedSpy(sprite, SIGNAL(finished()));
+ QVERIFY(finishedSpy.isValid());
+
+ // The finished() signal shouldn't be emitted for infinite animations.
+ const int previousFrame = sprite->currentFrame();
+ QTRY_VERIFY(sprite->currentFrame() != previousFrame);
+ QCOMPARE(finishedSpy.count(), 0);
+}
+
QTEST_MAIN(tst_qquickanimatedsprite)
#include "tst_qquickanimatedsprite.moc"
diff --git a/tests/auto/quick/qquickanimations/data/finished.qml b/tests/auto/quick/qquickanimations/data/finished.qml
new file mode 100644
index 0000000000..a18b321501
--- /dev/null
+++ b/tests/auto/quick/qquickanimations/data/finished.qml
@@ -0,0 +1,95 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+
+Item {
+ id: root
+ width: 400
+ height: 400
+
+ property bool finishedUsableInQml: false
+
+ property alias simpleTopLevelAnimation: simpleTopLevelAnimation
+ property real foo: 0
+
+ property alias transitionRect: transitionRect
+ property alias transition: transition
+ property alias animationWithinTransition: animationWithinTransition
+
+ property real bar: 0
+ property alias animationWithinBehavior: animationWithinBehavior
+ property alias behavior: behavior
+
+ NumberAnimation {
+ id: simpleTopLevelAnimation
+ target: root
+ property: "foo"
+ from: 0
+ to: 1
+ duration: 10
+
+ onFinished: finishedUsableInQml = true
+ }
+
+ Rectangle {
+ id: transitionRect
+ color: "green"
+ width: 50
+ height: 50
+ anchors.centerIn: parent
+
+ states: State {
+ name: "go"
+ }
+ transitions: Transition {
+ id: transition
+ to: "go"
+ SequentialAnimation {
+ NumberAnimation {
+ id: animationWithinTransition
+ duration: 10
+ property: "foo"
+ from: 1
+ to: 2
+ }
+ }
+ }
+ }
+
+ Behavior on bar {
+ id: behavior
+ NumberAnimation {
+ id: animationWithinBehavior
+ duration: 10
+ property: "bar"
+ from: 0
+ to: 1
+ }
+ }
+}
diff --git a/tests/auto/quick/qquickanimations/tst_qquickanimations.cpp b/tests/auto/quick/qquickanimations/tst_qquickanimations.cpp
index de86bb16db..3cfe03a376 100644
--- a/tests/auto/quick/qquickanimations/tst_qquickanimations.cpp
+++ b/tests/auto/quick/qquickanimations/tst_qquickanimations.cpp
@@ -105,6 +105,7 @@ private slots:
void pathSvgAnimation();
void pathLineUnspecifiedXYBug();
void unsetAnimatorProxyJobWindow();
+ void finished();
};
#define QTIMED_COMPARE(lhs, rhs) do { \
@@ -1612,6 +1613,79 @@ void tst_qquickanimations::unsetAnimatorProxyJobWindow()
QCOMPARE(proxy.job().data(), job);
}
+void tst_qquickanimations::finished()
+{
+ QQmlEngine engine;
+ QQmlComponent component(&engine, testFileUrl("finished.qml"));
+ QScopedPointer<QObject> root(component.create());
+ QVERIFY(root);
+
+ // Test that finished() is emitted for a simple top-level animation.
+ // (Each test is in its own block so that we can reuse the nice signal names :))
+ {
+ QQuickAbstractAnimation *simpleTopLevelAnimation
+ = root->property("simpleTopLevelAnimation").value<QQuickAbstractAnimation*>();
+ QVERIFY(simpleTopLevelAnimation);
+
+ QSignalSpy stoppedSpy(simpleTopLevelAnimation, SIGNAL(stopped()));
+ QVERIFY(stoppedSpy.isValid());
+
+ QSignalSpy finishedSpy(simpleTopLevelAnimation, SIGNAL(finished()));
+ QVERIFY(finishedSpy.isValid());
+
+ QVERIFY(simpleTopLevelAnimation->setProperty("running", QVariant(true)));
+ QTRY_COMPARE(stoppedSpy.count(), 1);
+ QCOMPARE(finishedSpy.count(), 1);
+
+ // Test that the signal is properly revisioned and hence accessible from QML.
+ QCOMPARE(root->property("finishedUsableInQml").toBool(), true);
+ }
+
+ // Test that finished() is not emitted for animations within a Transition.
+ {
+ QObject *transition = root->property("transition").value<QObject*>();
+ QVERIFY(transition);
+
+ QSignalSpy runningChangedSpy(transition, SIGNAL(runningChanged()));
+ QVERIFY(runningChangedSpy.isValid());
+
+ QQuickAbstractAnimation *animationWithinTransition
+ = root->property("animationWithinTransition").value<QQuickAbstractAnimation*>();
+ QVERIFY(animationWithinTransition);
+
+ QSignalSpy stoppedSpy(animationWithinTransition, SIGNAL(stopped()));
+ QVERIFY(stoppedSpy.isValid());
+
+ QSignalSpy finishedSpy(animationWithinTransition, SIGNAL(finished()));
+ QVERIFY(finishedSpy.isValid());
+
+ QObject *transitionRect = root->property("transitionRect").value<QObject*>();
+ QVERIFY(transitionRect);
+ QVERIFY(transitionRect->setProperty("state", QVariant(QLatin1String("go"))));
+ QTRY_COMPARE(runningChangedSpy.count(), 1);
+ QCOMPARE(stoppedSpy.count(), 0);
+ QCOMPARE(finishedSpy.count(), 0);
+ }
+
+ // Test that finished() is not emitted for animations within a Behavior.
+ {
+ QQuickAbstractAnimation *animationWithinBehavior
+ = root->property("animationWithinBehavior").value<QQuickAbstractAnimation*>();
+ QVERIFY(animationWithinBehavior);
+
+ QSignalSpy stoppedSpy(animationWithinBehavior, SIGNAL(stopped()));
+ QVERIFY(stoppedSpy.isValid());
+
+ QSignalSpy finishedSpy(animationWithinBehavior, SIGNAL(finished()));
+ QVERIFY(finishedSpy.isValid());
+
+ QVERIFY(root->setProperty("bar", QVariant(1.0)));
+ QTRY_COMPARE(root->property("bar").toReal(), 1.0);
+ QCOMPARE(stoppedSpy.count(), 0);
+ QCOMPARE(finishedSpy.count(), 0);
+ }
+}
+
QTEST_MAIN(tst_qquickanimations)
#include "tst_qquickanimations.moc"
diff --git a/tests/auto/quick/qquickcanvasitem/data/tst_line.qml b/tests/auto/quick/qquickcanvasitem/data/tst_line.qml
index 750f37638d..dc960a24d0 100644
--- a/tests/auto/quick/qquickcanvasitem/data/tst_line.qml
+++ b/tests/auto/quick/qquickcanvasitem/data/tst_line.qml
@@ -834,5 +834,96 @@ CanvasTestCase {
ctx.lineCap = 'square';
compare(ctx.lineCap, 'square');
+ }
+
+ function test_lineDash(row) {
+ var canvas = createCanvasObject(row);
+ var ctx = canvas.getContext('2d');
+ ctx.reset();
+ ctx.strokeStyle = "#fff";
+ ctx.lineWidth = 2;
+ var pattern = [2, 3, 5, 1, 6, 3]
+ ctx.setLineDash(pattern)
+
+ compare(ctx.getLineDash(), pattern);
+
+ ctx.beginPath();
+ ctx.moveTo(0, 0);
+ ctx.lineTo(40, 0);
+ ctx.stroke();
+
+ comparePixel(ctx, 0,0, 255,255,255,255);
+ comparePixel(ctx, 1,0, 255,255,255,255);
+ comparePixel(ctx, 2,0, 255,255,255,255);
+ comparePixel(ctx, 3,0, 255,255,255,255);
+ comparePixel(ctx, 4,0, 0,0,0,0);
+ comparePixel(ctx, 5,0, 0,0,0,0);
+ comparePixel(ctx, 6,0, 0,0,0,0);
+ comparePixel(ctx, 7,0, 0,0,0,0);
+ comparePixel(ctx, 8,0, 0,0,0,0);
+ comparePixel(ctx, 9,0, 0,0,0,0);
+ comparePixel(ctx, 10,0, 255,255,255,255);
+ comparePixel(ctx, 11,0, 255,255,255,255);
+ comparePixel(ctx, 12,0, 255,255,255,255);
+ comparePixel(ctx, 13,0, 255,255,255,255);
+ comparePixel(ctx, 14,0, 255,255,255,255);
+ comparePixel(ctx, 15,0, 255,255,255,255);
+ comparePixel(ctx, 16,0, 255,255,255,255);
+ comparePixel(ctx, 17,0, 255,255,255,255);
+ comparePixel(ctx, 18,0, 255,255,255,255);
+ comparePixel(ctx, 19,0, 255,255,255,255);
+ comparePixel(ctx, 20,0, 0,0,0,0);
+ comparePixel(ctx, 21,0, 0,0,0,0);
+ comparePixel(ctx, 22,0, 255,255,255,255);
+ comparePixel(ctx, 23,0, 255,255,255,255);
+ comparePixel(ctx, 24,0, 255,255,255,255);
+ comparePixel(ctx, 25,0, 255,255,255,255);
+ comparePixel(ctx, 26,0, 255,255,255,255);
+ comparePixel(ctx, 27,0, 255,255,255,255);
+ comparePixel(ctx, 28,0, 255,255,255,255);
+ comparePixel(ctx, 29,0, 255,255,255,255);
+ comparePixel(ctx, 30,0, 255,255,255,255);
+ comparePixel(ctx, 31,0, 255,255,255,255);
+ comparePixel(ctx, 32,0, 255,255,255,255);
+ comparePixel(ctx, 33,0, 255,255,255,255);
+ comparePixel(ctx, 34,0, 0,0,0,0);
+ comparePixel(ctx, 35,0, 0,0,0,0);
+ comparePixel(ctx, 36,0, 0,0,0,0);
+ comparePixel(ctx, 37,0, 0,0,0,0);
+ comparePixel(ctx, 38,0, 0,0,0,0);
+ comparePixel(ctx, 39,0, 0,0,0,0);
+ }
+
+ function test_lineDashOffset(row) {
+ var canvas = createCanvasObject(row);
+ var ctx = canvas.getContext('2d');
+ ctx.reset();
+ ctx.strokeStyle = "#fff";
+ ctx.lineWidth = 2;
+ var pattern = [2,2]
+ ctx.setLineDash(pattern)
+ ctx.lineDashOffset = 1
+ compare(ctx.getLineDash(), pattern);
+
+ ctx.beginPath();
+ ctx.moveTo(0, 0);
+ ctx.lineTo(40, 0);
+ ctx.stroke();
+
+
+ comparePixel(ctx, 0,0, 255,255,255,255);
+ comparePixel(ctx, 1,0, 255,255,255,255);
+ comparePixel(ctx, 2,0, 0,0,0,0);
+ comparePixel(ctx, 3,0, 0,0,0,0);
+ comparePixel(ctx, 4,0, 0,0,0,0);
+ comparePixel(ctx, 5,0, 0,0,0,0);
+ comparePixel(ctx, 6,0, 255,255,255,255);
+ comparePixel(ctx, 7,0, 255,255,255,255);
+ comparePixel(ctx, 8,0, 255,255,255,255);
+ comparePixel(ctx, 9,0, 255,255,255,255);
+ comparePixel(ctx, 10,0, 0,0,0,0);
+ comparePixel(ctx, 11,0, 0,0,0,0);
+ comparePixel(ctx, 12,0, 0,0,0,0);
+ comparePixel(ctx, 13,0, 0,0,0,0);
}
}
diff --git a/tests/auto/quick/qquickdesignersupport/data/TestComponent.qml b/tests/auto/quick/qquickdesignersupport/data/TestComponent.qml
index 68f456af99..63d65b435c 100644
--- a/tests/auto/quick/qquickdesignersupport/data/TestComponent.qml
+++ b/tests/auto/quick/qquickdesignersupport/data/TestComponent.qml
@@ -4,6 +4,8 @@ Item {
width: 100
height: 62
- x: Math.max(0, 200)
+ // Add a dummy dependency to parent.x to ensure that the
+ // binding stays for the test.
+ x: parent.x + Math.max(0, 200) - parent.x
}
diff --git a/tests/auto/quick/qquickdesignersupport/data/test.qml b/tests/auto/quick/qquickdesignersupport/data/test.qml
index 1d43cb3b7e..6c89f15257 100644
--- a/tests/auto/quick/qquickdesignersupport/data/test.qml
+++ b/tests/auto/quick/qquickdesignersupport/data/test.qml
@@ -1,4 +1,4 @@
-import QtQuick 2.0
+import QtQuick 2.11
Rectangle {
objectName: "rootItem"
@@ -13,7 +13,7 @@ Rectangle {
Rectangle {
objectName: "rectangleItem"
- gradient: Gradient {
+ containmentMask: Item {
}
}
diff --git a/tests/auto/quick/qquickdesignersupport/tst_qquickdesignersupport.cpp b/tests/auto/quick/qquickdesignersupport/tst_qquickdesignersupport.cpp
index 96a11e16e9..3e0765552a 100644
--- a/tests/auto/quick/qquickdesignersupport/tst_qquickdesignersupport.cpp
+++ b/tests/auto/quick/qquickdesignersupport/tst_qquickdesignersupport.cpp
@@ -209,15 +209,15 @@ void tst_qquickdesignersupport::objectProperties()
//Read gradient property as QObject
- int propertyIndex = rectangleItem->metaObject()->indexOfProperty("gradient");
+ int propertyIndex = rectangleItem->metaObject()->indexOfProperty("containmentMask");
QVERIFY(propertyIndex > 0);
QMetaProperty metaProperty = rectangleItem->metaObject()->property(propertyIndex);
QVERIFY(metaProperty.isValid());
QVERIFY(QQuickDesignerSupportProperties::isPropertyQObject(metaProperty));
- QObject*gradient = QQuickDesignerSupportProperties::readQObjectProperty(metaProperty, rectangleItem);
- QVERIFY(gradient);
+ QObject *containmentItem = QQuickDesignerSupportProperties::readQObjectProperty(metaProperty, rectangleItem);
+ QVERIFY(containmentItem);
//The width property is not a QObject
@@ -450,7 +450,7 @@ void tst_qquickdesignersupport::testNotifyPropertyChangeCallBack()
QQuickDesignerSupportMetaInfo::registerNotifyPropertyChangeCallBack(notifyPropertyChangeCallBackPointer);
- rectangle->setProperty("gradient", QVariant::fromValue<QQuickGradient *>(gradient));
+ rectangle->setProperty("gradient", QVariant::fromValue<QJSValue>(view->engine()->newQObject(gradient)));
QVERIFY(s_object);
QCOMPARE(s_object, rootItem);
diff --git a/tests/auto/quick/qquickflickable/BLACKLIST b/tests/auto/quick/qquickflickable/BLACKLIST
index 826c024732..870bb2e1e9 100644
--- a/tests/auto/quick/qquickflickable/BLACKLIST
+++ b/tests/auto/quick/qquickflickable/BLACKLIST
@@ -20,3 +20,4 @@ osx-10.10
osx-10.10
[nestedSliderUsingTouch:keepNeither]
ubuntu-16.04
+ubuntu-18.04
diff --git a/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp b/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp
index 248f8447e0..ba266824e6 100644
--- a/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp
+++ b/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp
@@ -203,6 +203,8 @@ private slots:
void overshoot();
void overshoot_data();
void overshoot_reentrant();
+ void synchronousDrag_data();
+ void synchronousDrag();
private:
void flickWithTouch(QQuickWindow *window, const QPoint &from, const QPoint &to);
@@ -2458,6 +2460,70 @@ void tst_qquickflickable::overshoot_reentrant()
QCOMPARE(flickable->verticalOvershoot(), 25.0);
}
+void tst_qquickflickable::synchronousDrag_data()
+{
+ QTest::addColumn<bool>("synchronousDrag");
+
+ QTest::newRow("default") << false;
+ QTest::newRow("synch") << true;
+}
+
+void tst_qquickflickable::synchronousDrag()
+{
+ QFETCH(bool, synchronousDrag);
+
+ QScopedPointer<QQuickView> scopedWindow(new QQuickView);
+ QQuickView *window = scopedWindow.data();
+ window->setSource(testFileUrl("longList.qml"));
+ QTRY_COMPARE(window->status(), QQuickView::Ready);
+ QQuickViewTestUtil::centerOnScreen(window);
+ QQuickViewTestUtil::moveMouseAway(window);
+ window->show();
+ QVERIFY(window->rootObject() != nullptr);
+
+ QQuickFlickable *flickable = qobject_cast<QQuickFlickable*>(window->rootObject());
+ QVERIFY(flickable != nullptr);
+ QCOMPARE(flickable->synchronousDrag(), false);
+ flickable->setSynchronousDrag(synchronousDrag);
+
+ QPoint p1(100, 100);
+ QPoint p2(95, 95);
+ QPoint p3(70, 70);
+ QPoint p4(50, 50);
+ QPoint p5(30, 30);
+ QCOMPARE(flickable->contentY(), 0.0f);
+
+ // Drag via mouse
+ moveAndPress(window, p1);
+ QTest::mouseMove(window, p2);
+ QTest::mouseMove(window, p3);
+ QTest::mouseMove(window, p4);
+ QCOMPARE(flickable->contentY(), synchronousDrag ? 50.0f : 0.0f);
+ QTest::mouseMove(window, p5);
+ if (!synchronousDrag)
+ QVERIFY(flickable->contentY() < 50.0f);
+ QTest::mouseRelease(window, Qt::LeftButton, Qt::NoModifier, p5);
+
+ // Reset to initial condition
+ flickable->setContentY(0);
+
+ // Drag via touch
+ QTest::touchEvent(window, touchDevice).press(0, p1, window);
+ QQuickTouchUtils::flush(window);
+ QTest::touchEvent(window, touchDevice).move(0, p2, window);
+ QQuickTouchUtils::flush(window);
+ QTest::touchEvent(window, touchDevice).move(0, p3, window);
+ QQuickTouchUtils::flush(window);
+ QTest::touchEvent(window, touchDevice).move(0, p4, window);
+ QQuickTouchUtils::flush(window);
+ QCOMPARE(flickable->contentY(), synchronousDrag ? 50.0f : 0.0f);
+ QTest::touchEvent(window, touchDevice).move(0, p5, window);
+ QQuickTouchUtils::flush(window);
+ if (!synchronousDrag)
+ QVERIFY(flickable->contentY() < 50.0f);
+ QTest::touchEvent(window, touchDevice).release(0, p5, window);
+}
+
QTEST_MAIN(tst_qquickflickable)
#include "tst_qquickflickable.moc"
diff --git a/tests/auto/quick/qquickframebufferobject/tst_qquickframebufferobject.cpp b/tests/auto/quick/qquickframebufferobject/tst_qquickframebufferobject.cpp
index 805baebc7a..6aff66d61e 100644
--- a/tests/auto/quick/qquickframebufferobject/tst_qquickframebufferobject.cpp
+++ b/tests/auto/quick/qquickframebufferobject/tst_qquickframebufferobject.cpp
@@ -193,7 +193,7 @@ void tst_QQuickFramebufferObject::testThatStuffWorks()
view.show();
view.requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(&view));
+ QVERIFY(QTest::qWaitForWindowExposed(&view));
QImage result = view.grabWindow();
@@ -233,7 +233,7 @@ void tst_QQuickFramebufferObject::testInvalidate()
view.show();
view.requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(&view));
+ QVERIFY(QTest::qWaitForWindowExposed(&view));
QCOMPARE(frameInfo.fboSize, QSize(200, 200));
diff --git a/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp b/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp
index 915b9b43ea..7deed8c5a8 100644
--- a/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp
+++ b/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp
@@ -4387,24 +4387,34 @@ void tst_QQuickGridView::snapOneRow_data()
QTest::addColumn<qreal>("snapAlignment");
QTest::addColumn<qreal>("endExtent");
QTest::addColumn<qreal>("startExtent");
+ QTest::addColumn<qreal>("flickSlowdown");
QTest::newRow("vertical, left to right") << QQuickGridView::FlowLeftToRight << Qt::LeftToRight << int(QQuickItemView::NoHighlightRange)
- << QPoint(20, 160) << QPoint(20, 20) << 100.0 << 240.0 << 0.0;
+ << QPoint(20, 160) << QPoint(20, 20) << 100.0 << 240.0 << 0.0 << 1.0;
QTest::newRow("horizontal, left to right") << QQuickGridView::FlowTopToBottom << Qt::LeftToRight << int(QQuickItemView::NoHighlightRange)
- << QPoint(160, 20) << QPoint(20, 20) << 100.0 << 240.0 << 0.0;
+ << QPoint(160, 20) << QPoint(20, 20) << 100.0 << 240.0 << 0.0 << 1.0;
QTest::newRow("horizontal, right to left") << QQuickGridView::FlowTopToBottom << Qt::RightToLeft << int(QQuickItemView::NoHighlightRange)
- << QPoint(20, 20) << QPoint(160, 20) << -340.0 << -240.0 - 240.0 << -240.0;
+ << QPoint(20, 20) << QPoint(160, 20) << -340.0 << -240.0 - 240.0 << -240.0 << 1.0;
QTest::newRow("vertical, left to right, enforce range") << QQuickGridView::FlowLeftToRight << Qt::LeftToRight << int(QQuickItemView::StrictlyEnforceRange)
- << QPoint(20, 160) << QPoint(20, 20) << 100.0 << 340.0 << -20.0;
+ << QPoint(20, 160) << QPoint(20, 20) << 100.0 << 340.0 << -20.0 << 1.0;
QTest::newRow("horizontal, left to right, enforce range") << QQuickGridView::FlowTopToBottom << Qt::LeftToRight << int(QQuickItemView::StrictlyEnforceRange)
- << QPoint(160, 20) << QPoint(20, 20) << 100.0 << 340.0 << -20.0;
+ << QPoint(160, 20) << QPoint(20, 20) << 100.0 << 340.0 << -20.0 << 1.0;
QTest::newRow("horizontal, right to left, enforce range") << QQuickGridView::FlowTopToBottom << Qt::RightToLeft << int(QQuickItemView::StrictlyEnforceRange)
- << QPoint(20, 20) << QPoint(160, 20) << -340.0 << -240.0 - 240.0 - 100.0 << -220.0;
+ << QPoint(20, 20) << QPoint(160, 20) << -340.0 << -240.0 - 240.0 - 100.0 << -220.0 << 1.0;
+
+ // Using e.g. 120 rather than 95 always went to the next row.
+ // Ensure this further movement has the same behavior
+ QTest::newRow("vertical, left to right, no more blindspot") << QQuickGridView::FlowLeftToRight << Qt::LeftToRight << int(QQuickItemView::NoHighlightRange)
+ << QPoint(20, 160) << QPoint(20, 95) << 100.0 << 240.0 << 0.0 << 4.0;
+
+ // StrictlyEnforceRange should not override valid SnapOneItem decisions
+ QTest::newRow("vertical, left to right, no more blindspot, enforce range") << QQuickGridView::FlowLeftToRight << Qt::LeftToRight << int(QQuickItemView::StrictlyEnforceRange)
+ << QPoint(20, 160) << QPoint(20, 95) << 100.0 << 340.0 << -20.0 << 4.0;
}
void tst_QQuickGridView::snapOneRow()
@@ -4417,6 +4427,9 @@ void tst_QQuickGridView::snapOneRow()
QFETCH(qreal, snapAlignment);
QFETCH(qreal, endExtent);
QFETCH(qreal, startExtent);
+ QFETCH(qreal, flickSlowdown);
+
+ qreal flickDuration = 180 * flickSlowdown;
QQuickView *window = getView();
QQuickViewTestUtil::moveMouseAway(window);
@@ -4439,7 +4452,7 @@ void tst_QQuickGridView::snapOneRow()
QSignalSpy currentIndexSpy(gridview, SIGNAL(currentIndexChanged()));
// confirm that a flick hits next row boundary
- flick(window, flickStart, flickEnd, 180);
+ flick(window, flickStart, flickEnd, flickDuration);
QTRY_VERIFY(gridview->isMoving() == false); // wait until it stops
if (flow == QQuickGridView::FlowLeftToRight)
QCOMPARE(gridview->contentY(), snapAlignment);
@@ -4453,7 +4466,7 @@ void tst_QQuickGridView::snapOneRow()
// flick to end
do {
- flick(window, flickStart, flickEnd, 180);
+ flick(window, flickStart, flickEnd, flickDuration);
QTRY_VERIFY(gridview->isMoving() == false); // wait until it stops
} while (flow == QQuickGridView::FlowLeftToRight
? !gridview->isAtYEnd()
@@ -4471,7 +4484,7 @@ void tst_QQuickGridView::snapOneRow()
// flick to start
do {
- flick(window, flickEnd, flickStart, 180);
+ flick(window, flickEnd, flickStart, flickDuration);
QTRY_VERIFY(gridview->isMoving() == false); // wait until it stops
} while (flow == QQuickGridView::FlowLeftToRight
? !gridview->isAtYBeginning()
diff --git a/tests/auto/quick/qquickimageprovider/tst_qquickimageprovider.cpp b/tests/auto/quick/qquickimageprovider/tst_qquickimageprovider.cpp
index d8464ebc74..4b75a7e008 100644
--- a/tests/auto/quick/qquickimageprovider/tst_qquickimageprovider.cpp
+++ b/tests/auto/quick/qquickimageprovider/tst_qquickimageprovider.cpp
@@ -65,6 +65,7 @@ private slots:
void threadTest();
void asyncTextureTest();
+ void instantAsyncTextureTest();
private:
QString newImageFileName() const;
@@ -550,6 +551,70 @@ void tst_qquickimageprovider::asyncTextureTest()
}
}
+class InstantAsyncImageResponse : public QQuickImageResponse
+{
+ public:
+ InstantAsyncImageResponse(const QString &id, const QSize &requestedSize)
+ {
+ QImage image(50, 50, QImage::Format_RGB32);
+ image.fill(QColor(id).rgb());
+ if (requestedSize.isValid())
+ image = image.scaled(requestedSize);
+ m_texture = QQuickTextureFactory::textureFactoryForImage(image);
+ emit finished();
+ }
+
+ QQuickTextureFactory *textureFactory() const
+ {
+ return m_texture;
+ }
+
+ QQuickTextureFactory *m_texture;
+};
+
+class InstancAsyncProvider : public QQuickAsyncImageProvider
+{
+ public:
+ InstancAsyncProvider()
+ {
+ }
+
+ ~InstancAsyncProvider() {}
+
+ QQuickImageResponse *requestImageResponse(const QString &id, const QSize &requestedSize)
+ {
+ return new InstantAsyncImageResponse(id, requestedSize);
+ }
+};
+
+void tst_qquickimageprovider::instantAsyncTextureTest()
+{
+ QQmlEngine engine;
+
+ InstancAsyncProvider *provider = new InstancAsyncProvider;
+
+ engine.addImageProvider("test_instantasync", provider);
+ QVERIFY(engine.imageProvider("test_instantasync") != nullptr);
+
+ QString componentStr = "import QtQuick 2.0\nItem { \n"
+ "Image { source: \"image://test_instantasync/blue\"; }\n"
+ "Image { source: \"image://test_instantasync/red\"; }\n"
+ "Image { source: \"image://test_instantasync/green\"; }\n"
+ "Image { source: \"image://test_instantasync/yellow\"; }\n"
+ " }";
+ QQmlComponent component(&engine);
+ component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+ QScopedPointer<QObject> obj(component.create());
+
+ QVERIFY(!obj.isNull());
+ const QList<QQuickImage *> images = obj->findChildren<QQuickImage *>();
+ QCOMPARE(images.count(), 4);
+
+ for (QQuickImage *img: images) {
+ QTRY_COMPARE(img->status(), QQuickImage::Ready);
+ }
+}
+
QTEST_MAIN(tst_qquickimageprovider)
diff --git a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp
index c1daddb561..64a186eade 100644
--- a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp
+++ b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp
@@ -118,6 +118,7 @@ private slots:
void noCurrentIndex();
void keyNavigation();
void keyNavigation_data();
+ void checkCountForMultiColumnModels();
void enforceRange();
void enforceRange_withoutHighlight();
void spacing();
@@ -1855,6 +1856,38 @@ void tst_QQuickListView::swapWithFirstItem()
delete testObject;
}
+void tst_QQuickListView::checkCountForMultiColumnModels()
+{
+ // Check that a list view will only load items for the first
+ // column, even if the model reports that it got several columns.
+ // We test this since QQmlDelegateModel has been changed to
+ // also understand multi-column models, but this should not affect ListView.
+ QScopedPointer<QQuickView> window(createView());
+
+ const int rowCount = 10;
+ const int columnCount = 10;
+
+ QaimModel model;
+ model.columns = columnCount;
+ for (int i = 0; i < rowCount; i++)
+ model.addItem("Item" + QString::number(i), "");
+
+ QQmlContext *ctxt = window->rootContext();
+ ctxt->setContextProperty("testModel", &model);
+
+ QScopedPointer<TestObject> testObject(new TestObject);
+ ctxt->setContextProperty("testObject", testObject.data());
+
+ window->setSource(testFileUrl("listviewtest.qml"));
+ window->show();
+ QVERIFY(QTest::qWaitForWindowExposed(window.data()));
+
+ QQuickListView *listview = findItem<QQuickListView>(window->rootObject(), "list");
+ QTRY_VERIFY(listview != nullptr);
+
+ QCOMPARE(listview->count(), rowCount);
+}
+
void tst_QQuickListView::enforceRange()
{
QScopedPointer<QQuickView> window(createView());
@@ -5481,38 +5514,50 @@ void tst_QQuickListView::snapOneItem_data()
QTest::addColumn<qreal>("snapAlignment");
QTest::addColumn<qreal>("endExtent");
QTest::addColumn<qreal>("startExtent");
+ QTest::addColumn<qreal>("flickSlowdown");
QTest::newRow("vertical, top to bottom")
<< QQuickListView::Vertical << Qt::LeftToRight << QQuickItemView::TopToBottom << int(QQuickItemView::NoHighlightRange)
- << QPoint(20, 200) << QPoint(20, 20) << 180.0 << 560.0 << 0.0;
+ << QPoint(20, 200) << QPoint(20, 20) << 180.0 << 560.0 << 0.0 << 1.0;
QTest::newRow("vertical, bottom to top")
<< QQuickListView::Vertical << Qt::LeftToRight << QQuickItemView::BottomToTop << int(QQuickItemView::NoHighlightRange)
- << QPoint(20, 20) << QPoint(20, 200) << -420.0 << -560.0 - 240.0 << -240.0;
+ << QPoint(20, 20) << QPoint(20, 200) << -420.0 << -560.0 - 240.0 << -240.0 << 1.0;
QTest::newRow("horizontal, left to right")
<< QQuickListView::Horizontal << Qt::LeftToRight << QQuickItemView::TopToBottom << int(QQuickItemView::NoHighlightRange)
- << QPoint(200, 20) << QPoint(20, 20) << 180.0 << 560.0 << 0.0;
+ << QPoint(200, 20) << QPoint(20, 20) << 180.0 << 560.0 << 0.0 << 1.0;
QTest::newRow("horizontal, right to left")
<< QQuickListView::Horizontal << Qt::RightToLeft << QQuickItemView::TopToBottom << int(QQuickItemView::NoHighlightRange)
- << QPoint(20, 20) << QPoint(200, 20) << -420.0 << -560.0 - 240.0 << -240.0;
+ << QPoint(20, 20) << QPoint(200, 20) << -420.0 << -560.0 - 240.0 << -240.0 << 1.0;
QTest::newRow("vertical, top to bottom, enforce range")
<< QQuickListView::Vertical << Qt::LeftToRight << QQuickItemView::TopToBottom << int(QQuickItemView::StrictlyEnforceRange)
- << QPoint(20, 200) << QPoint(20, 20) << 180.0 << 580.0 << -20.0;
+ << QPoint(20, 200) << QPoint(20, 20) << 180.0 << 580.0 << -20.0 << 1.0;
QTest::newRow("vertical, bottom to top, enforce range")
<< QQuickListView::Vertical << Qt::LeftToRight << QQuickItemView::BottomToTop << int(QQuickItemView::StrictlyEnforceRange)
- << QPoint(20, 20) << QPoint(20, 200) << -420.0 << -580.0 - 240.0 << -220.0;
+ << QPoint(20, 20) << QPoint(20, 200) << -420.0 << -580.0 - 240.0 << -220.0 << 1.0;
QTest::newRow("horizontal, left to right, enforce range")
<< QQuickListView::Horizontal << Qt::LeftToRight << QQuickItemView::TopToBottom << int(QQuickItemView::StrictlyEnforceRange)
- << QPoint(200, 20) << QPoint(20, 20) << 180.0 << 580.0 << -20.0;
+ << QPoint(200, 20) << QPoint(20, 20) << 180.0 << 580.0 << -20.0 << 1.0;
QTest::newRow("horizontal, right to left, enforce range")
<< QQuickListView::Horizontal << Qt::RightToLeft << QQuickItemView::TopToBottom << int(QQuickItemView::StrictlyEnforceRange)
- << QPoint(20, 20) << QPoint(200, 20) << -420.0 << -580.0 - 240.0 << -220.0;
+ << QPoint(20, 20) << QPoint(200, 20) << -420.0 << -580.0 - 240.0 << -220.0 << 1.0;
+
+ // Using e.g. 120 rather than 95 always went to the next item.
+ // Ensure this further movement has the same behavior
+ QTest::newRow("vertical, top to bottom, no more blindspot")
+ << QQuickListView::Vertical << Qt::LeftToRight << QQuickItemView::TopToBottom << int(QQuickItemView::NoHighlightRange)
+ << QPoint(20, 200) << QPoint(20, 95) << 180.0 << 560.0 << 0.0 << 6.0;
+
+ // StrictlyEnforceRange should not override valid SnapOneItem decisions
+ QTest::newRow("vertical, top to bottom, no more blindspot, enforce range")
+ << QQuickListView::Vertical << Qt::LeftToRight << QQuickItemView::TopToBottom << int(QQuickItemView::StrictlyEnforceRange)
+ << QPoint(20, 200) << QPoint(20, 95) << 180.0 << 580.0 << -20.0 << 6.0;
}
void tst_QQuickListView::snapOneItem()
@@ -5526,6 +5571,9 @@ void tst_QQuickListView::snapOneItem()
QFETCH(qreal, snapAlignment);
QFETCH(qreal, endExtent);
QFETCH(qreal, startExtent);
+ QFETCH(qreal, flickSlowdown);
+
+ qreal flickDuration = 180 * flickSlowdown;
QQuickView *window = getView();
QQuickViewTestUtil::moveMouseAway(window);
@@ -5550,7 +5598,7 @@ void tst_QQuickListView::snapOneItem()
QSignalSpy currentIndexSpy(listview, SIGNAL(currentIndexChanged()));
// confirm that a flick hits the next item boundary
- flick(window, flickStart, flickEnd, 180);
+ flick(window, flickStart, flickEnd, flickDuration);
QTRY_VERIFY(listview->isMoving() == false); // wait until it stops
if (orientation == QQuickListView::Vertical)
QCOMPARE(listview->contentY(), snapAlignment);
@@ -5564,7 +5612,7 @@ void tst_QQuickListView::snapOneItem()
// flick to end
do {
- flick(window, flickStart, flickEnd, 180);
+ flick(window, flickStart, flickEnd, flickDuration);
QTRY_VERIFY(listview->isMoving() == false); // wait until it stops
} while (orientation == QQuickListView::Vertical
? verticalLayoutDirection == QQuickItemView::TopToBottom ? !listview->isAtYEnd() : !listview->isAtYBeginning()
@@ -5582,7 +5630,7 @@ void tst_QQuickListView::snapOneItem()
// flick to start
do {
- flick(window, flickEnd, flickStart, 180);
+ flick(window, flickEnd, flickStart, flickDuration);
QTRY_VERIFY(listview->isMoving() == false); // wait until it stops
} while (orientation == QQuickListView::Vertical
? verticalLayoutDirection == QQuickItemView::TopToBottom ? !listview->isAtYBeginning() : !listview->isAtYEnd()
diff --git a/tests/auto/quick/qquickloader/tst_qquickloader.cpp b/tests/auto/quick/qquickloader/tst_qquickloader.cpp
index 5c3729a8cd..fbdd87905b 100644
--- a/tests/auto/quick/qquickloader/tst_qquickloader.cpp
+++ b/tests/auto/quick/qquickloader/tst_qquickloader.cpp
@@ -739,7 +739,7 @@ void tst_QQuickLoader::initialPropertyValuesError_data()
<< (QStringList() << QString(testFileUrl("NonexistentSourceComponent.qml").toString() + ": No such file or directory"));
QTest::newRow("invalid source url") << testFileUrl("initialPropertyValues.error.3.qml")
- << (QStringList() << QString(testFileUrl("InvalidSourceComponent.qml").toString() + ":5:1: Syntax error"));
+ << (QStringList() << QString(testFileUrl("InvalidSourceComponent.qml").toString() + ":5:1: Expected token `:'"));
QTest::newRow("invalid initial property values object with invalid property access") << testFileUrl("initialPropertyValues.error.4.qml")
<< (QStringList() << QString(testFileUrl("initialPropertyValues.error.4.qml").toString() + ":7:5: QML Loader: setSource: value is not an object")
@@ -885,7 +885,7 @@ void tst_QQuickLoader::asynchronous_data()
<< (QStringList() << QString(testFileUrl("IDoNotExist.qml").toString() + ": No such file or directory"));
QTest::newRow("Invalid component") << testFileUrl("InvalidSourceComponent.qml")
- << (QStringList() << QString(testFileUrl("InvalidSourceComponent.qml").toString() + ":5:1: Syntax error"));
+ << (QStringList() << QString(testFileUrl("InvalidSourceComponent.qml").toString() + ":5:1: Expected token `:'"));
}
void tst_QQuickLoader::asynchronous()
diff --git a/tests/auto/quick/qquickmultipointtoucharea/BLACKLIST b/tests/auto/quick/qquickmultipointtoucharea/BLACKLIST
index cab6e2f7bf..cdb3e7733b 100644
--- a/tests/auto/quick/qquickmultipointtoucharea/BLACKLIST
+++ b/tests/auto/quick/qquickmultipointtoucharea/BLACKLIST
@@ -1,4 +1,6 @@
[nonOverlapping]
ubuntu-16.04
+ubuntu-18.04
[nested]
ubuntu-16.04
+ubuntu-18.04
diff --git a/tests/auto/quick/qquickpathview/tst_qquickpathview.cpp b/tests/auto/quick/qquickpathview/tst_qquickpathview.cpp
index e6c03d052c..7d297d3fa2 100644
--- a/tests/auto/quick/qquickpathview/tst_qquickpathview.cpp
+++ b/tests/auto/quick/qquickpathview/tst_qquickpathview.cpp
@@ -367,6 +367,10 @@ void tst_QQuickPathView::insertModel_data()
void tst_QQuickPathView::insertModel()
{
+#ifdef Q_OS_MACOS
+ QSKIP("this test currently crashes on MacOS. See QTBUG-68048");
+#endif
+
QFETCH(int, mode);
QFETCH(int, idx);
QFETCH(int, count);
@@ -773,6 +777,10 @@ void tst_QQuickPathView::path()
void tst_QQuickPathView::dataModel()
{
+#ifdef Q_OS_MACOS
+ QSKIP("this test currently crashes on MacOS. See QTBUG-68047");
+#endif
+
QScopedPointer<QQuickView> window(createView());
window->show();
diff --git a/tests/auto/quick/qquickpositioners/tst_qquickpositioners.cpp b/tests/auto/quick/qquickpositioners/tst_qquickpositioners.cpp
index 0395b08f10..ec31acf035 100644
--- a/tests/auto/quick/qquickpositioners/tst_qquickpositioners.cpp
+++ b/tests/auto/quick/qquickpositioners/tst_qquickpositioners.cpp
@@ -40,6 +40,8 @@
using namespace QQuickViewTestUtil;
using namespace QQuickVisualTestUtil;
+Q_LOGGING_CATEGORY(lcTests, "qt.quick.tests")
+
class tst_qquickpositioners : public QQmlDataTest
{
Q_OBJECT
@@ -3772,6 +3774,10 @@ void tst_qquickpositioners::test_mirroring()
QList<QString> objectNames;
objectNames << "one" << "two" << "three" << "four" << "five";
+#ifdef Q_OS_MACOS
+ qputenv("QSG_RENDER_LOOP","basic"); // QTBUG-69040
+#endif
+
foreach (const QString qmlFile, qmlFiles) {
QScopedPointer<QQuickView> windowA(createView(testFile(qmlFile)));
QQuickItem *rootA = qobject_cast<QQuickItem*>(windowA->rootObject());
@@ -4007,15 +4013,19 @@ void tst_qquickpositioners::test_attachedproperties_dynamic()
QQuickView *tst_qquickpositioners::createView(const QString &filename, bool wait)
{
QQuickView *window = new QQuickView(nullptr);
- qDebug() << "1";
+ qCDebug(lcTests) << "created window";
window->setSource(QUrl::fromLocalFile(filename));
- qDebug() << "2";
+ qCDebug(lcTests) << "loaded content from" << filename;
window->show();
- qDebug() << "3";
+ qCDebug(lcTests) << "window shown";
+ bool exposed = true;
if (wait)
- QTest::qWaitForWindowExposed(window); //It may not relayout until the next frame, so it needs to be drawn
- qDebug() << "4";
+ exposed = QTest::qWaitForWindowExposed(window); //It may not relayout until the next frame, so it needs to be drawn
+ if (exposed)
+ qCDebug(lcTests) << "window exposed";
+ else
+ qCWarning(lcTests) << "window NOT exposed";
return window;
}
diff --git a/tests/auto/quick/qquickrectangle/data/gradient-preset.qml b/tests/auto/quick/qquickrectangle/data/gradient-preset.qml
new file mode 100644
index 0000000000..b740bdd610
--- /dev/null
+++ b/tests/auto/quick/qquickrectangle/data/gradient-preset.qml
@@ -0,0 +1,16 @@
+import QtQuick 2.0
+
+Item {
+ Rectangle {
+ objectName: "enum"
+ gradient: Gradient.NightFade
+ }
+ Rectangle {
+ objectName: "string"
+ gradient: "NightFade"
+ }
+ Rectangle {
+ objectName: "invalid"
+ gradient: -1
+ }
+}
diff --git a/tests/auto/quick/qquickrectangle/tst_qquickrectangle.cpp b/tests/auto/quick/qquickrectangle/tst_qquickrectangle.cpp
index 2aaad867bf..f6ca999cf5 100644
--- a/tests/auto/quick/qquickrectangle/tst_qquickrectangle.cpp
+++ b/tests/auto/quick/qquickrectangle/tst_qquickrectangle.cpp
@@ -49,6 +49,7 @@ private slots:
void gradient_border();
void gradient_separate();
void gradient_multiple();
+ void gradient_preset();
void antialiasing();
private:
@@ -84,7 +85,7 @@ void tst_qquickrectangle::gradient()
QQuickRectangle *rect = qobject_cast<QQuickRectangle*>(component.create());
QVERIFY(rect);
- QQuickGradient *grad = rect->gradient();
+ QQuickGradient *grad = qobject_cast<QQuickGradient *>(rect->gradient().toQObject());
QVERIFY(grad);
QQmlListProperty<QQuickGradientStop> stops = grad->stops();
@@ -103,7 +104,7 @@ void tst_qquickrectangle::gradient()
QMetaObject::invokeMethod(rect, "resetGradient");
- grad = rect->gradient();
+ grad = qobject_cast<QQuickGradient *>(rect->gradient().toQObject());
QVERIFY(!grad);
delete rect;
@@ -174,6 +175,29 @@ void tst_qquickrectangle::gradient_multiple()
QVERIFY(secondIsDirty);
}
+void tst_qquickrectangle::gradient_preset()
+{
+ QQuickView view;
+ view.setSource(testFileUrl("gradient-preset.qml"));
+ view.show();
+
+ QVERIFY(QTest::qWaitForWindowExposed(&view));
+
+ QQuickRectangle *enumRect = view.rootObject()->findChild<QQuickRectangle *>("enum");
+ QVERIFY(enumRect);
+ QVERIFY(enumRect->gradient().isNumber());
+ QCOMPARE(enumRect->gradient().toUInt(), QGradient::NightFade);
+
+ QQuickRectangle *stringRect = view.rootObject()->findChild<QQuickRectangle *>("string");
+ QVERIFY(stringRect);
+ QVERIFY(stringRect->gradient().isString());
+ QCOMPARE(stringRect->gradient().toString(), QLatin1String("NightFade"));
+
+ QQuickRectangle *invalidRect = view.rootObject()->findChild<QQuickRectangle *>("invalid");
+ QVERIFY(invalidRect);
+ QVERIFY(invalidRect->gradient().isUndefined());
+}
+
void tst_qquickrectangle::antialiasing()
{
QQmlComponent component(&engine);
diff --git a/tests/auto/quick/qquickrepeater/data/ownership.qml b/tests/auto/quick/qquickrepeater/data/ownership.qml
new file mode 100644
index 0000000000..e13df3ab3a
--- /dev/null
+++ b/tests/auto/quick/qquickrepeater/data/ownership.qml
@@ -0,0 +1,4 @@
+import QtQuick 2.0
+
+Repeater {
+}
diff --git a/tests/auto/quick/qquickrepeater/data/package.qml b/tests/auto/quick/qquickrepeater/data/package.qml
new file mode 100644
index 0000000000..1f9eb0d970
--- /dev/null
+++ b/tests/auto/quick/qquickrepeater/data/package.qml
@@ -0,0 +1,35 @@
+import QtQuick 2.0
+import QtQml.Models 2.2
+import QtQuick.Window 2.0
+
+Window {
+ width: 300
+ height: 300
+ visible: true
+ DelegateModel {
+ id: mdl
+
+ model: 1
+ delegate: Package {
+ Item {
+ id: first
+ Package.name: "first"
+ objectName: "firstItem"
+ }
+ Item{
+ id: second
+ Package.name: "second"
+ objectName: "secondItem"
+ }
+ }
+ }
+
+ Repeater {
+ id: repeater1
+ model: mdl.parts.first
+ }
+ Repeater {
+ id: repeater2
+ model: mdl.parts.second
+ }
+}
diff --git a/tests/auto/quick/qquickrepeater/tst_qquickrepeater.cpp b/tests/auto/quick/qquickrepeater/tst_qquickrepeater.cpp
index 0499e2f9a6..0860956224 100644
--- a/tests/auto/quick/qquickrepeater/tst_qquickrepeater.cpp
+++ b/tests/auto/quick/qquickrepeater/tst_qquickrepeater.cpp
@@ -37,6 +37,7 @@
#include <QtQuick/private/qquicktext_p.h>
#include <QtQml/private/qqmllistmodel_p.h>
#include <QtQml/private/qqmlobjectmodel_p.h>
+#include <QtGui/qstandarditemmodel.h>
#include "../../shared/util.h"
#include "../shared/viewtestutil.h"
@@ -76,6 +77,8 @@ private slots:
void stackingOrder();
void objectModel();
void QTBUG54859_asynchronousMove();
+ void package();
+ void ownership();
};
class TestObject : public QObject
@@ -1014,6 +1017,91 @@ void tst_QQuickRepeater::QTBUG54859_asynchronousMove()
QTRY_COMPARE(item->property("finished"), QVariant(true));
}
+void tst_QQuickRepeater::package()
+{
+ QQmlEngine engine;
+ QQmlComponent component(&engine, testFileUrl("package.qml"));
+
+ QScopedPointer<QObject>o(component.create()); // don't crash!
+ QVERIFY(o != nullptr);
+
+ {
+ QQuickRepeater *repeater1 = qobject_cast<QQuickRepeater*>(qmlContext(o.data())->contextProperty("repeater1").value<QObject*>());
+ QVERIFY(repeater1);
+ QCOMPARE(repeater1->count(), 1);
+ QCOMPARE(repeater1->itemAt(0)->objectName(), "firstItem");
+ }
+
+ {
+ QQuickRepeater *repeater2 = qobject_cast<QQuickRepeater*>(qmlContext(o.data())->contextProperty("repeater2").value<QObject*>());
+ QVERIFY(repeater2);
+ QCOMPARE(repeater2->count(), 1);
+ QCOMPARE(repeater2->itemAt(0)->objectName(), "secondItem");
+ }
+}
+
+void tst_QQuickRepeater::ownership()
+{
+ QQmlEngine engine;
+
+ QQmlComponent component(&engine, testFileUrl("ownership.qml"));
+
+ QScopedPointer<QAbstractItemModel> aim(new QStandardItemModel);
+ QPointer<QAbstractItemModel> modelGuard(aim.data());
+ QQmlEngine::setObjectOwnership(aim.data(), QQmlEngine::JavaScriptOwnership);
+ {
+ QJSValue wrapper = engine.newQObject(aim.data());
+ }
+
+ QScopedPointer<QObject> repeater(component.create());
+ QVERIFY(!repeater.isNull());
+
+ QVERIFY(!QQmlData::keepAliveDuringGarbageCollection(aim.data()));
+
+ repeater->setProperty("model", QVariant::fromValue<QObject*>(aim.data()));
+
+ QVERIFY(!QQmlData::keepAliveDuringGarbageCollection(aim.data()));
+
+ engine.collectGarbage();
+ QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete);
+
+ QVERIFY(modelGuard);
+
+ QScopedPointer<QQmlComponent> delegate(new QQmlComponent(&engine));
+ delegate->setData(QByteArrayLiteral("import QtQuick 2.0\nItem{}"), dataDirectoryUrl().resolved(QUrl("inline.qml")));
+ QPointer<QQmlComponent> delegateGuard(delegate.data());
+ QQmlEngine::setObjectOwnership(delegate.data(), QQmlEngine::JavaScriptOwnership);
+ {
+ QJSValue wrapper = engine.newQObject(delegate.data());
+ }
+
+ QVERIFY(!QQmlData::keepAliveDuringGarbageCollection(delegate.data()));
+
+ repeater->setProperty("delegate", QVariant::fromValue<QObject*>(delegate.data()));
+
+ QVERIFY(!QQmlData::keepAliveDuringGarbageCollection(delegate.data()));
+
+ engine.collectGarbage();
+ QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete);
+
+ QVERIFY(delegateGuard);
+
+ repeater->setProperty("model", QVariant());
+ repeater->setProperty("delegate", QVariant());
+
+ QVERIFY(delegateGuard);
+ QVERIFY(modelGuard);
+
+ delegate.take();
+ aim.take();
+
+ engine.collectGarbage();
+ QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete);
+
+ QVERIFY(!delegateGuard);
+ QVERIFY(!modelGuard);
+}
+
QTEST_MAIN(tst_QQuickRepeater)
#include "tst_qquickrepeater.moc"
diff --git a/tests/auto/quick/qquickshape/qquickshape.pro b/tests/auto/quick/qquickshape/qquickshape.pro
index 29c3502b86..a0e5c002e0 100644
--- a/tests/auto/quick/qquickshape/qquickshape.pro
+++ b/tests/auto/quick/qquickshape/qquickshape.pro
@@ -9,27 +9,5 @@ include (../shared/util.pri)
TESTDATA = data/*
-HEADERS += \
- ../../../../src/imports/shapes/qquickshape_p.h \
- ../../../../src/imports/shapes/qquickshape_p_p.h \
- ../../../../src/imports/shapes/qquickshapegenericrenderer_p.h \
- ../../../../src/imports/shapes/qquickshapesoftwarerenderer_p.h
-
-SOURCES += \
- ../../../../src/imports/shapes/qquickshape.cpp \
- ../../../../src/imports/shapes/qquickshapegenericrenderer.cpp \
- ../../../../src/imports/shapes/qquickshapesoftwarerenderer.cpp
-
-qtConfig(opengl) {
- HEADERS += \
- ../../../../src/imports/shapes/qquicknvprfunctions_p.h \
- ../../../../src/imports/shapes/qquicknvprfunctions_p_p.h \
- ../../../../src/imports/shapes/qquickshapenvprrenderer_p.h
-
- SOURCES += \
- ../../../../src/imports/shapes/qquicknvprfunctions.cpp \
- ../../../../src/imports/shapes/qquickshapenvprrenderer.cpp
-}
-
-QT += core-private gui-private qml-private quick-private testlib
+QT += core-private gui-private qml-private quick-private testlib quickshapes-private
qtHaveModule(widgets): QT += widgets
diff --git a/tests/auto/quick/qquickshape/tst_qquickshape.cpp b/tests/auto/quick/qquickshape/tst_qquickshape.cpp
index 2a349d2013..72f987ce4a 100644
--- a/tests/auto/quick/qquickshape/tst_qquickshape.cpp
+++ b/tests/auto/quick/qquickshape/tst_qquickshape.cpp
@@ -33,7 +33,7 @@
#include <QtQml/qqmlcontext.h>
#include <QtQml/qqmlexpression.h>
#include <QtQml/qqmlincubator.h>
-#include "../../../../src/imports/shapes/qquickshape_p.h"
+#include <QtQuickShapes/private/qquickshape_p.h>
#include "../../shared/util.h"
#include "../shared/viewtestutil.h"
diff --git a/tests/auto/quick/qquicktableview/data/countingtableview.qml b/tests/auto/quick/qquicktableview/data/countingtableview.qml
new file mode 100644
index 0000000000..d8315be54f
--- /dev/null
+++ b/tests/auto/quick/qquicktableview/data/countingtableview.qml
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtQuick module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Window 2.3
+import Qt.labs.tableview 1.0
+
+Item {
+ id: root
+ width: 640
+ height: 450
+
+ property alias tableView: tableView
+ property int currentDelegateCount: 0
+ property int maxDelegateCount: 0
+
+ TableView {
+ id: tableView
+ width: 600
+ height: 400
+ anchors.margins: 1
+ clip: true
+ delegate: tableViewDelegate
+ cacheBuffer: 0
+ }
+
+ Component {
+ id: tableViewDelegate
+ Rectangle {
+ objectName: "tableViewDelegate"
+ TableView.cellWidth: 100
+ TableView.cellHeight: 50
+ color: "lightgray"
+ border.width: 1
+ Text {
+ anchors.centerIn: parent
+ text: modelData
+ }
+ Component.onCompleted: {
+ currentDelegateCount++;
+ maxDelegateCount = Math.max(maxDelegateCount, currentDelegateCount);
+ }
+ Component.onDestruction: {
+ currentDelegateCount--;
+ }
+ }
+ }
+
+}
diff --git a/tests/auto/quick/qquicktableview/data/plaintableview.qml b/tests/auto/quick/qquicktableview/data/plaintableview.qml
new file mode 100644
index 0000000000..7668f0ca01
--- /dev/null
+++ b/tests/auto/quick/qquicktableview/data/plaintableview.qml
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtQuick module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Window 2.3
+import Qt.labs.tableview 1.0
+
+Item {
+ width: 640
+ height: 450
+
+ property alias tableView: tableView
+ property real delegateWidth: 100
+ property real delegateHeight: 50
+ property Component delegate: tableViewDelegate
+
+ TableView {
+ id: tableView
+ width: 600
+ height: 400
+ anchors.margins: 1
+ clip: true
+ delegate: tableViewDelegate
+ cacheBuffer: 0
+ columnSpacing: 1
+ rowSpacing: 1
+ }
+
+ Component {
+ id: tableViewDelegate
+ Rectangle {
+ objectName: "tableViewDelegate"
+ TableView.cellWidth: delegateWidth
+ TableView.cellHeight: delegateHeight
+ color: "lightgray"
+ border.width: 1
+ Text {
+ anchors.centerIn: parent
+ text: modelData
+ }
+ }
+ }
+
+}
diff --git a/tests/auto/quick/qquicktableview/data/tableviewimplicitsize.qml b/tests/auto/quick/qquicktableview/data/tableviewimplicitsize.qml
new file mode 100644
index 0000000000..65e4d0861c
--- /dev/null
+++ b/tests/auto/quick/qquicktableview/data/tableviewimplicitsize.qml
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Window 2.3
+import Qt.labs.tableview 1.0
+
+Item {
+ width: 640
+ height: 450
+
+ property alias tableView: tableView
+
+ TableView {
+ id: tableView
+ width: 600
+ height: 400
+ anchors.margins: 1
+ clip: true
+ delegate: tableViewDelegate
+ cacheBuffer: 0
+ columnSpacing: 1
+ rowSpacing: 1
+ }
+
+ Component {
+ id: tableViewDelegate
+ Rectangle {
+ objectName: "tableViewDelegate"
+ color: "lightgray"
+ border.width: 1
+ implicitWidth: 90
+ implicitHeight: 60
+ Text {
+ anchors.centerIn: parent
+ text: modelData
+ }
+ }
+ }
+
+}
diff --git a/tests/auto/quick/qquicktableview/qquicktableview.pro b/tests/auto/quick/qquicktableview/qquicktableview.pro
new file mode 100644
index 0000000000..f4d0265dd3
--- /dev/null
+++ b/tests/auto/quick/qquicktableview/qquicktableview.pro
@@ -0,0 +1,14 @@
+CONFIG += testcase
+TARGET = tst_qquicktableview
+macos:CONFIG -= app_bundle
+
+HEADERS += testmodel.h
+SOURCES += tst_qquicktableview.cpp
+
+include (../../shared/util.pri)
+include (../shared/util.pri)
+
+TESTDATA = data/*
+
+QT += core-private gui-private qml-private quick-private testlib
+
diff --git a/tests/auto/quick/qquicktableview/testmodel.h b/tests/auto/quick/qquicktableview/testmodel.h
new file mode 100644
index 0000000000..06384f7a5e
--- /dev/null
+++ b/tests/auto/quick/qquicktableview/testmodel.h
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtCore/QtCore>
+#include <QtGui/QStandardItemModel>
+
+class TestModel : public QAbstractTableModel
+{
+ Q_OBJECT
+ Q_PROPERTY(int rowCount READ rowCount WRITE setRowCount NOTIFY rowCountChanged)
+ Q_PROPERTY(int columnCount READ columnCount WRITE setColumnCount NOTIFY columnCountChanged)
+
+public:
+ TestModel(QObject *parent = nullptr)
+ : QAbstractTableModel(parent)
+ {}
+
+ TestModel(int rows, int columns, QObject *parent = nullptr)
+ : QAbstractTableModel(parent)
+ , m_rows(rows)
+ , m_columns(columns)
+ {}
+
+ int rowCount(const QModelIndex & = QModelIndex()) const override { return m_rows; }
+ void setRowCount(int count) { beginResetModel(); m_rows = count; emit rowCountChanged(); endResetModel(); }
+
+ int columnCount(const QModelIndex & = QModelIndex()) const override { return m_columns; }
+ void setColumnCount(int count) { beginResetModel(); m_columns = count; emit columnCountChanged(); endResetModel(); }
+
+ QVariant data(const QModelIndex &index, int role) const override
+ {
+ if (!index.isValid() || role != Qt::DisplayRole)
+ return QVariant();
+
+ int cell = index.row() + (index.column() * m_columns);
+ if (selectedCells.contains(cell))
+ return QStringLiteral("selected");
+ return QString("%1").arg(index.row());
+ }
+
+ QHash<int, QByteArray> roleNames() const override
+ {
+ return { {Qt::DisplayRole, "display"} };
+ }
+
+ Q_INVOKABLE void selectCell(int row, int column)
+ {
+ int cell = row + (column * m_columns);
+ selectedCells.insert(cell);
+ auto index = createIndex(row, column, nullptr);
+ emit dataChanged(index, index);
+ }
+
+signals:
+ void rowCountChanged();
+ void columnCountChanged();
+
+private:
+ int m_rows = 0;
+ int m_columns = 0;
+ QSet<int> selectedCells;
+};
+
+#define TestModelAsVariant(...) QVariant::fromValue(QSharedPointer<TestModel>(new TestModel(__VA_ARGS__)))
diff --git a/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp b/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp
new file mode 100644
index 0000000000..8caced4396
--- /dev/null
+++ b/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp
@@ -0,0 +1,791 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtTest/QtTest>
+
+#include <QtQuick/qquickview.h>
+#include <QtQuick/private/qquicktableview_p.h>
+#include <QtQuick/private/qquicktableview_p_p.h>
+
+#include <QtQml/qqmlengine.h>
+#include <QtQml/qqmlcontext.h>
+#include <QtQml/qqmlexpression.h>
+#include <QtQml/qqmlincubator.h>
+#include <QtQml/private/qqmlobjectmodel_p.h>
+#include <QtQml/private/qqmllistmodel_p.h>
+#include <QtQml/private/qqmldelegatemodel_p.h>
+
+#include "testmodel.h"
+
+#include "../../shared/util.h"
+#include "../shared/viewtestutil.h"
+#include "../shared/visualtestutil.h"
+
+using namespace QQuickViewTestUtil;
+using namespace QQuickVisualTestUtil;
+
+static const char* kTableViewPropName = "tableView";
+static const char* kDelegateObjectName = "tableViewDelegate";
+
+Q_DECLARE_METATYPE(QMarginsF);
+
+#define LOAD_TABLEVIEW(fileName) \
+ QScopedPointer<QQuickView> view(createView()); \
+ view->setSource(testFileUrl(fileName)); \
+ view->show(); \
+ QVERIFY(QTest::qWaitForWindowActive(view.data())); \
+ auto tableView = view->rootObject()->property(kTableViewPropName).value<QQuickTableView *>(); \
+ QVERIFY(tableView); \
+ auto tableViewPrivate = QQuickTableViewPrivate::get(tableView); \
+ Q_UNUSED(tableViewPrivate)
+
+#define WAIT_UNTIL_POLISHED \
+ QVERIFY(tableViewPrivate->polishScheduled); \
+ QTRY_VERIFY(!tableViewPrivate->polishScheduled)
+
+class tst_QQuickTableView : public QQmlDataTest
+{
+ Q_OBJECT
+public:
+ tst_QQuickTableView();
+
+ QQuickTableViewAttached *getAttachedObject(const QObject *object) const;
+ QPoint getContextRowAndColumn(const QQuickItem *item) const;
+
+private slots:
+ void initTestCase() override;
+
+ void setAndGetModel_data();
+ void setAndGetModel();
+ void emptyModel_data();
+ void emptyModel();
+ void checkZeroSizedDelegate();
+ void checkImplicitSizeDelegate();
+ void noDelegate();
+ void countDelegateItems_data();
+ void countDelegateItems();
+ void checkLayoutOfEqualSizedDelegateItems_data();
+ void checkLayoutOfEqualSizedDelegateItems();
+ void checkTableMargins_data();
+ void checkTableMargins();
+ void fillTableViewButNothingMore_data();
+ void fillTableViewButNothingMore();
+ void checkInitialAttachedProperties_data();
+ void checkInitialAttachedProperties();
+ void flick_data();
+ void flick();
+ void flickOvershoot_data();
+ void flickOvershoot();
+ void checkRowColumnCount();
+};
+
+tst_QQuickTableView::tst_QQuickTableView()
+{
+}
+
+void tst_QQuickTableView::initTestCase()
+{
+ QQmlDataTest::initTestCase();
+ qmlRegisterType<TestModel>("TestModel", 0, 1, "TestModel");
+}
+
+QQuickTableViewAttached *tst_QQuickTableView::getAttachedObject(const QObject *object) const
+{
+ QObject *attachedObject = qmlAttachedPropertiesObject<QQuickTableView>(object);
+ return static_cast<QQuickTableViewAttached *>(attachedObject);
+}
+
+QPoint tst_QQuickTableView::getContextRowAndColumn(const QQuickItem *item) const
+{
+ const auto context = qmlContext(item);
+ const int row = context->contextProperty("row").toInt();
+ const int column = context->contextProperty("column").toInt();
+ return QPoint(column, row);
+}
+
+void tst_QQuickTableView::setAndGetModel_data()
+{
+ QTest::addColumn<QVariant>("model");
+
+ QTest::newRow("QAIM 1x1") << TestModelAsVariant(1, 1);
+ QTest::newRow("Number model 1") << QVariant::fromValue(1);
+ QTest::newRow("QStringList 1") << QVariant::fromValue(QStringList() << "one");
+}
+
+void tst_QQuickTableView::setAndGetModel()
+{
+ // Test that we can set and get different kind of models
+ QFETCH(QVariant, model);
+ LOAD_TABLEVIEW("plaintableview.qml");
+
+ tableView->setModel(model);
+ QCOMPARE(model, tableView->model());
+}
+
+void tst_QQuickTableView::emptyModel_data()
+{
+ QTest::addColumn<QVariant>("model");
+
+ QTest::newRow("QAIM") << TestModelAsVariant(0, 0);
+ QTest::newRow("Number model") << QVariant::fromValue(0);
+ QTest::newRow("QStringList") << QVariant::fromValue(QStringList());
+}
+
+void tst_QQuickTableView::emptyModel()
+{
+ // Check that if we assign an empty model to
+ // TableView, no delegate items will be created.
+ QFETCH(QVariant, model);
+ LOAD_TABLEVIEW("plaintableview.qml");
+
+ tableView->setModel(model);
+ WAIT_UNTIL_POLISHED;
+ QCOMPARE(tableViewPrivate->loadedItems.count(), 0);
+}
+
+void tst_QQuickTableView::checkZeroSizedDelegate()
+{
+ // Check that if we assign a delegate with empty width and height, we
+ // fall back to use kDefaultColumnWidth and kDefaultRowHeight as
+ // column/row sizes.
+ LOAD_TABLEVIEW("plaintableview.qml");
+
+ auto model = TestModelAsVariant(100, 100);
+ tableView->setModel(model);
+
+ view->rootObject()->setProperty("delegateWidth", 0);
+ view->rootObject()->setProperty("delegateHeight", 0);
+
+ WAIT_UNTIL_POLISHED;
+
+ auto items = tableViewPrivate->loadedItems;
+ QVERIFY(!items.isEmpty());
+
+ for (auto fxItem : tableViewPrivate->loadedItems) {
+ auto item = fxItem->item;
+ QCOMPARE(item->width(), kDefaultColumnWidth);
+ QCOMPARE(item->height(), kDefaultRowHeight);
+ }
+}
+
+void tst_QQuickTableView::checkImplicitSizeDelegate()
+{
+ // Check that we can set the size of delegate items using
+ // implicit width/height, instead of forcing the user to
+ // create an attached object by using TableView.cellWidth/Height.
+ LOAD_TABLEVIEW("tableviewimplicitsize.qml");
+
+ auto model = TestModelAsVariant(100, 100);
+ tableView->setModel(model);
+
+ WAIT_UNTIL_POLISHED;
+
+ auto items = tableViewPrivate->loadedItems;
+ QVERIFY(!items.isEmpty());
+
+ for (auto fxItem : tableViewPrivate->loadedItems) {
+ auto item = fxItem->item;
+ QCOMPARE(item->width(), 90);
+ QCOMPARE(item->height(), 60);
+ }
+}
+
+void tst_QQuickTableView::noDelegate()
+{
+ // Check that you can skip setting a delegate without
+ // it causing any problems (like crashing or asserting).
+ // And then set a delegate, and do a quick check that the
+ // view gets populated as expected.
+ LOAD_TABLEVIEW("plaintableview.qml");
+
+ const int rows = 5;
+ const int columns = 5;
+ auto model = TestModelAsVariant(columns, rows);
+ tableView->setModel(model);
+
+ // Start with no delegate, and check
+ // that we end up with no items in the table.
+ tableView->setDelegate(nullptr);
+
+ WAIT_UNTIL_POLISHED;
+
+ auto items = tableViewPrivate->loadedItems;
+ QVERIFY(items.isEmpty());
+
+ // Set a delegate, and check that we end
+ // up with the expected number of items.
+ auto delegate = view->rootObject()->property("delegate").value<QQmlComponent *>();
+ QVERIFY(delegate);
+ tableView->setDelegate(delegate);
+
+ WAIT_UNTIL_POLISHED;
+
+ items = tableViewPrivate->loadedItems;
+ QCOMPARE(items.count(), rows * columns);
+
+ // And then unset the delegate again, and check
+ // that we end up with no items.
+ tableView->setDelegate(nullptr);
+
+ WAIT_UNTIL_POLISHED;
+
+ items = tableViewPrivate->loadedItems;
+ QVERIFY(items.isEmpty());
+}
+
+void tst_QQuickTableView::countDelegateItems_data()
+{
+ QTest::addColumn<QVariant>("model");
+ QTest::addColumn<int>("count");
+
+ QTest::newRow("QAIM 1x1") << TestModelAsVariant(1, 1) << 1;
+ QTest::newRow("QAIM 2x1") << TestModelAsVariant(2, 1) << 2;
+ QTest::newRow("QAIM 1x2") << TestModelAsVariant(1, 2) << 2;
+ QTest::newRow("QAIM 2x2") << TestModelAsVariant(2, 2) << 4;
+ QTest::newRow("QAIM 4x4") << TestModelAsVariant(4, 4) << 16;
+
+ QTest::newRow("Number model 1") << QVariant::fromValue(1) << 1;
+ QTest::newRow("Number model 4") << QVariant::fromValue(4) << 4;
+
+ QTest::newRow("QStringList 1") << QVariant::fromValue(QStringList() << "one") << 1;
+ QTest::newRow("QStringList 4") << QVariant::fromValue(QStringList() << "one" << "two" << "three" << "four") << 4;
+}
+
+void tst_QQuickTableView::countDelegateItems()
+{
+ // Assign different models of various sizes, and check that the number of
+ // delegate items in the view matches the size of the model. Note that for
+ // this test to be valid, all items must be within the visible area of the view.
+ QFETCH(QVariant, model);
+ QFETCH(int, count);
+ LOAD_TABLEVIEW("plaintableview.qml");
+
+ tableView->setModel(model);
+ WAIT_UNTIL_POLISHED;
+
+ // Check that tableview internals contain the expected number of items
+ auto const items = tableViewPrivate->loadedItems;
+ QCOMPARE(items.count(), count);
+
+ // Check that this also matches the items found in the view
+ auto foundItems = findItems<QQuickItem>(tableView, kDelegateObjectName);
+ QCOMPARE(foundItems.count(), count);
+}
+
+void tst_QQuickTableView::checkLayoutOfEqualSizedDelegateItems_data()
+{
+ QTest::addColumn<QVariant>("model");
+ QTest::addColumn<QSize>("tableSize");
+ QTest::addColumn<QSizeF>("spacing");
+ QTest::addColumn<QMarginsF>("margins");
+
+ // Check spacing together with different table setups
+ QTest::newRow("QAIM 1x1 1,1") << TestModelAsVariant(1, 1) << QSize(1, 1) << QSizeF(1, 1) << QMarginsF(0, 0, 0, 0);
+ QTest::newRow("QAIM 5x5 0,0") << TestModelAsVariant(5, 5) << QSize(5, 5) << QSizeF(0, 0) << QMarginsF(0, 0, 0, 0);
+ QTest::newRow("QAIM 5x5 1,0") << TestModelAsVariant(5, 5) << QSize(5, 5) << QSizeF(1, 0) << QMarginsF(0, 0, 0, 0);
+ QTest::newRow("QAIM 5x5 0,1") << TestModelAsVariant(5, 5) << QSize(5, 5) << QSizeF(0, 1) << QMarginsF(0, 0, 0, 0);
+
+ // Check spacing together with margins
+ QTest::newRow("QAIM 1x1 1,1 5555") << TestModelAsVariant(1, 1) << QSize(1, 1) << QSizeF(1, 1) << QMarginsF(5, 5, 5, 5);
+ QTest::newRow("QAIM 4x4 0,0 3333") << TestModelAsVariant(4, 4) << QSize(4, 4) << QSizeF(0, 0) << QMarginsF(3, 3, 3, 3);
+ QTest::newRow("QAIM 4x4 2,2 1234") << TestModelAsVariant(4, 4) << QSize(4, 4) << QSizeF(2, 2) << QMarginsF(1, 2, 3, 4);
+
+ // Check "list" models
+ QTest::newRow("NumberModel 1x4, 0000") << QVariant::fromValue(4) << QSize(1, 4) << QSizeF(1, 1) << QMarginsF(0, 0, 0, 0);
+ QTest::newRow("QStringList 1x4, 0,0 1111") << QVariant::fromValue(QStringList() << "one" << "two" << "three" << "four")
+ << QSize(1, 4) << QSizeF(0, 0) << QMarginsF(1, 1, 1, 1);
+}
+
+void tst_QQuickTableView::checkLayoutOfEqualSizedDelegateItems()
+{
+ // Check that the geometry of the delegate items are correct
+ QFETCH(QVariant, model);
+ QFETCH(QSize, tableSize);
+ QFETCH(QSizeF, spacing);
+ QFETCH(QMarginsF, margins);
+ LOAD_TABLEVIEW("plaintableview.qml");
+
+ const qreal expectedItemWidth = 100;
+ const qreal expectedItemHeight = 50;
+ const int expectedItemCount = tableSize.width() * tableSize.height();
+
+ tableView->setModel(model);
+ tableView->setRowSpacing(spacing.height());
+ tableView->setColumnSpacing(spacing.width());
+ tableView->setLeftMargin(margins.left());
+ tableView->setTopMargin(margins.top());
+ tableView->setRightMargin(margins.right());
+ tableView->setBottomMargin(margins.bottom());
+
+ WAIT_UNTIL_POLISHED;
+
+ auto const items = tableViewPrivate->loadedItems;
+ QVERIFY(!items.isEmpty());
+
+ for (int i = 0; i < expectedItemCount; ++i) {
+ const QQuickItem *item = items[i]->item;
+ QVERIFY(item);
+ QCOMPARE(item->parentItem(), tableView->contentItem());
+
+ const QPoint cell = getContextRowAndColumn(item);
+ qreal expectedX = margins.left() + (cell.x() * (expectedItemWidth + spacing.width()));
+ qreal expectedY = margins.top() + (cell.y() * (expectedItemHeight + spacing.height()));
+ QCOMPARE(item->x(), expectedX);
+ QCOMPARE(item->y(), expectedY);
+ QCOMPARE(item->width(), expectedItemWidth);
+ QCOMPARE(item->height(), expectedItemHeight);
+ }
+}
+
+void tst_QQuickTableView::checkTableMargins_data()
+{
+ QTest::addColumn<QVariant>("model");
+ QTest::addColumn<QSize>("tableSize");
+ QTest::addColumn<QSizeF>("spacing");
+ QTest::addColumn<QMarginsF>("margins");
+
+ QTest::newRow("QAIM 1x1 1,1 0000") << TestModelAsVariant(1, 1) << QSize(1, 1) << QSizeF(1, 1) << QMarginsF(0, 0, 0, 0);
+ QTest::newRow("QAIM 4x4 1,1 0000") << TestModelAsVariant(4, 4) << QSize(4, 4) << QSizeF(1, 1) << QMarginsF(0, 0, 0, 0);
+ QTest::newRow("QAIM 1x1 1,1 5555") << TestModelAsVariant(1, 1) << QSize(1, 1) << QSizeF(1, 1) << QMarginsF(5, 5, 5, 5);
+ QTest::newRow("QAIM 4x4 0,0 3333") << TestModelAsVariant(4, 4) << QSize(4, 4) << QSizeF(0, 0) << QMarginsF(3, 3, 3, 3);
+ QTest::newRow("QAIM 4x4 2,2 1234") << TestModelAsVariant(4, 4) << QSize(4, 4) << QSizeF(2, 2) << QMarginsF(1, 2, 3, 4);
+ QTest::newRow("QAIM 1x1 0,0 3210") << TestModelAsVariant(1, 1) << QSize(1, 1) << QSizeF(0, 0) << QMarginsF(3, 2, 1, 0);
+}
+
+void tst_QQuickTableView::checkTableMargins()
+{
+ // Check that the space between the content view and
+ // the items matches the margins we set on the tableview.
+ QFETCH(QVariant, model);
+ QFETCH(QSize, tableSize);
+ QFETCH(QSizeF, spacing);
+ QFETCH(QMarginsF, margins);
+ LOAD_TABLEVIEW("plaintableview.qml");
+
+ tableView->setModel(model);
+ tableView->setRowSpacing(spacing.height());
+ tableView->setColumnSpacing(spacing.width());
+ tableView->setLeftMargin(margins.left());
+ tableView->setTopMargin(margins.top());
+ tableView->setRightMargin(margins.right());
+ tableView->setBottomMargin(margins.bottom());
+
+ WAIT_UNTIL_POLISHED;
+
+ QCOMPARE(tableViewPrivate->loadedTable.size(), tableSize);
+
+ auto const topLeftFxItem = tableViewPrivate->loadedTableItem(QPoint(0, 0));
+ auto const bottomRightFxItem = tableViewPrivate->loadedTableItem(tableViewPrivate->loadedTable.bottomRight());
+ auto const topLeftItem = topLeftFxItem->item;
+ auto const bottomRightItem = bottomRightFxItem->item;
+
+ qreal leftSpace = topLeftItem->x();
+ qreal topSpace = topLeftItem->y();
+ qreal rightSpace = tableView->contentWidth() - (bottomRightItem->x() + bottomRightItem->width());
+ qreal bottomSpace = tableView->contentHeight() - (bottomRightItem->y() + bottomRightItem->height());
+ QCOMPARE(leftSpace, margins.left());
+ QCOMPARE(topSpace, margins.top());
+ QCOMPARE(rightSpace, margins.right());
+ QCOMPARE(bottomSpace, margins.bottom());
+}
+
+void tst_QQuickTableView::fillTableViewButNothingMore_data()
+{
+ QTest::addColumn<QSizeF>("spacing");
+ QTest::addColumn<QMarginsF>("margins");
+
+ QTest::newRow("0 0,0 0") << QSizeF(0, 0) << QMarginsF(0, 0, 0, 0);
+ QTest::newRow("0 10,10 0") << QSizeF(10, 10) << QMarginsF(0, 0, 0, 0);
+ QTest::newRow("100 10,10 0") << QSizeF(10, 10) << QMarginsF(0, 0, 0, 0);
+ QTest::newRow("0 0,0 100") << QSizeF(0, 0) << QMarginsF(0, 0, 0, 0);
+ QTest::newRow("0 10,10 100") << QSizeF(10, 10) << QMarginsF(100, 100, 100, 100);
+ QTest::newRow("100 10,10 100") << QSizeF(10, 10) << QMarginsF(100, 100, 100, 100);
+}
+
+void tst_QQuickTableView::fillTableViewButNothingMore()
+{
+ // Check that we end up filling the whole visible part of
+ // the tableview with cells, but nothing more.
+ QFETCH(QSizeF, spacing);
+ QFETCH(QMarginsF, margins);
+ LOAD_TABLEVIEW("plaintableview.qml");
+
+ const int rows = 100;
+ const int columns = 100;
+ auto model = TestModelAsVariant(rows, columns);
+
+ tableView->setModel(model);
+ tableView->setRowSpacing(spacing.height());
+ tableView->setColumnSpacing(spacing.width());
+ tableView->setLeftMargin(margins.left());
+ tableView->setTopMargin(margins.top());
+ tableView->setRightMargin(margins.right());
+ tableView->setBottomMargin(margins.bottom());
+ tableView->setCacheBuffer(0);
+
+ WAIT_UNTIL_POLISHED;
+
+ auto const topLeftFxItem = tableViewPrivate->loadedTableItem(QPoint(0, 0));
+ auto const topLeftItem = topLeftFxItem->item;
+
+ // Check that the top-left item are at the corner of the view
+ QCOMPARE(topLeftItem->x(), margins.left());
+ QCOMPARE(topLeftItem->y(), margins.top());
+
+ auto const bottomRightFxItem = tableViewPrivate->loadedTableItem(tableViewPrivate->loadedTable.bottomRight());
+ auto const bottomRightItem = bottomRightFxItem->item;
+ const QPoint bottomRightCell = getContextRowAndColumn(bottomRightItem.data());
+
+ // Check that the right-most item is overlapping the right edge of the view
+ QVERIFY(bottomRightItem->x() < tableView->width());
+ QVERIFY(bottomRightItem->x() + bottomRightItem->width() >= tableView->width() - spacing.width());
+
+ // Check that the actual number of columns matches what we expect
+ qreal cellWidth = bottomRightItem->width() + spacing.width();
+ qreal availableWidth = tableView->width() - margins.left();
+ int expectedColumns = qCeil(availableWidth / cellWidth);
+ int actualColumns = bottomRightCell.x() + 1;
+ QCOMPARE(actualColumns, expectedColumns);
+
+ // Check that the bottom-most item is overlapping the bottom edge of the view
+ QVERIFY(bottomRightItem->y() < tableView->height());
+ QVERIFY(bottomRightItem->y() + bottomRightItem->height() >= tableView->height() - spacing.height());
+
+ // Check that the actual number of rows matches what we expect
+ qreal cellHeight = bottomRightItem->height() + spacing.height();
+ qreal availableHeight = tableView->height() - margins.top();
+ int expectedRows = qCeil(availableHeight / cellHeight);
+ int actualRows = bottomRightCell.y() + 1;
+ QCOMPARE(actualRows, expectedRows);
+}
+
+void tst_QQuickTableView::checkInitialAttachedProperties_data()
+{
+ QTest::addColumn<QVariant>("model");
+
+ QTest::newRow("QAIM") << TestModelAsVariant(4, 4);
+ QTest::newRow("Number model") << QVariant::fromValue(4);
+ QTest::newRow("QStringList") << QVariant::fromValue(QStringList() << "0" << "1" << "2" << "3");
+}
+
+void tst_QQuickTableView::checkInitialAttachedProperties()
+{
+ // Check that the context and attached properties inside
+ // the delegate items are what we expect at start-up.
+ QFETCH(QVariant, model);
+ LOAD_TABLEVIEW("plaintableview.qml");
+
+ tableView->setModel(model);
+
+ WAIT_UNTIL_POLISHED;
+
+ for (auto fxItem : tableViewPrivate->loadedItems) {
+ const int index = fxItem->index;
+ const auto item = fxItem->item;
+ const auto context = qmlContext(item.data());
+ const QPoint cell = tableViewPrivate->cellAtModelIndex(index);
+ const int contextIndex = context->contextProperty("index").toInt();
+ const QPoint contextCell = getContextRowAndColumn(item.data());
+ const QString contextModelData = context->contextProperty("modelData").toString();
+ const QQmlDelegateModelAttached *delegateModelAttached =
+ static_cast<QQmlDelegateModelAttached *>(
+ qmlAttachedPropertiesObject<QQmlDelegateModel>(item));
+ const int contextItemsIndex = delegateModelAttached->property("itemsIndex").toInt();
+
+ QCOMPARE(contextCell.y(), cell.y());
+ QCOMPARE(contextCell.x(), cell.x());
+ QCOMPARE(contextIndex, index);
+ QCOMPARE(contextModelData, QStringLiteral("%1").arg(cell.y()));
+ QCOMPARE(contextItemsIndex, index);
+ }
+}
+
+void tst_QQuickTableView::flick_data()
+{
+ QTest::addColumn<QSizeF>("spacing");
+ QTest::addColumn<QMarginsF>("margins");
+
+ QTest::newRow("s:0 m:0") << QSizeF(0, 0) << QMarginsF(0, 0, 0, 0);
+ QTest::newRow("s:5 m:0") << QSizeF(5, 5) << QMarginsF(0, 0, 0, 0);
+ QTest::newRow("s:0 m:20") << QSizeF(0, 0) << QMarginsF(20, 20, 20, 20);
+ QTest::newRow("s:5 m:20") << QSizeF(5, 5) << QMarginsF(20, 20, 20, 20);
+}
+
+void tst_QQuickTableView::flick()
+{
+ // Check that if we end up with the correct start and end column/row as we flick around
+ // with different table configurations.
+ QFETCH(QSizeF, spacing);
+ QFETCH(QMarginsF, margins);
+ LOAD_TABLEVIEW("plaintableview.qml");
+
+ const qreal delegateWidth = 100;
+ const qreal delegateHeight = 50;
+ const int visualColumnCount = 4;
+ const int visualRowCount = 4;
+ const qreal cellWidth = delegateWidth + spacing.width();
+ const qreal cellHeight = delegateHeight + spacing.height();
+ auto model = TestModelAsVariant(100, 100);
+
+ tableView->setModel(model);
+ tableView->setRowSpacing(spacing.height());
+ tableView->setColumnSpacing(spacing.width());
+ tableView->setLeftMargin(margins.left());
+ tableView->setTopMargin(margins.top());
+ tableView->setRightMargin(margins.right());
+ tableView->setBottomMargin(margins.bottom());
+ tableView->setCacheBuffer(0);
+ tableView->setWidth(margins.left() + (visualColumnCount * cellWidth) - spacing.width());
+ tableView->setHeight(margins.top() + (visualRowCount * cellHeight) - spacing.height());
+
+ WAIT_UNTIL_POLISHED;
+
+ // Check the "simple" case if the cells never lands egde-to-edge with the viewport. For
+ // that case we only accept that visible row/columns are loaded.
+ qreal flickValues[] = {0.5, 1.5, 4.5, 20.5, 10.5, 3.5, 1.5, 0.5};
+
+ for (qreal cellsToFlick : flickValues) {
+ // Flick to the beginning of the cell
+ tableView->setContentX(cellsToFlick * cellWidth);
+ tableView->setContentY(cellsToFlick * cellHeight);
+ tableView->polish();
+
+ WAIT_UNTIL_POLISHED;
+
+ const QRect loadedTable = tableViewPrivate->loadedTable;
+
+ const int expectedTableLeft = cellsToFlick - int((margins.left() + spacing.width()) / cellWidth);
+ const int expectedTableTop = cellsToFlick - int((margins.top() + spacing.height()) / cellHeight);
+
+ QCOMPARE(loadedTable.left(), expectedTableLeft);
+ QCOMPARE(loadedTable.right(), expectedTableLeft + visualColumnCount);
+ QCOMPARE(loadedTable.top(), expectedTableTop);
+ QCOMPARE(loadedTable.bottom(), expectedTableTop + visualRowCount);
+ }
+}
+
+void tst_QQuickTableView::flickOvershoot_data()
+{
+ QTest::addColumn<QSizeF>("spacing");
+ QTest::addColumn<QMarginsF>("margins");
+
+ QTest::newRow("s:0 m:0") << QSizeF(0, 0) << QMarginsF(0, 0, 0, 0);
+ QTest::newRow("s:5 m:0") << QSizeF(5, 5) << QMarginsF(0, 0, 0, 0);
+ QTest::newRow("s:0 m:20") << QSizeF(0, 0) << QMarginsF(20, 20, 20, 20);
+ QTest::newRow("s:5 m:20") << QSizeF(5, 5) << QMarginsF(20, 20, 20, 20);
+}
+
+void tst_QQuickTableView::flickOvershoot()
+{
+ // Flick the table completely out and then in again, and see
+ // that we still contains the expected rows/columns
+ // Note that TableView always keeps top-left item loaded, even
+ // when everything is flicked out of view.
+ QFETCH(QSizeF, spacing);
+ QFETCH(QMarginsF, margins);
+ LOAD_TABLEVIEW("plaintableview.qml");
+
+ const int rowCount = 5;
+ const int columnCount = 5;
+ const qreal delegateWidth = 100;
+ const qreal delegateHeight = 50;
+ const qreal cellWidth = delegateWidth + spacing.width();
+ const qreal cellHeight = delegateHeight + spacing.height();
+ const qreal tableWidth = margins.left() + margins.right() + (cellWidth * columnCount) - spacing.width();
+ const qreal tableHeight = margins.top() + margins.bottom() + (cellHeight * rowCount) - spacing.height();
+ const int outsideMargin = 10;
+ auto model = TestModelAsVariant(rowCount, columnCount);
+
+ tableView->setModel(model);
+ tableView->setRowSpacing(spacing.height());
+ tableView->setColumnSpacing(spacing.width());
+ tableView->setLeftMargin(margins.left());
+ tableView->setTopMargin(margins.top());
+ tableView->setRightMargin(margins.right());
+ tableView->setBottomMargin(margins.bottom());
+ tableView->setCacheBuffer(0);
+ tableView->setWidth(tableWidth - margins.right() - cellWidth / 2);
+ tableView->setHeight(tableHeight - margins.bottom() - cellHeight / 2);
+
+ WAIT_UNTIL_POLISHED;
+
+ // Flick table out of view left
+ tableView->setContentX(-tableView->width() - outsideMargin);
+ tableView->setContentY(0);
+ tableView->polish();
+
+ WAIT_UNTIL_POLISHED;
+
+ QCOMPARE(tableViewPrivate->loadedTable.left(), 0);
+ QCOMPARE(tableViewPrivate->loadedTable.right(), 0);
+ QCOMPARE(tableViewPrivate->loadedTable.top(), 0);
+ QCOMPARE(tableViewPrivate->loadedTable.bottom(), rowCount - 1);
+
+ // Flick table out of view right
+ tableView->setContentX(tableWidth + outsideMargin);
+ tableView->setContentY(0);
+ tableView->polish();
+
+ WAIT_UNTIL_POLISHED;
+
+ QCOMPARE(tableViewPrivate->loadedTable.left(), columnCount - 1);
+ QCOMPARE(tableViewPrivate->loadedTable.right(), columnCount - 1);
+ QCOMPARE(tableViewPrivate->loadedTable.top(), 0);
+ QCOMPARE(tableViewPrivate->loadedTable.bottom(), rowCount - 1);
+
+ // Flick table out of view on top
+ tableView->setContentX(0);
+ tableView->setContentY(-tableView->height() - outsideMargin);
+ tableView->polish();
+
+ WAIT_UNTIL_POLISHED;
+
+ QCOMPARE(tableViewPrivate->loadedTable.left(), 0);
+ QCOMPARE(tableViewPrivate->loadedTable.right(), columnCount - 1);
+ QCOMPARE(tableViewPrivate->loadedTable.top(), 0);
+ QCOMPARE(tableViewPrivate->loadedTable.bottom(), 0);
+
+ // Flick table out of view at the bottom
+ tableView->setContentX(0);
+ tableView->setContentY(tableHeight + outsideMargin);
+ tableView->polish();
+
+ WAIT_UNTIL_POLISHED;
+
+ QCOMPARE(tableViewPrivate->loadedTable.left(), 0);
+ QCOMPARE(tableViewPrivate->loadedTable.right(), columnCount - 1);
+ QCOMPARE(tableViewPrivate->loadedTable.top(), rowCount - 1);
+ QCOMPARE(tableViewPrivate->loadedTable.bottom(), rowCount - 1);
+
+ // Flick table out of view left and top at the same time
+ tableView->setContentX(-tableView->width() - outsideMargin);
+ tableView->setContentY(-tableView->height() - outsideMargin);
+ tableView->polish();
+
+ WAIT_UNTIL_POLISHED;
+
+ QCOMPARE(tableViewPrivate->loadedTable.left(), 0);
+ QCOMPARE(tableViewPrivate->loadedTable.right(), 0);
+ QCOMPARE(tableViewPrivate->loadedTable.top(), 0);
+ QCOMPARE(tableViewPrivate->loadedTable.bottom(), 0);
+
+ // Flick table back to origo
+ tableView->setContentX(0);
+ tableView->setContentY(0);
+ tableView->polish();
+
+ WAIT_UNTIL_POLISHED;
+
+ QCOMPARE(tableViewPrivate->loadedTable.left(), 0);
+ QCOMPARE(tableViewPrivate->loadedTable.right(), columnCount - 1);
+ QCOMPARE(tableViewPrivate->loadedTable.top(), 0);
+ QCOMPARE(tableViewPrivate->loadedTable.bottom(), rowCount - 1);
+
+ // Flick table out of view right and bottom at the same time
+ tableView->setContentX(tableWidth + outsideMargin);
+ tableView->setContentY(tableHeight + outsideMargin);
+ tableView->polish();
+
+ WAIT_UNTIL_POLISHED;
+
+ QCOMPARE(tableViewPrivate->loadedTable.left(), columnCount - 1);
+ QCOMPARE(tableViewPrivate->loadedTable.right(), columnCount - 1);
+ QCOMPARE(tableViewPrivate->loadedTable.top(), rowCount - 1);
+ QCOMPARE(tableViewPrivate->loadedTable.bottom(), rowCount - 1);
+
+ // Flick table back to origo
+ tableView->setContentX(0);
+ tableView->setContentY(0);
+ tableView->polish();
+
+ WAIT_UNTIL_POLISHED;
+
+ QCOMPARE(tableViewPrivate->loadedTable.left(), 0);
+ QCOMPARE(tableViewPrivate->loadedTable.right(), columnCount - 1);
+ QCOMPARE(tableViewPrivate->loadedTable.top(), 0);
+ QCOMPARE(tableViewPrivate->loadedTable.bottom(), rowCount - 1);
+}
+
+void tst_QQuickTableView::checkRowColumnCount()
+{
+ // If we flick several columns (rows) at the same time, check that we don't
+ // end up with loading more delegate items into memory than necessary. We
+ // should free up columns as we go before loading new ones.
+ LOAD_TABLEVIEW("countingtableview.qml");
+
+ const char *maxDelegateCountProp = "maxDelegateCount";
+ auto model = TestModelAsVariant(100, 100);
+
+ tableView->setModel(model);
+
+ WAIT_UNTIL_POLISHED;
+
+ const int tableViewCount = tableViewPrivate->loadedItems.count();
+ const int qmlCountAfterInit = view->rootObject()->property(maxDelegateCountProp).toInt();
+ QCOMPARE(tableViewCount, qmlCountAfterInit);
+
+ // Flick a long distance right
+ tableView->setContentX(tableView->width() * 2);
+ tableView->polish();
+
+ WAIT_UNTIL_POLISHED;
+
+ const int qmlCountAfterRightFlick = view->rootObject()->property(maxDelegateCountProp).toInt();
+ QCOMPARE(qmlCountAfterRightFlick, qmlCountAfterInit);
+
+ // Flick a long distance down
+ tableView->setContentX(tableView->height() * 2);
+ tableView->polish();
+
+ WAIT_UNTIL_POLISHED;
+
+ const int qmlCountAfterDownFlick = view->rootObject()->property(maxDelegateCountProp).toInt();
+ QCOMPARE(qmlCountAfterDownFlick, qmlCountAfterInit);
+
+ // Flick a long distance left
+ tableView->setContentX(0);
+ tableView->polish();
+
+ WAIT_UNTIL_POLISHED;
+
+ const int qmlCountAfterLeftFlick = view->rootObject()->property(maxDelegateCountProp).toInt();
+ QCOMPARE(qmlCountAfterLeftFlick, qmlCountAfterInit);
+
+ // Flick a long distance up
+ tableView->setContentY(0);
+ tableView->polish();
+
+ WAIT_UNTIL_POLISHED;
+
+ const int qmlCountAfterUpFlick = view->rootObject()->property(maxDelegateCountProp).toInt();
+ QCOMPARE(qmlCountAfterUpFlick, qmlCountAfterInit);
+}
+
+QTEST_MAIN(tst_QQuickTableView)
+
+#include "tst_qquicktableview.moc"
diff --git a/tests/auto/quick/qquicktext/data/implicitSizeChangeRewrap.qml b/tests/auto/quick/qquicktext/data/implicitSizeChangeRewrap.qml
new file mode 100644
index 0000000000..fb8626a75a
--- /dev/null
+++ b/tests/auto/quick/qquicktext/data/implicitSizeChangeRewrap.qml
@@ -0,0 +1,27 @@
+import QtQuick 2.0
+import QtQuick.Layouts 1.0
+
+Item
+{
+ id : _rootItem
+ width : 200
+ height : 1000
+ ColumnLayout
+ {
+ id : _textContainer
+ anchors.centerIn: parent
+ Layout.maximumWidth: (_rootItem.width - 40) // to have some space left / right
+ Text
+ {
+ id : text
+ objectName: "text"
+ font.italic: true
+ textFormat: Text.RichText
+ horizontalAlignment : Text.AlignHCenter
+ verticalAlignment : Text.AlignVCenter
+ wrapMode: Text.Wrap
+ Layout.maximumWidth: (_rootItem.width - 60)
+ Component.onCompleted: text.text = "This is a too long text for the interface with a stupid path also too long -> /home/long/long/long/to/force/it/to/need/to/wrap This is a too long text for the interface with a stupid path also too long -> /home/long/long/long/to/force/it/to/need/to/wrap This is a too long text for the interface with a stupid path also too long -> /home/long/long/long/to/force/it/to/need/to/wrap This is a too long text for the interface with a stupid path also too long -> /home/long/long/long/to/force/it/to/need/to/wrap"
+ }
+ }
+}
diff --git a/tests/auto/quick/qquicktext/tst_qquicktext.cpp b/tests/auto/quick/qquicktext/tst_qquicktext.cpp
index 89d2590c03..48069ab8c5 100644
--- a/tests/auto/quick/qquicktext/tst_qquicktext.cpp
+++ b/tests/auto/quick/qquicktext/tst_qquicktext.cpp
@@ -105,6 +105,7 @@ private slots:
void implicitSize_data();
void implicitSize();
+ void implicitSizeChangeRewrap();
void dependentImplicitSizes();
void contentSize();
void implicitSizeBinding_data();
@@ -999,11 +1000,14 @@ static inline QByteArray msgNotLessThan(int n1, int n2)
void tst_qquicktext::hAlignImplicitWidth()
{
+#ifdef Q_OS_MACOS
+ QSKIP("this test currently crashes on MacOS. See QTBUG-68047");
+#endif
QQuickView view(testFileUrl("hAlignImplicitWidth.qml"));
view.setFlags(view.flags() | Qt::WindowStaysOnTopHint); // Prevent being obscured by other windows.
view.show();
view.requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(&view));
+ QVERIFY(QTest::qWaitForWindowExposed(&view));
QQuickText *text = view.rootObject()->findChild<QQuickText*>("textItem");
QVERIFY(text != nullptr);
@@ -4369,6 +4373,23 @@ void tst_qquicktext::fontInfo()
QVERIFY(copy->font().pixelSize() < 1000);
}
+void tst_qquicktext::implicitSizeChangeRewrap()
+{
+ QScopedPointer<QQuickView> window(new QQuickView);
+ window->setSource(testFileUrl("implicitSizeChangeRewrap.qml"));
+ QTRY_COMPARE(window->status(), QQuickView::Ready);
+
+ window->show();
+ QVERIFY(QTest::qWaitForWindowExposed(window.data()));
+
+ QObject *root = window->rootObject();
+
+ QQuickText *text = root->findChild<QQuickText *>("text");
+ QVERIFY(text != nullptr);
+
+ QVERIFY(text->contentWidth() < window->width());
+}
+
QTEST_MAIN(tst_qquicktext)
#include "tst_qquicktext.moc"
diff --git a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp
index 65c9c9e8ad..ed2d535fda 100644
--- a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp
+++ b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp
@@ -1990,9 +1990,6 @@ void tst_qquicktextinput::validators()
QCOMPARE(intInput->hasAcceptableInput(), false);
QCOMPARE(intInput->property("acceptable").toBool(), false);
QCOMPARE(intSpy.count(), 0);
- QTest::keyPress(&window, Qt::Key_2);
- QTest::keyRelease(&window, Qt::Key_2, Qt::NoModifier);
- QTRY_COMPARE(intInput->text(), QLatin1String("1"));
QCOMPARE(intInput->hasAcceptableInput(), false);
QCOMPARE(intInput->property("acceptable").toBool(), false);
QCOMPARE(intSpy.count(), 0);
@@ -5989,7 +5986,7 @@ void tst_qquicktextinput::QTBUG_19956_regexp()
{
QUrl url = testFileUrl("qtbug-19956regexp.qml");
- QString warning = url.toString() + ":11:17: Unable to assign [undefined] to QRegExp";
+ QString warning = url.toString() + ":11:9: Unable to assign [undefined] to QRegExp";
QTest::ignoreMessage(QtWarningMsg, qPrintable(warning));
QQuickView window(url);
diff --git a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp
index 44cd1dd656..381da76fa3 100644
--- a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp
+++ b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp
@@ -631,9 +631,10 @@ void tst_qquickwindow::touchEvent_basic()
topItem->setSize(QSizeF(150, 150));
QPointF pos(10, 10);
+ QTest::QTouchEventSequence touchSeq = QTest::touchEvent(window, touchDevice, false);
// press single point
- QTest::touchEvent(window, touchDevice).press(0, topItem->mapToScene(pos).toPoint(),window);
+ touchSeq.press(0, topItem->mapToScene(pos).toPoint(),window).commit();
QQuickTouchUtils::flush(window);
QTRY_COMPARE(topItem->lastEvent.touchPoints.count(), 1);
@@ -643,11 +644,11 @@ void tst_qquickwindow::touchEvent_basic()
// would put the decorated window at that position rather than the window itself.
COMPARE_TOUCH_DATA(topItem->lastEvent, makeTouchData(QEvent::TouchBegin, window, Qt::TouchPointPressed, makeTouchPoint(topItem, pos)));
topItem->reset();
- QTest::touchEvent(window, touchDevice).release(0, topItem->mapToScene(pos).toPoint(), window);
+ touchSeq.release(0, topItem->mapToScene(pos).toPoint(), window).commit();
// press multiple points
- QTest::touchEvent(window, touchDevice).press(0, topItem->mapToScene(pos).toPoint(), window)
- .press(1, bottomItem->mapToScene(pos).toPoint(), window);
+ touchSeq.press(0, topItem->mapToScene(pos).toPoint(), window)
+ .press(1, bottomItem->mapToScene(pos).toPoint(), window).commit();
QQuickTouchUtils::flush(window);
QCOMPARE(topItem->lastEvent.touchPoints.count(), 1);
QVERIFY(middleItem->lastEvent.touchPoints.isEmpty());
@@ -656,35 +657,35 @@ void tst_qquickwindow::touchEvent_basic()
COMPARE_TOUCH_DATA(bottomItem->lastEvent, makeTouchData(QEvent::TouchBegin, window, Qt::TouchPointPressed, makeTouchPoint(bottomItem, pos)));
topItem->reset();
bottomItem->reset();
- QTest::touchEvent(window, touchDevice).release(0, topItem->mapToScene(pos).toPoint(), window).release(1, bottomItem->mapToScene(pos).toPoint(), window);
+ touchSeq.release(0, topItem->mapToScene(pos).toPoint(), window).release(1, bottomItem->mapToScene(pos).toPoint(), window).commit();
// touch point on top item moves to bottom item, but top item should still receive the event
- QTest::touchEvent(window, touchDevice).press(0, topItem->mapToScene(pos).toPoint(), window);
+ touchSeq.press(0, topItem->mapToScene(pos).toPoint(), window).commit();
QQuickTouchUtils::flush(window);
- QTest::touchEvent(window, touchDevice).move(0, bottomItem->mapToScene(pos).toPoint(), window);
+ touchSeq.move(0, bottomItem->mapToScene(pos).toPoint(), window).commit();
QQuickTouchUtils::flush(window);
QCOMPARE(topItem->lastEvent.touchPoints.count(), 1);
COMPARE_TOUCH_DATA(topItem->lastEvent, makeTouchData(QEvent::TouchUpdate, window, Qt::TouchPointMoved,
makeTouchPoint(topItem, topItem->mapFromItem(bottomItem, pos), pos)));
topItem->reset();
- QTest::touchEvent(window, touchDevice).release(0, bottomItem->mapToScene(pos).toPoint(), window);
+ touchSeq.release(0, bottomItem->mapToScene(pos).toPoint(), window).commit();
// touch point on bottom item moves to top item, but bottom item should still receive the event
- QTest::touchEvent(window, touchDevice).press(0, bottomItem->mapToScene(pos).toPoint(), window);
+ touchSeq.press(0, bottomItem->mapToScene(pos).toPoint(), window).commit();
QQuickTouchUtils::flush(window);
- QTest::touchEvent(window, touchDevice).move(0, topItem->mapToScene(pos).toPoint(), window);
+ touchSeq.move(0, topItem->mapToScene(pos).toPoint(), window).commit();
QQuickTouchUtils::flush(window);
QCOMPARE(bottomItem->lastEvent.touchPoints.count(), 1);
COMPARE_TOUCH_DATA(bottomItem->lastEvent, makeTouchData(QEvent::TouchUpdate, window, Qt::TouchPointMoved,
makeTouchPoint(bottomItem, bottomItem->mapFromItem(topItem, pos), pos)));
bottomItem->reset();
- QTest::touchEvent(window, touchDevice).release(0, bottomItem->mapToScene(pos).toPoint(), window);
+ touchSeq.release(0, bottomItem->mapToScene(pos).toPoint(), window).commit();
// a single stationary press on an item shouldn't cause an event
- QTest::touchEvent(window, touchDevice).press(0, topItem->mapToScene(pos).toPoint(), window);
+ touchSeq.press(0, topItem->mapToScene(pos).toPoint(), window).commit();
QQuickTouchUtils::flush(window);
- QTest::touchEvent(window, touchDevice).stationary(0)
- .press(1, bottomItem->mapToScene(pos).toPoint(), window);
+ touchSeq.stationary(0)
+ .press(1, bottomItem->mapToScene(pos).toPoint(), window).commit();
QQuickTouchUtils::flush(window);
QCOMPARE(topItem->lastEvent.touchPoints.count(), 1); // received press only, not stationary
QVERIFY(middleItem->lastEvent.touchPoints.isEmpty());
@@ -696,13 +697,13 @@ void tst_qquickwindow::touchEvent_basic()
// cleanup: what is pressed must be released
// Otherwise you will get an assertion failure:
// ASSERT: "itemForTouchPointId.isEmpty()" in file items/qquickwindow.cpp
- QTest::touchEvent(window, touchDevice).release(0, pos.toPoint(), window).release(1, pos.toPoint(), window);
+ touchSeq.release(0, pos.toPoint(), window).release(1, pos.toPoint(), window).commit();
QQuickTouchUtils::flush(window);
// move touch point from top item to bottom, and release
- QTest::touchEvent(window, touchDevice).press(0, topItem->mapToScene(pos).toPoint(),window);
+ touchSeq.press(0, topItem->mapToScene(pos).toPoint(),window).commit();
QQuickTouchUtils::flush(window);
- QTest::touchEvent(window, touchDevice).release(0, bottomItem->mapToScene(pos).toPoint(),window);
+ touchSeq.release(0, bottomItem->mapToScene(pos).toPoint(),window).commit();
QQuickTouchUtils::flush(window);
QCOMPARE(topItem->lastEvent.touchPoints.count(), 1);
COMPARE_TOUCH_DATA(topItem->lastEvent, makeTouchData(QEvent::TouchEnd, window, Qt::TouchPointReleased,
@@ -710,13 +711,13 @@ void tst_qquickwindow::touchEvent_basic()
topItem->reset();
// release while another point is pressed
- QTest::touchEvent(window, touchDevice).press(0, topItem->mapToScene(pos).toPoint(),window)
- .press(1, bottomItem->mapToScene(pos).toPoint(), window);
+ touchSeq.press(0, topItem->mapToScene(pos).toPoint(),window)
+ .press(1, bottomItem->mapToScene(pos).toPoint(), window).commit();
QQuickTouchUtils::flush(window);
- QTest::touchEvent(window, touchDevice).move(0, bottomItem->mapToScene(pos).toPoint(), window);
+ touchSeq.move(0, bottomItem->mapToScene(pos).toPoint(), window).commit();
QQuickTouchUtils::flush(window);
- QTest::touchEvent(window, touchDevice).release(0, bottomItem->mapToScene(pos).toPoint(), window)
- .stationary(1);
+ touchSeq.release(0, bottomItem->mapToScene(pos).toPoint(), window)
+ .stationary(1).commit();
QQuickTouchUtils::flush(window);
QCOMPARE(topItem->lastEvent.touchPoints.count(), 1);
QVERIFY(middleItem->lastEvent.touchPoints.isEmpty());
diff --git a/tests/auto/quick/qquickxmllistmodel/tst_qquickxmllistmodel.cpp b/tests/auto/quick/qquickxmllistmodel/tst_qquickxmllistmodel.cpp
index 757cb8f513..bcff0c46fb 100644
--- a/tests/auto/quick/qquickxmllistmodel/tst_qquickxmllistmodel.cpp
+++ b/tests/auto/quick/qquickxmllistmodel/tst_qquickxmllistmodel.cpp
@@ -354,7 +354,7 @@ void tst_qquickxmllistmodel::xml()
QSignalSpy spy(model, SIGNAL(statusChanged(QQuickXmlListModel::Status)));
QVERIFY(errorString(model).isEmpty());
- QCOMPARE(model->property("progress").toDouble(), qreal(0.0));
+ QCOMPARE(model->property("progress").toDouble(), qreal(1.0));
QCOMPARE(qvariant_cast<QQuickXmlListModel::Status>(model->property("status")),
QQuickXmlListModel::Loading);
QTRY_COMPARE(spy.count(), 1); spy.clear();
@@ -410,6 +410,13 @@ void tst_qquickxmllistmodel::headers()
QTRY_COMPARE(qvariant_cast<QQuickXmlListModel::Status>(model->property("status")),
QQuickXmlListModel::Ready);
+ // It doesn't do a network request for a local file
+ QCOMPARE(factory.lastSentHeaders.count(), 0);
+
+ model->setProperty("source", QUrl("http://localhost/filethatdoesnotexist.xml"));
+ QTRY_COMPARE(qvariant_cast<QQuickXmlListModel::Status>(model->property("status")),
+ QQuickXmlListModel::Error);
+
QVariantMap expectedHeaders;
expectedHeaders["Accept"] = "application/xml,*/*";
@@ -433,7 +440,7 @@ void tst_qquickxmllistmodel::source()
QSignalSpy spy(model, SIGNAL(statusChanged(QQuickXmlListModel::Status)));
QVERIFY(errorString(model).isEmpty());
- QCOMPARE(model->property("progress").toDouble(), qreal(0.0));
+ QCOMPARE(model->property("progress").toDouble(), qreal(1.0));
QCOMPARE(qvariant_cast<QQuickXmlListModel::Status>(model->property("status")),
QQuickXmlListModel::Loading);
QTRY_COMPARE(spy.count(), 1); spy.clear();
@@ -447,7 +454,7 @@ void tst_qquickxmllistmodel::source()
if (model->property("source").toString().isEmpty())
QCOMPARE(qvariant_cast<QQuickXmlListModel::Status>(model->property("status")),
QQuickXmlListModel::Null);
- QCOMPARE(model->property("progress").toDouble(), qreal(0.0));
+ QCOMPARE(model->property("progress").toDouble(), qreal(source.isLocalFile() ? 1.0 : 0.0));
QTRY_COMPARE(spy.count(), 1); spy.clear();
QCOMPARE(qvariant_cast<QQuickXmlListModel::Status>(model->property("status")),
QQuickXmlListModel::Loading);
diff --git a/tests/auto/quick/quick.pro b/tests/auto/quick/quick.pro
index a54a707f4a..a4b6076a34 100644
--- a/tests/auto/quick/quick.pro
+++ b/tests/auto/quick/quick.pro
@@ -66,6 +66,7 @@ QUICKTESTS += \
qquickitem2 \
qquickitemlayer \
qquicklistview \
+ qquicktableview \
qquickloader \
qquickmousearea \
qquickmultipointtoucharea \
@@ -93,7 +94,7 @@ QUICKTESTS += \
SUBDIRS += $$PUBLICTESTS
# Following tests are too slow on qemu + software backend
-boot2qt: QUICKTESTS -= qquickgridview qquicklistview qquickpositioners
+boot2qt: QUICKTESTS -= qquickgridview qquicklistview qquicktableview qquickpositioners
!qtConfig(accessibility):QUICKTESTS -= qquickaccessible
diff --git a/tests/auto/quick/shared/viewtestutil.cpp b/tests/auto/quick/shared/viewtestutil.cpp
index dc813b9d59..3bfa23173e 100644
--- a/tests/auto/quick/shared/viewtestutil.cpp
+++ b/tests/auto/quick/shared/viewtestutil.cpp
@@ -153,6 +153,12 @@ int QQuickViewTestUtil::QaimModel::rowCount(const QModelIndex &parent) const
return list.count();
}
+int QQuickViewTestUtil::QaimModel::columnCount(const QModelIndex &parent) const
+{
+ Q_UNUSED(parent);
+ return columns;
+}
+
QHash<int,QByteArray> QQuickViewTestUtil::QaimModel::roleNames() const
{
QHash<int,QByteArray> roles = QAbstractListModel::roleNames();
@@ -174,7 +180,7 @@ QVariant QQuickViewTestUtil::QaimModel::data(const QModelIndex &index, int role)
int QQuickViewTestUtil::QaimModel::count() const
{
- return rowCount();
+ return rowCount() * columnCount();
}
QString QQuickViewTestUtil::QaimModel::name(int index) const
diff --git a/tests/auto/quick/shared/viewtestutil.h b/tests/auto/quick/shared/viewtestutil.h
index b11d5e4859..04e1771ef8 100644
--- a/tests/auto/quick/shared/viewtestutil.h
+++ b/tests/auto/quick/shared/viewtestutil.h
@@ -76,6 +76,7 @@ namespace QQuickViewTestUtil
QaimModel(QObject *parent=0);
int rowCount(const QModelIndex &parent=QModelIndex()) const;
+ int columnCount(const QModelIndex &parent=QModelIndex()) const;
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const;
QHash<int,QByteArray> roleNames() const;
@@ -104,6 +105,8 @@ namespace QQuickViewTestUtil
using QAbstractListModel::dataChanged;
+ int columns = 1;
+
private:
QList<QPair<QString,QString> > list;
};
diff --git a/tests/auto/quick/touchmouse/tst_touchmouse.cpp b/tests/auto/quick/touchmouse/tst_touchmouse.cpp
index a69cd5bc34..2fc56c2ad8 100644
--- a/tests/auto/quick/touchmouse/tst_touchmouse.cpp
+++ b/tests/auto/quick/touchmouse/tst_touchmouse.cpp
@@ -824,6 +824,7 @@ void tst_TouchMouse::buttonOnTouch()
EventItem *eventItem4 = window->rootObject()->findChild<EventItem*>("eventItem4");
QVERIFY(eventItem4);
+ QTest::QTouchEventSequence touchSeq = QTest::touchEvent(window.data(), device, false);
// Test the common case of a mouse area on top of pinch
eventItem1->setAcceptedMouseButtons(Qt::LeftButton);
@@ -835,9 +836,9 @@ void tst_TouchMouse::buttonOnTouch()
// Normal touch click
QPoint p1 = QPoint(10, 110);
- QTest::touchEvent(window.data(), device).press(0, p1, window.data());
+ touchSeq.press(0, p1, window.data()).commit();
QQuickTouchUtils::flush(window.data());
- QTest::touchEvent(window.data(), device).release(0, p1, window.data());
+ touchSeq.release(0, p1, window.data()).commit();
QQuickTouchUtils::flush(window.data());
QCOMPARE(eventItem1->eventList.size(), 5);
QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin);
@@ -860,9 +861,9 @@ void tst_TouchMouse::buttonOnTouch()
QPoint p2 = QPoint(60, 10);
// Start the events after each other
- QTest::touchEvent(window.data(), device).press(0, p1, window.data());
+ touchSeq.press(0, p1, window.data()).commit();
QQuickTouchUtils::flush(window.data());
- QTest::touchEvent(window.data(), device).stationary(0).press(1, p2, window.data());
+ touchSeq.stationary(0).press(1, p2, window.data()).commit();
QQuickTouchUtils::flush(window.data());
QCOMPARE(button1->scale(), 1.0);
@@ -870,24 +871,24 @@ void tst_TouchMouse::buttonOnTouch()
// This event seems to be discarded, let's ignore it for now until someone digs into pincharea
p1 -= QPoint(10, 0);
p2 += QPoint(10, 0);
- QTest::touchEvent(window.data(), device).move(0, p1, window.data()).move(1, p2, window.data());
+ touchSeq.move(0, p1, window.data()).move(1, p2, window.data()).commit();
QQuickTouchUtils::flush(window.data());
p1 -= QPoint(10, 0);
p2 += QPoint(10, 0);
- QTest::touchEvent(window.data(), device).move(0, p1, window.data()).move(1, p2, window.data());
+ touchSeq.move(0, p1, window.data()).move(1, p2, window.data()).commit();
QQuickTouchUtils::flush(window.data());
// QCOMPARE(button1->scale(), 1.5);
qDebug() << "Button scale: " << button1->scale();
p1 -= QPoint(10, 0);
p2 += QPoint(10, 0);
- QTest::touchEvent(window.data(), device).move(0, p1, window.data()).move(1, p2, window.data());
+ touchSeq.move(0, p1, window.data()).move(1, p2, window.data()).commit();
QQuickTouchUtils::flush(window.data());
// QCOMPARE(button1->scale(), 2.0);
qDebug() << "Button scale: " << button1->scale();
- QTest::touchEvent(window.data(), device).release(0, p1, window.data()).release(1, p2, window.data());
+ touchSeq.release(0, p1, window.data()).release(1, p2, window.data()).commit();
QQuickTouchUtils::flush(window.data());
// QVERIFY(eventItem1->eventList.isEmpty());
// QCOMPARE(button1->scale(), 2.0);
@@ -901,7 +902,7 @@ void tst_TouchMouse::buttonOnTouch()
button1->setScale(1.0);
p1 = QPoint(40, 110);
p2 = QPoint(60, 110);
- QTest::touchEvent(window.data(), device).press(0, p1, window.data()).press(1, p2, window.data());
+ touchSeq.press(0, p1, window.data()).press(1, p2, window.data()).commit();
QQuickTouchUtils::flush(window.data());
QCOMPARE(button1->scale(), 1.0);
QCOMPARE(eventItem1->eventList.count(), 2);
@@ -911,24 +912,24 @@ void tst_TouchMouse::buttonOnTouch()
// This event seems to be discarded, let's ignore it for now until someone digs into pincharea
p1 -= QPoint(10, 0);
p2 += QPoint(10, 0);
- QTest::touchEvent(window.data(), device).move(0, p1, window.data()).move(1, p2, window.data());
+ touchSeq.move(0, p1, window.data()).move(1, p2, window.data()).commit();
QQuickTouchUtils::flush(window.data());
p1 -= QPoint(10, 0);
p2 += QPoint(10, 0);
- QTest::touchEvent(window.data(), device).move(0, p1, window.data()).move(1, p2, window.data());
+ touchSeq.move(0, p1, window.data()).move(1, p2, window.data()).commit();
QQuickTouchUtils::flush(window.data());
//QCOMPARE(button1->scale(), 1.5);
qDebug() << button1->scale();
p1 -= QPoint(10, 0);
p2 += QPoint(10, 0);
- QTest::touchEvent(window.data(), device).move(0, p1, window.data()).move(1, p2, window.data());
+ touchSeq.move(0, p1, window.data()).move(1, p2, window.data()).commit();
QQuickTouchUtils::flush(window.data());
qDebug() << button1->scale();
//QCOMPARE(button1->scale(), 2.0);
- QTest::touchEvent(window.data(), device).release(0, p1, window.data()).release(1, p2, window.data());
+ touchSeq.release(0, p1, window.data()).release(1, p2, window.data()).commit();
QQuickTouchUtils::flush(window.data());
// QCOMPARE(eventItem1->eventList.size(), 99);
qDebug() << button1->scale();
@@ -1334,6 +1335,7 @@ void tst_TouchMouse::touchPointDeliveryOrder()
QPoint pLeftMiddle = QPoint(200, 100);
QPoint pRightMiddle = QPoint(350, 100);
+ QTest::QTouchEventSequence touchSeq = QTest::touchEvent(window.data(), device, false);
QVector<QQuickItem*> events;
EventItem *background = window->rootObject()->findChild<EventItem*>("background");
@@ -1349,7 +1351,7 @@ void tst_TouchMouse::touchPointDeliveryOrder()
connect(middle, &EventItem::onTouchEvent, [&events](QQuickItem* receiver){ events.append(receiver); });
connect(right, &EventItem::onTouchEvent, [&events](QQuickItem* receiver){ events.append(receiver); });
- QTest::touchEvent(window.data(), device).press(0, pLeft, window.data());
+ touchSeq.press(0, pLeft, window.data()).commit();
QQuickTouchUtils::flush(window.data());
// Touch on left, then background
@@ -1359,7 +1361,7 @@ void tst_TouchMouse::touchPointDeliveryOrder()
events.clear();
// New press events are deliverd first, the stationary point was not accepted, thus it doesn't get delivered
- QTest::touchEvent(window.data(), device).stationary(0).press(1, pRightMiddle, window.data());
+ touchSeq.stationary(0).press(1, pRightMiddle, window.data()).commit();
QQuickTouchUtils::flush(window.data());
QCOMPARE(events.size(), 3);
QCOMPARE(events.at(0), middle);
@@ -1367,49 +1369,49 @@ void tst_TouchMouse::touchPointDeliveryOrder()
QCOMPARE(events.at(2), background);
events.clear();
- QTest::touchEvent(window.data(), device).release(0, pLeft, window.data()).release(1, pRightMiddle, window.data());
+ touchSeq.release(0, pLeft, window.data()).release(1, pRightMiddle, window.data()).commit();
QQuickTouchUtils::flush(window.data());
QCOMPARE(events.size(), 0); // no accepted events
// Two presses, the first point should come first
- QTest::touchEvent(window.data(), device).press(0, pLeft, window.data()).press(1, pRight, window.data());
+ touchSeq.press(0, pLeft, window.data()).press(1, pRight, window.data()).commit();
QQuickTouchUtils::flush(window.data());
QCOMPARE(events.size(), 3);
QCOMPARE(events.at(0), left);
QCOMPARE(events.at(1), right);
QCOMPARE(events.at(2), background);
- QTest::touchEvent(window.data(), device).release(0, pLeft, window.data()).release(1, pRight, window.data());
+ touchSeq.release(0, pLeft, window.data()).release(1, pRight, window.data()).commit();
events.clear();
// Again, pressing right first
- QTest::touchEvent(window.data(), device).press(0, pRight, window.data()).press(1, pLeft, window.data());
+ touchSeq.press(0, pRight, window.data()).press(1, pLeft, window.data()).commit();
QQuickTouchUtils::flush(window.data());
QCOMPARE(events.size(), 3);
QCOMPARE(events.at(0), right);
QCOMPARE(events.at(1), left);
QCOMPARE(events.at(2), background);
- QTest::touchEvent(window.data(), device).release(0, pRight, window.data()).release(1, pLeft, window.data());
+ touchSeq.release(0, pRight, window.data()).release(1, pLeft, window.data()).commit();
events.clear();
// Two presses, both hitting the middle item on top, then branching left and right, then bottom
// Each target should be offered the events exactly once, middle first, left must come before right (id 0)
- QTest::touchEvent(window.data(), device).press(0, pLeftMiddle, window.data()).press(1, pRightMiddle, window.data());
+ touchSeq.press(0, pLeftMiddle, window.data()).press(1, pRightMiddle, window.data()).commit();
QCOMPARE(events.size(), 4);
QCOMPARE(events.at(0), middle);
QCOMPARE(events.at(1), left);
QCOMPARE(events.at(2), right);
QCOMPARE(events.at(3), background);
- QTest::touchEvent(window.data(), device).release(0, pLeftMiddle, window.data()).release(1, pRightMiddle, window.data());
+ touchSeq.release(0, pLeftMiddle, window.data()).release(1, pRightMiddle, window.data()).commit();
events.clear();
- QTest::touchEvent(window.data(), device).press(0, pRightMiddle, window.data()).press(1, pLeftMiddle, window.data());
+ touchSeq.press(0, pRightMiddle, window.data()).press(1, pLeftMiddle, window.data()).commit();
qDebug() << events;
QCOMPARE(events.size(), 4);
QCOMPARE(events.at(0), middle);
QCOMPARE(events.at(1), right);
QCOMPARE(events.at(2), left);
QCOMPARE(events.at(3), background);
- QTest::touchEvent(window.data(), device).release(0, pRightMiddle, window.data()).release(1, pLeftMiddle, window.data());
+ touchSeq.release(0, pRightMiddle, window.data()).release(1, pLeftMiddle, window.data()).commit();
}
void tst_TouchMouse::hoverEnabled()
diff --git a/tests/auto/quicktest/quicktest.pro b/tests/auto/quicktest/quicktest.pro
index 9d909f1d16..0e3f257e33 100644
--- a/tests/auto/quicktest/quicktest.pro
+++ b/tests/auto/quicktest/quicktest.pro
@@ -1,4 +1,5 @@
TEMPLATE = subdirs
SUBDIRS = \
signalspy \
- quicktestmainwithsetup
+ quicktestmainwithsetup \
+ testfiltering
diff --git a/tests/auto/quicktest/testfiltering/quicktestmain/quicktestmain.cpp b/tests/auto/quicktest/testfiltering/quicktestmain/quicktestmain.cpp
new file mode 100644
index 0000000000..656911f842
--- /dev/null
+++ b/tests/auto/quicktest/testfiltering/quicktestmain/quicktestmain.cpp
@@ -0,0 +1,29 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QtQuickTest/quicktest.h>
+QUICK_TEST_MAIN(quicktestmain)
diff --git a/tests/auto/quicktest/testfiltering/quicktestmain/quicktestmain.pro b/tests/auto/quicktest/testfiltering/quicktestmain/quicktestmain.pro
new file mode 100644
index 0000000000..7b3e734cb4
--- /dev/null
+++ b/tests/auto/quicktest/testfiltering/quicktestmain/quicktestmain.pro
@@ -0,0 +1,11 @@
+CONFIG += qmltestcase
+macos:CONFIG -= app_bundle
+TARGET = quicktestmain
+
+DEFINES += QT_QMLTEST_DATADIR=\\\"$${PWD}\\\"
+
+SOURCES += quicktestmain.cpp
+
+TESTDATA += $$PWD/*.qml
+
+DESTDIR = ./
diff --git a/tests/auto/quicktest/testfiltering/quicktestmain/tst_first.qml b/tests/auto/quicktest/testfiltering/quicktestmain/tst_first.qml
new file mode 100644
index 0000000000..55c9612b78
--- /dev/null
+++ b/tests/auto/quicktest/testfiltering/quicktestmain/tst_first.qml
@@ -0,0 +1,38 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.3
+import QtTest 1.1
+
+TestCase {
+ name: "First"
+
+ function test_foo() { }
+ function test_bar() { }
+ function test_baz() { }
+}
diff --git a/tests/auto/quicktest/testfiltering/quicktestmain/tst_second.qml b/tests/auto/quicktest/testfiltering/quicktestmain/tst_second.qml
new file mode 100644
index 0000000000..2143d93e12
--- /dev/null
+++ b/tests/auto/quicktest/testfiltering/quicktestmain/tst_second.qml
@@ -0,0 +1,38 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.3
+import QtTest 1.1
+
+TestCase {
+ name: "Second"
+
+ function test_dupfoo() { }
+ function test_dupbar() { }
+ function test_dupbaz() { }
+}
diff --git a/tests/auto/quicktest/testfiltering/test/test.pro b/tests/auto/quicktest/testfiltering/test/test.pro
new file mode 100644
index 0000000000..cecbdca725
--- /dev/null
+++ b/tests/auto/quicktest/testfiltering/test/test.pro
@@ -0,0 +1,5 @@
+CONFIG += testcase
+QT += testlib
+TARGET = ../tst_testfiltering
+
+SOURCES = ../tst_testfiltering.cpp
diff --git a/tests/auto/quicktest/testfiltering/testfiltering.pro b/tests/auto/quicktest/testfiltering/testfiltering.pro
new file mode 100644
index 0000000000..ae7a039b8b
--- /dev/null
+++ b/tests/auto/quicktest/testfiltering/testfiltering.pro
@@ -0,0 +1,4 @@
+TEMPLATE = subdirs
+SUBDIRS = \
+ test \
+ quicktestmain
diff --git a/tests/auto/quicktest/testfiltering/tst_testfiltering.cpp b/tests/auto/quicktest/testfiltering/tst_testfiltering.cpp
new file mode 100644
index 0000000000..72bb8f02b7
--- /dev/null
+++ b/tests/auto/quicktest/testfiltering/tst_testfiltering.cpp
@@ -0,0 +1,135 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QProcess>
+#include <QtTest>
+
+class tst_TestFiltering : public QObject
+{
+ Q_OBJECT
+private slots:
+ void noFilters();
+ void oneMatchingFilter();
+ void filterThatDoesntMatch();
+ void twoFilters();
+ void twoFiltersWithOneMatch();
+ void manyFilters();
+};
+
+
+const QString testExe =
+#if defined(Q_OS_WIN)
+ QFINDTESTDATA("quicktestmain/quicktestmain.exe");
+#else
+ QFINDTESTDATA("quicktestmain/quicktestmain");
+#endif
+
+void tst_TestFiltering::noFilters()
+{
+ QProcess process;
+ process.start(testExe);
+
+ QVERIFY(process.waitForFinished());
+
+ const QString output = process.readAll();
+ QVERIFY(output.contains(QLatin1String("Totals: 10 passed")));
+ QCOMPARE(process.exitStatus(), QProcess::NormalExit);
+ QCOMPARE(process.exitCode(), 0);
+}
+
+void tst_TestFiltering::oneMatchingFilter()
+{
+ QProcess process;
+ process.start(testExe, {QLatin1String("First::test_bar")});
+
+ QVERIFY(process.waitForFinished());
+
+ const QString output = process.readAll();
+ QVERIFY(output.contains(QLatin1String("Totals: 3 passed")));
+ QCOMPARE(process.exitStatus(), QProcess::NormalExit);
+ QCOMPARE(process.exitCode(), 0);
+}
+
+void tst_TestFiltering::filterThatDoesntMatch()
+{
+ QProcess process;
+ process.start(testExe, {QLatin1String("First::test_nonexisting")});
+
+ QVERIFY(process.waitForFinished());
+
+ QCOMPARE(process.exitStatus(), QProcess::NormalExit);
+ QCOMPARE(process.exitCode(), 1);
+}
+
+void tst_TestFiltering::twoFilters()
+{
+ QProcess process;
+ process.start(testExe,
+ {QLatin1String("Second::test_dupfoo"), QLatin1String("Second::test_dupbaz")});
+
+ QVERIFY(process.waitForFinished());
+
+ const QString output = process.readAll();
+ QVERIFY(output.contains(QLatin1String("Totals: 4 passed")));
+ QCOMPARE(process.exitStatus(), QProcess::NormalExit);
+ QCOMPARE(process.exitCode(), 0);
+}
+
+void tst_TestFiltering::twoFiltersWithOneMatch()
+{
+ QProcess process;
+ process.start(testExe,
+ {QLatin1String("First::test_foo"), QLatin1String("Second::test_nonexisting")});
+
+ QVERIFY(process.waitForFinished());
+
+ const QString output = process.readAll();
+ QVERIFY(output.contains(QLatin1String("Totals: 3 passed")));
+ QCOMPARE(process.exitStatus(), QProcess::NormalExit);
+ QCOMPARE(process.exitCode(), 1);
+}
+
+void tst_TestFiltering::manyFilters()
+{
+ QProcess process;
+ process.start(testExe,
+ {QLatin1String("First::test_foo"),
+ QLatin1String("First::test_baz"),
+ QLatin1String("Second::test_dupfoo"),
+ QLatin1String("Second::test_dupbaz")});
+
+ QVERIFY(process.waitForFinished());
+
+ const QString output = process.readAll();
+ QVERIFY(output.contains(QLatin1String("Totals: 8 passed")));
+ QCOMPARE(process.exitStatus(), QProcess::NormalExit);
+ QCOMPARE(process.exitCode(), 0);
+}
+
+QTEST_MAIN(tst_TestFiltering);
+
+#include "tst_testfiltering.moc"
diff --git a/tests/manual/pointer/content/MultiButton.qml b/tests/manual/pointer/content/MultiButton.qml
index 2a41967a36..ca9b16a957 100644
--- a/tests/manual/pointer/content/MultiButton.qml
+++ b/tests/manual/pointer/content/MultiButton.qml
@@ -35,6 +35,7 @@ Rectangle {
property alias pressed: tap.pressed
property bool checked: false
property alias gesturePolicy: tap.gesturePolicy
+ property alias margin: tap.margin
signal tapped
width: label.implicitWidth * 1.5; height: label.implicitHeight * 2.0
diff --git a/tests/manual/pointer/map.qml b/tests/manual/pointer/map.qml
index 6ab6badfd0..880f184adb 100644
--- a/tests/manual/pointer/map.qml
+++ b/tests/manual/pointer/map.qml
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2018 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the manual tests of the Qt Toolkit.
@@ -48,6 +48,12 @@ Item {
source: "resources/map.svgz"
Component.onCompleted: { width = implicitWidth; height = implicitHeight }
}
+
+ Text {
+ anchors.centerIn: parent
+ text: image.sourceSize.width + " x " + image.sourceSize.height +
+ " scale " + map.scale.toFixed(2) + " active scale " + pinch.activeScale.toFixed(2)
+ }
}
PinchHandler {
diff --git a/tests/manual/pointer/multibuttons.qml b/tests/manual/pointer/multibuttons.qml
index cd7c5d0b19..28c3cc0f50 100644
--- a/tests/manual/pointer/multibuttons.qml
+++ b/tests/manual/pointer/multibuttons.qml
@@ -44,6 +44,7 @@ Item {
label: "Launch Balloons"
Layout.fillWidth: true
gesturePolicy: TapHandler.WithinBounds
+ margin: 10
}
Text { text: "the goons"; font.pointSize: 12 }
MultiButton {
@@ -51,6 +52,7 @@ Item {
label: "Launch Missile"
Layout.fillWidth: true
gesturePolicy: TapHandler.ReleaseWithinBounds
+ margin: 10
onTapped: missileEmitter.burst(1)
}
MultiButton {
@@ -58,6 +60,7 @@ Item {
label: "Launch Fighters"
Layout.fillWidth: true
gesturePolicy: TapHandler.DragThreshold
+ margin: 10
}
}
ParticleSystem {
diff --git a/tests/manual/pointer/pinchDragFlingMPTA.qml b/tests/manual/pointer/pinchDragFlingMPTA.qml
index 2578d62466..0362832662 100644
--- a/tests/manual/pointer/pinchDragFlingMPTA.qml
+++ b/tests/manual/pointer/pinchDragFlingMPTA.qml
@@ -66,7 +66,7 @@ Rectangle {
minimumPointCount: 3
minimumScale: 0.1
maximumScale: 10
- onActiveChanged: if (!active) fling.restart(centroidVelocity)
+ onActiveChanged: if (!active) fling.restart(centroid.velocity)
}
DragHandler {
id: dragHandler
diff --git a/tests/manual/pointer/pinchHandler.qml b/tests/manual/pointer/pinchHandler.qml
index 409b852b55..36af1f53bd 100644
--- a/tests/manual/pointer/pinchHandler.qml
+++ b/tests/manual/pointer/pinchHandler.qml
@@ -153,7 +153,7 @@ Rectangle {
maximumScale: 10
onActiveChanged: {
if (!active)
- anim.restart(centroidVelocity)
+ anim.restart(centroid.velocity)
}
}
TapHandler { gesturePolicy: TapHandler.DragThreshold; onTapped: rect3.z = rect2.z + 1 }
@@ -164,8 +164,8 @@ Rectangle {
Rectangle {
id: centroidIndicator
property QtObject pincher: activePincher()
- x: pincher.centroid.x - radius
- y: pincher.centroid.y - radius
+ x: pincher.centroid.scenePosition.x - radius
+ y: pincher.centroid.scenePosition.y - radius
z: 1
visible: pincher.active
radius: width / 2
diff --git a/tests/manual/pointer/sidebar.qml b/tests/manual/pointer/sidebar.qml
new file mode 100644
index 0000000000..ce2c770592
--- /dev/null
+++ b/tests/manual/pointer/sidebar.qml
@@ -0,0 +1,186 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the manual tests of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import Qt.labs.handlers 1.0
+import "content"
+
+Rectangle {
+ id: root
+ width: 640
+ height: 480
+ color: "#444"
+
+ Component {
+ id: buttonsAndStuff
+ Column {
+ anchors.fill: parent
+ anchors.margins: 8
+ spacing: 8
+
+ Rectangle {
+ objectName: "buttonWithMA"
+ width: parent.width
+ height: 30
+ color: buttonMA.pressed ? "lightsteelblue" : "#999"
+ border.color: buttonMA.containsMouse ? "cyan" : "transparent"
+
+ MouseArea {
+ id: buttonMA
+ objectName: "buttonMA"
+ hoverEnabled: true
+ anchors.fill: parent
+ onClicked: console.log("clicked MA")
+ }
+
+ Text {
+ anchors.centerIn: parent
+ text: "MouseArea"
+ }
+ }
+
+ Rectangle {
+ objectName: "buttonWithHH"
+ width: parent.width
+ height: 30
+ color: flash ? "#999" : "white"
+ border.color: buttonHH.hovered ? "cyan" : "transparent"
+ property bool flash: true
+
+ HoverHandler {
+ id: buttonHH
+ objectName: "buttonHH"
+ acceptedDevices: PointerDevice.AllDevices
+ }
+
+ TapHandler {
+ onTapped: tapFlash.start()
+ }
+
+ Text {
+ anchors.centerIn: parent
+ text: "HoverHandler"
+ }
+
+ FlashAnimation on flash {
+ id: tapFlash
+ }
+ }
+ }
+ }
+
+ Rectangle {
+ id: paddle
+ width: 100
+ height: 40
+ color: paddleHH.hovered ? "indianred" : "#888"
+ y: parent.height - 100
+ radius: 10
+
+ HoverHandler {
+ id: paddleHH
+ objectName: "paddleHH"
+ }
+
+ SequentialAnimation on x {
+ NumberAnimation {
+ to: root.width - paddle.width
+ duration: 2000
+ easing { type: Easing.InOutQuad }
+ }
+ PauseAnimation { duration: 100 }
+ NumberAnimation {
+ to: 0
+ duration: 2000
+ easing { type: Easing.InOutQuad }
+ }
+ PauseAnimation { duration: 100 }
+ loops: Animation.Infinite
+ }
+ }
+
+ Rectangle {
+ objectName: "topSidebar"
+ radius: 5
+ antialiasing: true
+ x: -radius
+ y: -radius
+ width: 120
+ height: 200
+ border.color: topSidebarHH.hovered ? "cyan" : "black"
+ color: "#777"
+
+ Rectangle {
+ color: "cyan"
+ width: 10
+ height: width
+ radius: width / 2
+ visible: topSidebarHH.hovered
+ x: topSidebarHH.point.position.x - width / 2
+ y: topSidebarHH.point.position.y - height / 2
+ z: 100
+ }
+
+ HoverHandler {
+ id: topSidebarHH
+ objectName: "topSidebarHH"
+ }
+
+ Loader {
+ objectName: "topSidebarLoader"
+ sourceComponent: buttonsAndStuff
+ anchors.fill: parent
+ }
+ }
+
+ Rectangle {
+ objectName: "bottomSidebar"
+ radius: 5
+ antialiasing: true
+ x: -radius
+ anchors.bottom: parent.bottom
+ anchors.bottomMargin: -radius
+ width: 120
+ height: 200
+ border.color: bottomSidebarMA.containsMouse ? "cyan" : "black"
+ color: "#777"
+
+ MouseArea {
+ id: bottomSidebarMA
+ objectName: "bottomSidebarMA"
+ hoverEnabled: true
+ anchors.fill: parent
+ }
+
+ Loader {
+ objectName: "bottomSidebarLoader"
+ sourceComponent: buttonsAndStuff
+ anchors.fill: parent
+ }
+ }
+}
diff --git a/tests/manual/pointer/singlePointHandlerProperties.qml b/tests/manual/pointer/singlePointHandlerProperties.qml
index c11042cf14..1c044f8167 100644
--- a/tests/manual/pointer/singlePointHandlerProperties.qml
+++ b/tests/manual/pointer/singlePointHandlerProperties.qml
@@ -63,7 +63,7 @@ Rectangle {
anchors.centerIn: parent
antialiasing: true
Rectangle {
- y: -40
+ y: -56
anchors.horizontalCenter: parent.horizontalCenter
color: "lightsteelblue"
implicitWidth: label.implicitWidth
@@ -71,7 +71,8 @@ Rectangle {
Text {
id: label
text: 'id: ' + dragHandler.point.id.toString(16) + " uid: " + dragHandler.point.uniqueId.numericId +
- '\npos: (' + dragHandler.point.position.x.toFixed(2) + ', ' + dragHandler.point.position.y.toFixed(2) + ')'
+ '\npos: (' + dragHandler.point.position.x.toFixed(2) + ', ' + dragHandler.point.position.y.toFixed(2) + ')' +
+ '\nmodifiers: ' + dragHandler.point.modifiers.toString(16)
}
}
}
diff --git a/tests/manual/tableview/abstracttablemodel/abstracttablemodel.pro b/tests/manual/tableview/abstracttablemodel/abstracttablemodel.pro
new file mode 100644
index 0000000000..ade49c33a2
--- /dev/null
+++ b/tests/manual/tableview/abstracttablemodel/abstracttablemodel.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = tableview_abstracttablemodel
+QT += qml quick
+SOURCES += main.cpp
+RESOURCES += main.qml
+
+# Default rules for deployment.
+qnx: target.path = /tmp/$${TARGET}/bin
+else: unix:!android: target.path = /opt/$${TARGET}/bin
+!isEmpty(target.path): INSTALLS += target
diff --git a/tests/manual/tableview/abstracttablemodel/main.cpp b/tests/manual/tableview/abstracttablemodel/main.cpp
new file mode 100644
index 0000000000..22dda5ca4a
--- /dev/null
+++ b/tests/manual/tableview/abstracttablemodel/main.cpp
@@ -0,0 +1,100 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtQuick module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QGuiApplication>
+#include <QQmlApplicationEngine>
+#include <QAbstractTableModel>
+
+class TestTableModel : public QAbstractTableModel
+{
+ Q_OBJECT
+ Q_PROPERTY(int rowCount READ rowCount WRITE setRowCount NOTIFY rowCountChanged)
+ Q_PROPERTY(int columnCount READ columnCount WRITE setColumnCount NOTIFY columnCountChanged)
+
+public:
+ TestTableModel(QObject *parent = nullptr) : QAbstractTableModel(parent) { }
+
+ int rowCount(const QModelIndex & = QModelIndex()) const override { return m_rows; }
+ void setRowCount(int count) { beginResetModel(); m_rows = count; emit rowCountChanged(); endResetModel(); }
+
+ int columnCount(const QModelIndex & = QModelIndex()) const override { return m_cols; }
+ void setColumnCount(int count) { beginResetModel(); m_cols = count; emit columnCountChanged(); endResetModel(); }
+
+ QVariant headerData(int section, Qt::Orientation orientation, int role) const
+ {
+ Q_UNUSED(orientation);
+ Q_UNUSED(role);
+ return QStringLiteral("Column header");
+ }
+
+ QVariant data(const QModelIndex &index, int role) const override
+ {
+ if (!index.isValid() || role != Qt::DisplayRole)
+ return QVariant();
+ return QString("[%1-%2]").arg(index.column()).arg(index.row());
+ }
+
+ QHash<int, QByteArray> roleNames() const override
+ {
+ return { {Qt::DisplayRole, "display"} };
+ }
+
+signals:
+ void rowCountChanged();
+ void columnCountChanged();
+
+private:
+ int m_rows = 0;
+ int m_cols = 0;
+};
+
+int main(int argc, char *argv[])
+{
+ QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
+ QGuiApplication app(argc, argv);
+
+ qmlRegisterType<TestTableModel>("TestTableModel", 0, 1, "TestTableModel");
+
+ QQmlApplicationEngine engine;
+ engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
+
+ return app.exec();
+}
+
+#include "main.moc"
diff --git a/tests/manual/tableview/abstracttablemodel/main.qml b/tests/manual/tableview/abstracttablemodel/main.qml
new file mode 100644
index 0000000000..271752aaf1
--- /dev/null
+++ b/tests/manual/tableview/abstracttablemodel/main.qml
@@ -0,0 +1,91 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtQuick module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Window 2.3
+import QtQml.Models 2.2
+import Qt.labs.tableview 1.0
+import TestTableModel 0.1
+
+Window {
+ id: window
+ width: 640
+ height: 480
+ visible: true
+
+ TestTableModel {
+ id: tableModel
+ rowCount: 200
+ columnCount: 200
+ }
+
+ Rectangle {
+ anchors.fill: parent
+ anchors.margins: 10
+ color: "darkgray"
+
+ TableView {
+ id: tableView
+ anchors.fill: parent
+ anchors.margins: 1
+ clip: true
+
+ model: tableModel
+ delegate: tableViewDelegate
+ cacheBuffer: 500
+ columnSpacing: 1
+ rowSpacing: 1
+ }
+
+ Component {
+ id: tableViewDelegate
+ Rectangle {
+ TableView.cellWidth: column % 3 ? 80 : 50
+ TableView.cellHeight: row % 3 ? 80 : 50
+
+ Text {
+ anchors.centerIn: parent
+ text: modelData
+ }
+ }
+ }
+
+ }
+
+}
diff --git a/tests/manual/tableview/listmodel/listmodel.pro b/tests/manual/tableview/listmodel/listmodel.pro
new file mode 100644
index 0000000000..dbae0db2b1
--- /dev/null
+++ b/tests/manual/tableview/listmodel/listmodel.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = tableview_listmodel
+QT += qml quick
+SOURCES += main.cpp
+RESOURCES += main.qml
+
+# Default rules for deployment.
+qnx: target.path = /tmp/$${TARGET}/bin
+else: unix:!android: target.path = /opt/$${TARGET}/bin
+!isEmpty(target.path): INSTALLS += target
diff --git a/tests/manual/tableview/listmodel/main.cpp b/tests/manual/tableview/listmodel/main.cpp
new file mode 100644
index 0000000000..2a3b90d392
--- /dev/null
+++ b/tests/manual/tableview/listmodel/main.cpp
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtQuick module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QGuiApplication>
+#include <QQmlApplicationEngine>
+
+int main(int argc, char *argv[])
+{
+ QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
+ QGuiApplication app(argc, argv);
+
+ QQmlApplicationEngine engine;
+ engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
+
+ return app.exec();
+}
diff --git a/tests/manual/tableview/listmodel/main.qml b/tests/manual/tableview/listmodel/main.qml
new file mode 100644
index 0000000000..ca39e6a2b9
--- /dev/null
+++ b/tests/manual/tableview/listmodel/main.qml
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtQuick module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Window 2.3
+import Qt.labs.tableview 1.0
+import QtQml.Models 2.2
+
+Window {
+ id: window
+ width: 640
+ height: 480
+ visible: true
+
+ ListModel {
+ id: listModel
+ Component.onCompleted: {
+ for (var i = 0; i < 30; ++i)
+ listModel.append({"name" : i})
+ }
+ }
+
+ Rectangle {
+ anchors.fill: parent
+ anchors.margins: 10
+ color: "darkgray"
+
+ TableView {
+ id: tableView
+ anchors.fill: parent
+ anchors.margins: 1
+ clip: true
+ columnSpacing: 1
+ rowSpacing: 1
+ model: listModel
+ delegate: Component {
+ Rectangle {
+ id: tableDelegate
+ TableView.cellWidth: 100
+ TableView.cellHeight: 50
+
+ Text {
+ anchors.centerIn: parent
+ text: name + "\n[" + column + ", " + row + "]"
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/tests/manual/tableview/storagemodel/main.cpp b/tests/manual/tableview/storagemodel/main.cpp
new file mode 100644
index 0000000000..97ae619ce4
--- /dev/null
+++ b/tests/manual/tableview/storagemodel/main.cpp
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtQuick module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QGuiApplication>
+#include <QQmlApplicationEngine>
+#include "storagemodel.h"
+
+int main(int argc, char *argv[])
+{
+ QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
+ QGuiApplication app(argc, argv);
+
+ qmlRegisterType<StorageModel>("StorageModel", 0, 1, "StorageModel");
+
+ QQmlApplicationEngine engine;
+ engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
+
+ return app.exec();
+}
+
diff --git a/tests/manual/tableview/storagemodel/main.qml b/tests/manual/tableview/storagemodel/main.qml
new file mode 100644
index 0000000000..f76da374e3
--- /dev/null
+++ b/tests/manual/tableview/storagemodel/main.qml
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtQuick module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Window 2.3
+import Qt.labs.tableview 1.0
+import StorageModel 0.1
+
+Window {
+ id: window
+ width: 640
+ height: 480
+ visible: true
+ color: "darkgray"
+ title: "Storage Volumes"
+
+ TableView {
+ id: table
+ anchors.fill: parent
+ anchors.margins: 10
+ clip: true
+ model: StorageModel { }
+ columnSpacing: 1
+ rowSpacing: 1
+ delegate: Rectangle {
+ id: tableDelegate
+ TableView.cellWidth: displayText.implicitWidth + 8
+ TableView.cellHeight: displayText.implicitHeight + 14
+
+ Text {
+ id: displayText
+ anchors.bottom: parent.bottom
+ anchors.left: parent.left
+ anchors.leftMargin: 4
+ text: display
+ }
+ }
+ }
+}
diff --git a/tests/manual/tableview/storagemodel/storagemodel.cpp b/tests/manual/tableview/storagemodel/storagemodel.cpp
new file mode 100644
index 0000000000..345d1cc63f
--- /dev/null
+++ b/tests/manual/tableview/storagemodel/storagemodel.cpp
@@ -0,0 +1,226 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2016 Ivan Komissarov
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "storagemodel.h"
+
+#include <QDir>
+#include <QLocale>
+#include <qmath.h>
+#include <algorithm>
+#include <cmath>
+
+StorageModel::StorageModel(QObject *parent) :
+ QAbstractTableModel(parent)
+{
+ refresh();
+}
+
+void StorageModel::refresh()
+{
+ beginResetModel();
+ m_volumes = QStorageInfo::mountedVolumes();
+ std::sort(m_volumes.begin(), m_volumes.end(),
+ [](const QStorageInfo &st1, const QStorageInfo &st2) {
+ static const QString rootSortString = QStringLiteral(" ");
+ return (st1.isRoot() ? rootSortString : st1.rootPath())
+ < (st2.isRoot() ? rootSortString : st2.rootPath());
+ });
+ endResetModel();
+}
+
+int StorageModel::columnCount(const QModelIndex &/*parent*/) const
+{
+ return ColumnCount;
+}
+
+int StorageModel::rowCount(const QModelIndex &parent) const
+{
+ if (parent.isValid())
+ return 0;
+ return m_volumes.count();
+}
+
+Qt::ItemFlags StorageModel::flags(const QModelIndex &index) const
+{
+ Qt::ItemFlags result = QAbstractTableModel::flags(index);
+ switch (index.column()) {
+ case ColumnAvailable:
+ case ColumnIsReady:
+ case ColumnIsReadOnly:
+ case ColumnIsValid:
+ result |= Qt::ItemIsUserCheckable;
+ break;
+ default:
+ break;
+ }
+ return result;
+}
+
+QVariant StorageModel::data(const QModelIndex &index, int role) const
+{
+ if (!index.isValid())
+ return QVariant();
+
+ if (role == Qt::DisplayRole) {
+ const QStorageInfo &volume = m_volumes.at(index.row());
+ switch (index.column()) {
+ case ColumnRootPath:
+ return QDir::toNativeSeparators(volume.rootPath());
+ case ColumnName:
+ return volume.name();
+ case ColumnDevice:
+ return volume.device();
+ case ColumnFileSystemName:
+ return volume.fileSystemType();
+ case ColumnTotal:
+ return QLocale().formattedDataSize(volume.bytesTotal());
+ case ColumnFree:
+ return QLocale().formattedDataSize(volume.bytesFree());
+ case ColumnAvailable:
+ return QLocale().formattedDataSize(volume.bytesAvailable());
+ case ColumnIsReady:
+ return volume.isReady();
+ case ColumnIsReadOnly:
+ return volume.isReadOnly();
+ case ColumnIsValid:
+ return volume.isValid();
+ default:
+ break;
+ }
+ } else if (role == Qt::CheckStateRole) {
+ const QStorageInfo &volume = m_volumes.at(index.row());
+ switch (index.column()) {
+ case ColumnIsReady:
+ return volume.isReady();
+ case ColumnIsReadOnly:
+ return volume.isReadOnly();
+ case ColumnIsValid:
+ return volume.isValid();
+ default:
+ break;
+ }
+ } else if (role == Qt::TextAlignmentRole) {
+ switch (index.column()) {
+ case ColumnTotal:
+ case ColumnFree:
+ case ColumnAvailable:
+ return Qt::AlignTrailing;
+ default:
+ break;
+ }
+ return Qt::AlignLeading;
+ } else if (role == Qt::ToolTipRole) {
+ QLocale locale;
+ const QStorageInfo &volume = m_volumes.at(index.row());
+ return tr("Root path : %1\n"
+ "Name: %2\n"
+ "Display Name: %3\n"
+ "Device: %4\n"
+ "FileSystem: %5\n"
+ "Total size: %6\n"
+ "Free size: %7\n"
+ "Available size: %8\n"
+ "Is Ready: %9\n"
+ "Is Read-only: %10\n"
+ "Is Valid: %11\n"
+ "Is Root: %12"
+ ).
+ arg(QDir::toNativeSeparators(volume.rootPath())).
+ arg(volume.name()).
+ arg(volume.displayName()).
+ arg(QString::fromUtf8(volume.device())).
+ arg(QString::fromUtf8(volume.fileSystemType())).
+ arg(locale.formattedDataSize(volume.bytesTotal())).
+ arg(locale.formattedDataSize(volume.bytesFree())).
+ arg(locale.formattedDataSize(volume.bytesAvailable())).
+ arg(volume.isReady() ? tr("true") : tr("false")).
+ arg(volume.isReadOnly() ? tr("true") : tr("false")).
+ arg(volume.isValid() ? tr("true") : tr("false")).
+ arg(volume.isRoot() ? tr("true") : tr("false"));
+ }
+ return QVariant();
+}
+
+QVariant StorageModel::headerData(int section, Qt::Orientation orientation, int role) const
+{
+ if (orientation != Qt::Horizontal)
+ return QVariant();
+
+ if (role != Qt::DisplayRole)
+ return QVariant();
+
+ switch (section) {
+ case ColumnRootPath:
+ return tr("Root Path");
+ case ColumnName:
+ return tr("Volume Name");
+ case ColumnDevice:
+ return tr("Device");
+ case ColumnFileSystemName:
+ return tr("File System");
+ case ColumnTotal:
+ return tr("Total");
+ case ColumnFree:
+ return tr("Free");
+ case ColumnAvailable:
+ return tr("Available");
+ case ColumnIsReady:
+ return tr("Ready");
+ case ColumnIsReadOnly:
+ return tr("Read-only");
+ case ColumnIsValid:
+ return tr("Valid");
+ default:
+ break;
+ }
+
+ return QVariant();
+}
diff --git a/tests/manual/tableview/storagemodel/storagemodel.h b/tests/manual/tableview/storagemodel/storagemodel.h
new file mode 100644
index 0000000000..787b2f04de
--- /dev/null
+++ b/tests/manual/tableview/storagemodel/storagemodel.h
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2016 Ivan Komissarov
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef STORAGEMODEL_H
+#define STORAGEMODEL_H
+
+#include <QAbstractTableModel>
+#include <QStorageInfo>
+
+class StorageModel : public QAbstractTableModel
+{
+ Q_OBJECT
+ Q_DISABLE_COPY(StorageModel)
+public:
+ enum Column {
+ ColumnRootPath = 0,
+ ColumnName,
+ ColumnDevice,
+ ColumnFileSystemName,
+ ColumnTotal,
+ ColumnFree,
+ ColumnAvailable,
+ ColumnIsReady,
+ ColumnIsReadOnly,
+ ColumnIsValid,
+ ColumnCount
+ };
+
+ explicit StorageModel(QObject *parent = nullptr);
+
+ int columnCount(const QModelIndex &parent) const override;
+ int rowCount(const QModelIndex &parent) const override;
+
+ QVariant data(const QModelIndex &index, int role) const override;
+ Qt::ItemFlags flags(const QModelIndex &index) const override;
+ QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
+
+public slots:
+ void refresh();
+
+private:
+ QList<QStorageInfo> m_volumes;
+};
+
+#endif // STORAGEMODEL_H
diff --git a/tests/manual/tableview/storagemodel/storagemodel.pro b/tests/manual/tableview/storagemodel/storagemodel.pro
new file mode 100644
index 0000000000..c6a018239e
--- /dev/null
+++ b/tests/manual/tableview/storagemodel/storagemodel.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = tableview_storage
+QT += qml quick
+SOURCES += main.cpp storagemodel.cpp
+HEADERS += storagemodel.h
+RESOURCES += main.qml
+
+# Default rules for deployment.
+qnx: target.path = /tmp/$${TARGET}/bin
+else: unix:!android: target.path = /opt/$${TARGET}/bin
+!isEmpty(target.path): INSTALLS += target
diff --git a/tests/manual/tableview/tableview.pro b/tests/manual/tableview/tableview.pro
new file mode 100644
index 0000000000..5040f0e747
--- /dev/null
+++ b/tests/manual/tableview/tableview.pro
@@ -0,0 +1,4 @@
+TEMPLATE = subdirs
+SUBDIRS += abstracttablemodel \
+ listmodel \
+ storagemodel
diff --git a/tests/manual/touch/flicktext.qml b/tests/manual/touch/flicktext.qml
index 6e8dcfded5..9e84261687 100644
--- a/tests/manual/touch/flicktext.qml
+++ b/tests/manual/touch/flicktext.qml
@@ -48,7 +48,7 @@
**
****************************************************************************/
-import QtQuick 2.4
+import QtQuick 2.12
import "qrc:/quick/shared/" as Examples
Rectangle {
@@ -67,6 +67,7 @@ Rectangle {
contentWidth: text.implicitWidth
contentHeight: text.implicitHeight
pixelAligned: pxAlignCB.checked
+ synchronousDrag: syncDragCB.checked
Text {
id: text
text: "foo bar"
@@ -366,10 +367,15 @@ Rectangle {
}
Column {
+ spacing: 2
Examples.CheckBox {
id: pxAlignCB
text: "pixel aligned"
}
+ Examples.CheckBox {
+ id: syncDragCB
+ text: "synchronous drag"
+ }
Text {
text: "content X " + flick.contentX.toFixed(2) + " Y " + flick.contentY.toFixed(2)
}