aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/api/api.pro1
-rw-r--r--tests/auto/api/api.qbs4
-rw-r--r--tests/auto/api/testdata/QBS-728/project.qbs (renamed from tests/auto/blackbox/testdata/QBS-728/project.qbs)0
-rw-r--r--tests/auto/api/testdata/add-qobject-macro-to-cpp-file/main.cpp (renamed from tests/auto/blackbox/testdata/add-qobject-macro-to-cpp-file/main.cpp)0
-rw-r--r--tests/auto/api/testdata/add-qobject-macro-to-cpp-file/object.cpp (renamed from tests/auto/blackbox/testdata/add-qobject-macro-to-cpp-file/object.cpp)0
-rw-r--r--tests/auto/api/testdata/add-qobject-macro-to-cpp-file/object.h (renamed from tests/auto/blackbox/testdata/add-qobject-macro-to-cpp-file/object.h)0
-rw-r--r--tests/auto/api/testdata/add-qobject-macro-to-cpp-file/project.qbs (renamed from tests/auto/blackbox/testdata/add-qobject-macro-to-cpp-file/project.qbs)0
-rw-r--r--tests/auto/api/testdata/added-file-persistent/file.cpp (renamed from tests/auto/blackbox/testdata/added-file-persistent/file.cpp)0
-rw-r--r--tests/auto/api/testdata/added-file-persistent/main.cpp (renamed from tests/auto/blackbox/testdata/added-file-persistent/main.cpp)0
-rw-r--r--tests/auto/api/testdata/added-file-persistent/project.qbs (renamed from tests/auto/blackbox/testdata/added-file-persistent/project.qbs)0
-rw-r--r--tests/auto/api/testdata/app-without-sources/a.c (renamed from tests/auto/blackbox/testdata/appWithoutSources/a.c)0
-rw-r--r--tests/auto/api/testdata/app-without-sources/b.c (renamed from tests/auto/blackbox/testdata/appWithoutSources/b.c)0
-rw-r--r--tests/auto/api/testdata/app-without-sources/project.qbs (renamed from tests/auto/blackbox/testdata/appWithoutSources/project.qbs)10
-rw-r--r--tests/auto/api/testdata/base-properties/imports/Bar.qbs (renamed from tests/auto/blackbox/testdata/baseProperties/imports/Bar.qbs)0
-rw-r--r--tests/auto/api/testdata/base-properties/imports/Foo.qbs (renamed from tests/auto/blackbox/testdata/baseProperties/imports/Foo.qbs)1
-rw-r--r--tests/auto/api/testdata/base-properties/main.cpp (renamed from tests/auto/blackbox/testdata/baseProperties/main.cpp)0
-rw-r--r--tests/auto/api/testdata/base-properties/prj.qbs (renamed from tests/auto/blackbox/testdata/baseProperties/prj.qbs)0
-rw-r--r--tests/auto/api/testdata/build-properties-source/main.cpp (renamed from tests/auto/blackbox/testdata/buildproperties_source/main.cpp)0
-rw-r--r--tests/auto/api/testdata/build-properties-source/project.qbs (renamed from tests/auto/blackbox/testdata/buildproperties_source/bp_source.qbs)1
-rw-r--r--tests/auto/api/testdata/change-dependent-lib/change-dependent-lib.qbs (renamed from tests/auto/blackbox/testdata/change-dependent-lib/change-dependent-lib.qbs)1
-rw-r--r--tests/auto/api/testdata/change-dependent-lib/main.cpp (renamed from tests/auto/blackbox/testdata/change-dependent-lib/main.cpp)0
-rw-r--r--tests/auto/api/testdata/change-dependent-lib/mylib.cpp (renamed from tests/auto/blackbox/testdata/change-dependent-lib/mylib.cpp)0
-rw-r--r--tests/auto/api/testdata/codegen/foo.txt (renamed from tests/auto/blackbox/testdata/codegen/foo.txt)0
-rw-r--r--tests/auto/api/testdata/codegen/project.qbs (renamed from tests/auto/blackbox/testdata/codegen/codegen.qbs)1
-rw-r--r--tests/auto/api/testdata/disabled-product/disabledProduct.qbs10
-rw-r--r--tests/auto/api/testdata/disabled-product/main.cpp1
-rw-r--r--tests/auto/api/testdata/disabled-project/disabled_project.qbs (renamed from tests/auto/blackbox/testdata/disabledProject/disabled_project.qbs)0
-rw-r--r--tests/auto/api/testdata/disabled_install_group/project.qbs1
-rw-r--r--tests/auto/api/testdata/duplicate-product-names/explicit.qbs (renamed from tests/auto/blackbox/testdata/duplicateProductNames/explicit.qbs)0
-rw-r--r--tests/auto/api/testdata/duplicate-product-names/implicit-indirect.qbs (renamed from tests/auto/blackbox/testdata/duplicateProductNames/implicit-indirect.qbs)0
-rw-r--r--tests/auto/api/testdata/duplicate-product-names/implicit.qbs (renamed from tests/auto/blackbox/testdata/duplicateProductNames/implicit.qbs)0
-rw-r--r--tests/auto/api/testdata/duplicate-product-names/subdir1/subproject.qbs (renamed from tests/auto/blackbox/testdata/duplicateProductNames/subdir1/subproject.qbs)0
-rw-r--r--tests/auto/api/testdata/duplicate-product-names/subdir2/subproject.qbs (renamed from tests/auto/blackbox/testdata/duplicateProductNames/subdir2/subproject.qbs)0
-rw-r--r--tests/auto/api/testdata/dynamic-libs/lib1.cpp (renamed from tests/auto/blackbox/testdata/dynamicLibs/lib1.cpp)0
-rw-r--r--tests/auto/api/testdata/dynamic-libs/lib2.cpp (renamed from tests/auto/blackbox/testdata/dynamicLibs/lib2.cpp)0
-rw-r--r--tests/auto/api/testdata/dynamic-libs/lib3.cpp (renamed from tests/auto/blackbox/testdata/dynamicLibs/lib3.cpp)0
-rw-r--r--tests/auto/api/testdata/dynamic-libs/lib4.cpp (renamed from tests/auto/blackbox/testdata/dynamicLibs/lib4.cpp)0
-rw-r--r--tests/auto/api/testdata/dynamic-libs/lib4.h (renamed from tests/auto/blackbox/testdata/dynamicLibs/lib4.h)0
-rw-r--r--tests/auto/api/testdata/dynamic-libs/link_dynamiclib.qbs (renamed from tests/auto/blackbox/testdata/dynamicLibs/link_dynamiclib.qbs)4
-rw-r--r--tests/auto/api/testdata/dynamic-libs/main.cpp (renamed from tests/auto/blackbox/testdata/dynamicLibs/main.cpp)0
-rw-r--r--tests/auto/api/testdata/empty-filetag-list/dontcompilethis.cpp (renamed from tests/auto/blackbox/testdata/empty-filetag-list/dontcompilethis.cpp)0
-rw-r--r--tests/auto/api/testdata/empty-filetag-list/project.qbs (renamed from tests/auto/blackbox/testdata/empty-filetag-list/project.qbs)0
-rw-r--r--tests/auto/api/testdata/empty-submodules-list/project.qbs (renamed from tests/auto/blackbox/testdata/empty-submodules-list/project.qbs)0
-rw-r--r--tests/auto/api/testdata/enable-and-disable-product/main.cpp (renamed from tests/auto/blackbox/testdata/enable-and-disable-product/main.cpp)0
-rw-r--r--tests/auto/api/testdata/enable-and-disable-product/project.qbs (renamed from tests/auto/blackbox/testdata/enable-and-disable-product/project.qbs)0
-rw-r--r--tests/auto/api/testdata/explicitly-depends-on/dependency.txt (renamed from tests/auto/blackbox/testdata/explicitlyDependsOn/dependency.txt)0
-rw-r--r--tests/auto/api/testdata/explicitly-depends-on/project.qbs (renamed from tests/auto/blackbox/testdata/explicitlyDependsOn/project.qbs)0
-rw-r--r--tests/auto/api/testdata/export-simple/lib1.cpp (renamed from tests/auto/blackbox/testdata/exportSimple/lib1.cpp)0
-rw-r--r--tests/auto/api/testdata/export-simple/main.cpp (renamed from tests/auto/blackbox/testdata/exportSimple/main.cpp)0
-rw-r--r--tests/auto/api/testdata/export-simple/project.qbs (renamed from tests/auto/blackbox/testdata/exportSimple/project.qbs)1
-rw-r--r--tests/auto/api/testdata/export-with-recursive-depends/main1.cpp (renamed from tests/auto/blackbox/testdata/exportWithRecursiveDepends/main1.cpp)0
-rw-r--r--tests/auto/api/testdata/export-with-recursive-depends/main2.cpp (renamed from tests/auto/blackbox/testdata/exportWithRecursiveDepends/main2.cpp)0
-rw-r--r--tests/auto/api/testdata/export-with-recursive-depends/modules/module1/module1.qbs (renamed from tests/auto/blackbox/testdata/exportWithRecursiveDepends/modules/module1/module1.qbs)0
-rw-r--r--tests/auto/api/testdata/export-with-recursive-depends/modules/module2/module2.qbs (renamed from tests/auto/blackbox/testdata/exportWithRecursiveDepends/modules/module2/module2.qbs)0
-rw-r--r--tests/auto/api/testdata/export-with-recursive-depends/project.qbs (renamed from tests/auto/blackbox/testdata/exportWithRecursiveDepends/project.qbs)0
-rw-r--r--tests/auto/api/testdata/file-tagger/bla.txt (renamed from tests/auto/blackbox/testdata/fileTagger/bla.txt)0
-rw-r--r--tests/auto/api/testdata/file-tagger/moc_cpp.qbs (renamed from tests/auto/blackbox/testdata/fileTagger/moc_cpp.qbs)1
-rw-r--r--tests/auto/api/testdata/filetagsfilter_override/InstalledApp.qbs1
-rw-r--r--tests/auto/api/testdata/infinite-loop-process/infinite-loop.qbs5
-rw-r--r--tests/auto/api/testdata/inherit-qbs-search-paths/imports/Foo.qbs (renamed from tests/auto/blackbox/testdata/inheritQbsSearchPaths/imports/Foo.qbs)1
-rw-r--r--tests/auto/api/testdata/inherit-qbs-search-paths/main.cpp (renamed from tests/auto/blackbox/testdata/inheritQbsSearchPaths/main.cpp)0
-rw-r--r--tests/auto/api/testdata/inherit-qbs-search-paths/prj.qbs (renamed from tests/auto/blackbox/testdata/inheritQbsSearchPaths/prj.qbs)0
-rw-r--r--tests/auto/api/testdata/inherit-qbs-search-paths/subdir/modules/bli/m.qbs (renamed from tests/auto/blackbox/testdata/inheritQbsSearchPaths/subdir/modules/bli/m.qbs)0
-rw-r--r--tests/auto/api/testdata/installed-artifact/installed_artifact.qbs19
-rw-r--r--tests/auto/api/testdata/installed-artifact/main.cpp (renamed from tests/auto/blackbox/testdata/type-change/main.cpp)0
-rw-r--r--tests/auto/api/testdata/is-runnable/project.qbs1
-rw-r--r--tests/auto/api/testdata/lib-same-source/main.cpp (renamed from tests/auto/blackbox/testdata/lib_samesource/main.cpp)0
-rw-r--r--tests/auto/api/testdata/lib-same-source/project.qbs (renamed from tests/auto/blackbox/testdata/lib_samesource/lib.qbs)1
-rw-r--r--tests/auto/api/testdata/link-static-lib/helper1/helper1.cpp (renamed from tests/auto/blackbox/testdata/link_staticlib/helper1/helper1.cpp)0
-rw-r--r--tests/auto/api/testdata/link-static-lib/helper1/helper1.h (renamed from tests/auto/blackbox/testdata/link_staticlib/helper1/helper1.h)0
-rw-r--r--tests/auto/api/testdata/link-static-lib/helper2/helper2.cpp (renamed from tests/auto/blackbox/testdata/link_staticlib/helper2/helper2.cpp)0
-rw-r--r--tests/auto/api/testdata/link-static-lib/helper2/helper2.h (renamed from tests/auto/blackbox/testdata/link_staticlib/helper2/helper2.h)0
-rw-r--r--tests/auto/api/testdata/link-static-lib/main.cpp (renamed from tests/auto/blackbox/testdata/link_staticlib/main.cpp)0
-rw-r--r--tests/auto/api/testdata/link-static-lib/mystaticlib.cpp (renamed from tests/auto/blackbox/testdata/link_staticlib/mystaticlib.cpp)0
-rw-r--r--tests/auto/api/testdata/link-static-lib/mystaticlibhelper.cpp (renamed from tests/auto/blackbox/testdata/link_staticlib/mystaticlibhelper.cpp)0
-rw-r--r--tests/auto/api/testdata/link-static-lib/project.qbs (renamed from tests/auto/blackbox/testdata/link_staticlib/link_staticlib.qbs)1
-rw-r--r--tests/auto/api/testdata/lots-of-dots/dotty.matrix.ui (renamed from tests/auto/blackbox/testdata/lotsofdots/dotty.matrix.ui)0
-rw-r--r--tests/auto/api/testdata/lots-of-dots/m.a.i.n.cpp (renamed from tests/auto/blackbox/testdata/lotsofdots/m.a.i.n.cpp)0
-rw-r--r--tests/auto/api/testdata/lots-of-dots/object.narf.cpp (renamed from tests/auto/blackbox/testdata/lotsofdots/object.narf.cpp)0
-rw-r--r--tests/auto/api/testdata/lots-of-dots/object.narf.h (renamed from tests/auto/blackbox/testdata/lotsofdots/object.narf.h)0
-rw-r--r--tests/auto/api/testdata/lots-of-dots/polka.dots.qrc (renamed from tests/auto/blackbox/testdata/lotsofdots/polka.dots.qrc)0
-rw-r--r--tests/auto/api/testdata/lots-of-dots/project.qbs (renamed from tests/auto/blackbox/testdata/lotsofdots/lots.of.dots.qbs)1
-rw-r--r--tests/auto/api/testdata/missing-qobject-header/main.cpp (renamed from tests/auto/blackbox/testdata/missingqobjectheader/main.cpp)0
-rw-r--r--tests/auto/api/testdata/missing-qobject-header/myobject.cpp (renamed from tests/auto/blackbox/testdata/missingqobjectheader/myobject.cpp)0
-rw-r--r--tests/auto/api/testdata/missing-qobject-header/myobject.h (renamed from tests/auto/blackbox/testdata/missingqobjectheader/myobject.h)0
-rw-r--r--tests/auto/api/testdata/moc-cpp/bla.cpp (renamed from tests/auto/blackbox/testdata/moc_cpp/bla.cpp)0
-rw-r--r--tests/auto/api/testdata/moc-cpp/project.qbs (renamed from tests/auto/blackbox/testdata/moc_cpp/moc_cpp.qbs)1
-rw-r--r--tests/auto/api/testdata/moc-hpp-included/object.cpp (renamed from tests/auto/blackbox/testdata/moc_hpp_included/object.cpp)0
-rw-r--r--tests/auto/api/testdata/moc-hpp-included/object.h (renamed from tests/auto/blackbox/testdata/moc_hpp/object.h)0
-rw-r--r--tests/auto/api/testdata/moc-hpp-included/project.qbs (renamed from tests/auto/blackbox/testdata/moc_hpp_included/moc_hpp_included.qbs)1
-rw-r--r--tests/auto/api/testdata/moc-hpp/object.cpp (renamed from tests/auto/blackbox/testdata/moc_hpp/object.cpp)0
-rw-r--r--tests/auto/api/testdata/moc-hpp/object.h (renamed from tests/auto/blackbox/testdata/moc_hpp_included/object.h)0
-rw-r--r--tests/auto/api/testdata/moc-hpp/project.qbs (renamed from tests/auto/blackbox/testdata/moc_hpp/moc_hpp.qbs)1
-rw-r--r--tests/auto/api/testdata/new-output-artifact-in-dependency/lib.cpp (renamed from tests/auto/blackbox/testdata/new-output-artifact-in-dependency/lib.cpp)0
-rw-r--r--tests/auto/api/testdata/new-output-artifact-in-dependency/main.cpp (renamed from tests/auto/blackbox/testdata/new-output-artifact-in-dependency/main.cpp)0
-rw-r--r--tests/auto/api/testdata/new-output-artifact-in-dependency/project.qbs (renamed from tests/auto/blackbox/testdata/new-output-artifact-in-dependency/project.qbs)1
-rw-r--r--tests/auto/api/testdata/new-pattern-match/project.qbs (renamed from tests/auto/blackbox/testdata/new-pattern-match/project.qbs)0
-rw-r--r--tests/auto/api/testdata/objc/main.mm (renamed from tests/auto/blackbox/testdata/objc/main.mm)0
-rw-r--r--tests/auto/api/testdata/objc/objc.qbs (renamed from tests/auto/blackbox/testdata/objc/objc.qbs)0
-rw-r--r--tests/auto/api/testdata/precompiled-header/main.cpp (renamed from tests/auto/blackbox/testdata/precompiledHeader/main.cpp)0
-rw-r--r--tests/auto/api/testdata/precompiled-header/myobject.cpp (renamed from tests/auto/blackbox/testdata/precompiledHeader/myobject.cpp)0
-rw-r--r--tests/auto/api/testdata/precompiled-header/myobject.h (renamed from tests/auto/blackbox/testdata/precompiledHeader/myobject.h)0
-rw-r--r--tests/auto/api/testdata/precompiled-header/project.qbs (renamed from tests/auto/blackbox/testdata/precompiledHeader/precompiledHeader.qbs)1
-rw-r--r--tests/auto/api/testdata/precompiled-header/stable.h (renamed from tests/auto/blackbox/testdata/precompiledHeader/stable.h)0
-rw-r--r--tests/auto/api/testdata/productNameWithDots/app.cpp (renamed from tests/auto/blackbox/testdata/simpleProbe/main.cpp)0
-rw-r--r--tests/auto/api/testdata/productNameWithDots/lib.cpp1
-rw-r--r--tests/auto/api/testdata/productNameWithDots/project.qbs17
-rw-r--r--tests/auto/api/testdata/project-with-properties-item/project.qbs (renamed from tests/auto/blackbox/testdata/project-with-properties-item/project.qbs)0
-rw-r--r--tests/auto/api/testdata/properties-blocks/main.cpp (renamed from tests/auto/blackbox/testdata/propertiesBlocks/main.cpp)0
-rw-r--r--tests/auto/api/testdata/properties-blocks/propertiesblocks.qbs (renamed from tests/auto/blackbox/testdata/propertiesBlocks/propertiesblocks.qbs)1
-rw-r--r--tests/auto/api/testdata/qt5-plugin/echointerface.h (renamed from tests/auto/blackbox/testdata/qt5plugin/echointerface.h)0
-rw-r--r--tests/auto/api/testdata/qt5-plugin/echoplugin.cpp (renamed from tests/auto/blackbox/testdata/qt5plugin/echoplugin.cpp)0
-rw-r--r--tests/auto/api/testdata/qt5-plugin/echoplugin.h (renamed from tests/auto/blackbox/testdata/qt5plugin/echoplugin.h)0
-rw-r--r--tests/auto/api/testdata/qt5-plugin/echoplugin.json.source (renamed from tests/auto/blackbox/testdata/qt5plugin/echoplugin.json.source)0
-rw-r--r--tests/auto/api/testdata/qt5-plugin/echoplugin_dummy.cpp (renamed from tests/auto/blackbox/testdata/qt5plugin/echoplugin_dummy.cpp)0
-rw-r--r--tests/auto/api/testdata/qt5-plugin/project.qbs (renamed from tests/auto/blackbox/testdata/qt5plugin/plugin.qbs)1
-rw-r--r--tests/auto/api/testdata/rc/main.cpp (renamed from tests/auto/blackbox/testdata/rc/main.cpp)0
-rw-r--r--tests/auto/api/testdata/rc/rc.qbs (renamed from tests/auto/blackbox/testdata/rc/rc.qbs)1
-rw-r--r--tests/auto/api/testdata/rc/test.rc (renamed from tests/auto/blackbox/testdata/rc/test.rc)0
-rw-r--r--tests/auto/api/testdata/recursive-wildcards/dir/file1.txt0
-rw-r--r--tests/auto/api/testdata/recursive-wildcards/dir/subdir/file2.txt0
-rw-r--r--tests/auto/api/testdata/recursive-wildcards/recursive_wildcards.qbs7
-rw-r--r--tests/auto/api/testdata/remove-file-dependency/main.cpp (renamed from tests/auto/blackbox/testdata/removeFileDependency/main.cpp)0
-rw-r--r--tests/auto/api/testdata/remove-file-dependency/removeFileDependency.qbs (renamed from tests/auto/blackbox/testdata/removeFileDependency/removeFileDependency.qbs)0
-rw-r--r--tests/auto/api/testdata/remove-file-dependency/someheader.h (renamed from tests/auto/blackbox/testdata/removeFileDependency/someheader.h)0
-rw-r--r--tests/auto/api/testdata/rename-product/lib.cpp (renamed from tests/auto/blackbox/testdata/renameProduct/lib.cpp)0
-rw-r--r--tests/auto/api/testdata/rename-product/main.cpp (renamed from tests/auto/blackbox/testdata/renameProduct/main.cpp)0
-rw-r--r--tests/auto/api/testdata/rename-product/rename.qbs (renamed from tests/auto/blackbox/testdata/renameProduct/rename.qbs)1
-rw-r--r--tests/auto/api/testdata/rename-target-artifact/lib.cpp (renamed from tests/auto/blackbox/testdata/renameTargetArtifact/lib.cpp)0
-rw-r--r--tests/auto/api/testdata/rename-target-artifact/main.cpp (renamed from tests/auto/blackbox/testdata/renameTargetArtifact/main.cpp)0
-rw-r--r--tests/auto/api/testdata/rename-target-artifact/rename.qbs (renamed from tests/auto/blackbox/testdata/renameTargetArtifact/rename.qbs)1
-rw-r--r--tests/auto/api/testdata/same-base-name/lib.c (renamed from tests/auto/blackbox/testdata/sameBaseName/lib.c)0
-rw-r--r--tests/auto/api/testdata/same-base-name/lib.cpp (renamed from tests/auto/blackbox/testdata/sameBaseName/lib.cpp)0
-rw-r--r--tests/auto/api/testdata/same-base-name/lib.m (renamed from tests/auto/blackbox/testdata/sameBaseName/lib.m)0
-rw-r--r--tests/auto/api/testdata/same-base-name/lib.mm (renamed from tests/auto/blackbox/testdata/sameBaseName/lib.mm)0
-rw-r--r--tests/auto/api/testdata/same-base-name/main.c (renamed from tests/auto/blackbox/testdata/sameBaseName/main.c)0
-rw-r--r--tests/auto/api/testdata/same-base-name/project.qbs (renamed from tests/auto/blackbox/testdata/sameBaseName/sameBaseName.qbs)1
-rw-r--r--tests/auto/api/testdata/simple-probe/main.cpp1
-rw-r--r--tests/auto/api/testdata/simple-probe/project.qbs (renamed from tests/auto/blackbox/testdata/simpleProbe/simpleProbe.qbs)1
-rw-r--r--tests/auto/api/testdata/soft-dependency/main.cpp (renamed from tests/auto/blackbox/testdata/soft-dependency/main.cpp)0
-rw-r--r--tests/auto/api/testdata/soft-dependency/project.qbs (renamed from tests/auto/blackbox/testdata/soft-dependency/project.qbs)0
-rw-r--r--tests/auto/api/testdata/static-lib-deps/a1.cpp (renamed from tests/auto/blackbox/testdata/staticLibDeps/a1.cpp)0
-rw-r--r--tests/auto/api/testdata/static-lib-deps/a2.cpp (renamed from tests/auto/blackbox/testdata/staticLibDeps/a2.cpp)0
-rw-r--r--tests/auto/api/testdata/static-lib-deps/b.cpp (renamed from tests/auto/blackbox/testdata/staticLibDeps/b.cpp)0
-rw-r--r--tests/auto/api/testdata/static-lib-deps/c.cpp (renamed from tests/auto/blackbox/testdata/staticLibDeps/c.cpp)0
-rw-r--r--tests/auto/api/testdata/static-lib-deps/d.cpp (renamed from tests/auto/blackbox/testdata/staticLibDeps/d.cpp)0
-rw-r--r--tests/auto/api/testdata/static-lib-deps/e.cpp (renamed from tests/auto/blackbox/testdata/staticLibDeps/e.cpp)0
-rw-r--r--tests/auto/api/testdata/static-lib-deps/main.cpp (renamed from tests/auto/blackbox/testdata/staticLibDeps/main.cpp)0
-rw-r--r--tests/auto/api/testdata/static-lib-deps/project.qbs (renamed from tests/auto/blackbox/testdata/staticLibDeps/dep.qbs)1
-rw-r--r--tests/auto/api/testdata/subprojects/resources/imports/LibraryType/type.js (renamed from tests/auto/blackbox/testdata/subprojects/resources/imports/LibraryType/type.js)0
-rw-r--r--tests/auto/api/testdata/subprojects/resources/modules/QtCoreDepender/qtcoredepender.qbs (renamed from tests/auto/blackbox/testdata/subprojects/resources/modules/QtCoreDepender/qtcoredepender.qbs)0
-rw-r--r--tests/auto/api/testdata/subprojects/subproject1/main.cpp (renamed from tests/auto/blackbox/testdata/subprojects/subproject1/main.cpp)0
-rw-r--r--tests/auto/api/testdata/subprojects/subproject2/subproject2.qbs (renamed from tests/auto/blackbox/testdata/subprojects/subproject2/subproject2.qbs)0
-rw-r--r--tests/auto/api/testdata/subprojects/subproject2/subproject3/subproject3.qbs (renamed from tests/auto/blackbox/testdata/subprojects/subproject2/subproject3/subproject3.qbs)0
-rw-r--r--tests/auto/api/testdata/subprojects/subproject2/subproject3/testlib.cpp (renamed from tests/auto/blackbox/testdata/subprojects/subproject2/subproject3/testlib.cpp)0
-rw-r--r--tests/auto/api/testdata/subprojects/toplevelproject.qbs (renamed from tests/auto/blackbox/testdata/subprojects/toplevelproject.qbs)0
-rw-r--r--tests/auto/api/testdata/transformers/main.cpp (renamed from tests/auto/blackbox/testdata/transformers/main.cpp)0
-rw-r--r--tests/auto/api/testdata/transformers/transformers.qbs (renamed from tests/auto/blackbox/testdata/transformers/transformers.qbs)1
-rw-r--r--tests/auto/api/testdata/type-change/main.cpp1
-rw-r--r--tests/auto/api/testdata/type-change/project.qbs (renamed from tests/auto/blackbox/testdata/type-change/project.qbs)0
-rw-r--r--tests/auto/api/testdata/uic/bla.cpp (renamed from tests/auto/blackbox/testdata/uic/bla.cpp)0
-rw-r--r--tests/auto/api/testdata/uic/bla.h (renamed from tests/auto/blackbox/testdata/uic/bla.h)0
-rw-r--r--tests/auto/api/testdata/uic/ui.h (renamed from tests/auto/blackbox/testdata/uic/ui.h)0
-rw-r--r--tests/auto/api/testdata/uic/ui.ui (renamed from tests/auto/blackbox/testdata/uic/ui.ui)0
-rw-r--r--tests/auto/api/testdata/uic/uic.qbs (renamed from tests/auto/blackbox/testdata/uic/uic.qbs)1
-rw-r--r--tests/auto/api/tst_api.cpp1115
-rw-r--r--tests/auto/api/tst_api.h56
-rw-r--r--tests/auto/auto.pri1
-rw-r--r--tests/auto/auto.pro3
-rw-r--r--tests/auto/autotest.qbs21
-rw-r--r--tests/auto/blackbox/blackbox.qbs5
-rw-r--r--tests/auto/blackbox/testdata/android/android-project.qbs90
-rw-r--r--tests/auto/blackbox/testdata/archiver/archivable.qbs13
-rw-r--r--tests/auto/blackbox/testdata/archiver/list.txt2
-rw-r--r--tests/auto/blackbox/testdata/archiver/test.txt0
-rw-r--r--tests/auto/blackbox/testdata/build-directories/project.qbs2
-rw-r--r--tests/auto/blackbox/testdata/changed-files/project.qbs1
-rw-r--r--tests/auto/blackbox/testdata/clean/clean.qbs3
-rw-r--r--tests/auto/blackbox/testdata/dependenciesProperty/dependenciesProperty.qbs1
-rw-r--r--tests/auto/blackbox/testdata/dynamicRuleOutputs/before/genlexer.qbs1
-rw-r--r--tests/auto/blackbox/testdata/embedInfoPlist/embedInfoPlist.qbs4
-rw-r--r--tests/auto/blackbox/testdata/export-rule/blubber.cpp1
-rw-r--r--tests/auto/blackbox/testdata/export-rule/export-rule.qbs37
-rw-r--r--tests/auto/blackbox/testdata/export-rule/myapp.blubb8
-rw-r--r--tests/auto/blackbox/testdata/fileDependencies/fileDependencies.qbs1
-rw-r--r--tests/auto/blackbox/testdata/frameworkStructure/BaseResource0
-rw-r--r--tests/auto/blackbox/testdata/frameworkStructure/Widget.cpp1
-rw-r--r--tests/auto/blackbox/testdata/frameworkStructure/Widget.h1
-rw-r--r--tests/auto/blackbox/testdata/frameworkStructure/WidgetPrivate.h0
-rw-r--r--tests/auto/blackbox/testdata/frameworkStructure/en.lproj/EnglishResource0
-rw-r--r--tests/auto/blackbox/testdata/frameworkStructure/frameworkStructure.qbs13
-rw-r--r--tests/auto/blackbox/testdata/inputs-from-dependencies/file1.txt0
-rw-r--r--tests/auto/blackbox/testdata/inputs-from-dependencies/file2.txt0
-rw-r--r--tests/auto/blackbox/testdata/inputs-from-dependencies/file3.txt0
-rw-r--r--tests/auto/blackbox/testdata/inputs-from-dependencies/file4.txt0
-rw-r--r--tests/auto/blackbox/testdata/inputs-from-dependencies/project.qbs51
-rw-r--r--tests/auto/blackbox/testdata/installable/installable.qbs43
-rw-r--r--tests/auto/blackbox/testdata/installable/main.cpp1
-rw-r--r--tests/auto/blackbox/testdata/installed-source-files/main.cpp1
-rw-r--r--tests/auto/blackbox/testdata/installed-source-files/project.qbs20
-rw-r--r--tests/auto/blackbox/testdata/installed-source-files/readme.txt1
-rw-r--r--tests/auto/blackbox/testdata/installed_artifact/installed_artifact.qbs1
-rw-r--r--tests/auto/blackbox/testdata/installpackage/installpackage.qbs43
-rw-r--r--tests/auto/blackbox/testdata/installpackage/lib.cpp3
-rw-r--r--tests/auto/blackbox/testdata/installpackage/lib.h9
-rw-r--r--tests/auto/blackbox/testdata/installpackage/main.cpp6
-rw-r--r--tests/auto/blackbox/testdata/java/Car.java7
-rw-r--r--tests/auto/blackbox/testdata/java/HelloWorld.java8
-rw-r--r--tests/auto/blackbox/testdata/java/Jet.java7
-rw-r--r--tests/auto/blackbox/testdata/java/NoPackage.java5
-rw-r--r--tests/auto/blackbox/testdata/java/Ship.java12
-rw-r--r--tests/auto/blackbox/testdata/java/Vehicle.java4
-rw-r--r--tests/auto/blackbox/testdata/java/Vehicles.java34
-rw-r--r--tests/auto/blackbox/testdata/java/vehicles.qbs18
-rw-r--r--tests/auto/blackbox/testdata/jsextensions/propertylist.qbs10
-rw-r--r--tests/auto/blackbox/testdata/non-broken-files-in-broken-product/project.qbs1
-rw-r--r--tests/auto/blackbox/testdata/non-default-product/main.cpp1
-rw-r--r--tests/auto/blackbox/testdata/non-default-product/project.qbs16
-rw-r--r--tests/auto/blackbox/testdata/objc-arc/arc.m3
-rw-r--r--tests/auto/blackbox/testdata/objc-arc/arc.mm3
-rw-r--r--tests/auto/blackbox/testdata/objc-arc/main.m4
-rw-r--r--tests/auto/blackbox/testdata/objc-arc/mrc.m3
-rw-r--r--tests/auto/blackbox/testdata/objc-arc/mrc.mm3
-rw-r--r--tests/auto/blackbox/testdata/objc-arc/objc-arc.qbs21
-rw-r--r--tests/auto/blackbox/testdata/overrideProjectProperties/helper_lib.qbs1
-rw-r--r--tests/auto/blackbox/testdata/overrideProjectProperties/project.qbs1
-rw-r--r--tests/auto/blackbox/testdata/overrideProjectProperties/project_using_helper_lib.qbs2
-rw-r--r--tests/auto/blackbox/testdata/product-dependencies-by-type/main.cpp1
-rw-r--r--tests/auto/blackbox/testdata/product-dependencies-by-type/project.qbs66
-rw-r--r--tests/auto/blackbox/testdata/productproperties/app.qbs1
-rw-r--r--tests/auto/blackbox/testdata/proper quoting/proper quoting.qbs1
-rw-r--r--tests/auto/blackbox/testdata/propertyChanges/project.qbs1
-rw-r--r--tests/auto/blackbox/testdata/qml-debugging/project.qbs2
-rw-r--r--tests/auto/blackbox/testdata/qobject-in-mm/main.mm13
-rw-r--r--tests/auto/blackbox/testdata/qobject-in-mm/project.qbs6
-rw-r--r--tests/auto/blackbox/testdata/qrc/i.qbs1
-rw-r--r--tests/auto/blackbox/testdata/ruleConditions/templates/zorduct.qbs1
-rw-r--r--tests/auto/blackbox/testdata/separate-debug-info/foo.cpp7
-rw-r--r--tests/auto/blackbox/testdata/separate-debug-info/main.cpp1
-rw-r--r--tests/auto/blackbox/testdata/separate-debug-info/project.qbs30
-rw-r--r--tests/auto/blackbox/testdata/subprofile-change-tracking/main1.cpp1
-rw-r--r--tests/auto/blackbox/testdata/subprofile-change-tracking/main2.cpp1
-rw-r--r--tests/auto/blackbox/testdata/subprofile-change-tracking/subprofile-change-tracking.qbs9
-rw-r--r--tests/auto/blackbox/testdata/trackAddFile/after/project.qbs1
-rw-r--r--tests/auto/blackbox/testdata/trackAddFile/before/project.qbs1
-rw-r--r--tests/auto/blackbox/testdata/trackFileTags/after/project.qbs1
-rw-r--r--tests/auto/blackbox/testdata/trackFileTags/before/project.qbs1
-rw-r--r--tests/auto/blackbox/testdata/trackProducts/after/product3.qbs1
-rw-r--r--tests/auto/blackbox/testdata/trackProducts/before/product1.qbs1
-rw-r--r--tests/auto/blackbox/testdata/trackProducts/before/product2.qbs1
-rw-r--r--tests/auto/blackbox/testdata/trackQObjChange/i.qbs1
-rw-r--r--tests/auto/blackbox/testdata/usings-as-sole-inputs-non-multiplexed/project.qbs2
-rw-r--r--tests/auto/blackbox/tst_blackbox.cpp1148
-rw-r--r--tests/auto/blackbox/tst_blackbox.h64
-rw-r--r--tests/auto/buildgraph/buildgraph.qbs4
-rw-r--r--tests/auto/cmdlineparser/cmdlineparser.qbs11
-rw-r--r--tests/auto/language/language.qbs4
-rw-r--r--tests/auto/shared.h80
-rw-r--r--tests/auto/tools/tools.qbs4
-rw-r--r--tests/fuzzy-test/fuzzy-test.qbs1
-rw-r--r--tests/manual/configure/configure.qbs1
-rw-r--r--tests/manual/includeLookup/includeLookup.qbs1
-rw-r--r--tests/manual/localDeployment/localDeployment.qbs1
-rw-r--r--tests/manual/minimumSystemVersion/minimumSystemVersion.qbs10
-rw-r--r--tests/tests.pro3
265 files changed, 2275 insertions, 1041 deletions
diff --git a/tests/auto/api/api.pro b/tests/auto/api/api.pro
index d364333fc..586d8fcb0 100644
--- a/tests/auto/api/api.pro
+++ b/tests/auto/api/api.pro
@@ -3,6 +3,7 @@ TARGET = tst_api
HEADERS = tst_api.h
SOURCES = tst_api.cpp
+include(../../../src/library_dirname.pri)
isEmpty(QBS_RELATIVE_PLUGINS_PATH):QBS_RELATIVE_PLUGINS_PATH=../$${QBS_LIBRARY_DIRNAME}
isEmpty(QBS_RELATIVE_SEARCH_PATH):QBS_RELATIVE_SEARCH_PATH=..
DEFINES += QBS_RELATIVE_PLUGINS_PATH=\\\"$${QBS_RELATIVE_PLUGINS_PATH}\\\"
diff --git a/tests/auto/api/api.qbs b/tests/auto/api/api.qbs
index 61f6070a9..bcf1cbd53 100644
--- a/tests/auto/api/api.qbs
+++ b/tests/auto/api/api.qbs
@@ -1,6 +1,6 @@
-import "../autotest.qbs" as AutoTest
+import qbs
-AutoTest {
+QbsAutotest {
testName: "api"
files: ["../shared.h", "tst_api.h", "tst_api.cpp"]
cpp.defines: base.concat([
diff --git a/tests/auto/blackbox/testdata/QBS-728/project.qbs b/tests/auto/api/testdata/QBS-728/project.qbs
index 6ab244c83..6ab244c83 100644
--- a/tests/auto/blackbox/testdata/QBS-728/project.qbs
+++ b/tests/auto/api/testdata/QBS-728/project.qbs
diff --git a/tests/auto/blackbox/testdata/add-qobject-macro-to-cpp-file/main.cpp b/tests/auto/api/testdata/add-qobject-macro-to-cpp-file/main.cpp
index 940a7628d..940a7628d 100644
--- a/tests/auto/blackbox/testdata/add-qobject-macro-to-cpp-file/main.cpp
+++ b/tests/auto/api/testdata/add-qobject-macro-to-cpp-file/main.cpp
diff --git a/tests/auto/blackbox/testdata/add-qobject-macro-to-cpp-file/object.cpp b/tests/auto/api/testdata/add-qobject-macro-to-cpp-file/object.cpp
index aab24f6c0..aab24f6c0 100644
--- a/tests/auto/blackbox/testdata/add-qobject-macro-to-cpp-file/object.cpp
+++ b/tests/auto/api/testdata/add-qobject-macro-to-cpp-file/object.cpp
diff --git a/tests/auto/blackbox/testdata/add-qobject-macro-to-cpp-file/object.h b/tests/auto/api/testdata/add-qobject-macro-to-cpp-file/object.h
index 37070b494..37070b494 100644
--- a/tests/auto/blackbox/testdata/add-qobject-macro-to-cpp-file/object.h
+++ b/tests/auto/api/testdata/add-qobject-macro-to-cpp-file/object.h
diff --git a/tests/auto/blackbox/testdata/add-qobject-macro-to-cpp-file/project.qbs b/tests/auto/api/testdata/add-qobject-macro-to-cpp-file/project.qbs
index 40c5395ef..40c5395ef 100644
--- a/tests/auto/blackbox/testdata/add-qobject-macro-to-cpp-file/project.qbs
+++ b/tests/auto/api/testdata/add-qobject-macro-to-cpp-file/project.qbs
diff --git a/tests/auto/blackbox/testdata/added-file-persistent/file.cpp b/tests/auto/api/testdata/added-file-persistent/file.cpp
index 8101b05dc..8101b05dc 100644
--- a/tests/auto/blackbox/testdata/added-file-persistent/file.cpp
+++ b/tests/auto/api/testdata/added-file-persistent/file.cpp
diff --git a/tests/auto/blackbox/testdata/added-file-persistent/main.cpp b/tests/auto/api/testdata/added-file-persistent/main.cpp
index 1921f1feb..1921f1feb 100644
--- a/tests/auto/blackbox/testdata/added-file-persistent/main.cpp
+++ b/tests/auto/api/testdata/added-file-persistent/main.cpp
diff --git a/tests/auto/blackbox/testdata/added-file-persistent/project.qbs b/tests/auto/api/testdata/added-file-persistent/project.qbs
index 672886646..672886646 100644
--- a/tests/auto/blackbox/testdata/added-file-persistent/project.qbs
+++ b/tests/auto/api/testdata/added-file-persistent/project.qbs
diff --git a/tests/auto/blackbox/testdata/appWithoutSources/a.c b/tests/auto/api/testdata/app-without-sources/a.c
index bf7759e11..bf7759e11 100644
--- a/tests/auto/blackbox/testdata/appWithoutSources/a.c
+++ b/tests/auto/api/testdata/app-without-sources/a.c
diff --git a/tests/auto/blackbox/testdata/appWithoutSources/b.c b/tests/auto/api/testdata/app-without-sources/b.c
index e3841fa32..e3841fa32 100644
--- a/tests/auto/blackbox/testdata/appWithoutSources/b.c
+++ b/tests/auto/api/testdata/app-without-sources/b.c
diff --git a/tests/auto/blackbox/testdata/appWithoutSources/project.qbs b/tests/auto/api/testdata/app-without-sources/project.qbs
index dca195e29..726726337 100644
--- a/tests/auto/blackbox/testdata/appWithoutSources/project.qbs
+++ b/tests/auto/api/testdata/app-without-sources/project.qbs
@@ -24,8 +24,14 @@ Project {
CppApplication {
name: "appWithoutSources"
- type: ["application"]
- cpp.entryPoint: "main"
+
+ // HACK: cpp.entryPoint currently not working 100% with gcc
+ Properties {
+ condition: qbs.toolchain.contains("msvc")
+ cpp.entryPoint: "main"
+ }
+ cpp.entryPoint: undefined
+ bundle.isBundle: false
Depends { name: "a" }
Depends { name: "b" }
diff --git a/tests/auto/blackbox/testdata/baseProperties/imports/Bar.qbs b/tests/auto/api/testdata/base-properties/imports/Bar.qbs
index 07ab724e4..07ab724e4 100644
--- a/tests/auto/blackbox/testdata/baseProperties/imports/Bar.qbs
+++ b/tests/auto/api/testdata/base-properties/imports/Bar.qbs
diff --git a/tests/auto/blackbox/testdata/baseProperties/imports/Foo.qbs b/tests/auto/api/testdata/base-properties/imports/Foo.qbs
index 563992434..f177a17c3 100644
--- a/tests/auto/blackbox/testdata/baseProperties/imports/Foo.qbs
+++ b/tests/auto/api/testdata/base-properties/imports/Foo.qbs
@@ -2,6 +2,7 @@ import qbs 1.0
Bar {
type: "application"
+ consoleApplication: true
cpp.defines: base.concat(["FROM_FOO"])
}
diff --git a/tests/auto/blackbox/testdata/baseProperties/main.cpp b/tests/auto/api/testdata/base-properties/main.cpp
index 3c1bc2c58..3c1bc2c58 100644
--- a/tests/auto/blackbox/testdata/baseProperties/main.cpp
+++ b/tests/auto/api/testdata/base-properties/main.cpp
diff --git a/tests/auto/blackbox/testdata/baseProperties/prj.qbs b/tests/auto/api/testdata/base-properties/prj.qbs
index a43b930dc..a43b930dc 100644
--- a/tests/auto/blackbox/testdata/baseProperties/prj.qbs
+++ b/tests/auto/api/testdata/base-properties/prj.qbs
diff --git a/tests/auto/blackbox/testdata/buildproperties_source/main.cpp b/tests/auto/api/testdata/build-properties-source/main.cpp
index 6020544fe..6020544fe 100644
--- a/tests/auto/blackbox/testdata/buildproperties_source/main.cpp
+++ b/tests/auto/api/testdata/build-properties-source/main.cpp
diff --git a/tests/auto/blackbox/testdata/buildproperties_source/bp_source.qbs b/tests/auto/api/testdata/build-properties-source/project.qbs
index df7649625..49f565b29 100644
--- a/tests/auto/blackbox/testdata/buildproperties_source/bp_source.qbs
+++ b/tests/auto/api/testdata/build-properties-source/project.qbs
@@ -3,6 +3,7 @@ import qbs 1.0
Project {
Product {
type: "application"
+ consoleApplication: true
name: "HelloWorld"
Depends { name: 'cpp' }
diff --git a/tests/auto/blackbox/testdata/change-dependent-lib/change-dependent-lib.qbs b/tests/auto/api/testdata/change-dependent-lib/change-dependent-lib.qbs
index ac5778134..4037ae869 100644
--- a/tests/auto/blackbox/testdata/change-dependent-lib/change-dependent-lib.qbs
+++ b/tests/auto/api/testdata/change-dependent-lib/change-dependent-lib.qbs
@@ -18,6 +18,7 @@ Project {
}
Depends { name: "cpp" }
cpp.defines: ["XXXX"]
+ bundle.isBundle: false
}
}
diff --git a/tests/auto/blackbox/testdata/change-dependent-lib/main.cpp b/tests/auto/api/testdata/change-dependent-lib/main.cpp
index 0bf8b2823..0bf8b2823 100644
--- a/tests/auto/blackbox/testdata/change-dependent-lib/main.cpp
+++ b/tests/auto/api/testdata/change-dependent-lib/main.cpp
diff --git a/tests/auto/blackbox/testdata/change-dependent-lib/mylib.cpp b/tests/auto/api/testdata/change-dependent-lib/mylib.cpp
index d74c52ce0..d74c52ce0 100644
--- a/tests/auto/blackbox/testdata/change-dependent-lib/mylib.cpp
+++ b/tests/auto/api/testdata/change-dependent-lib/mylib.cpp
diff --git a/tests/auto/blackbox/testdata/codegen/foo.txt b/tests/auto/api/testdata/codegen/foo.txt
index 557db03de..557db03de 100644
--- a/tests/auto/blackbox/testdata/codegen/foo.txt
+++ b/tests/auto/api/testdata/codegen/foo.txt
diff --git a/tests/auto/blackbox/testdata/codegen/codegen.qbs b/tests/auto/api/testdata/codegen/project.qbs
index 4b440fc51..282ee4a7f 100644
--- a/tests/auto/blackbox/testdata/codegen/codegen.qbs
+++ b/tests/auto/api/testdata/codegen/project.qbs
@@ -7,6 +7,7 @@ Project {
Product {
type: 'application'
+ consoleApplication: true
name: project.name
property var replacements: ({
NUMBERTYPE: "int",
diff --git a/tests/auto/api/testdata/disabled-product/disabledProduct.qbs b/tests/auto/api/testdata/disabled-product/disabledProduct.qbs
new file mode 100644
index 000000000..c57615c10
--- /dev/null
+++ b/tests/auto/api/testdata/disabled-product/disabledProduct.qbs
@@ -0,0 +1,10 @@
+import qbs
+
+CppApplication {
+ condition: false
+ files: "main.cpp"
+ Group {
+ condition: qbs.targetOS.contains("stuff")
+ qbs.install: false
+ }
+}
diff --git a/tests/auto/api/testdata/disabled-product/main.cpp b/tests/auto/api/testdata/disabled-product/main.cpp
new file mode 100644
index 000000000..1f5a432df
--- /dev/null
+++ b/tests/auto/api/testdata/disabled-product/main.cpp
@@ -0,0 +1 @@
+thiswillnotcompile
diff --git a/tests/auto/blackbox/testdata/disabledProject/disabled_project.qbs b/tests/auto/api/testdata/disabled-project/disabled_project.qbs
index 1461b70ad..1461b70ad 100644
--- a/tests/auto/blackbox/testdata/disabledProject/disabled_project.qbs
+++ b/tests/auto/api/testdata/disabled-project/disabled_project.qbs
diff --git a/tests/auto/api/testdata/disabled_install_group/project.qbs b/tests/auto/api/testdata/disabled_install_group/project.qbs
index 19df87928..6364506b4 100644
--- a/tests/auto/api/testdata/disabled_install_group/project.qbs
+++ b/tests/auto/api/testdata/disabled_install_group/project.qbs
@@ -7,4 +7,5 @@ CppApplication {
qbs.install: true
fileTagsFilter: product.type
}
+ bundle.isBundle: false
}
diff --git a/tests/auto/blackbox/testdata/duplicateProductNames/explicit.qbs b/tests/auto/api/testdata/duplicate-product-names/explicit.qbs
index 0183b411c..0183b411c 100644
--- a/tests/auto/blackbox/testdata/duplicateProductNames/explicit.qbs
+++ b/tests/auto/api/testdata/duplicate-product-names/explicit.qbs
diff --git a/tests/auto/blackbox/testdata/duplicateProductNames/implicit-indirect.qbs b/tests/auto/api/testdata/duplicate-product-names/implicit-indirect.qbs
index 7164aa1c5..7164aa1c5 100644
--- a/tests/auto/blackbox/testdata/duplicateProductNames/implicit-indirect.qbs
+++ b/tests/auto/api/testdata/duplicate-product-names/implicit-indirect.qbs
diff --git a/tests/auto/blackbox/testdata/duplicateProductNames/implicit.qbs b/tests/auto/api/testdata/duplicate-product-names/implicit.qbs
index f39f80626..f39f80626 100644
--- a/tests/auto/blackbox/testdata/duplicateProductNames/implicit.qbs
+++ b/tests/auto/api/testdata/duplicate-product-names/implicit.qbs
diff --git a/tests/auto/blackbox/testdata/duplicateProductNames/subdir1/subproject.qbs b/tests/auto/api/testdata/duplicate-product-names/subdir1/subproject.qbs
index 6d16a3c53..6d16a3c53 100644
--- a/tests/auto/blackbox/testdata/duplicateProductNames/subdir1/subproject.qbs
+++ b/tests/auto/api/testdata/duplicate-product-names/subdir1/subproject.qbs
diff --git a/tests/auto/blackbox/testdata/duplicateProductNames/subdir2/subproject.qbs b/tests/auto/api/testdata/duplicate-product-names/subdir2/subproject.qbs
index 6d16a3c53..6d16a3c53 100644
--- a/tests/auto/blackbox/testdata/duplicateProductNames/subdir2/subproject.qbs
+++ b/tests/auto/api/testdata/duplicate-product-names/subdir2/subproject.qbs
diff --git a/tests/auto/blackbox/testdata/dynamicLibs/lib1.cpp b/tests/auto/api/testdata/dynamic-libs/lib1.cpp
index 7af7cdbb1..7af7cdbb1 100644
--- a/tests/auto/blackbox/testdata/dynamicLibs/lib1.cpp
+++ b/tests/auto/api/testdata/dynamic-libs/lib1.cpp
diff --git a/tests/auto/blackbox/testdata/dynamicLibs/lib2.cpp b/tests/auto/api/testdata/dynamic-libs/lib2.cpp
index f145e3246..f145e3246 100644
--- a/tests/auto/blackbox/testdata/dynamicLibs/lib2.cpp
+++ b/tests/auto/api/testdata/dynamic-libs/lib2.cpp
diff --git a/tests/auto/blackbox/testdata/dynamicLibs/lib3.cpp b/tests/auto/api/testdata/dynamic-libs/lib3.cpp
index e8df9d65c..e8df9d65c 100644
--- a/tests/auto/blackbox/testdata/dynamicLibs/lib3.cpp
+++ b/tests/auto/api/testdata/dynamic-libs/lib3.cpp
diff --git a/tests/auto/blackbox/testdata/dynamicLibs/lib4.cpp b/tests/auto/api/testdata/dynamic-libs/lib4.cpp
index c0ead4721..c0ead4721 100644
--- a/tests/auto/blackbox/testdata/dynamicLibs/lib4.cpp
+++ b/tests/auto/api/testdata/dynamic-libs/lib4.cpp
diff --git a/tests/auto/blackbox/testdata/dynamicLibs/lib4.h b/tests/auto/api/testdata/dynamic-libs/lib4.h
index 689e8d146..689e8d146 100644
--- a/tests/auto/blackbox/testdata/dynamicLibs/lib4.h
+++ b/tests/auto/api/testdata/dynamic-libs/lib4.h
diff --git a/tests/auto/blackbox/testdata/dynamicLibs/link_dynamiclib.qbs b/tests/auto/api/testdata/dynamic-libs/link_dynamiclib.qbs
index 53cebc4a9..0235234e2 100644
--- a/tests/auto/blackbox/testdata/dynamicLibs/link_dynamiclib.qbs
+++ b/tests/auto/api/testdata/dynamic-libs/link_dynamiclib.qbs
@@ -20,6 +20,7 @@ Project {
}
Depends { name: "cpp" }
Depends { name: "lib2" }
+ bundle.isBundle: false
}
DynamicLibrary {
@@ -31,6 +32,7 @@ Project {
}
Depends { name: "cpp" }
Depends { name: "lib3" }
+ bundle.isBundle: false
}
DynamicLibrary {
@@ -41,6 +43,7 @@ Project {
files : [ "lib3.cpp" ]
}
Depends { name: "cpp" }
+ bundle.isBundle: false
}
DynamicLibrary {
@@ -52,6 +55,7 @@ Project {
files : [ "lib4.h", "lib4.cpp" ]
}
Depends { name: "cpp" }
+ bundle.isBundle: false
Export {
Depends { name: "cpp" }
diff --git a/tests/auto/blackbox/testdata/dynamicLibs/main.cpp b/tests/auto/api/testdata/dynamic-libs/main.cpp
index 32a310b8c..32a310b8c 100644
--- a/tests/auto/blackbox/testdata/dynamicLibs/main.cpp
+++ b/tests/auto/api/testdata/dynamic-libs/main.cpp
diff --git a/tests/auto/blackbox/testdata/empty-filetag-list/dontcompilethis.cpp b/tests/auto/api/testdata/empty-filetag-list/dontcompilethis.cpp
index bac3b631d..bac3b631d 100644
--- a/tests/auto/blackbox/testdata/empty-filetag-list/dontcompilethis.cpp
+++ b/tests/auto/api/testdata/empty-filetag-list/dontcompilethis.cpp
diff --git a/tests/auto/blackbox/testdata/empty-filetag-list/project.qbs b/tests/auto/api/testdata/empty-filetag-list/project.qbs
index 294616124..294616124 100644
--- a/tests/auto/blackbox/testdata/empty-filetag-list/project.qbs
+++ b/tests/auto/api/testdata/empty-filetag-list/project.qbs
diff --git a/tests/auto/blackbox/testdata/empty-submodules-list/project.qbs b/tests/auto/api/testdata/empty-submodules-list/project.qbs
index 88b5e3177..88b5e3177 100644
--- a/tests/auto/blackbox/testdata/empty-submodules-list/project.qbs
+++ b/tests/auto/api/testdata/empty-submodules-list/project.qbs
diff --git a/tests/auto/blackbox/testdata/enable-and-disable-product/main.cpp b/tests/auto/api/testdata/enable-and-disable-product/main.cpp
index 237c8ce18..237c8ce18 100644
--- a/tests/auto/blackbox/testdata/enable-and-disable-product/main.cpp
+++ b/tests/auto/api/testdata/enable-and-disable-product/main.cpp
diff --git a/tests/auto/blackbox/testdata/enable-and-disable-product/project.qbs b/tests/auto/api/testdata/enable-and-disable-product/project.qbs
index 4afa1e25e..4afa1e25e 100644
--- a/tests/auto/blackbox/testdata/enable-and-disable-product/project.qbs
+++ b/tests/auto/api/testdata/enable-and-disable-product/project.qbs
diff --git a/tests/auto/blackbox/testdata/explicitlyDependsOn/dependency.txt b/tests/auto/api/testdata/explicitly-depends-on/dependency.txt
index e69de29bb..e69de29bb 100644
--- a/tests/auto/blackbox/testdata/explicitlyDependsOn/dependency.txt
+++ b/tests/auto/api/testdata/explicitly-depends-on/dependency.txt
diff --git a/tests/auto/blackbox/testdata/explicitlyDependsOn/project.qbs b/tests/auto/api/testdata/explicitly-depends-on/project.qbs
index 3db802717..3db802717 100644
--- a/tests/auto/blackbox/testdata/explicitlyDependsOn/project.qbs
+++ b/tests/auto/api/testdata/explicitly-depends-on/project.qbs
diff --git a/tests/auto/blackbox/testdata/exportSimple/lib1.cpp b/tests/auto/api/testdata/export-simple/lib1.cpp
index f9fddadf8..f9fddadf8 100644
--- a/tests/auto/blackbox/testdata/exportSimple/lib1.cpp
+++ b/tests/auto/api/testdata/export-simple/lib1.cpp
diff --git a/tests/auto/blackbox/testdata/exportSimple/main.cpp b/tests/auto/api/testdata/export-simple/main.cpp
index 2dd943472..2dd943472 100644
--- a/tests/auto/blackbox/testdata/exportSimple/main.cpp
+++ b/tests/auto/api/testdata/export-simple/main.cpp
diff --git a/tests/auto/blackbox/testdata/exportSimple/project.qbs b/tests/auto/api/testdata/export-simple/project.qbs
index 96244671a..6eca71e89 100644
--- a/tests/auto/blackbox/testdata/exportSimple/project.qbs
+++ b/tests/auto/api/testdata/export-simple/project.qbs
@@ -44,6 +44,7 @@ Project {
files : [ "lib1.cpp" ]
}
Depends { name: "cpp" }
+ bundle.isBundle: false
}
}
diff --git a/tests/auto/blackbox/testdata/exportWithRecursiveDepends/main1.cpp b/tests/auto/api/testdata/export-with-recursive-depends/main1.cpp
index 237c8ce18..237c8ce18 100644
--- a/tests/auto/blackbox/testdata/exportWithRecursiveDepends/main1.cpp
+++ b/tests/auto/api/testdata/export-with-recursive-depends/main1.cpp
diff --git a/tests/auto/blackbox/testdata/exportWithRecursiveDepends/main2.cpp b/tests/auto/api/testdata/export-with-recursive-depends/main2.cpp
index c7f2e65ab..c7f2e65ab 100644
--- a/tests/auto/blackbox/testdata/exportWithRecursiveDepends/main2.cpp
+++ b/tests/auto/api/testdata/export-with-recursive-depends/main2.cpp
diff --git a/tests/auto/blackbox/testdata/exportWithRecursiveDepends/modules/module1/module1.qbs b/tests/auto/api/testdata/export-with-recursive-depends/modules/module1/module1.qbs
index c1c4ad358..c1c4ad358 100644
--- a/tests/auto/blackbox/testdata/exportWithRecursiveDepends/modules/module1/module1.qbs
+++ b/tests/auto/api/testdata/export-with-recursive-depends/modules/module1/module1.qbs
diff --git a/tests/auto/blackbox/testdata/exportWithRecursiveDepends/modules/module2/module2.qbs b/tests/auto/api/testdata/export-with-recursive-depends/modules/module2/module2.qbs
index 75a274631..75a274631 100644
--- a/tests/auto/blackbox/testdata/exportWithRecursiveDepends/modules/module2/module2.qbs
+++ b/tests/auto/api/testdata/export-with-recursive-depends/modules/module2/module2.qbs
diff --git a/tests/auto/blackbox/testdata/exportWithRecursiveDepends/project.qbs b/tests/auto/api/testdata/export-with-recursive-depends/project.qbs
index d5f5f79e5..d5f5f79e5 100644
--- a/tests/auto/blackbox/testdata/exportWithRecursiveDepends/project.qbs
+++ b/tests/auto/api/testdata/export-with-recursive-depends/project.qbs
diff --git a/tests/auto/blackbox/testdata/fileTagger/bla.txt b/tests/auto/api/testdata/file-tagger/bla.txt
index 26185684a..26185684a 100644
--- a/tests/auto/blackbox/testdata/fileTagger/bla.txt
+++ b/tests/auto/api/testdata/file-tagger/bla.txt
diff --git a/tests/auto/blackbox/testdata/fileTagger/moc_cpp.qbs b/tests/auto/api/testdata/file-tagger/moc_cpp.qbs
index ce7970f20..fd07730dc 100644
--- a/tests/auto/blackbox/testdata/fileTagger/moc_cpp.qbs
+++ b/tests/auto/api/testdata/file-tagger/moc_cpp.qbs
@@ -5,6 +5,7 @@ import qbs.FileInfo
Project {
Product {
type: "application"
+ consoleApplication: true
name: "moc_cpp"
Depends {
diff --git a/tests/auto/api/testdata/filetagsfilter_override/InstalledApp.qbs b/tests/auto/api/testdata/filetagsfilter_override/InstalledApp.qbs
index 0aabaf063..633410c3c 100644
--- a/tests/auto/api/testdata/filetagsfilter_override/InstalledApp.qbs
+++ b/tests/auto/api/testdata/filetagsfilter_override/InstalledApp.qbs
@@ -2,6 +2,7 @@ import qbs
CppApplication {
type: "application"
+ consoleApplication: true
Group {
fileTagsFilter: product.type
qbs.install: true
diff --git a/tests/auto/api/testdata/infinite-loop-process/infinite-loop.qbs b/tests/auto/api/testdata/infinite-loop-process/infinite-loop.qbs
index 540ce030a..d441f58a5 100644
--- a/tests/auto/api/testdata/infinite-loop-process/infinite-loop.qbs
+++ b/tests/auto/api/testdata/infinite-loop-process/infinite-loop.qbs
@@ -2,7 +2,8 @@ import qbs
Project {
QtApplication {
- type: "application" // suppress bundle generation
+ type: "application"
+ consoleApplication: true // suppress bundle generation
files: "main.cpp"
name: "infinite-loop"
}
@@ -12,7 +13,7 @@ Project {
name: "caller"
Depends { name: "infinite-loop" }
Rule {
- usings: "application"
+ inputsFromDependencies: "application"
Artifact {
filePath: "dummy"
fileTags: "mytype"
diff --git a/tests/auto/blackbox/testdata/inheritQbsSearchPaths/imports/Foo.qbs b/tests/auto/api/testdata/inherit-qbs-search-paths/imports/Foo.qbs
index f6c1733b5..9493b04b5 100644
--- a/tests/auto/blackbox/testdata/inheritQbsSearchPaths/imports/Foo.qbs
+++ b/tests/auto/api/testdata/inherit-qbs-search-paths/imports/Foo.qbs
@@ -2,6 +2,7 @@ import qbs 1.0
Product {
type: "application"
+ consoleApplication: true
Depends { name: 'bli' }
}
diff --git a/tests/auto/blackbox/testdata/inheritQbsSearchPaths/main.cpp b/tests/auto/api/testdata/inherit-qbs-search-paths/main.cpp
index 7382cd2dd..7382cd2dd 100644
--- a/tests/auto/blackbox/testdata/inheritQbsSearchPaths/main.cpp
+++ b/tests/auto/api/testdata/inherit-qbs-search-paths/main.cpp
diff --git a/tests/auto/blackbox/testdata/inheritQbsSearchPaths/prj.qbs b/tests/auto/api/testdata/inherit-qbs-search-paths/prj.qbs
index ba8284f4f..ba8284f4f 100644
--- a/tests/auto/blackbox/testdata/inheritQbsSearchPaths/prj.qbs
+++ b/tests/auto/api/testdata/inherit-qbs-search-paths/prj.qbs
diff --git a/tests/auto/blackbox/testdata/inheritQbsSearchPaths/subdir/modules/bli/m.qbs b/tests/auto/api/testdata/inherit-qbs-search-paths/subdir/modules/bli/m.qbs
index b4b93678a..b4b93678a 100644
--- a/tests/auto/blackbox/testdata/inheritQbsSearchPaths/subdir/modules/bli/m.qbs
+++ b/tests/auto/api/testdata/inherit-qbs-search-paths/subdir/modules/bli/m.qbs
diff --git a/tests/auto/api/testdata/installed-artifact/installed_artifact.qbs b/tests/auto/api/testdata/installed-artifact/installed_artifact.qbs
new file mode 100644
index 000000000..d1f9f54ea
--- /dev/null
+++ b/tests/auto/api/testdata/installed-artifact/installed_artifact.qbs
@@ -0,0 +1,19 @@
+import qbs 1.0
+
+Application {
+ name: "installedApp"
+ type: "application"
+ consoleApplication: true
+ Depends { name: "cpp" }
+ Group {
+ files: "main.cpp"
+ qbs.install: true
+ qbs.installDir: "src"
+ }
+ qbs.installPrefix: "/usr"
+ Group {
+ fileTagsFilter: "application"
+ qbs.install: true
+ qbs.installDir: "bin"
+ }
+}
diff --git a/tests/auto/blackbox/testdata/type-change/main.cpp b/tests/auto/api/testdata/installed-artifact/main.cpp
index 237c8ce18..237c8ce18 100644
--- a/tests/auto/blackbox/testdata/type-change/main.cpp
+++ b/tests/auto/api/testdata/installed-artifact/main.cpp
diff --git a/tests/auto/api/testdata/is-runnable/project.qbs b/tests/auto/api/testdata/is-runnable/project.qbs
index 02200fff2..47e217a6a 100644
--- a/tests/auto/api/testdata/is-runnable/project.qbs
+++ b/tests/auto/api/testdata/is-runnable/project.qbs
@@ -6,5 +6,6 @@ Project {
}
DynamicLibrary {
name: "lib"
+ bundle.isBundle: false
}
}
diff --git a/tests/auto/blackbox/testdata/lib_samesource/main.cpp b/tests/auto/api/testdata/lib-same-source/main.cpp
index 7c18babaf..7c18babaf 100644
--- a/tests/auto/blackbox/testdata/lib_samesource/main.cpp
+++ b/tests/auto/api/testdata/lib-same-source/main.cpp
diff --git a/tests/auto/blackbox/testdata/lib_samesource/lib.qbs b/tests/auto/api/testdata/lib-same-source/project.qbs
index 063684b40..dc5785e98 100644
--- a/tests/auto/blackbox/testdata/lib_samesource/lib.qbs
+++ b/tests/auto/api/testdata/lib-same-source/project.qbs
@@ -3,6 +3,7 @@ import qbs 1.0
Project {
Product {
type: "application"
+ consoleApplication: true
name : "HelloWorldApp"
Depends { name: 'cpp' }
Group {
diff --git a/tests/auto/blackbox/testdata/link_staticlib/helper1/helper1.cpp b/tests/auto/api/testdata/link-static-lib/helper1/helper1.cpp
index 7d9f96285..7d9f96285 100644
--- a/tests/auto/blackbox/testdata/link_staticlib/helper1/helper1.cpp
+++ b/tests/auto/api/testdata/link-static-lib/helper1/helper1.cpp
diff --git a/tests/auto/blackbox/testdata/link_staticlib/helper1/helper1.h b/tests/auto/api/testdata/link-static-lib/helper1/helper1.h
index 8a69abe68..8a69abe68 100644
--- a/tests/auto/blackbox/testdata/link_staticlib/helper1/helper1.h
+++ b/tests/auto/api/testdata/link-static-lib/helper1/helper1.h
diff --git a/tests/auto/blackbox/testdata/link_staticlib/helper2/helper2.cpp b/tests/auto/api/testdata/link-static-lib/helper2/helper2.cpp
index 7bf3cb7eb..7bf3cb7eb 100644
--- a/tests/auto/blackbox/testdata/link_staticlib/helper2/helper2.cpp
+++ b/tests/auto/api/testdata/link-static-lib/helper2/helper2.cpp
diff --git a/tests/auto/blackbox/testdata/link_staticlib/helper2/helper2.h b/tests/auto/api/testdata/link-static-lib/helper2/helper2.h
index 870c3ea1f..870c3ea1f 100644
--- a/tests/auto/blackbox/testdata/link_staticlib/helper2/helper2.h
+++ b/tests/auto/api/testdata/link-static-lib/helper2/helper2.h
diff --git a/tests/auto/blackbox/testdata/link_staticlib/main.cpp b/tests/auto/api/testdata/link-static-lib/main.cpp
index a6c5ba211..a6c5ba211 100644
--- a/tests/auto/blackbox/testdata/link_staticlib/main.cpp
+++ b/tests/auto/api/testdata/link-static-lib/main.cpp
diff --git a/tests/auto/blackbox/testdata/link_staticlib/mystaticlib.cpp b/tests/auto/api/testdata/link-static-lib/mystaticlib.cpp
index 82610656b..82610656b 100644
--- a/tests/auto/blackbox/testdata/link_staticlib/mystaticlib.cpp
+++ b/tests/auto/api/testdata/link-static-lib/mystaticlib.cpp
diff --git a/tests/auto/blackbox/testdata/link_staticlib/mystaticlibhelper.cpp b/tests/auto/api/testdata/link-static-lib/mystaticlibhelper.cpp
index 76a6a38e9..76a6a38e9 100644
--- a/tests/auto/blackbox/testdata/link_staticlib/mystaticlibhelper.cpp
+++ b/tests/auto/api/testdata/link-static-lib/mystaticlibhelper.cpp
diff --git a/tests/auto/blackbox/testdata/link_staticlib/link_staticlib.qbs b/tests/auto/api/testdata/link-static-lib/project.qbs
index be12e01aa..2ae327caa 100644
--- a/tests/auto/blackbox/testdata/link_staticlib/link_staticlib.qbs
+++ b/tests/auto/api/testdata/link-static-lib/project.qbs
@@ -3,6 +3,7 @@ import qbs 1.0
Project {
Product {
type: "application"
+ consoleApplication: true
name: "HelloWorld"
files : [ "main.cpp" ]
Depends { name: "cpp" }
diff --git a/tests/auto/blackbox/testdata/lotsofdots/dotty.matrix.ui b/tests/auto/api/testdata/lots-of-dots/dotty.matrix.ui
index 4b7d6a45f..4b7d6a45f 100644
--- a/tests/auto/blackbox/testdata/lotsofdots/dotty.matrix.ui
+++ b/tests/auto/api/testdata/lots-of-dots/dotty.matrix.ui
diff --git a/tests/auto/blackbox/testdata/lotsofdots/m.a.i.n.cpp b/tests/auto/api/testdata/lots-of-dots/m.a.i.n.cpp
index 4975bc680..4975bc680 100644
--- a/tests/auto/blackbox/testdata/lotsofdots/m.a.i.n.cpp
+++ b/tests/auto/api/testdata/lots-of-dots/m.a.i.n.cpp
diff --git a/tests/auto/blackbox/testdata/lotsofdots/object.narf.cpp b/tests/auto/api/testdata/lots-of-dots/object.narf.cpp
index a8761e53b..a8761e53b 100644
--- a/tests/auto/blackbox/testdata/lotsofdots/object.narf.cpp
+++ b/tests/auto/api/testdata/lots-of-dots/object.narf.cpp
diff --git a/tests/auto/blackbox/testdata/lotsofdots/object.narf.h b/tests/auto/api/testdata/lots-of-dots/object.narf.h
index bb1868cc0..bb1868cc0 100644
--- a/tests/auto/blackbox/testdata/lotsofdots/object.narf.h
+++ b/tests/auto/api/testdata/lots-of-dots/object.narf.h
diff --git a/tests/auto/blackbox/testdata/lotsofdots/polka.dots.qrc b/tests/auto/api/testdata/lots-of-dots/polka.dots.qrc
index 815b11002..815b11002 100644
--- a/tests/auto/blackbox/testdata/lotsofdots/polka.dots.qrc
+++ b/tests/auto/api/testdata/lots-of-dots/polka.dots.qrc
diff --git a/tests/auto/blackbox/testdata/lotsofdots/lots.of.dots.qbs b/tests/auto/api/testdata/lots-of-dots/project.qbs
index 9654100fc..5e033bd36 100644
--- a/tests/auto/blackbox/testdata/lotsofdots/lots.of.dots.qbs
+++ b/tests/auto/api/testdata/lots-of-dots/project.qbs
@@ -3,6 +3,7 @@ import qbs 1.0
Project {
QtGuiApplication {
type: "application"
+ consoleApplication: true
name: "lots.of.dots"
files : [
diff --git a/tests/auto/blackbox/testdata/missingqobjectheader/main.cpp b/tests/auto/api/testdata/missing-qobject-header/main.cpp
index 191b3b316..191b3b316 100644
--- a/tests/auto/blackbox/testdata/missingqobjectheader/main.cpp
+++ b/tests/auto/api/testdata/missing-qobject-header/main.cpp
diff --git a/tests/auto/blackbox/testdata/missingqobjectheader/myobject.cpp b/tests/auto/api/testdata/missing-qobject-header/myobject.cpp
index 249e198ad..249e198ad 100644
--- a/tests/auto/blackbox/testdata/missingqobjectheader/myobject.cpp
+++ b/tests/auto/api/testdata/missing-qobject-header/myobject.cpp
diff --git a/tests/auto/blackbox/testdata/missingqobjectheader/myobject.h b/tests/auto/api/testdata/missing-qobject-header/myobject.h
index 46353c30e..46353c30e 100644
--- a/tests/auto/blackbox/testdata/missingqobjectheader/myobject.h
+++ b/tests/auto/api/testdata/missing-qobject-header/myobject.h
diff --git a/tests/auto/blackbox/testdata/moc_cpp/bla.cpp b/tests/auto/api/testdata/moc-cpp/bla.cpp
index 26185684a..26185684a 100644
--- a/tests/auto/blackbox/testdata/moc_cpp/bla.cpp
+++ b/tests/auto/api/testdata/moc-cpp/bla.cpp
diff --git a/tests/auto/blackbox/testdata/moc_cpp/moc_cpp.qbs b/tests/auto/api/testdata/moc-cpp/project.qbs
index 311d7c490..f8ee0736b 100644
--- a/tests/auto/blackbox/testdata/moc_cpp/moc_cpp.qbs
+++ b/tests/auto/api/testdata/moc-cpp/project.qbs
@@ -3,6 +3,7 @@ import qbs 1.0
Project {
Product {
type: "application"
+ consoleApplication: true
name: "moc_cpp"
Depends {
diff --git a/tests/auto/blackbox/testdata/moc_hpp_included/object.cpp b/tests/auto/api/testdata/moc-hpp-included/object.cpp
index ef0b32417..ef0b32417 100644
--- a/tests/auto/blackbox/testdata/moc_hpp_included/object.cpp
+++ b/tests/auto/api/testdata/moc-hpp-included/object.cpp
diff --git a/tests/auto/blackbox/testdata/moc_hpp/object.h b/tests/auto/api/testdata/moc-hpp-included/object.h
index 7d8f59c6c..7d8f59c6c 100644
--- a/tests/auto/blackbox/testdata/moc_hpp/object.h
+++ b/tests/auto/api/testdata/moc-hpp-included/object.h
diff --git a/tests/auto/blackbox/testdata/moc_hpp_included/moc_hpp_included.qbs b/tests/auto/api/testdata/moc-hpp-included/project.qbs
index b144fb672..d78493b2f 100644
--- a/tests/auto/blackbox/testdata/moc_hpp_included/moc_hpp_included.qbs
+++ b/tests/auto/api/testdata/moc-hpp-included/project.qbs
@@ -3,6 +3,7 @@ import qbs 1.0
Project {
Product {
type: "application"
+ consoleApplication: true
name: "moc_hpp_included"
Depends { name: "Qt.core" }
diff --git a/tests/auto/blackbox/testdata/moc_hpp/object.cpp b/tests/auto/api/testdata/moc-hpp/object.cpp
index 8c091c58c..8c091c58c 100644
--- a/tests/auto/blackbox/testdata/moc_hpp/object.cpp
+++ b/tests/auto/api/testdata/moc-hpp/object.cpp
diff --git a/tests/auto/blackbox/testdata/moc_hpp_included/object.h b/tests/auto/api/testdata/moc-hpp/object.h
index 7d8f59c6c..7d8f59c6c 100644
--- a/tests/auto/blackbox/testdata/moc_hpp_included/object.h
+++ b/tests/auto/api/testdata/moc-hpp/object.h
diff --git a/tests/auto/blackbox/testdata/moc_hpp/moc_hpp.qbs b/tests/auto/api/testdata/moc-hpp/project.qbs
index 87ddfc335..54451a509 100644
--- a/tests/auto/blackbox/testdata/moc_hpp/moc_hpp.qbs
+++ b/tests/auto/api/testdata/moc-hpp/project.qbs
@@ -3,6 +3,7 @@ import qbs 1.0
Project {
Product {
type: "application"
+ consoleApplication: true
name: "moc_hpp"
Depends { name: "Qt.core" }
diff --git a/tests/auto/blackbox/testdata/new-output-artifact-in-dependency/lib.cpp b/tests/auto/api/testdata/new-output-artifact-in-dependency/lib.cpp
index 7fd25b792..7fd25b792 100644
--- a/tests/auto/blackbox/testdata/new-output-artifact-in-dependency/lib.cpp
+++ b/tests/auto/api/testdata/new-output-artifact-in-dependency/lib.cpp
diff --git a/tests/auto/blackbox/testdata/new-output-artifact-in-dependency/main.cpp b/tests/auto/api/testdata/new-output-artifact-in-dependency/main.cpp
index b44adf42f..b44adf42f 100644
--- a/tests/auto/blackbox/testdata/new-output-artifact-in-dependency/main.cpp
+++ b/tests/auto/api/testdata/new-output-artifact-in-dependency/main.cpp
diff --git a/tests/auto/blackbox/testdata/new-output-artifact-in-dependency/project.qbs b/tests/auto/api/testdata/new-output-artifact-in-dependency/project.qbs
index 2fc85e9a9..ed08e8315 100644
--- a/tests/auto/blackbox/testdata/new-output-artifact-in-dependency/project.qbs
+++ b/tests/auto/api/testdata/new-output-artifact-in-dependency/project.qbs
@@ -6,6 +6,7 @@ Project {
//Depends { name: "Qt.core" }
name: "lib"
files: "lib.cpp"
+ bundle.isBundle: false
}
CppApplication {
diff --git a/tests/auto/blackbox/testdata/new-pattern-match/project.qbs b/tests/auto/api/testdata/new-pattern-match/project.qbs
index 18975da75..18975da75 100644
--- a/tests/auto/blackbox/testdata/new-pattern-match/project.qbs
+++ b/tests/auto/api/testdata/new-pattern-match/project.qbs
diff --git a/tests/auto/blackbox/testdata/objc/main.mm b/tests/auto/api/testdata/objc/main.mm
index 49b4f3915..49b4f3915 100644
--- a/tests/auto/blackbox/testdata/objc/main.mm
+++ b/tests/auto/api/testdata/objc/main.mm
diff --git a/tests/auto/blackbox/testdata/objc/objc.qbs b/tests/auto/api/testdata/objc/objc.qbs
index c069c5032..c069c5032 100644
--- a/tests/auto/blackbox/testdata/objc/objc.qbs
+++ b/tests/auto/api/testdata/objc/objc.qbs
diff --git a/tests/auto/blackbox/testdata/precompiledHeader/main.cpp b/tests/auto/api/testdata/precompiled-header/main.cpp
index 400762bc6..400762bc6 100644
--- a/tests/auto/blackbox/testdata/precompiledHeader/main.cpp
+++ b/tests/auto/api/testdata/precompiled-header/main.cpp
diff --git a/tests/auto/blackbox/testdata/precompiledHeader/myobject.cpp b/tests/auto/api/testdata/precompiled-header/myobject.cpp
index 9f3f93740..9f3f93740 100644
--- a/tests/auto/blackbox/testdata/precompiledHeader/myobject.cpp
+++ b/tests/auto/api/testdata/precompiled-header/myobject.cpp
diff --git a/tests/auto/blackbox/testdata/precompiledHeader/myobject.h b/tests/auto/api/testdata/precompiled-header/myobject.h
index 376f0da66..376f0da66 100644
--- a/tests/auto/blackbox/testdata/precompiledHeader/myobject.h
+++ b/tests/auto/api/testdata/precompiled-header/myobject.h
diff --git a/tests/auto/blackbox/testdata/precompiledHeader/precompiledHeader.qbs b/tests/auto/api/testdata/precompiled-header/project.qbs
index de65b9330..5f7b4b616 100644
--- a/tests/auto/blackbox/testdata/precompiledHeader/precompiledHeader.qbs
+++ b/tests/auto/api/testdata/precompiled-header/project.qbs
@@ -2,6 +2,7 @@ import qbs 1.0
Product {
type: "application"
+ consoleApplication: true
name: "MyApp"
files: ["stable.h",
"myobject.h",
diff --git a/tests/auto/blackbox/testdata/precompiledHeader/stable.h b/tests/auto/api/testdata/precompiled-header/stable.h
index 93ce3cb29..93ce3cb29 100644
--- a/tests/auto/blackbox/testdata/precompiledHeader/stable.h
+++ b/tests/auto/api/testdata/precompiled-header/stable.h
diff --git a/tests/auto/blackbox/testdata/simpleProbe/main.cpp b/tests/auto/api/testdata/productNameWithDots/app.cpp
index 76e819701..76e819701 100644
--- a/tests/auto/blackbox/testdata/simpleProbe/main.cpp
+++ b/tests/auto/api/testdata/productNameWithDots/app.cpp
diff --git a/tests/auto/api/testdata/productNameWithDots/lib.cpp b/tests/auto/api/testdata/productNameWithDots/lib.cpp
new file mode 100644
index 000000000..85e6cd8c3
--- /dev/null
+++ b/tests/auto/api/testdata/productNameWithDots/lib.cpp
@@ -0,0 +1 @@
+void foo() {}
diff --git a/tests/auto/api/testdata/productNameWithDots/project.qbs b/tests/auto/api/testdata/productNameWithDots/project.qbs
new file mode 100644
index 000000000..f0cf5813c
--- /dev/null
+++ b/tests/auto/api/testdata/productNameWithDots/project.qbs
@@ -0,0 +1,17 @@
+import qbs
+Project {
+ Product {
+ Depends { name: "cpp" }
+ Depends { name: "bundle" }
+ type: ["application"]
+ name: "myapp"
+ Depends { name: "foo.bar.bla" }
+ files: ["app.cpp"]
+ bundle.isBundle: false
+ }
+ StaticLibrary {
+ Depends { name: "cpp" }
+ name: "foo.bar.bla"
+ files: ["lib.cpp"]
+ }
+}
diff --git a/tests/auto/blackbox/testdata/project-with-properties-item/project.qbs b/tests/auto/api/testdata/project-with-properties-item/project.qbs
index d59a26a94..d59a26a94 100644
--- a/tests/auto/blackbox/testdata/project-with-properties-item/project.qbs
+++ b/tests/auto/api/testdata/project-with-properties-item/project.qbs
diff --git a/tests/auto/blackbox/testdata/propertiesBlocks/main.cpp b/tests/auto/api/testdata/properties-blocks/main.cpp
index 18cc6563b..18cc6563b 100644
--- a/tests/auto/blackbox/testdata/propertiesBlocks/main.cpp
+++ b/tests/auto/api/testdata/properties-blocks/main.cpp
diff --git a/tests/auto/blackbox/testdata/propertiesBlocks/propertiesblocks.qbs b/tests/auto/api/testdata/properties-blocks/propertiesblocks.qbs
index 5fe02a103..1b4c3680a 100644
--- a/tests/auto/blackbox/testdata/propertiesBlocks/propertiesblocks.qbs
+++ b/tests/auto/api/testdata/properties-blocks/propertiesblocks.qbs
@@ -6,6 +6,7 @@ Product {
Properties {
condition: true
type: 'application'
+ consoleApplication: true
name: 'HelloWorld'
}
diff --git a/tests/auto/blackbox/testdata/qt5plugin/echointerface.h b/tests/auto/api/testdata/qt5-plugin/echointerface.h
index 228a911e6..228a911e6 100644
--- a/tests/auto/blackbox/testdata/qt5plugin/echointerface.h
+++ b/tests/auto/api/testdata/qt5-plugin/echointerface.h
diff --git a/tests/auto/blackbox/testdata/qt5plugin/echoplugin.cpp b/tests/auto/api/testdata/qt5-plugin/echoplugin.cpp
index b6747a82b..b6747a82b 100644
--- a/tests/auto/blackbox/testdata/qt5plugin/echoplugin.cpp
+++ b/tests/auto/api/testdata/qt5-plugin/echoplugin.cpp
diff --git a/tests/auto/blackbox/testdata/qt5plugin/echoplugin.h b/tests/auto/api/testdata/qt5-plugin/echoplugin.h
index 9f8d71c5c..9f8d71c5c 100644
--- a/tests/auto/blackbox/testdata/qt5plugin/echoplugin.h
+++ b/tests/auto/api/testdata/qt5-plugin/echoplugin.h
diff --git a/tests/auto/blackbox/testdata/qt5plugin/echoplugin.json.source b/tests/auto/api/testdata/qt5-plugin/echoplugin.json.source
index 0967ef424..0967ef424 100644
--- a/tests/auto/blackbox/testdata/qt5plugin/echoplugin.json.source
+++ b/tests/auto/api/testdata/qt5-plugin/echoplugin.json.source
diff --git a/tests/auto/blackbox/testdata/qt5plugin/echoplugin_dummy.cpp b/tests/auto/api/testdata/qt5-plugin/echoplugin_dummy.cpp
index baa060d28..baa060d28 100644
--- a/tests/auto/blackbox/testdata/qt5plugin/echoplugin_dummy.cpp
+++ b/tests/auto/api/testdata/qt5-plugin/echoplugin_dummy.cpp
diff --git a/tests/auto/blackbox/testdata/qt5plugin/plugin.qbs b/tests/auto/api/testdata/qt5-plugin/project.qbs
index 2944198f3..3e0dd1c6a 100644
--- a/tests/auto/blackbox/testdata/qt5plugin/plugin.qbs
+++ b/tests/auto/api/testdata/qt5-plugin/project.qbs
@@ -7,6 +7,7 @@ DynamicLibrary {
Depends { name: "Qt.core" }
Depends { name: "cpp" }
+ bundle.isBundle: false
Group {
condition: Qt.core.versionMajor >= 5
diff --git a/tests/auto/blackbox/testdata/rc/main.cpp b/tests/auto/api/testdata/rc/main.cpp
index 5d10372bc..5d10372bc 100644
--- a/tests/auto/blackbox/testdata/rc/main.cpp
+++ b/tests/auto/api/testdata/rc/main.cpp
diff --git a/tests/auto/blackbox/testdata/rc/rc.qbs b/tests/auto/api/testdata/rc/rc.qbs
index 75502cf88..418ac2744 100644
--- a/tests/auto/blackbox/testdata/rc/rc.qbs
+++ b/tests/auto/api/testdata/rc/rc.qbs
@@ -2,6 +2,7 @@ import qbs 1.0
Application {
type: "application"
+ consoleApplication: true
name: "rc"
Depends { name: 'cpp' }
diff --git a/tests/auto/blackbox/testdata/rc/test.rc b/tests/auto/api/testdata/rc/test.rc
index a8e5fd39b..a8e5fd39b 100644
--- a/tests/auto/blackbox/testdata/rc/test.rc
+++ b/tests/auto/api/testdata/rc/test.rc
diff --git a/tests/auto/api/testdata/recursive-wildcards/dir/file1.txt b/tests/auto/api/testdata/recursive-wildcards/dir/file1.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/auto/api/testdata/recursive-wildcards/dir/file1.txt
diff --git a/tests/auto/api/testdata/recursive-wildcards/dir/subdir/file2.txt b/tests/auto/api/testdata/recursive-wildcards/dir/subdir/file2.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/auto/api/testdata/recursive-wildcards/dir/subdir/file2.txt
diff --git a/tests/auto/api/testdata/recursive-wildcards/recursive_wildcards.qbs b/tests/auto/api/testdata/recursive-wildcards/recursive_wildcards.qbs
new file mode 100644
index 000000000..a1970e1c4
--- /dev/null
+++ b/tests/auto/api/testdata/recursive-wildcards/recursive_wildcards.qbs
@@ -0,0 +1,7 @@
+Product {
+ Group {
+ files: "dir/**"
+ qbs.install: true
+ qbs.installDir: "dir"
+ }
+}
diff --git a/tests/auto/blackbox/testdata/removeFileDependency/main.cpp b/tests/auto/api/testdata/remove-file-dependency/main.cpp
index 77727cf42..77727cf42 100644
--- a/tests/auto/blackbox/testdata/removeFileDependency/main.cpp
+++ b/tests/auto/api/testdata/remove-file-dependency/main.cpp
diff --git a/tests/auto/blackbox/testdata/removeFileDependency/removeFileDependency.qbs b/tests/auto/api/testdata/remove-file-dependency/removeFileDependency.qbs
index 8ed927761..8ed927761 100644
--- a/tests/auto/blackbox/testdata/removeFileDependency/removeFileDependency.qbs
+++ b/tests/auto/api/testdata/remove-file-dependency/removeFileDependency.qbs
diff --git a/tests/auto/blackbox/testdata/removeFileDependency/someheader.h b/tests/auto/api/testdata/remove-file-dependency/someheader.h
index b895e465c..b895e465c 100644
--- a/tests/auto/blackbox/testdata/removeFileDependency/someheader.h
+++ b/tests/auto/api/testdata/remove-file-dependency/someheader.h
diff --git a/tests/auto/blackbox/testdata/renameProduct/lib.cpp b/tests/auto/api/testdata/rename-product/lib.cpp
index 47ce43bc9..47ce43bc9 100644
--- a/tests/auto/blackbox/testdata/renameProduct/lib.cpp
+++ b/tests/auto/api/testdata/rename-product/lib.cpp
diff --git a/tests/auto/blackbox/testdata/renameProduct/main.cpp b/tests/auto/api/testdata/rename-product/main.cpp
index 6a0bac9f1..6a0bac9f1 100644
--- a/tests/auto/blackbox/testdata/renameProduct/main.cpp
+++ b/tests/auto/api/testdata/rename-product/main.cpp
diff --git a/tests/auto/blackbox/testdata/renameProduct/rename.qbs b/tests/auto/api/testdata/rename-product/rename.qbs
index a2fe2e22f..c7811059a 100644
--- a/tests/auto/blackbox/testdata/renameProduct/rename.qbs
+++ b/tests/auto/api/testdata/rename-product/rename.qbs
@@ -13,5 +13,6 @@ Project {
Depends { name: "Qt.core" }
cpp.defines: "MY_EXPORT=Q_DECL_EXPORT"
files: "lib.cpp"
+ bundle.isBundle: false
}
}
diff --git a/tests/auto/blackbox/testdata/renameTargetArtifact/lib.cpp b/tests/auto/api/testdata/rename-target-artifact/lib.cpp
index 47ce43bc9..47ce43bc9 100644
--- a/tests/auto/blackbox/testdata/renameTargetArtifact/lib.cpp
+++ b/tests/auto/api/testdata/rename-target-artifact/lib.cpp
diff --git a/tests/auto/blackbox/testdata/renameTargetArtifact/main.cpp b/tests/auto/api/testdata/rename-target-artifact/main.cpp
index 6a0bac9f1..6a0bac9f1 100644
--- a/tests/auto/blackbox/testdata/renameTargetArtifact/main.cpp
+++ b/tests/auto/api/testdata/rename-target-artifact/main.cpp
diff --git a/tests/auto/blackbox/testdata/renameTargetArtifact/rename.qbs b/tests/auto/api/testdata/rename-target-artifact/rename.qbs
index 5a8c765e4..e94cc7b45 100644
--- a/tests/auto/blackbox/testdata/renameTargetArtifact/rename.qbs
+++ b/tests/auto/api/testdata/rename-target-artifact/rename.qbs
@@ -14,5 +14,6 @@ Project {
Depends { name: "Qt.core" }
cpp.defines: "MY_EXPORT=Q_DECL_EXPORT"
files: "lib.cpp"
+ bundle.isBundle: false
}
}
diff --git a/tests/auto/blackbox/testdata/sameBaseName/lib.c b/tests/auto/api/testdata/same-base-name/lib.c
index 6055ed681..6055ed681 100644
--- a/tests/auto/blackbox/testdata/sameBaseName/lib.c
+++ b/tests/auto/api/testdata/same-base-name/lib.c
diff --git a/tests/auto/blackbox/testdata/sameBaseName/lib.cpp b/tests/auto/api/testdata/same-base-name/lib.cpp
index 933fa8036..933fa8036 100644
--- a/tests/auto/blackbox/testdata/sameBaseName/lib.cpp
+++ b/tests/auto/api/testdata/same-base-name/lib.cpp
diff --git a/tests/auto/blackbox/testdata/sameBaseName/lib.m b/tests/auto/api/testdata/same-base-name/lib.m
index 17cd2dceb..17cd2dceb 100644
--- a/tests/auto/blackbox/testdata/sameBaseName/lib.m
+++ b/tests/auto/api/testdata/same-base-name/lib.m
diff --git a/tests/auto/blackbox/testdata/sameBaseName/lib.mm b/tests/auto/api/testdata/same-base-name/lib.mm
index ee284b080..ee284b080 100644
--- a/tests/auto/blackbox/testdata/sameBaseName/lib.mm
+++ b/tests/auto/api/testdata/same-base-name/lib.mm
diff --git a/tests/auto/blackbox/testdata/sameBaseName/main.c b/tests/auto/api/testdata/same-base-name/main.c
index 07da20307..07da20307 100644
--- a/tests/auto/blackbox/testdata/sameBaseName/main.c
+++ b/tests/auto/api/testdata/same-base-name/main.c
diff --git a/tests/auto/blackbox/testdata/sameBaseName/sameBaseName.qbs b/tests/auto/api/testdata/same-base-name/project.qbs
index e9b4ba7a6..c6a7a6fa3 100644
--- a/tests/auto/blackbox/testdata/sameBaseName/sameBaseName.qbs
+++ b/tests/auto/api/testdata/same-base-name/project.qbs
@@ -3,6 +3,7 @@ import qbs 1.0
Project {
CppApplication {
type: "application"
+ consoleApplication: true
Depends { name: "basenamelib" }
name: "basename"
files: "main.c"
diff --git a/tests/auto/api/testdata/simple-probe/main.cpp b/tests/auto/api/testdata/simple-probe/main.cpp
new file mode 100644
index 000000000..76e819701
--- /dev/null
+++ b/tests/auto/api/testdata/simple-probe/main.cpp
@@ -0,0 +1 @@
+int main() { return 0; }
diff --git a/tests/auto/blackbox/testdata/simpleProbe/simpleProbe.qbs b/tests/auto/api/testdata/simple-probe/project.qbs
index b409c7cc6..9a869c3de 100644
--- a/tests/auto/blackbox/testdata/simpleProbe/simpleProbe.qbs
+++ b/tests/auto/api/testdata/simple-probe/project.qbs
@@ -26,6 +26,7 @@ CppApplication {
throw "probe1.someString expected to be \"one\"."
return "application"
}
+ consoleApplication: true
files: ["main.cpp"]
}
diff --git a/tests/auto/blackbox/testdata/soft-dependency/main.cpp b/tests/auto/api/testdata/soft-dependency/main.cpp
index 5f3248c7f..5f3248c7f 100644
--- a/tests/auto/blackbox/testdata/soft-dependency/main.cpp
+++ b/tests/auto/api/testdata/soft-dependency/main.cpp
diff --git a/tests/auto/blackbox/testdata/soft-dependency/project.qbs b/tests/auto/api/testdata/soft-dependency/project.qbs
index bbf37fda8..bbf37fda8 100644
--- a/tests/auto/blackbox/testdata/soft-dependency/project.qbs
+++ b/tests/auto/api/testdata/soft-dependency/project.qbs
diff --git a/tests/auto/blackbox/testdata/staticLibDeps/a1.cpp b/tests/auto/api/testdata/static-lib-deps/a1.cpp
index 862d76783..862d76783 100644
--- a/tests/auto/blackbox/testdata/staticLibDeps/a1.cpp
+++ b/tests/auto/api/testdata/static-lib-deps/a1.cpp
diff --git a/tests/auto/blackbox/testdata/staticLibDeps/a2.cpp b/tests/auto/api/testdata/static-lib-deps/a2.cpp
index d1f41731c..d1f41731c 100644
--- a/tests/auto/blackbox/testdata/staticLibDeps/a2.cpp
+++ b/tests/auto/api/testdata/static-lib-deps/a2.cpp
diff --git a/tests/auto/blackbox/testdata/staticLibDeps/b.cpp b/tests/auto/api/testdata/static-lib-deps/b.cpp
index a88cc9d90..a88cc9d90 100644
--- a/tests/auto/blackbox/testdata/staticLibDeps/b.cpp
+++ b/tests/auto/api/testdata/static-lib-deps/b.cpp
diff --git a/tests/auto/blackbox/testdata/staticLibDeps/c.cpp b/tests/auto/api/testdata/static-lib-deps/c.cpp
index 264db582a..264db582a 100644
--- a/tests/auto/blackbox/testdata/staticLibDeps/c.cpp
+++ b/tests/auto/api/testdata/static-lib-deps/c.cpp
diff --git a/tests/auto/blackbox/testdata/staticLibDeps/d.cpp b/tests/auto/api/testdata/static-lib-deps/d.cpp
index a7a2b9f85..a7a2b9f85 100644
--- a/tests/auto/blackbox/testdata/staticLibDeps/d.cpp
+++ b/tests/auto/api/testdata/static-lib-deps/d.cpp
diff --git a/tests/auto/blackbox/testdata/staticLibDeps/e.cpp b/tests/auto/api/testdata/static-lib-deps/e.cpp
index af7d24682..af7d24682 100644
--- a/tests/auto/blackbox/testdata/staticLibDeps/e.cpp
+++ b/tests/auto/api/testdata/static-lib-deps/e.cpp
diff --git a/tests/auto/blackbox/testdata/staticLibDeps/main.cpp b/tests/auto/api/testdata/static-lib-deps/main.cpp
index 3753dd5cb..3753dd5cb 100644
--- a/tests/auto/blackbox/testdata/staticLibDeps/main.cpp
+++ b/tests/auto/api/testdata/static-lib-deps/main.cpp
diff --git a/tests/auto/blackbox/testdata/staticLibDeps/dep.qbs b/tests/auto/api/testdata/static-lib-deps/project.qbs
index f7d4a98b0..2d2022c54 100644
--- a/tests/auto/blackbox/testdata/staticLibDeps/dep.qbs
+++ b/tests/auto/api/testdata/static-lib-deps/project.qbs
@@ -59,6 +59,7 @@ Project {
CppApplication {
name: "staticLibDeps"
type: "application"
+ consoleApplication: true
Depends { name: "e" }
diff --git a/tests/auto/blackbox/testdata/subprojects/resources/imports/LibraryType/type.js b/tests/auto/api/testdata/subprojects/resources/imports/LibraryType/type.js
index cb07f8e5b..cb07f8e5b 100644
--- a/tests/auto/blackbox/testdata/subprojects/resources/imports/LibraryType/type.js
+++ b/tests/auto/api/testdata/subprojects/resources/imports/LibraryType/type.js
diff --git a/tests/auto/blackbox/testdata/subprojects/resources/modules/QtCoreDepender/qtcoredepender.qbs b/tests/auto/api/testdata/subprojects/resources/modules/QtCoreDepender/qtcoredepender.qbs
index 03d649309..03d649309 100644
--- a/tests/auto/blackbox/testdata/subprojects/resources/modules/QtCoreDepender/qtcoredepender.qbs
+++ b/tests/auto/api/testdata/subprojects/resources/modules/QtCoreDepender/qtcoredepender.qbs
diff --git a/tests/auto/blackbox/testdata/subprojects/subproject1/main.cpp b/tests/auto/api/testdata/subprojects/subproject1/main.cpp
index 6a0bac9f1..6a0bac9f1 100644
--- a/tests/auto/blackbox/testdata/subprojects/subproject1/main.cpp
+++ b/tests/auto/api/testdata/subprojects/subproject1/main.cpp
diff --git a/tests/auto/blackbox/testdata/subprojects/subproject2/subproject2.qbs b/tests/auto/api/testdata/subprojects/subproject2/subproject2.qbs
index 183df4dac..183df4dac 100644
--- a/tests/auto/blackbox/testdata/subprojects/subproject2/subproject2.qbs
+++ b/tests/auto/api/testdata/subprojects/subproject2/subproject2.qbs
diff --git a/tests/auto/blackbox/testdata/subprojects/subproject2/subproject3/subproject3.qbs b/tests/auto/api/testdata/subprojects/subproject2/subproject3/subproject3.qbs
index acdf1d7e6..acdf1d7e6 100644
--- a/tests/auto/blackbox/testdata/subprojects/subproject2/subproject3/subproject3.qbs
+++ b/tests/auto/api/testdata/subprojects/subproject2/subproject3/subproject3.qbs
diff --git a/tests/auto/blackbox/testdata/subprojects/subproject2/subproject3/testlib.cpp b/tests/auto/api/testdata/subprojects/subproject2/subproject3/testlib.cpp
index 398034cb3..398034cb3 100644
--- a/tests/auto/blackbox/testdata/subprojects/subproject2/subproject3/testlib.cpp
+++ b/tests/auto/api/testdata/subprojects/subproject2/subproject3/testlib.cpp
diff --git a/tests/auto/blackbox/testdata/subprojects/toplevelproject.qbs b/tests/auto/api/testdata/subprojects/toplevelproject.qbs
index f167ccabc..f167ccabc 100644
--- a/tests/auto/blackbox/testdata/subprojects/toplevelproject.qbs
+++ b/tests/auto/api/testdata/subprojects/toplevelproject.qbs
diff --git a/tests/auto/blackbox/testdata/transformers/main.cpp b/tests/auto/api/testdata/transformers/main.cpp
index 52606e760..52606e760 100644
--- a/tests/auto/blackbox/testdata/transformers/main.cpp
+++ b/tests/auto/api/testdata/transformers/main.cpp
diff --git a/tests/auto/blackbox/testdata/transformers/transformers.qbs b/tests/auto/api/testdata/transformers/transformers.qbs
index a0b1d70b0..b0884ffa6 100644
--- a/tests/auto/blackbox/testdata/transformers/transformers.qbs
+++ b/tests/auto/api/testdata/transformers/transformers.qbs
@@ -8,6 +8,7 @@ Project {
Product {
name: "HelloWorld"
type: "application"
+ consoleApplication: true
files: ["main.cpp"]
Depends { name: "cpp" }
diff --git a/tests/auto/api/testdata/type-change/main.cpp b/tests/auto/api/testdata/type-change/main.cpp
new file mode 100644
index 000000000..237c8ce18
--- /dev/null
+++ b/tests/auto/api/testdata/type-change/main.cpp
@@ -0,0 +1 @@
+int main() {}
diff --git a/tests/auto/blackbox/testdata/type-change/project.qbs b/tests/auto/api/testdata/type-change/project.qbs
index 7661aa305..7661aa305 100644
--- a/tests/auto/blackbox/testdata/type-change/project.qbs
+++ b/tests/auto/api/testdata/type-change/project.qbs
diff --git a/tests/auto/blackbox/testdata/uic/bla.cpp b/tests/auto/api/testdata/uic/bla.cpp
index 062f07e11..062f07e11 100644
--- a/tests/auto/blackbox/testdata/uic/bla.cpp
+++ b/tests/auto/api/testdata/uic/bla.cpp
diff --git a/tests/auto/blackbox/testdata/uic/bla.h b/tests/auto/api/testdata/uic/bla.h
index e138ab0c6..e138ab0c6 100644
--- a/tests/auto/blackbox/testdata/uic/bla.h
+++ b/tests/auto/api/testdata/uic/bla.h
diff --git a/tests/auto/blackbox/testdata/uic/ui.h b/tests/auto/api/testdata/uic/ui.h
index 613d0e2fe..613d0e2fe 100644
--- a/tests/auto/blackbox/testdata/uic/ui.h
+++ b/tests/auto/api/testdata/uic/ui.h
diff --git a/tests/auto/blackbox/testdata/uic/ui.ui b/tests/auto/api/testdata/uic/ui.ui
index b07f62d05..b07f62d05 100644
--- a/tests/auto/blackbox/testdata/uic/ui.ui
+++ b/tests/auto/api/testdata/uic/ui.ui
diff --git a/tests/auto/blackbox/testdata/uic/uic.qbs b/tests/auto/api/testdata/uic/uic.qbs
index a216b86a9..301cdad44 100644
--- a/tests/auto/blackbox/testdata/uic/uic.qbs
+++ b/tests/auto/api/testdata/uic/uic.qbs
@@ -3,6 +3,7 @@ import qbs 1.0
Project {
QtGuiApplication {
type: "application"
+ consoleApplication: true
name: "ui"
files: [
diff --git a/tests/auto/api/tst_api.cpp b/tests/auto/api/tst_api.cpp
index 8f1240715..88e013731 100644
--- a/tests/auto/api/tst_api.cpp
+++ b/tests/auto/api/tst_api.cpp
@@ -32,18 +32,9 @@
#include "../shared.h"
-#include <api/jobs.h>
-#include <api/project.h>
-#include <api/projectdata.h>
-#include <logging/ilogsink.h>
-#include <tools/buildoptions.h>
+#include <qbs.h>
#include <tools/fileinfo.h>
#include <tools/hostosinfo.h>
-#include <tools/installoptions.h>
-#include <tools/preferences.h>
-#include <tools/profile.h>
-#include <tools/settings.h>
-#include <tools/setupprojectparameters.h>
#include <QCoreApplication>
#include <QDir>
@@ -55,12 +46,20 @@
#include <QTest>
#include <QTimer>
+#define VERIFY_NO_ERROR(errorInfo) \
+ QVERIFY2(!errorInfo.hasError(), qPrintable(errorInfo.toString()))
+
class LogSink: public qbs::ILogSink
{
+public:
+ QString output;
+
void doPrintWarning(const qbs::ErrorInfo &error) {
qDebug("%s", qPrintable(error.toString()));
}
- void doPrintMessage(qbs::LoggerLevel, const QString &, const QString &) { }
+ void doPrintMessage(qbs::LoggerLevel, const QString &message, const QString &) {
+ output += message;
+ }
};
class BuildDescriptionReceiver : public QObject
@@ -75,24 +74,37 @@ private slots:
}
};
-TestApi::TestApi()
- : m_logSink(new LogSink)
- , m_sourceDataDir(QDir::cleanPath(SRCDIR "/testdata"))
- , m_workingDataDir(QCoreApplication::applicationDirPath() + "/../tests/auto/api/testWorkDir")
+class ProcessResultReceiver : public QObject
{
-}
+ Q_OBJECT
+public:
+ QString output;
-TestApi::~TestApi()
+private slots:
+ void handleProcessResult(const qbs::ProcessResult &result) {
+ output += result.stdErr().join(QLatin1String("\n"));
+ output += result.stdOut().join(QLatin1String("\n"));
+ }
+};
+
+class TaskReceiver : public QObject
{
- delete m_logSink;
-}
+ Q_OBJECT
+public:
+ QString taskDescriptions;
-void TestApi::initTestCase()
+private slots:
+ void handleTaskStart(const QString &task) { taskDescriptions += task; }
+};
+
+
+static void removeBuildDir(const qbs::SetupProjectParameters &params)
{
- QString errorMessage;
- qbs::Internal::removeDirectoryWithContents(m_workingDataDir, &errorMessage);
- QVERIFY2(qbs::Internal::copyFileRecursion(m_sourceDataDir,
- m_workingDataDir, false, &errorMessage), qPrintable(errorMessage));
+ QString message;
+ const QString dir = params.buildRoot() + '/' + params.topLevelProfile()
+ + '-' + params.buildVariant();
+ if (!qbs::Internal::removeDirectoryWithContents(dir, &message))
+ qFatal("Could not remove build dir: %s", qPrintable(message));
}
static bool waitForFinished(qbs::AbstractJob *job, int timeout = 0)
@@ -114,23 +126,116 @@ static bool waitForFinished(qbs::AbstractJob *job, int timeout = 0)
}
-void printProjectData(const qbs::ProjectData &project)
+TestApi::TestApi()
+ : m_logSink(new LogSink)
+ , m_sourceDataDir(QDir::cleanPath(SRCDIR "/testdata"))
+ , m_workingDataDir(testWorkDir(QStringLiteral("api")))
{
- foreach (const qbs::ProductData &p, project.products()) {
- qDebug(" Product '%s' at %s", qPrintable(p.name()), qPrintable(p.location().toString()));
- foreach (const qbs::GroupData &g, p.groups()) {
- qDebug(" Group '%s' at %s", qPrintable(g.name()), qPrintable(g.location().toString()));
- qDebug(" Files: %s", qPrintable(g.filePaths().join(QLatin1String(", "))));
- }
- }
}
+TestApi::~TestApi()
+{
+ delete m_logSink;
+}
+
+void TestApi::initTestCase()
+{
+ QString errorMessage;
+ qbs::Internal::removeDirectoryWithContents(m_workingDataDir, &errorMessage);
+ QVERIFY2(qbs::Internal::copyFileRecursion(m_sourceDataDir,
+ m_workingDataDir, false, &errorMessage), qPrintable(errorMessage));
+}
+
+void TestApi::addQObjectMacroToCppFile()
+{
+ BuildDescriptionReceiver receiver;
+ qbs::ErrorInfo errorInfo = doBuildProject("add-qobject-macro-to-cpp-file/project.qbs", &receiver);
+ VERIFY_NO_ERROR(errorInfo);
+ QVERIFY2(!receiver.descriptions.contains("moc"), qPrintable(receiver.descriptions));
+ receiver.descriptions.clear();
+
+ waitForNewTimestamp();
+ QFile cppFile("object.cpp");
+ QVERIFY2(cppFile.open(QIODevice::ReadWrite), qPrintable(cppFile.errorString()));
+ QByteArray contents = cppFile.readAll();
+ contents.replace("// ", "");
+ cppFile.resize(0);
+ cppFile.write(contents);
+ cppFile.close();
+ errorInfo = doBuildProject("add-qobject-macro-to-cpp-file/project.qbs", &receiver);
+ VERIFY_NO_ERROR(errorInfo);
+ QVERIFY2(receiver.descriptions.contains("moc"), qPrintable(receiver.descriptions));
+}
+
+static bool isAboutUndefinedSymbols(const QString &_message)
+{
+ const QString message = _message.toLower();
+ return message.contains("undefined") || message.contains("unresolved");
+}
+
+void TestApi::addedFilePersistent()
+{
+ // On the initial run, linking will fail.
+ const QString relProjectFilePath = "added-file-persistent/project.qbs";
+ ProcessResultReceiver receiver;
+ qbs::ErrorInfo errorInfo = doBuildProject(relProjectFilePath, 0, &receiver);
+ QVERIFY(errorInfo.hasError());
+ QVERIFY2(isAboutUndefinedSymbols(receiver.output), qPrintable((receiver.output)));
+ receiver.output.clear();
+
+ // Add a file. qbs must schedule it for rule application on the next build.
+ waitForNewTimestamp();
+ const qbs::SetupProjectParameters params = defaultSetupParameters(relProjectFilePath);
+ QFile projectFile(params.projectFilePath());
+ QVERIFY2(projectFile.open(QIODevice::ReadWrite), qPrintable(projectFile.errorString()));
+ const QByteArray originalContent = projectFile.readAll();
+ QByteArray addedFileContent = originalContent;
+ addedFileContent.replace("/* 'file.cpp' */", "'file.cpp'");
+ projectFile.resize(0);
+ projectFile.write(addedFileContent);
+ projectFile.flush();
+ QScopedPointer<qbs::SetupProjectJob> setupJob(qbs::Project().setupProject(params, m_logSink,
+ 0));
+ waitForFinished(setupJob.data());
+ QVERIFY2(!setupJob->error().hasError(), qPrintable(setupJob->error().toString()));
+ setupJob.reset(0);
+
+ // Remove the file again. qbs must unschedule the rule application again.
+ // Consequently, the linking step must fail as in the initial run.
+ waitForNewTimestamp();
+ projectFile.resize(0);
+ projectFile.write(originalContent);
+ projectFile.flush();
+ errorInfo = doBuildProject(relProjectFilePath, 0, &receiver);
+ QVERIFY(errorInfo.hasError());
+ QVERIFY2(isAboutUndefinedSymbols(receiver.output), qPrintable((receiver.output)));
+
+ // Add the file again. qbs must schedule it for rule application on the next build.
+ waitForNewTimestamp();
+ projectFile.resize(0);
+ projectFile.write(addedFileContent);
+ projectFile.close();
+ setupJob.reset(qbs::Project().setupProject(params, m_logSink, 0));
+ waitForFinished(setupJob.data());
+ QVERIFY2(!setupJob->error().hasError(), qPrintable(setupJob->error().toString()));
+ setupJob.reset(0);
+
+ // qbs must remember that a file was scheduled for rule application. The build must then
+ // succeed, as now all necessary symbols are linked in.
+ errorInfo = doBuildProject(relProjectFilePath);
+ VERIFY_NO_ERROR(errorInfo);
+}
+
+void TestApi::baseProperties()
+{
+ const qbs::ErrorInfo errorInfo = doBuildProject("base-properties/prj.qbs");
+ VERIFY_NO_ERROR(errorInfo);
+}
void TestApi::buildGraphLocking()
{
- qbs::SetupProjectParameters setupParams = defaultSetupParameters();
- const QString projectDirPath = QDir::cleanPath(m_workingDataDir + "/buildgraph-locking");
- setupParams.setProjectFilePath(projectDirPath + "/project.qbs");
+ qbs::SetupProjectParameters setupParams
+ = defaultSetupParameters("buildgraph-locking/project.qbs");
QScopedPointer<qbs::SetupProjectJob> setupJob(qbs::Project().setupProject(setupParams,
m_logSink, 0));
waitForFinished(setupJob.data());
@@ -139,19 +244,115 @@ void TestApi::buildGraphLocking()
Q_UNUSED(project);
setupJob.reset(qbs::Project().setupProject(setupParams, m_logSink, 0));
waitForFinished(setupJob.data());
-#if QT_VERSION < QT_VERSION_CHECK(5, 1, 0)
- QEXPECT_FAIL("", "Build graph locking requires Qt >= 5.1", Abort);
-#endif
QVERIFY(setupJob->error().hasError());
QVERIFY2(setupJob->error().toString().contains("lock"),
qPrintable(setupJob->error().toString()));
}
+void TestApi::buildProject()
+{
+ QFETCH(QString, projectSubDir);
+ QFETCH(QString, productFileName);
+ qbs::SetupProjectParameters params = defaultSetupParameters(projectSubDir + "/project.qbs");
+ removeBuildDir(params);
+ qbs::ErrorInfo errorInfo = doBuildProject(projectSubDir + "/project.qbs");
+ VERIFY_NO_ERROR(errorInfo);
+ QVERIFY(regularFileExists(relativeBuildGraphFilePath()));
+ if (!productFileName.isEmpty()) {
+ QVERIFY2(regularFileExists(productFileName), qPrintable(productFileName));
+ QVERIFY2(QFile::remove(productFileName), qPrintable(productFileName));
+ }
+
+ waitForNewTimestamp();
+ qbs::BuildOptions options;
+ options.setForceTimestampCheck(true);
+ errorInfo = doBuildProject(projectSubDir + "/project.qbs", 0, 0, 0, options);
+ VERIFY_NO_ERROR(errorInfo);
+ if (!productFileName.isEmpty())
+ QVERIFY2(regularFileExists(productFileName), qPrintable(productFileName));
+ QVERIFY(regularFileExists(relativeBuildGraphFilePath()));
+}
+
+void TestApi::buildProject_data()
+{
+ QTest::addColumn<QString>("projectSubDir");
+ QTest::addColumn<QString>("productFileName");
+ QTest::newRow("BPs in Sources")
+ << QString("build-properties-source")
+ << relativeExecutableFilePath("HelloWorld");
+ QTest::newRow("code generator")
+ << QString("codegen")
+ << relativeExecutableFilePath("codegen");
+ QTest::newRow("link static libs")
+ << QString("link-static-lib")
+ << relativeExecutableFilePath("HelloWorld");
+ QTest::newRow("precompiled header")
+ << QString("precompiled-header")
+ << relativeExecutableFilePath("MyApp");
+ QTest::newRow("lots of dots")
+ << QString("lots-of-dots")
+ << relativeExecutableFilePath("lots.of.dots");
+ QTest::newRow("Qt5 plugin")
+ << QString("qt5-plugin")
+ << relativeProductBuildDir("echoplugin") + '/'
+ + qbs::Internal::HostOsInfo::dynamicLibraryName("echoplugin");
+ QTest::newRow("Q_OBJECT in source")
+ << QString("moc-cpp")
+ << relativeExecutableFilePath("moc_cpp");
+ QTest::newRow("Q_OBJECT in header")
+ << QString("moc-hpp")
+ << relativeExecutableFilePath("moc_hpp");
+ QTest::newRow("Q_OBJECT in header, moc_XXX.cpp included")
+ << QString("moc-hpp-included")
+ << relativeExecutableFilePath("moc_hpp_included");
+ QTest::newRow("app and lib with same source file")
+ << QString("lib-same-source")
+ << relativeExecutableFilePath("HelloWorldApp");
+ QTest::newRow("source files with the same base name but different extensions")
+ << QString("same-base-name")
+ << relativeExecutableFilePath("basename");
+ QTest::newRow("static library dependencies")
+ << QString("static-lib-deps")
+ << relativeExecutableFilePath("staticLibDeps");
+ QTest::newRow("simple probes")
+ << QString("simple-probe")
+ << relativeExecutableFilePath("MyApp");
+ QTest::newRow("application without sources")
+ << QString("app-without-sources")
+ << relativeExecutableFilePath("appWithoutSources");
+ QTest::newRow("productNameWithDots")
+ << QString("productNameWithDots")
+ << relativeExecutableFilePath("myapp");
+ QTest::newRow("QBS-728")
+ << QString("QBS-728")
+ << QString();
+}
+
+void TestApi::buildProjectDryRun()
+{
+ QFETCH(QString, projectSubDir);
+ QFETCH(QString, productFileName);
+ qbs::SetupProjectParameters params = defaultSetupParameters(projectSubDir + "/project.qbs");
+ removeBuildDir(params);
+ qbs::BuildOptions options;
+ options.setDryRun(true);
+ const qbs::ErrorInfo errorInfo
+ = doBuildProject(projectSubDir + "/project.qbs", 0, 0, 0, options);
+ VERIFY_NO_ERROR(errorInfo);
+ const QStringList &buildDirContents
+ = QDir(relativeBuildDir()).entryList(QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs);
+ QVERIFY2(buildDirContents.isEmpty(), qPrintable(buildDirContents.join(" ")));
+}
+
+void TestApi::buildProjectDryRun_data()
+{
+ return buildProject_data();
+}
+
void TestApi::buildSingleFile()
{
- qbs::SetupProjectParameters setupParams = defaultSetupParameters();
- const QString projectDirPath = QDir::cleanPath(m_workingDataDir + "/build-single-file");
- setupParams.setProjectFilePath(projectDirPath + "/project.qbs");
+ qbs::SetupProjectParameters setupParams
+ = defaultSetupParameters("build-single-file/project.qbs");
QScopedPointer<qbs::SetupProjectJob> setupJob(qbs::Project().setupProject(setupParams,
m_logSink, 0));
waitForFinished(setupJob.data());
@@ -159,7 +360,7 @@ void TestApi::buildSingleFile()
qbs::Project project = setupJob->project();
qbs::BuildOptions options;
options.setDryRun(true);
- options.setFilesToConsider(QStringList(projectDirPath + "/compiled.cpp"));
+ options.setFilesToConsider(QStringList(setupParams.buildRoot() + "/compiled.cpp"));
options.setActiveFileTags(QStringList("obj"));
m_logSink->setLogLevel(qbs::LoggerMaxLevel);
QScopedPointer<qbs::BuildJob> buildJob(project.buildAllProducts(options));
@@ -173,49 +374,6 @@ void TestApi::buildSingleFile()
qPrintable(receiver.descriptions));
}
-void TestApi::commandExtraction()
-{
- qbs::SetupProjectParameters setupParams = defaultSetupParameters();
- const QString projectDirPath = QDir::cleanPath(m_workingDataDir + "/command-extraction");
- setupParams.setProjectFilePath(projectDirPath + "/project.qbs");
- QScopedPointer<qbs::SetupProjectJob> setupJob(qbs::Project().setupProject(setupParams,
- m_logSink, 0));
- waitForFinished(setupJob.data());
- QVERIFY2(!setupJob->error().hasError(), qPrintable(setupJob->error().toString()));
- qbs::Project project = setupJob->project();
- qbs::ProjectData projectData = project.projectData();
- QCOMPARE(projectData.allProducts().count(), 1);
- qbs::ProductData productData = projectData.allProducts().first();
- qbs::ErrorInfo errorInfo;
- const QString sourceFilePath = projectDirPath + "/main.cpp";
-
- // Before the first build, no rules exist.
- qbs::RuleCommandList commands
- = project.ruleCommands(productData, sourceFilePath, "obj", &errorInfo);
- QCOMPARE(commands.count(), 0);
- QVERIFY(errorInfo.hasError());
- QVERIFY2(errorInfo.toString().contains("No rule"), qPrintable(errorInfo.toString()));
-
- qbs::BuildOptions options;
- options.setDryRun(true);
- QScopedPointer<qbs::BuildJob> buildJob(project.buildAllProducts(options));
- waitForFinished(buildJob.data());
- QVERIFY2(!buildJob->error().hasError(), qPrintable(buildJob->error().toString()));
- projectData = project.projectData();
- QCOMPARE(projectData.allProducts().count(), 1);
- productData = projectData.allProducts().first();
- errorInfo = qbs::ErrorInfo();
-
- // After the build, the compile command must be found.
- commands = project.ruleCommands(productData, sourceFilePath, "obj", &errorInfo);
- QCOMPARE(commands.count(), 1);
- QVERIFY2(!errorInfo.hasError(), qPrintable(errorInfo.toString()));
- const qbs::RuleCommand command = commands.first();
- QCOMPARE(command.type(), qbs::RuleCommand::ProcessCommandType);
- QVERIFY(!command.executable().isEmpty());
- QVERIFY(!command.arguments().isEmpty());
-}
-
qbs::GroupData findGroup(const qbs::ProductData &product, const QString &name)
{
foreach (const qbs::GroupData &g, product.groups()) {
@@ -226,12 +384,26 @@ qbs::GroupData findGroup(const qbs::ProductData &product, const QString &name)
}
#ifdef QBS_ENABLE_PROJECT_FILE_UPDATES
+
+static qbs::Project::ProductSelection defaultProducts()
+{
+ return qbs::Project::ProductSelectionDefaultOnly;
+}
+
+static void printProjectData(const qbs::ProjectData &project)
+{
+ foreach (const qbs::ProductData &p, project.products()) {
+ qDebug(" Product '%s' at %s", qPrintable(p.name()), qPrintable(p.location().toString()));
+ foreach (const qbs::GroupData &g, p.groups()) {
+ qDebug(" Group '%s' at %s", qPrintable(g.name()), qPrintable(g.location().toString()));
+ qDebug(" Files: %s", qPrintable(g.filePaths().join(QLatin1String(", "))));
+ }
+ }
+}
+
void TestApi::changeContent()
{
- qbs::SetupProjectParameters setupParams = defaultSetupParameters();
- const QString workingDir = m_workingDataDir + "/project-editing";
- QDir::setCurrent(workingDir);
- setupParams.setProjectFilePath(QDir::cleanPath(workingDir + "/project.qbs"));
+ qbs::SetupProjectParameters setupParams = defaultSetupParameters("project-editing/project.qbs");
QScopedPointer<qbs::SetupProjectJob> job(qbs::Project().setupProject(setupParams,
m_logSink, 0));
waitForFinished(job.data());
@@ -253,10 +425,10 @@ void TestApi::changeContent()
QVERIFY(errorInfo.toString().contains("empty"));
errorInfo = project.addGroup(product, "New Group 1");
- QVERIFY2(!errorInfo.hasError(), qPrintable(errorInfo.toString()));
+ VERIFY_NO_ERROR(errorInfo);
errorInfo = project.addGroup(product, "New Group 2");
- QVERIFY2(!errorInfo.hasError(), qPrintable(errorInfo.toString()));
+ VERIFY_NO_ERROR(errorInfo);
// Error handling: Group already inserted.
errorInfo = project.addGroup(product, "New Group 1");
@@ -277,7 +449,7 @@ void TestApi::changeContent()
qbs::GroupData group = findGroup(product, "New Group 1");
QVERIFY(group.isValid());
errorInfo = project.addFiles(product, group, QStringList() << "file.h" << "file.cpp");
- QVERIFY2(!errorInfo.hasError(), qPrintable(errorInfo.toString()));
+ VERIFY_NO_ERROR(errorInfo);
// Error handling: Add the same file again.
projectData = project.projectData();
@@ -292,7 +464,7 @@ void TestApi::changeContent()
// Remove one of the newly added files again.
errorInfo = project.removeFiles(product, group, QStringList("file.h"));
- QVERIFY2(!errorInfo.hasError(), qPrintable(errorInfo.toString()));
+ VERIFY_NO_ERROR(errorInfo);
// Error handling: Try to remove the same file again.
projectData = project.projectData();
@@ -314,7 +486,7 @@ void TestApi::changeContent()
// Remove file from product's 'files' binding.
errorInfo = project.removeFiles(product, qbs::GroupData(), QStringList("main.cpp"));
- QVERIFY2(!errorInfo.hasError(), qPrintable(errorInfo.toString()));
+ VERIFY_NO_ERROR(errorInfo);
// Add file to non-empty array literal.
projectData = project.projectData();
@@ -323,14 +495,14 @@ void TestApi::changeContent()
group = findGroup(product, "Existing Group 1");
QVERIFY(group.isValid());
errorInfo = project.addFiles(product, group, QStringList() << "newfile1.txt");
- QVERIFY2(!errorInfo.hasError(), qPrintable(errorInfo.toString()));
+ VERIFY_NO_ERROR(errorInfo);
// Add files to list represented as a single string.
projectData = project.projectData();
QVERIFY(projectData.products().count() == 1);
product = projectData.products().first();
errorInfo = project.addFiles(product, qbs::GroupData(), QStringList() << "newfile2.txt");
- QVERIFY2(!errorInfo.hasError(), qPrintable(errorInfo.toString()));
+ VERIFY_NO_ERROR(errorInfo);
// Add files to list represented as an identifier.
projectData = project.projectData();
@@ -339,7 +511,7 @@ void TestApi::changeContent()
group = findGroup(product, "Existing Group 2");
QVERIFY(group.isValid());
errorInfo = project.addFiles(product, group, QStringList() << "newfile3.txt");
- QVERIFY2(!errorInfo.hasError(), qPrintable(errorInfo.toString()));
+ VERIFY_NO_ERROR(errorInfo);
// Add files to list represented as a block of code (not yet implemented).
projectData = project.projectData();
@@ -358,7 +530,7 @@ void TestApi::changeContent()
group = findGroup(product, "Existing Group 4");
QVERIFY(group.isValid());
errorInfo = project.addFiles(product, group, QStringList() << "file.txt");
- QVERIFY2(!errorInfo.hasError(), qPrintable(errorInfo.toString()));
+ VERIFY_NO_ERROR(errorInfo);
// Error handling: Add file to group with non-directory prefix.
projectData = project.projectData();
@@ -377,7 +549,7 @@ void TestApi::changeContent()
group = findGroup(product, "Existing Group 5");
QVERIFY(group.isValid());
errorInfo = project.removeGroup(product, group);
- QVERIFY2(!errorInfo.hasError(), qPrintable(errorInfo.toString()));
+ VERIFY_NO_ERROR(errorInfo);
projectData = project.projectData();
QVERIFY(projectData.products().count() == 1);
QCOMPARE(projectData.products().first().groups().count(), 9);
@@ -397,7 +569,7 @@ void TestApi::changeContent()
QVERIFY2(newFile.open(QIODevice::WriteOnly), qPrintable(newFile.errorString()));
newFile.close();
errorInfo = project.addFiles(product, group, QStringList() << newFile.fileName());
- QVERIFY2(!errorInfo.hasError(), qPrintable(errorInfo.toString()));
+ VERIFY_NO_ERROR(errorInfo);
projectData = project.projectData();
QVERIFY(projectData.products().count() == 1);
product = projectData.products().first();
@@ -421,7 +593,8 @@ void TestApi::changeContent()
qbs::BuildOptions buildOptions;
buildOptions.setDryRun(true);
BuildDescriptionReceiver rcvr;
- QScopedPointer<qbs::BuildJob> buildJob(project.buildAllProducts(buildOptions, this));
+ QScopedPointer<qbs::BuildJob> buildJob(project.buildAllProducts(buildOptions, defaultProducts(),
+ this));
connect(buildJob.data(), SIGNAL(reportCommandDescription(QString,QString)), &rcvr,
SLOT(handleDescription(QString,QString)));
waitForFinished(buildJob.data());
@@ -435,11 +608,11 @@ void TestApi::changeContent()
waitForFinished(job.data());
QVERIFY2(!job->error().hasError(), qPrintable(job->error().toString()));
project = job->project();
- const qbs::ProjectData newProjectData = project.projectData();
+ qbs::ProjectData newProjectData = project.projectData();
// Can't use Project::operator== here, as the target artifacts will differ due to the build
// not having run yet.
- const bool projectDataMatches = newProjectData.products().count() == 1
+ bool projectDataMatches = newProjectData.products().count() == 1
&& projectData.products().count() == 1
&& newProjectData.products().first().groups() == projectData.products().first().groups();
if (!projectDataMatches) {
@@ -451,7 +624,7 @@ void TestApi::changeContent()
QVERIFY(projectDataMatches); // Will fail if e.g. code locations don't match.
// Now try building again and check if the newly resolved product behaves the same way.
- buildJob.reset(project.buildAllProducts(buildOptions, this));
+ buildJob.reset(project.buildAllProducts(buildOptions, defaultProducts(), this));
connect(buildJob.data(), SIGNAL(reportCommandDescription(QString,QString)), &rcvr,
SLOT(handleDescription(QString,QString)));
waitForFinished(buildJob.data());
@@ -463,14 +636,18 @@ void TestApi::changeContent()
QVERIFY(projectData == project.projectData());
// Error handling: Try to change the project during a build.
- buildJob.reset(project.buildAllProducts(buildOptions, this));
+ buildJob.reset(project.buildAllProducts(buildOptions, defaultProducts(), this));
errorInfo = project.addGroup(newProjectData.products().first(), "blubb");
QVERIFY(errorInfo.hasError());
QVERIFY2(errorInfo.toString().contains("in process"), qPrintable(errorInfo.toString()));
waitForFinished(buildJob.data());
errorInfo = project.addGroup(newProjectData.products().first(), "blubb");
- QVERIFY2(!errorInfo.hasError(), qPrintable(errorInfo.toString()));
+ VERIFY_NO_ERROR(errorInfo);
+ project = qbs::Project();
+ job.reset(0);
+ buildJob.reset(0);
+ removeBuildDir(setupParams);
// Add a file to the top level of a product that does not have a "files" binding yet.
setupParams.setProjectFilePath(QDir::cleanPath(m_workingDataDir +
"/project-editing/project-with-no-files.qbs"));
@@ -483,10 +660,10 @@ void TestApi::changeContent()
QCOMPARE(projectData.allProducts().count(), 1);
product = projectData.allProducts().first();
errorInfo = project.addFiles(product, qbs::GroupData(), QStringList("main.cpp"));
- QVERIFY2(!errorInfo.hasError(), qPrintable(errorInfo.toString()));
+ VERIFY_NO_ERROR(errorInfo);
projectData = project.projectData();
rcvr.descriptions.clear();
- buildJob.reset(project.buildAllProducts(buildOptions, this));
+ buildJob.reset(project.buildAllProducts(buildOptions, defaultProducts(), this));
connect(buildJob.data(), SIGNAL(reportCommandDescription(QString,QString)), &rcvr,
SLOT(handleDescription(QString,QString)));
waitForFinished(buildJob.data());
@@ -495,15 +672,119 @@ void TestApi::changeContent()
job.reset(project.setupProject(setupParams, m_logSink, 0));
waitForFinished(job.data());
QVERIFY2(!job->error().hasError(), qPrintable(job->error().toString()));
- if (job->project().projectData() != projectData) {
+ // Can't use Project::operator== here, as the target artifacts will differ due to the build
+ // not having run yet.
+ newProjectData = job->project().projectData();
+ projectDataMatches = newProjectData.products().count() == 1
+ && projectData.products().count() == 1
+ && newProjectData.products().first().groups() == projectData.products().first().groups();
+ if (!projectDataMatches) {
printProjectData(projectData);
qDebug("\n====\n");
- printProjectData(job->project().projectData());
+ printProjectData(newProjectData);
}
- QVERIFY(job->project().projectData() == projectData);
+ QVERIFY(projectDataMatches);
}
+
#endif // QBS_ENABLE_PROJECT_FILE_UPDATES
+void TestApi::commandExtraction()
+{
+ qbs::SetupProjectParameters setupParams
+ = defaultSetupParameters("/command-extraction/project.qbs");
+ QScopedPointer<qbs::SetupProjectJob> setupJob(qbs::Project().setupProject(setupParams,
+ m_logSink, 0));
+ waitForFinished(setupJob.data());
+ QVERIFY2(!setupJob->error().hasError(), qPrintable(setupJob->error().toString()));
+ qbs::Project project = setupJob->project();
+ qbs::ProjectData projectData = project.projectData();
+ QCOMPARE(projectData.allProducts().count(), 1);
+ qbs::ProductData productData = projectData.allProducts().first();
+ qbs::ErrorInfo errorInfo;
+ const QString projectDirPath = QDir::cleanPath(QFileInfo(setupParams.projectFilePath()).path());
+ const QString sourceFilePath = projectDirPath + "/main.cpp";
+
+ // Before the first build, no rules exist.
+ qbs::RuleCommandList commands
+ = project.ruleCommands(productData, sourceFilePath, "obj", &errorInfo);
+ QCOMPARE(commands.count(), 0);
+ QVERIFY(errorInfo.hasError());
+ QVERIFY2(errorInfo.toString().contains("No rule"), qPrintable(errorInfo.toString()));
+
+ qbs::BuildOptions options;
+ options.setDryRun(true);
+ QScopedPointer<qbs::BuildJob> buildJob(project.buildAllProducts(options));
+ waitForFinished(buildJob.data());
+ QVERIFY2(!buildJob->error().hasError(), qPrintable(buildJob->error().toString()));
+ projectData = project.projectData();
+ QCOMPARE(projectData.allProducts().count(), 1);
+ productData = projectData.allProducts().first();
+ errorInfo = qbs::ErrorInfo();
+
+ // After the build, the compile command must be found.
+ commands = project.ruleCommands(productData, sourceFilePath, "obj", &errorInfo);
+ QCOMPARE(commands.count(), 1);
+ QVERIFY2(!errorInfo.hasError(), qPrintable(errorInfo.toString()));
+ const qbs::RuleCommand command = commands.first();
+ QCOMPARE(command.type(), qbs::RuleCommand::ProcessCommandType);
+ QVERIFY(!command.executable().isEmpty());
+ QVERIFY(!command.arguments().isEmpty());
+}
+
+void TestApi::changeDependentLib()
+{
+ qbs::ErrorInfo errorInfo = doBuildProject("change-dependent-lib/change-dependent-lib.qbs");
+ VERIFY_NO_ERROR(errorInfo);
+
+ waitForNewTimestamp();
+ const QString qbsFileName("change-dependent-lib.qbs");
+ QFile qbsFile(qbsFileName);
+ QVERIFY(qbsFile.open(QIODevice::ReadWrite));
+ const QByteArray content1 = qbsFile.readAll();
+ QByteArray content2 = content1;
+ content2.replace("cpp.defines: [\"XXXX\"]", "cpp.defines: [\"ABCD\"]");
+ QVERIFY(content1 != content2);
+ qbsFile.seek(0);
+ qbsFile.write(content2);
+ qbsFile.close();
+ errorInfo = doBuildProject("change-dependent-lib/change-dependent-lib.qbs");
+ VERIFY_NO_ERROR(errorInfo);
+}
+
+void TestApi::enableAndDisableProduct()
+{
+ BuildDescriptionReceiver bdr;
+ qbs::ErrorInfo errorInfo = doBuildProject("enable-and-disable-product/project.qbs", &bdr);
+ VERIFY_NO_ERROR(errorInfo);
+ QVERIFY(!bdr.descriptions.contains("compiling"));
+
+ waitForNewTimestamp();
+ QFile projectFile("project.qbs");
+ QVERIFY(projectFile.open(QIODevice::ReadWrite));
+ QByteArray content = projectFile.readAll();
+ content.replace("undefined", "'hidden'");
+ projectFile.resize(0);
+ projectFile.write(content);
+ projectFile.close();
+ bdr.descriptions.clear();
+ errorInfo = doBuildProject("enable-and-disable-product/project.qbs", &bdr);
+ VERIFY_NO_ERROR(errorInfo);
+ QVERIFY(bdr.descriptions.contains("linking"));
+
+ waitForNewTimestamp();
+ touch("main.cpp");
+ QVERIFY(projectFile.open(QIODevice::ReadWrite));
+ content = projectFile.readAll();
+ content.replace("'hidden'", "undefined");
+ projectFile.resize(0);
+ projectFile.write(content);
+ projectFile.close();
+ bdr.descriptions.clear();
+ errorInfo = doBuildProject("enable-and-disable-product/project.qbs", &bdr);
+ VERIFY_NO_ERROR(errorInfo);
+ QVERIFY(!bdr.descriptions.contains("compiling"));
+}
+
static qbs::ErrorInfo forceRuleEvaluation(const qbs::Project project)
{
qbs::BuildOptions buildOptions;
@@ -515,9 +796,8 @@ static qbs::ErrorInfo forceRuleEvaluation(const qbs::Project project)
void TestApi::disabledInstallGroup()
{
- qbs::SetupProjectParameters setupParams = defaultSetupParameters();
- setupParams.setProjectFilePath(QDir::cleanPath(m_workingDataDir +
- "/disabled_install_group/project.qbs"));
+ qbs::SetupProjectParameters setupParams
+ = defaultSetupParameters("disabled_install_group/project.qbs");
QScopedPointer<qbs::SetupProjectJob> job(qbs::Project().setupProject(setupParams,
m_logSink, 0));
waitForFinished(job.data());
@@ -525,7 +805,7 @@ void TestApi::disabledInstallGroup()
const qbs::Project project = job->project();
const qbs::ErrorInfo errorInfo = forceRuleEvaluation(project);
- QVERIFY2(!errorInfo.hasError(), qPrintable(errorInfo.toString()));
+ VERIFY_NO_ERROR(errorInfo);
qbs::ProjectData projectData = project.projectData();
QCOMPARE(projectData.allProducts().count(), 1);
@@ -539,11 +819,98 @@ void TestApi::disabledInstallGroup()
QCOMPARE(project.targetExecutable(product, qbs::InstallOptions()), targets.first().filePath());
}
+void TestApi::disabledProduct()
+{
+ const qbs::ErrorInfo errorInfo = doBuildProject("disabled-product/disabledProduct.qbs");
+ VERIFY_NO_ERROR(errorInfo);
+}
+
+void TestApi::disabledProject()
+{
+ const qbs::ErrorInfo errorInfo = doBuildProject("disabled-project/disabled_project.qbs");
+ VERIFY_NO_ERROR(errorInfo);
+}
+
+void TestApi::duplicateProductNames()
+{
+ QFETCH(QString, projectFileName);
+ const qbs::ErrorInfo errorInfo = doBuildProject("duplicate-product-names/" + projectFileName);
+ QVERIFY(errorInfo.hasError());
+ QVERIFY2(errorInfo.toString().contains("Duplicate product name"),
+ qPrintable(errorInfo.toString()));
+}
+
+void TestApi::duplicateProductNames_data()
+{
+ QTest::addColumn<QString>("projectFileName");
+ QTest::newRow("Names explicitly set") << QString("explicit.qbs");
+ QTest::newRow("Unnamed products in same file") << QString("implicit.qbs");
+ QTest::newRow("Unnamed products in files of the same name") << QString("implicit-indirect.qbs");
+
+}
+
+void TestApi::dynamicLibs()
+{
+ const qbs::ErrorInfo errorInfo = doBuildProject("dynamic-libs/link_dynamiclib.qbs");
+ VERIFY_NO_ERROR(errorInfo);
+}
+
+void TestApi::emptyFileTagList()
+{
+ const qbs::ErrorInfo errorInfo = doBuildProject("empty-filetag-list/project.qbs");
+ VERIFY_NO_ERROR(errorInfo);
+}
+
+void TestApi::emptySubmodulesList()
+{
+ const qbs::ErrorInfo errorInfo = doBuildProject("empty-submodules-list/project.qbs");
+ VERIFY_NO_ERROR(errorInfo);
+}
+
+void TestApi::explicitlyDependsOn()
+{
+ BuildDescriptionReceiver receiver;
+ qbs::ErrorInfo errorInfo = doBuildProject("explicitly-depends-on/project.qbs", &receiver);
+ VERIFY_NO_ERROR(errorInfo);
+ QVERIFY(receiver.descriptions.contains("Creating output artifact"));
+ receiver.descriptions.clear();
+
+ errorInfo = doBuildProject("explicitly-depends-on/project.qbs", &receiver);
+ VERIFY_NO_ERROR(errorInfo);
+ QVERIFY(!receiver.descriptions.contains("Creating output artifact"));
+
+ waitForNewTimestamp();
+ touch("dependency.txt");
+ errorInfo = doBuildProject("explicitly-depends-on/project.qbs", &receiver);
+ VERIFY_NO_ERROR(errorInfo);
+ QVERIFY(receiver.descriptions.contains("Creating output artifact"));
+}
+
+void TestApi::exportSimple()
+{
+ const qbs::ErrorInfo errorInfo = doBuildProject("export-simple/project.qbs");
+ VERIFY_NO_ERROR(errorInfo);
+}
+
+void TestApi::exportWithRecursiveDepends()
+{
+ const qbs::ErrorInfo errorInfo = doBuildProject("export-with-recursive-depends/project.qbs");
+ QEXPECT_FAIL("", "QBS-706", Abort);
+ VERIFY_NO_ERROR(errorInfo);
+}
+
+void TestApi::fileTagger()
+{
+ BuildDescriptionReceiver receiver;
+ const qbs::ErrorInfo errorInfo = doBuildProject("file-tagger/moc_cpp.qbs", &receiver);
+ VERIFY_NO_ERROR(errorInfo);
+ QVERIFY2(receiver.descriptions.contains("moc bla.cpp"), qPrintable(receiver.descriptions));
+}
+
void TestApi::fileTagsFilterOverride()
{
- qbs::SetupProjectParameters setupParams = defaultSetupParameters();
- setupParams.setProjectFilePath(QDir::cleanPath(m_workingDataDir +
- "/filetagsfilter_override/project.qbs"));
+ qbs::SetupProjectParameters setupParams
+ = defaultSetupParameters("filetagsfilter_override/project.qbs");
QScopedPointer<qbs::SetupProjectJob> job(qbs::Project().setupProject(setupParams,
m_logSink, 0));
waitForFinished(job.data());
@@ -551,7 +918,7 @@ void TestApi::fileTagsFilterOverride()
qbs::Project project = job->project();
const qbs::ErrorInfo errorInfo = forceRuleEvaluation(project);
- QVERIFY2(!errorInfo.hasError(), qPrintable(errorInfo.toString()));
+ VERIFY_NO_ERROR(errorInfo);
qbs::ProjectData projectData = project.projectData();
QCOMPARE(projectData.allProducts().count(), 1);
@@ -565,10 +932,8 @@ void TestApi::fileTagsFilterOverride()
void TestApi::infiniteLoopBuilding()
{
QFETCH(QString, projectDirName);
- qbs::SetupProjectParameters setupParams = defaultSetupParameters();
- const QString projectDir = QDir::cleanPath(m_workingDataDir + '/' + projectDirName);
- setupParams.setProjectFilePath(projectDir + "/infinite-loop.qbs");
- setupParams.setBuildRoot(projectDir);
+ qbs::SetupProjectParameters setupParams
+ = defaultSetupParameters(projectDirName + "/infinite-loop.qbs");
QScopedPointer<qbs::SetupProjectJob> setupJob(qbs::Project().setupProject(setupParams,
m_logSink, 0));
waitForFinished(setupJob.data());
@@ -588,10 +953,8 @@ void TestApi::infiniteLoopBuilding_data()
void TestApi::infiniteLoopResolving()
{
- qbs::SetupProjectParameters setupParams = defaultSetupParameters();
- const QString projectDir = QDir::cleanPath(m_workingDataDir + "/infinite-loop-resolving");
- setupParams.setProjectFilePath(projectDir + "/project.qbs");
- setupParams.setBuildRoot(projectDir);
+ qbs::SetupProjectParameters setupParams
+ = defaultSetupParameters("infinite-loop-resolving/project.qbs");
QScopedPointer<qbs::SetupProjectJob> setupJob(qbs::Project().setupProject(setupParams,
m_logSink, 0));
QTimer::singleShot(1000, setupJob.data(), SLOT(cancel()));
@@ -600,11 +963,16 @@ void TestApi::infiniteLoopResolving()
qPrintable(setupJob->error().toString()));
}
+void TestApi::inheritQbsSearchPaths()
+{
+ const qbs::ErrorInfo errorInfo = doBuildProject("inherit-qbs-search-paths/prj.qbs");
+ VERIFY_NO_ERROR(errorInfo);
+}
+
void TestApi::installableFiles()
{
- qbs::SetupProjectParameters setupParams = defaultSetupParameters();
- setupParams.setProjectFilePath(QDir::cleanPath(QLatin1String(SRCDIR "/../blackbox/testdata"
- "/installed_artifact/installed_artifact.qbs")));
+ qbs::SetupProjectParameters setupParams
+ = defaultSetupParameters("installed-artifact/installed_artifact.qbs");
QScopedPointer<qbs::SetupProjectJob> job(qbs::Project().setupProject(setupParams,
m_logSink, 0));
waitForFinished(job.data());
@@ -612,7 +980,7 @@ void TestApi::installableFiles()
qbs::Project project = job->project();
const qbs::ErrorInfo errorInfo = forceRuleEvaluation(project);
- QVERIFY2(!errorInfo.hasError(), qPrintable(errorInfo.toString()));
+ VERIFY_NO_ERROR(errorInfo);
qbs::ProjectData projectData = project.projectData();
QCOMPARE(projectData.allProducts().count(), 1);
@@ -633,8 +1001,7 @@ void TestApi::installableFiles()
}
}
- setupParams.setProjectFilePath(QDir::cleanPath(QLatin1String(SRCDIR "/../blackbox/testdata"
- "/recursive_wildcards/recursive_wildcards.qbs")));
+ setupParams = defaultSetupParameters("recursive-wildcards/recursive_wildcards.qbs");
job.reset(project.setupProject(setupParams, m_logSink, 0));
waitForFinished(job.data());
QVERIFY2(!job->error().hasError(), qPrintable(job->error().toString()));
@@ -652,9 +1019,7 @@ void TestApi::installableFiles()
void TestApi::isRunnable()
{
- qbs::SetupProjectParameters setupParams = defaultSetupParameters();
- setupParams.setProjectFilePath(QDir::cleanPath(QLatin1String(SRCDIR "/testdata"
- "/is-runnable/project.qbs")));
+ qbs::SetupProjectParameters setupParams = defaultSetupParameters("is-runnable/project.qbs");
QScopedPointer<qbs::SetupProjectJob> job(qbs::Project().setupProject(setupParams,
m_logSink, 0));
waitForFinished(job.data());
@@ -673,31 +1038,49 @@ void TestApi::isRunnable()
void TestApi::listBuildSystemFiles()
{
- qbs::SetupProjectParameters setupParams = defaultSetupParameters();
- const QString projectDir
- = QDir::cleanPath(QLatin1String(SRCDIR "/../blackbox/testdata/subprojects"));
- const QString topLevelProjectFile = projectDir + QLatin1String("/toplevelproject.qbs");
- setupParams.setProjectFilePath(topLevelProjectFile);
+ qbs::SetupProjectParameters setupParams
+ = defaultSetupParameters("subprojects/toplevelproject.qbs");
QScopedPointer<qbs::SetupProjectJob> job(qbs::Project().setupProject(setupParams,
m_logSink, 0));
waitForFinished(job.data());
QVERIFY2(!job->error().hasError(), qPrintable(job->error().toString()));
const QSet<QString> buildSystemFiles = job->project().buildSystemFiles();
- QVERIFY(buildSystemFiles.contains(topLevelProjectFile));
- QVERIFY(buildSystemFiles.contains(projectDir + QLatin1String("/subproject2/subproject2.qbs")));
- QVERIFY(buildSystemFiles.contains(projectDir
- + QLatin1String("/subproject2/subproject3/subproject3.qbs")));
+ QVERIFY(buildSystemFiles.contains(setupParams.projectFilePath()));
+ QVERIFY(buildSystemFiles.contains(setupParams.buildRoot() + "/subproject2/subproject2.qbs"));
+ QVERIFY(buildSystemFiles.contains(setupParams.buildRoot()
+ + "/subproject2/subproject3/subproject3.qbs"));
+}
+
+void TestApi::mocCppIncluded()
+{
+ // Initial build.
+ qbs::ErrorInfo errorInfo = doBuildProject("moc-hpp-included/project.qbs");
+ VERIFY_NO_ERROR(errorInfo);
+
+ // Touch header and try again.
+ waitForNewTimestamp();
+ QFile headerFile("object.h");
+ QVERIFY2(headerFile.open(QIODevice::WriteOnly | QIODevice::Append),
+ qPrintable(headerFile.errorString()));
+ headerFile.write("\n");
+ headerFile.close();
+ errorInfo = doBuildProject("moc-hpp-included/project.qbs");
+ VERIFY_NO_ERROR(errorInfo);
+
+ // Touch cpp file and try again.
+ waitForNewTimestamp();
+ QFile cppFile("object.cpp");
+ QVERIFY2(cppFile.open(QIODevice::WriteOnly | QIODevice::Append),
+ qPrintable(cppFile.errorString()));
+ cppFile.write("\n");
+ cppFile.close();
+ errorInfo = doBuildProject("moc-hpp-included/project.qbs");
+ VERIFY_NO_ERROR(errorInfo);
}
void TestApi::multiArch()
{
- qbs::SetupProjectParameters setupParams = defaultSetupParameters();
- setupParams.setDryRun(false);
- const QString projectDir
- = QDir::cleanPath(m_workingDataDir + "/multi-arch");
- const QString topLevelProjectFile = projectDir + QLatin1String("/project.qbs");
- setupParams.setBuildRoot(projectDir);
- setupParams.setProjectFilePath(topLevelProjectFile);
+ qbs::SetupProjectParameters setupParams = defaultSetupParameters("multi-arch/project.qbs");
qbs::Settings settings((QString()));
qbs::Internal::TemporaryProfile tph("host", &settings);
qbs::Profile hostProfile = tph.p;
@@ -714,7 +1097,7 @@ void TestApi::multiArch()
waitForFinished(setupJob.data());
QVERIFY2(!setupJob->error().hasError(), qPrintable(setupJob->error().toString()));
qbs::Project project = setupJob->project();
- QCOMPARE(project.profile(), QLatin1String("qbs_autotests"));
+ QCOMPARE(project.profile(), profileName());
const QList<qbs::ProductData> &products = project.projectData().products();
QCOMPARE(products.count(), 3);
QList<qbs::ProductData> hostProducts;
@@ -738,21 +1121,24 @@ void TestApi::multiArch()
QScopedPointer<qbs::BuildJob> buildJob(project.buildAllProducts(qbs::BuildOptions()));
waitForFinished(buildJob.data());
QVERIFY2(!buildJob->error().hasError(), qPrintable(buildJob->error().toString()));
- const QString outputBaseDir(setupParams.buildRoot() + "/qbs_autotests-debug");
- QFile p1HostArtifact(outputBaseDir + "/p1.host/host+target.output");
+ const QString outputBaseDir = setupParams.buildRoot() + '/';
+ QFile p1HostArtifact(outputBaseDir
+ + relativeProductBuildDir("p1", "host") + "/host+target.output");
QVERIFY2(p1HostArtifact.exists(), qPrintable(p1HostArtifact.fileName()));
QVERIFY2(p1HostArtifact.open(QIODevice::ReadOnly), qPrintable(p1HostArtifact.errorString()));
QCOMPARE(p1HostArtifact.readAll().constData(), "host-arch");
- QFile p1TargetArtifact(outputBaseDir + "/p1.target/host+target.output");
+ QFile p1TargetArtifact(outputBaseDir + relativeProductBuildDir("p1", "target")
+ + "/host+target.output");
QVERIFY2(p1TargetArtifact.exists(), qPrintable(p1TargetArtifact.fileName()));
QVERIFY2(p1TargetArtifact.open(QIODevice::ReadOnly), qPrintable(p1TargetArtifact.errorString()));
QCOMPARE(p1TargetArtifact.readAll().constData(), "target-arch");
- QFile p2Artifact(outputBaseDir + "/p2.host/host-tool.output");
+ QFile p2Artifact(outputBaseDir + relativeProductBuildDir("p2", "host") + "/host-tool.output");
QVERIFY2(p2Artifact.exists(), qPrintable(p2Artifact.fileName()));
QVERIFY2(p2Artifact.open(QIODevice::ReadOnly), qPrintable(p2Artifact.errorString()));
QCOMPARE(p2Artifact.readAll().constData(), "host-arch");
- const QString installRoot = outputBaseDir + '/' + qbs::InstallOptions::defaultInstallRoot();
+ const QString installRoot = outputBaseDir + relativeBuildDir() + '/'
+ + qbs::InstallOptions::defaultInstallRoot();
QScopedPointer<qbs::InstallJob> installJob(project.installAllProducts(qbs::InstallOptions()));
waitForFinished(installJob.data());
QVERIFY2(!installJob->error().hasError(), qPrintable(installJob->error().toString()));
@@ -786,13 +1172,66 @@ void TestApi::multiArch()
qPrintable(setupJob->error().toString()));
}
+void TestApi::newOutputArtifactInDependency()
+{
+ BuildDescriptionReceiver receiver;
+ qbs::ErrorInfo errorInfo
+ = doBuildProject("new-output-artifact-in-dependency/project.qbs", &receiver);
+ VERIFY_NO_ERROR(errorInfo);
+ QVERIFY(receiver.descriptions.contains("linking app"));
+ const QByteArray linkingLibString = QByteArray("linking ")
+ + qbs::Internal::HostOsInfo::dynamicLibraryName("lib").toLatin1();
+ QVERIFY(!receiver.descriptions.contains(linkingLibString));
+ receiver.descriptions.clear();
+
+ waitForNewTimestamp();
+ QFile projectFile("project.qbs");
+ QVERIFY2(projectFile.open(QIODevice::ReadWrite), qPrintable(projectFile.errorString()));
+ QByteArray contents = projectFile.readAll();
+ contents.replace("//Depends", "Depends");
+ projectFile.resize(0);
+ projectFile.write(contents);
+ projectFile.close();
+ errorInfo = doBuildProject("new-output-artifact-in-dependency/project.qbs", &receiver);
+ VERIFY_NO_ERROR(errorInfo);
+ QVERIFY(receiver.descriptions.contains("linking app"));
+ QVERIFY(receiver.descriptions.contains(linkingLibString));
+}
+
+void TestApi::newPatternMatch()
+{
+ TaskReceiver receiver;
+ qbs::ErrorInfo errorInfo = doBuildProject("new-pattern-match/project.qbs", 0, 0, &receiver);
+ VERIFY_NO_ERROR(errorInfo);
+ QVERIFY2(receiver.taskDescriptions.contains("Resolving"), qPrintable(m_logSink->output));
+ receiver.taskDescriptions.clear();
+
+ errorInfo = doBuildProject("new-pattern-match/project.qbs", 0, 0, &receiver);
+ VERIFY_NO_ERROR(errorInfo);
+ QVERIFY(!receiver.taskDescriptions.contains("Resolving"));
+
+ QFile f("test.txt");
+ QVERIFY2(f.open(QIODevice::WriteOnly), qPrintable(f.errorString()));
+ f.close();
+ errorInfo = doBuildProject("new-pattern-match/project.qbs", 0, 0, &receiver);
+ VERIFY_NO_ERROR(errorInfo);
+ QVERIFY(receiver.taskDescriptions.contains("Resolving"));
+ receiver.taskDescriptions.clear();
+
+ errorInfo = doBuildProject("new-pattern-match/project.qbs", 0, 0, &receiver);
+ VERIFY_NO_ERROR(errorInfo);
+ QVERIFY(!receiver.taskDescriptions.contains("Resolving"));
+
+ f.remove();
+ errorInfo = doBuildProject("new-pattern-match/project.qbs", 0, 0, &receiver);
+ VERIFY_NO_ERROR(errorInfo);
+ QVERIFY(receiver.taskDescriptions.contains("Resolving"));
+}
+
void TestApi::nonexistingProjectPropertyFromProduct()
{
- qbs::SetupProjectParameters setupParams = defaultSetupParameters();
- const QString projectDir
- = QDir::cleanPath(m_workingDataDir + "/nonexistingprojectproperties");
- const QString topLevelProjectFile = projectDir + QLatin1String("/invalidaccessfromproduct.qbs");
- setupParams.setProjectFilePath(topLevelProjectFile);
+ qbs::SetupProjectParameters setupParams
+ = defaultSetupParameters("nonexistingprojectproperties/invalidaccessfromproduct.qbs");
QScopedPointer<qbs::SetupProjectJob> job(qbs::Project().setupProject(setupParams,
m_logSink, 0));
waitForFinished(job.data());
@@ -804,10 +1243,9 @@ void TestApi::nonexistingProjectPropertyFromProduct()
void TestApi::nonexistingProjectPropertyFromCommandLine()
{
- qbs::SetupProjectParameters setupParams = defaultSetupParameters();
- const QString projectDir = QDir::cleanPath(m_workingDataDir + "/nonexistingprojectproperties");
- const QString topLevelProjectFile = projectDir + QLatin1String("/project.qbs");
- setupParams.setProjectFilePath(topLevelProjectFile);
+ qbs::SetupProjectParameters setupParams
+ = defaultSetupParameters("nonexistingprojectproperties/project.qbs");
+ removeBuildDir(setupParams);
QVariantMap projectProperties;
projectProperties.insert(QLatin1String("project.blubb"), QLatin1String("true"));
setupParams.setOverriddenValues(projectProperties);
@@ -819,14 +1257,16 @@ void TestApi::nonexistingProjectPropertyFromCommandLine()
qPrintable(job->error().toString()));
}
+void TestApi::objC()
+{
+ const qbs::ErrorInfo errorInfo = doBuildProject("objc/objc.qbs");
+ VERIFY_NO_ERROR(errorInfo);
+}
+
void TestApi::projectInvalidation()
{
- qbs::SetupProjectParameters setupParams = defaultSetupParameters();
- setupParams.setRestoreBehavior(qbs::SetupProjectParameters::RestoreAndTrackChanges);
- const QString projectDirPath = QDir::cleanPath(m_workingDataDir + "/project-invalidation");
- setupParams.setProjectFilePath(projectDirPath + "/project.qbs");
- QDir::setCurrent(projectDirPath);
- setupParams.setBuildRoot(projectDirPath);
+ qbs::SetupProjectParameters setupParams
+ = defaultSetupParameters("project-invalidation/project.qbs");
QVERIFY(QFile::copy("project.no-error.qbs", "project.qbs"));
QScopedPointer<qbs::SetupProjectJob> setupJob(qbs::Project().setupProject(setupParams,
m_logSink, 0));
@@ -850,9 +1290,7 @@ void TestApi::projectInvalidation()
void TestApi::projectLocking()
{
- qbs::SetupProjectParameters setupParams = defaultSetupParameters();
- const QString projectDirPath = QDir::cleanPath(m_workingDataDir + "/project-locking");
- setupParams.setProjectFilePath(projectDirPath + "/project.qbs");
+ qbs::SetupProjectParameters setupParams = defaultSetupParameters("project-locking/project.qbs");
QScopedPointer<qbs::SetupProjectJob> setupJob(qbs::Project().setupProject(setupParams,
m_logSink, 0));
waitForFinished(setupJob.data());
@@ -870,30 +1308,52 @@ void TestApi::projectLocking()
QVERIFY2(!setupJob->error().hasError(), qPrintable(setupJob->error().toString()));
}
-qbs::SetupProjectParameters TestApi::defaultSetupParameters() const
+void TestApi::projectWithPropertiesItem()
{
- qbs::SetupProjectParameters setupParams;
- setupParams.setDryRun(true); // So no build graph gets created.
- setupParams.setBuildRoot(m_workingDataDir);
- setupParams.setRestoreBehavior(qbs::SetupProjectParameters::ResolveOnly); // No restoring.
+ const qbs::ErrorInfo errorInfo = doBuildProject("project-with-properties-item/project.qbs");
+ VERIFY_NO_ERROR(errorInfo);
+}
+
+void TestApi::propertiesBlocks()
+{
+ const qbs::ErrorInfo errorInfo = doBuildProject("properties-blocks/propertiesblocks.qbs");
+ VERIFY_NO_ERROR(errorInfo);
+}
+
+void TestApi::rc()
+{
+ BuildDescriptionReceiver receiver;
+ const qbs::ErrorInfo errorInfo = doBuildProject("rc/rc.qbs", &receiver);
+ VERIFY_NO_ERROR(errorInfo);
+ const bool rcFileWasCompiled = receiver.descriptions.contains("compiling test.rc");
+ QCOMPARE(rcFileWasCompiled, qbs::Internal::HostOsInfo::isWindowsHost());
+}
+qbs::SetupProjectParameters TestApi::defaultSetupParameters(const QString &projectFilePath) const
+{
+ qbs::SetupProjectParameters setupParams;
+ const QString projectDirPath = QDir::cleanPath(m_workingDataDir + QLatin1Char('/')
+ + QFileInfo(projectFilePath).path());
+ setupParams.setProjectFilePath(projectDirPath + QLatin1Char('/')
+ + QFileInfo(projectFilePath).fileName());
+ setupParams.setPropertyCheckingMode(qbs::SetupProjectParameters::PropertyCheckingStrict);
+ QDir::setCurrent(projectDirPath);
+ setupParams.setBuildRoot(projectDirPath);
qbs::Settings settings((QString()));
- const QString profileName = QLatin1String("qbs_autotests");
- const qbs::Preferences prefs(&settings, profileName);
+ const qbs::Preferences prefs(&settings, profileName());
setupParams.setSearchPaths(prefs.searchPaths(QDir::cleanPath(QCoreApplication::applicationDirPath()
+ QLatin1String("/" QBS_RELATIVE_SEARCH_PATH))));
setupParams.setPluginPaths(prefs.pluginPaths(QDir::cleanPath(QCoreApplication::applicationDirPath()
+ QLatin1String("/" QBS_RELATIVE_PLUGINS_PATH))));
- setupParams.setTopLevelProfile(profileName);
+ setupParams.setTopLevelProfile(profileName());
setupParams.setBuildVariant(QLatin1String("debug"));
return setupParams;
}
void TestApi::references()
{
- qbs::SetupProjectParameters setupParams = defaultSetupParameters();
+ qbs::SetupProjectParameters setupParams = defaultSetupParameters("references/invalid1.qbs");
const QString projectDir = QDir::cleanPath(m_workingDataDir + "/references");
- setupParams.setProjectFilePath(projectDir + QLatin1String("/invalid1.qbs"));
QScopedPointer<qbs::SetupProjectJob> job(qbs::Project().setupProject(setupParams,
m_logSink, 0));
waitForFinished(job.data());
@@ -915,15 +1375,133 @@ void TestApi::references()
const qbs::ProjectData topLevelProject = job->project().projectData();
QCOMPARE(topLevelProject.subProjects().count(), 1);
const QString subProjectFileName
- = QFileInfo(topLevelProject.subProjects().first().location().fileName()).fileName();
+ = QFileInfo(topLevelProject.subProjects().first().location().filePath()).fileName();
QCOMPARE(subProjectFileName, QString("p.qbs"));
}
+void TestApi::renameProduct()
+{
+ // Initial run.
+ qbs::ErrorInfo errorInfo = doBuildProject("rename-product/rename.qbs");
+ VERIFY_NO_ERROR(errorInfo);
+
+ // Rename lib and adapt Depends item.
+ waitForNewTimestamp();
+ QFile f("rename.qbs");
+ QVERIFY(f.open(QIODevice::ReadWrite));
+ QByteArray contents = f.readAll();
+ contents.replace("TheLib", "thelib");
+ f.resize(0);
+ f.write(contents);
+ f.close();
+ errorInfo = doBuildProject("rename-product/rename.qbs");
+ VERIFY_NO_ERROR(errorInfo);
+
+ // Rename lib and don't adapt Depends item.
+ waitForNewTimestamp();
+ QVERIFY(f.open(QIODevice::ReadWrite));
+ contents = f.readAll();
+ const int libNameIndex = contents.lastIndexOf("thelib");
+ QVERIFY(libNameIndex != -1);
+ contents.replace(libNameIndex, 6, "TheLib");
+ f.resize(0);
+ f.write(contents);
+ f.close();
+ errorInfo = doBuildProject("rename-product/rename.qbs");
+ QVERIFY(errorInfo.hasError());
+ QVERIFY2(errorInfo.toString().contains("Product dependency 'thelib' not found"),
+ qPrintable(errorInfo.toString()));
+}
+
+void TestApi::renameTargetArtifact()
+{
+ // Initial run.
+ BuildDescriptionReceiver receiver;
+ qbs::ErrorInfo errorInfo = doBuildProject("rename-target-artifact/rename.qbs", &receiver);
+ VERIFY_NO_ERROR(errorInfo);
+ QVERIFY2(receiver.descriptions.contains("compiling"), qPrintable(receiver.descriptions));
+ QCOMPARE(receiver.descriptions.count("linking"), 2);
+ receiver.descriptions.clear();
+
+ // Rename library file name.
+ waitForNewTimestamp();
+ QFile f("rename.qbs");
+ QVERIFY(f.open(QIODevice::ReadWrite));
+ QByteArray contents = f.readAll();
+ contents.replace("the_lib", "TheLib");
+ f.resize(0);
+ f.write(contents);
+ f.close();
+ errorInfo = doBuildProject("rename-target-artifact/rename.qbs", &receiver);
+ VERIFY_NO_ERROR(errorInfo);
+ QVERIFY2(!receiver.descriptions.contains("compiling"), qPrintable(receiver.descriptions));
+ QCOMPARE(receiver.descriptions.count("linking"), 2);
+}
+
+void TestApi::removeFileDependency()
+{
+ qbs::ErrorInfo errorInfo = doBuildProject("remove-file-dependency/removeFileDependency.qbs");
+ VERIFY_NO_ERROR(errorInfo);
+
+ QFile::remove("someheader.h");
+ ProcessResultReceiver receiver;
+ errorInfo = doBuildProject("remove-file-dependency/removeFileDependency.qbs", 0, &receiver);
+ QVERIFY(errorInfo.hasError());
+ QVERIFY2(receiver.output.contains("someheader.h"), qPrintable(receiver.output));
+}
+
+void TestApi::resolveProject()
+{
+ QFETCH(QString, projectSubDir);
+ QFETCH(QString, productFileName);
+
+ const qbs::SetupProjectParameters params
+ = defaultSetupParameters(projectSubDir + "/project.qbs");
+ removeBuildDir(params);
+ const QScopedPointer<qbs::SetupProjectJob> setupJob(qbs::Project().setupProject(params,
+ m_logSink, 0));
+ waitForFinished(setupJob.data());
+ VERIFY_NO_ERROR(setupJob->error());
+ QVERIFY2(!QFile::exists(productFileName), qPrintable(productFileName));
+ QVERIFY(regularFileExists(relativeBuildGraphFilePath()));
+}
+
+void TestApi::resolveProject_data()
+{
+ return buildProject_data();
+}
+
+void TestApi::resolveProjectDryRun()
+{
+ QFETCH(QString, projectSubDir);
+ QFETCH(QString, productFileName);
+
+ qbs::SetupProjectParameters params = defaultSetupParameters(projectSubDir + "/project.qbs");
+ params.setDryRun(true);
+ removeBuildDir(params);
+ const QScopedPointer<qbs::SetupProjectJob> setupJob(qbs::Project().setupProject(params,
+ m_logSink, 0));
+ waitForFinished(setupJob.data());
+ VERIFY_NO_ERROR(setupJob->error());
+ QVERIFY2(!QFile::exists(productFileName), qPrintable(productFileName));
+ QVERIFY(!regularFileExists(relativeBuildGraphFilePath()));
+}
+
+void TestApi::resolveProjectDryRun_data()
+{
+ return resolveProject_data();
+}
+
+void TestApi::softDependency()
+{
+ const qbs::ErrorInfo errorInfo = doBuildProject("soft-dependency/project.qbs");
+ VERIFY_NO_ERROR(errorInfo);
+}
+
void TestApi::sourceFileInBuildDir()
{
- qbs::SetupProjectParameters setupParams = defaultSetupParameters();
- const QString projectDir = QDir::cleanPath(m_workingDataDir + "/source-file-in-build-dir");
- setupParams.setProjectFilePath(projectDir + QLatin1String("/project.qbs"));
+ qbs::SetupProjectParameters setupParams
+ = defaultSetupParameters("source-file-in-build-dir/project.qbs");
QScopedPointer<qbs::SetupProjectJob> job(qbs::Project().setupProject(setupParams,
m_logSink, 0));
waitForFinished(job.data());
@@ -931,12 +1509,167 @@ void TestApi::sourceFileInBuildDir()
const qbs::ProjectData projectData = job->project().projectData();
QCOMPARE(projectData.allProducts().count(), 1);
const qbs::ProductData product = projectData.allProducts().first();
- QCOMPARE(product.profile(), QLatin1String("qbs_autotests"));
+ QCOMPARE(product.profile(), profileName());
QCOMPARE(product.groups().count(), 1);
const qbs::GroupData group = product.groups().first();
QCOMPARE(group.allFilePaths().count(), 1);
}
+void TestApi::subProjects()
+{
+ const qbs::SetupProjectParameters params
+ = defaultSetupParameters("subprojects/toplevelproject.qbs");
+ removeBuildDir(params);
+
+ // Check all three types of subproject creation, plus property overrides.
+ qbs::ErrorInfo errorInfo = doBuildProject("subprojects/toplevelproject.qbs");
+ VERIFY_NO_ERROR(errorInfo);
+
+ // Disabling both the project with the dependency and the one with the dependent
+ // should not cause an error.
+ waitForNewTimestamp();
+ QFile f(params.projectFilePath());
+ QVERIFY(f.open(QIODevice::ReadWrite));
+ QByteArray contents = f.readAll();
+ contents.replace("condition: true", "condition: false");
+ f.resize(0);
+ f.write(contents);
+ f.close();
+ f.setFileName(params.buildRoot() + "/subproject2/subproject2.qbs");
+ QVERIFY(f.open(QIODevice::ReadWrite));
+ contents = f.readAll();
+ contents.replace("condition: true", "condition: false");
+ f.resize(0);
+ f.write(contents);
+ f.close();
+ errorInfo = doBuildProject("subprojects/toplevelproject.qbs");
+ VERIFY_NO_ERROR(errorInfo);
+
+ // Disabling the project with the dependency only is an error.
+ // This tests also whether changes in sub-projects are detected.
+ waitForNewTimestamp();
+ f.setFileName(params.projectFilePath());
+ QVERIFY(f.open(QIODevice::ReadWrite));
+ contents = f.readAll();
+ contents.replace("condition: false", "condition: true");
+ f.resize(0);
+ f.write(contents);
+ f.close();
+ errorInfo = doBuildProject("subprojects/toplevelproject.qbs");
+ QVERIFY(errorInfo.hasError());
+ QVERIFY2(errorInfo.toString().contains("Product dependency 'testLib' not found"),
+ qPrintable(errorInfo.toString()));
+}
+
+void TestApi::trackAddQObjectHeader()
+{
+ const qbs::SetupProjectParameters params
+ = defaultSetupParameters("missing-qobject-header/missingheader.qbs");
+ QFile qbsFile(params.projectFilePath());
+ QVERIFY(qbsFile.open(QIODevice::WriteOnly | QIODevice::Truncate));
+ qbsFile.write("import qbs.base 1.0\nCppApplication {\n Depends { name: 'Qt.core' }\n"
+ " files: ['main.cpp', 'myobject.cpp']\n}");
+ qbsFile.close();
+ ProcessResultReceiver receiver;
+ qbs::ErrorInfo errorInfo
+ = doBuildProject("missing-qobject-header/missingheader.qbs", 0, &receiver);
+ QVERIFY(errorInfo.hasError());
+ QVERIFY2(isAboutUndefinedSymbols(receiver.output), qPrintable(receiver.output));
+
+ waitForNewTimestamp();
+ QVERIFY(qbsFile.open(QIODevice::WriteOnly | QIODevice::Truncate));
+ qbsFile.write("import qbs.base 1.0\nCppApplication {\n Depends { name: 'Qt.core' }\n"
+ " files: ['main.cpp', 'myobject.cpp','myobject.h']\n}");
+ qbsFile.close();
+ errorInfo = doBuildProject("missing-qobject-header/missingheader.qbs");
+ VERIFY_NO_ERROR(errorInfo);
+}
+
+void TestApi::trackRemoveQObjectHeader()
+{
+ const qbs::SetupProjectParameters params
+ = defaultSetupParameters("missing-qobject-header/missingheader.qbs");
+ removeBuildDir(params);
+ QFile qbsFile(params.projectFilePath());
+ QVERIFY(qbsFile.open(QIODevice::WriteOnly | QIODevice::Truncate));
+ qbsFile.write("import qbs.base 1.0\nCppApplication {\n Depends { name: 'Qt.core' }\n"
+ " files: ['main.cpp', 'myobject.cpp','myobject.h']\n}");
+ qbsFile.close();
+ qbs::ErrorInfo errorInfo = doBuildProject("missing-qobject-header/missingheader.qbs");
+ VERIFY_NO_ERROR(errorInfo);
+
+ waitForNewTimestamp();
+ QVERIFY(qbsFile.open(QIODevice::WriteOnly | QIODevice::Truncate));
+ qbsFile.write("import qbs.base 1.0\nCppApplication {\n Depends { name: 'Qt.core' }\n"
+ " files: ['main.cpp', 'myobject.cpp']\n}");
+ qbsFile.close();
+ ProcessResultReceiver receiver;
+ errorInfo = doBuildProject("missing-qobject-header/missingheader.qbs", 0, &receiver);
+ QVERIFY(errorInfo.hasError());
+ QVERIFY2(isAboutUndefinedSymbols(receiver.output), qPrintable(receiver.output));
+}
+
+void TestApi::transformers()
+{
+ const qbs::ErrorInfo errorInfo = doBuildProject("transformers/transformers.qbs");
+ VERIFY_NO_ERROR(errorInfo);
+}
+
+void TestApi::typeChange()
+{
+ BuildDescriptionReceiver receiver;
+ qbs::ErrorInfo errorInfo = doBuildProject("type-change/project.qbs", &receiver);
+ VERIFY_NO_ERROR(errorInfo);
+ QVERIFY2(!receiver.descriptions.contains("compiling"), qPrintable(receiver.descriptions));
+
+ waitForNewTimestamp();
+ QFile projectFile("project.qbs");
+ QVERIFY2(projectFile.open(QIODevice::ReadWrite), qPrintable(projectFile.errorString()));
+ QByteArray content = projectFile.readAll();
+ content.replace("//", "");
+ projectFile.resize(0);
+ projectFile.write(content);
+ projectFile.close();
+ errorInfo = doBuildProject("type-change/project.qbs", &receiver);
+ VERIFY_NO_ERROR(errorInfo);
+ QVERIFY2(receiver.descriptions.contains("compiling"), qPrintable(receiver.descriptions));
+}
+
+void TestApi::uic()
+{
+ const qbs::ErrorInfo errorInfo = doBuildProject("uic/uic.qbs");
+ VERIFY_NO_ERROR(errorInfo);
+}
+
+
+qbs::ErrorInfo TestApi::doBuildProject(const QString &projectFilePath,
+ QObject *buildDescriptionReceiver, QObject *procResultReceiver, QObject *taskReceiver,
+ const qbs::BuildOptions &options)
+{
+ qbs::SetupProjectParameters params = defaultSetupParameters(projectFilePath);
+ params.setDryRun(options.dryRun());
+ const QScopedPointer<qbs::SetupProjectJob> setupJob(qbs::Project().setupProject(params,
+ m_logSink, 0));
+ if (taskReceiver) {
+ connect(setupJob.data(), SIGNAL(taskStarted(QString,int,qbs::AbstractJob*)), taskReceiver,
+ SLOT(handleTaskStart(QString)));
+ }
+ waitForFinished(setupJob.data());
+ if (setupJob->error().hasError())
+ return setupJob->error();
+ const QScopedPointer<qbs::BuildJob> buildJob(setupJob->project().buildAllProducts(options));
+ if (buildDescriptionReceiver) {
+ connect(buildJob.data(), SIGNAL(reportCommandDescription(QString,QString)),
+ buildDescriptionReceiver, SLOT(handleDescription(QString,QString)));
+ }
+ if (procResultReceiver) {
+ connect(buildJob.data(), SIGNAL(reportProcessResult(qbs::ProcessResult)),
+ procResultReceiver, SLOT(handleProcessResult(qbs::ProcessResult)));
+ }
+ waitForFinished(buildJob.data());
+ return buildJob->error();
+}
+
QTEST_MAIN(TestApi)
#include "tst_api.moc"
diff --git a/tests/auto/api/tst_api.h b/tests/auto/api/tst_api.h
index cead9a71d..21ee9da7d 100644
--- a/tests/auto/api/tst_api.h
+++ b/tests/auto/api/tst_api.h
@@ -31,9 +31,14 @@
#ifndef QBS_TST_API_H
#define QBS_TST_API_H
+#include <tools/buildoptions.h>
+
#include <QObject>
-namespace qbs { class SetupProjectParameters; }
+namespace qbs {
+class ErrorInfo;
+class SetupProjectParameters;
+}
class LogSink;
@@ -48,30 +53,77 @@ public:
private slots:
void initTestCase();
+ void addQObjectMacroToCppFile();
+ void addedFilePersistent();
+ void baseProperties();
void buildGraphLocking();
+ void buildProject();
+ void buildProject_data();
+ void buildProjectDryRun();
+ void buildProjectDryRun_data();
void buildSingleFile();
#ifdef QBS_ENABLE_PROJECT_FILE_UPDATES
void changeContent();
#endif
void commandExtraction();
+ void changeDependentLib();
+ void enableAndDisableProduct();
void disabledInstallGroup();
+ void disabledProduct();
+ void disabledProject();
+ void duplicateProductNames();
+ void duplicateProductNames_data();
+ void dynamicLibs();
+ void emptyFileTagList();
+ void emptySubmodulesList();
+ void explicitlyDependsOn();
+ void exportSimple();
+ void exportWithRecursiveDepends();
+ void fileTagger();
void fileTagsFilterOverride();
void infiniteLoopBuilding();
void infiniteLoopBuilding_data();
void infiniteLoopResolving();
+ void inheritQbsSearchPaths();
void installableFiles();
void isRunnable();
void listBuildSystemFiles();
+ void mocCppIncluded();
void multiArch();
+ void newOutputArtifactInDependency();
+ void newPatternMatch();
void nonexistingProjectPropertyFromProduct();
void nonexistingProjectPropertyFromCommandLine();
+ void objC();
void projectInvalidation();
void projectLocking();
+ void projectWithPropertiesItem();
+ void propertiesBlocks();
+ void rc();
void references();
+ void renameProduct();
+ void renameTargetArtifact();
+ void removeFileDependency();
+ void resolveProject();
+ void resolveProject_data();
+ void resolveProjectDryRun();
+ void resolveProjectDryRun_data();
+ void softDependency();
void sourceFileInBuildDir();
+ void subProjects();
+ void trackAddQObjectHeader();
+ void trackRemoveQObjectHeader();
+ void transformers();
+ void typeChange();
+ void uic();
private:
- qbs::SetupProjectParameters defaultSetupParameters() const;
+ qbs::SetupProjectParameters defaultSetupParameters(const QString &projectFilePath) const;
+ qbs::ErrorInfo doBuildProject(const QString &projectFilePath,
+ QObject *buildDescriptionReceiver = 0,
+ QObject *procResultReceiver = 0,
+ QObject *taskReceiver = 0,
+ const qbs::BuildOptions &options = qbs::BuildOptions());
LogSink * const m_logSink;
const QString m_sourceDataDir;
diff --git a/tests/auto/auto.pri b/tests/auto/auto.pri
index 979efe8ad..fe7d58a98 100644
--- a/tests/auto/auto.pri
+++ b/tests/auto/auto.pri
@@ -6,6 +6,7 @@ INCLUDEPATH += $$PWD/../../src
QT = core script testlib
CONFIG += depend_includepath testcase console
CONFIG -= app_bundle
+CONFIG += c++11
target.CONFIG += no_default_install
include(../../src/lib/corelib/use_corelib.pri)
diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro
index 823bd3e49..d1d7da652 100644
--- a/tests/auto/auto.pro
+++ b/tests/auto/auto.pro
@@ -1,7 +1,6 @@
TEMPLATE=subdirs
-CONFIG += ordered
-all_tests {
+qbs_enable_unit_tests {
SUBDIRS += \
buildgraph \
language \
diff --git a/tests/auto/autotest.qbs b/tests/auto/autotest.qbs
deleted file mode 100644
index 8c802df98..000000000
--- a/tests/auto/autotest.qbs
+++ /dev/null
@@ -1,21 +0,0 @@
-import qbs
-
-QtApplication {
- type: "application"
- property string testName
- name: "tst_" + testName
- Depends { name: "Qt.test" }
- Depends { name: "qbscore" }
- cpp.includePaths: path + "/../../src"
- destinationDirectory: "bin"
- Group {
- name: "logging"
- prefix: path + "/../../src/app/shared/logging/"
- files: [
- "coloredoutput.cpp",
- "coloredoutput.h",
- "consolelogger.cpp",
- "consolelogger.h"
- ]
- }
-}
diff --git a/tests/auto/blackbox/blackbox.qbs b/tests/auto/blackbox/blackbox.qbs
index 7b7a31635..271ccb516 100644
--- a/tests/auto/blackbox/blackbox.qbs
+++ b/tests/auto/blackbox/blackbox.qbs
@@ -1,7 +1,8 @@
-import "../autotest.qbs" as AutoTest
+import qbs 1.0
-AutoTest {
+QbsAutotest {
testName: "blackbox"
+ Depends { name: "qbs_app" }
files: ["../shared.h", "tst_blackbox.h", "tst_blackbox.cpp", ]
cpp.defines: base.concat(['SRCDIR="' + path + '"'])
}
diff --git a/tests/auto/blackbox/testdata/android/android-project.qbs b/tests/auto/blackbox/testdata/android/android-project.qbs
new file mode 100644
index 000000000..c16c2a390
--- /dev/null
+++ b/tests/auto/blackbox/testdata/android/android-project.qbs
@@ -0,0 +1,90 @@
+import qbs
+
+Project {
+ property stringList architectures: ["arm64-v8a", "armeabi-v7a-hard", "x86_64", "mips"]
+ StaticLibrary {
+ architectures: project.architectures
+ name: "native-glue"
+ Group {
+ id: glue_sources
+ prefix: Android.ndk.ndkDir + "/sources/android/native_app_glue/"
+ files: ["*.c", "*.h"]
+ }
+
+ Export {
+ Depends { name: "cpp" }
+ cpp.includePaths: [glue_sources.prefix]
+ cpp.dynamicLibraries: ["log"]
+ }
+ }
+
+ StaticLibrary {
+ architectures: project.architectures
+ name: "ndk-helper"
+ Depends { name: "native-glue" }
+
+ Group {
+ id: ndkhelper_sources
+ prefix: Android.ndk.ndkDir + "/sources/android/ndk_helper/"
+ files: ["*.c", "*.cpp", "*.h"]
+ }
+ Android.ndk.appStl: "stlport_shared"
+
+ Export {
+ Depends { name: "cpp" }
+ cpp.includePaths: [ndkhelper_sources.prefix]
+ cpp.dynamicLibraries: ["log", "android", "EGL", "GLESv2"]
+ }
+ }
+
+ StaticLibrary {
+ architectures: project.architectures
+ name: "cpufeatures"
+ Group {
+ id: cpufeatures_sources
+ prefix: Android.ndk.ndkDir + "/sources/android/cpufeatures/"
+ files: ["*.c", "*.h"]
+ }
+
+ Export {
+ Depends { name: "cpp" }
+ cpp.includePaths: [cpufeatures_sources.prefix]
+ cpp.dynamicLibraries: ["dl"]
+ }
+ }
+
+ DynamicLibrary {
+ name: "TeapotNativeActivity"
+ architectures: project.architectures
+ Depends { name: "cpufeatures" }
+ Depends { name: "native-glue" }
+ Depends { name: "ndk-helper" }
+
+ Group {
+ name: "C++ sources"
+ prefix: Android.ndk.ndkDir + "/samples/Teapot/jni/"
+ files: [
+ "TeapotNativeActivity.cpp",
+ "TeapotRenderer.cpp",
+ "TeapotRenderer.h",
+ "teapot.inl",
+ ]
+ }
+
+ FileTagger { patterns: ["*.inl"]; fileTags: ["hpp"] }
+
+ Android.ndk.appStl: "stlport_shared"
+ cpp.dynamicLibraries: ["log", "android", "EGL", "GLESv2"]
+ cpp.useRPaths: false
+ }
+
+ AndroidApk {
+ name: "com.sample.teapot"
+ property string sourcesPrefix: Android.sdk.ndkDir + "/samples/Teapot"
+
+ resourcesDir: sourcesPrefix + "/res"
+ sourcesDir: sourcesPrefix + "/java"
+ manifestFile: sourcesPrefix + "/AndroidManifest.xml"
+ Depends { productTypes: ["android.nativelibrary"] }
+ }
+}
diff --git a/tests/auto/blackbox/testdata/archiver/archivable.qbs b/tests/auto/blackbox/testdata/archiver/archivable.qbs
new file mode 100644
index 000000000..d6a8e048d
--- /dev/null
+++ b/tests/auto/blackbox/testdata/archiver/archivable.qbs
@@ -0,0 +1,13 @@
+import qbs
+
+Product {
+ name: "archivable"
+ type: "archiver.archive"
+ Depends { name: "archiver" }
+ archiver.workingDirectory: path
+ Group {
+ files: ["list.txt"]
+ fileTags: ["archiver.input-list"]
+ }
+ files: ["test.txt"]
+}
diff --git a/tests/auto/blackbox/testdata/archiver/list.txt b/tests/auto/blackbox/testdata/archiver/list.txt
new file mode 100644
index 000000000..e300f8e23
--- /dev/null
+++ b/tests/auto/blackbox/testdata/archiver/list.txt
@@ -0,0 +1,2 @@
+test.txt
+archivable.qbs
diff --git a/tests/auto/blackbox/testdata/archiver/test.txt b/tests/auto/blackbox/testdata/archiver/test.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/auto/blackbox/testdata/archiver/test.txt
diff --git a/tests/auto/blackbox/testdata/build-directories/project.qbs b/tests/auto/blackbox/testdata/build-directories/project.qbs
index 4d2758527..ef4947d61 100644
--- a/tests/auto/blackbox/testdata/build-directories/project.qbs
+++ b/tests/auto/blackbox/testdata/build-directories/project.qbs
@@ -24,7 +24,7 @@ Project {
type: "blubb2"
Depends { name: "p1" }
Rule {
- usings: "blubb1"
+ inputsFromDependencies: "blubb1"
Artifact {
filePath: "dummy2.txt"
fileTags: product.type
diff --git a/tests/auto/blackbox/testdata/changed-files/project.qbs b/tests/auto/blackbox/testdata/changed-files/project.qbs
index 82411a659..dd222479f 100644
--- a/tests/auto/blackbox/testdata/changed-files/project.qbs
+++ b/tests/auto/blackbox/testdata/changed-files/project.qbs
@@ -3,6 +3,7 @@ import qbs.TextFile
CppApplication {
type: ["application", "stuff"]
+ consoleApplication: true
files: ["file1.cpp", "file2.cpp", "main.cpp"]
Rule {
diff --git a/tests/auto/blackbox/testdata/clean/clean.qbs b/tests/auto/blackbox/testdata/clean/clean.qbs
index 26684160f..cf16e7c85 100644
--- a/tests/auto/blackbox/testdata/clean/clean.qbs
+++ b/tests/auto/blackbox/testdata/clean/clean.qbs
@@ -7,10 +7,11 @@ Project {
version: "1.1.0"
name: "dep"
files: "dep.cpp"
+ bundle.isBundle: false
}
CppApplication {
- type: "application"
+ consoleApplication: true
name: "app"
Depends { name: "dep" }
files: "main.cpp"
diff --git a/tests/auto/blackbox/testdata/dependenciesProperty/dependenciesProperty.qbs b/tests/auto/blackbox/testdata/dependenciesProperty/dependenciesProperty.qbs
index 836463379..d924e73ff 100644
--- a/tests/auto/blackbox/testdata/dependenciesProperty/dependenciesProperty.qbs
+++ b/tests/auto/blackbox/testdata/dependenciesProperty/dependenciesProperty.qbs
@@ -29,6 +29,7 @@ Project {
}
Product {
type: "application"
+ consoleApplication: true
name: "product2"
property string narf: "zort"
Depends { name: "cpp" }
diff --git a/tests/auto/blackbox/testdata/dynamicRuleOutputs/before/genlexer.qbs b/tests/auto/blackbox/testdata/dynamicRuleOutputs/before/genlexer.qbs
index 3bf3d1a3e..acd587791 100644
--- a/tests/auto/blackbox/testdata/dynamicRuleOutputs/before/genlexer.qbs
+++ b/tests/auto/blackbox/testdata/dynamicRuleOutputs/before/genlexer.qbs
@@ -45,6 +45,7 @@ Project {
Product {
name: "genlexer"
type: "application"
+ consoleApplication: true
Depends { name: "cpp" }
Group {
files: ["numbers.l"]
diff --git a/tests/auto/blackbox/testdata/embedInfoPlist/embedInfoPlist.qbs b/tests/auto/blackbox/testdata/embedInfoPlist/embedInfoPlist.qbs
index 32f7f7292..83ed4b220 100644
--- a/tests/auto/blackbox/testdata/embedInfoPlist/embedInfoPlist.qbs
+++ b/tests/auto/blackbox/testdata/embedInfoPlist/embedInfoPlist.qbs
@@ -2,10 +2,10 @@ import qbs
CppApplication {
condition: qbs.targetOS.contains("darwin")
- type: ["application"]
+ bundle.isBundle: false
files: ["main.m"]
cpp.frameworks: ["Foundation"]
- cpp.infoPlist: {
+ bundle.infoPlist: {
return {
"QBS": "org.qt-project.qbs.testdata.embedInfoPlist"
};
diff --git a/tests/auto/blackbox/testdata/export-rule/blubber.cpp b/tests/auto/blackbox/testdata/export-rule/blubber.cpp
new file mode 100644
index 000000000..7688d9ab6
--- /dev/null
+++ b/tests/auto/blackbox/testdata/export-rule/blubber.cpp
@@ -0,0 +1 @@
+void justSomeFunction() {}
diff --git a/tests/auto/blackbox/testdata/export-rule/export-rule.qbs b/tests/auto/blackbox/testdata/export-rule/export-rule.qbs
new file mode 100644
index 000000000..51dd787a4
--- /dev/null
+++ b/tests/auto/blackbox/testdata/export-rule/export-rule.qbs
@@ -0,0 +1,37 @@
+import qbs
+import qbs.File
+
+Project {
+ Application {
+ name: "MyApp"
+ files: ["myapp.blubb"]
+ Depends { name: "blubber" }
+ Depends { name: "cpp" }
+ }
+ StaticLibrary {
+ name: "blubber"
+ files: ["blubber.cpp"]
+ Depends { name: "cpp" }
+ Export {
+ FileTagger {
+ patterns: ["*.blubb"]
+ fileTags: ["blubb"]
+ }
+ Rule {
+ inputs: ["blubb"]
+ Artifact {
+ filePath: input.completeBaseName + ".cpp"
+ fileTags: ["cpp"]
+ }
+ prepare: {
+ var cmd = new JavaScriptCommand();
+ cmd.description = "Creating C++ source file.";
+ cmd.sourceCode = function() {
+ File.copy(input.filePath, output.filePath);
+ }
+ return [cmd];
+ }
+ }
+ }
+ }
+}
diff --git a/tests/auto/blackbox/testdata/export-rule/myapp.blubb b/tests/auto/blackbox/testdata/export-rule/myapp.blubb
new file mode 100644
index 000000000..ad87b5e87
--- /dev/null
+++ b/tests/auto/blackbox/testdata/export-rule/myapp.blubb
@@ -0,0 +1,8 @@
+extern void justSomeFunction();
+
+int main()
+{
+ justSomeFunction();
+ return 0;
+}
+
diff --git a/tests/auto/blackbox/testdata/fileDependencies/fileDependencies.qbs b/tests/auto/blackbox/testdata/fileDependencies/fileDependencies.qbs
index 0fc6590cc..662879ccb 100644
--- a/tests/auto/blackbox/testdata/fileDependencies/fileDependencies.qbs
+++ b/tests/auto/blackbox/testdata/fileDependencies/fileDependencies.qbs
@@ -3,6 +3,7 @@ import qbs 1.0
Project {
Product {
type: "application"
+ consoleApplication: true
name: "myapp"
Depends { name: "cpp" }
cpp.includePaths: ["awesomelib"]
diff --git a/tests/auto/blackbox/testdata/frameworkStructure/BaseResource b/tests/auto/blackbox/testdata/frameworkStructure/BaseResource
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/auto/blackbox/testdata/frameworkStructure/BaseResource
diff --git a/tests/auto/blackbox/testdata/frameworkStructure/Widget.cpp b/tests/auto/blackbox/testdata/frameworkStructure/Widget.cpp
new file mode 100644
index 000000000..9fe07f82f
--- /dev/null
+++ b/tests/auto/blackbox/testdata/frameworkStructure/Widget.cpp
@@ -0,0 +1 @@
+int foo() { return 0; }
diff --git a/tests/auto/blackbox/testdata/frameworkStructure/Widget.h b/tests/auto/blackbox/testdata/frameworkStructure/Widget.h
new file mode 100644
index 000000000..5d5f8f0c9
--- /dev/null
+++ b/tests/auto/blackbox/testdata/frameworkStructure/Widget.h
@@ -0,0 +1 @@
+int foo();
diff --git a/tests/auto/blackbox/testdata/frameworkStructure/WidgetPrivate.h b/tests/auto/blackbox/testdata/frameworkStructure/WidgetPrivate.h
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/auto/blackbox/testdata/frameworkStructure/WidgetPrivate.h
diff --git a/tests/auto/blackbox/testdata/frameworkStructure/en.lproj/EnglishResource b/tests/auto/blackbox/testdata/frameworkStructure/en.lproj/EnglishResource
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/auto/blackbox/testdata/frameworkStructure/en.lproj/EnglishResource
diff --git a/tests/auto/blackbox/testdata/frameworkStructure/frameworkStructure.qbs b/tests/auto/blackbox/testdata/frameworkStructure/frameworkStructure.qbs
new file mode 100644
index 000000000..05a0acc4d
--- /dev/null
+++ b/tests/auto/blackbox/testdata/frameworkStructure/frameworkStructure.qbs
@@ -0,0 +1,13 @@
+import qbs
+
+Project {
+ Library {
+ Depends { name: "cpp" }
+
+ name: "Widget"
+ bundle.publicHeaders: ["Widget.h"]
+ bundle.privateHeaders: ["WidgetPrivate.h"]
+ bundle.resources: ["BaseResource", "en.lproj/EnglishResource"]
+ files: ["Widget.cpp"].concat(bundle.publicHeaders).concat(bundle.privateHeaders)
+ }
+}
diff --git a/tests/auto/blackbox/testdata/inputs-from-dependencies/file1.txt b/tests/auto/blackbox/testdata/inputs-from-dependencies/file1.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/auto/blackbox/testdata/inputs-from-dependencies/file1.txt
diff --git a/tests/auto/blackbox/testdata/inputs-from-dependencies/file2.txt b/tests/auto/blackbox/testdata/inputs-from-dependencies/file2.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/auto/blackbox/testdata/inputs-from-dependencies/file2.txt
diff --git a/tests/auto/blackbox/testdata/inputs-from-dependencies/file3.txt b/tests/auto/blackbox/testdata/inputs-from-dependencies/file3.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/auto/blackbox/testdata/inputs-from-dependencies/file3.txt
diff --git a/tests/auto/blackbox/testdata/inputs-from-dependencies/file4.txt b/tests/auto/blackbox/testdata/inputs-from-dependencies/file4.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/auto/blackbox/testdata/inputs-from-dependencies/file4.txt
diff --git a/tests/auto/blackbox/testdata/inputs-from-dependencies/project.qbs b/tests/auto/blackbox/testdata/inputs-from-dependencies/project.qbs
new file mode 100644
index 000000000..087ad9bf6
--- /dev/null
+++ b/tests/auto/blackbox/testdata/inputs-from-dependencies/project.qbs
@@ -0,0 +1,51 @@
+import qbs
+
+Project {
+ Product {
+ name: "TextFileContainer1"
+ type: "txt_container"
+ Group {
+ files: ["file1.txt", "file2.txt"]
+ fileTags: "txt"
+ }
+ }
+ Product {
+ name: "TextFileContainer2"
+ Group {
+ files: ["file3.txt"]
+ fileTags: "txt"
+ }
+ }
+ Product {
+ name: "TextFileContainer3"
+ Group {
+ files: ["file4.txt"]
+ fileTags: "txt"
+ }
+ }
+
+ Product {
+ name: "TextFileGatherer"
+ type: "printed_txt"
+ Depends { name: "TextFileContainer1" }
+ Depends { name: "TextFileContainer2" }
+ Rule {
+ inputsFromDependencies: "txt"
+ multiplex: true
+ Artifact {
+ filePath: "blubb"
+ fileTags: "printed_txt"
+ alwaysUpdated: false
+ }
+ prepare: {
+ var cmd = new JavaScriptCommand();
+ cmd.description = "Gathering text files";
+ cmd.sourceCode = function() {
+ for (i in inputs.txt)
+ print("\t" + inputs.txt[i].filePath);
+ };
+ return cmd;
+ }
+ }
+ }
+}
diff --git a/tests/auto/blackbox/testdata/installable/installable.qbs b/tests/auto/blackbox/testdata/installable/installable.qbs
new file mode 100644
index 000000000..c9d579f60
--- /dev/null
+++ b/tests/auto/blackbox/testdata/installable/installable.qbs
@@ -0,0 +1,43 @@
+import qbs
+import qbs.TextFile
+
+Project {
+ CppApplication {
+ type: ["application"]
+ name: "app"
+ Group {
+ files: ["main.cpp"]
+ qbs.install: true
+ }
+
+ Group {
+ fileTagsFilter: product.type
+ qbs.install: true
+ }
+ }
+
+ Product {
+ name: "install-list"
+ type: ["install-list"]
+ Depends { name: "app" }
+ Rule {
+ multiplex: true
+ inputsFromDependencies: ["installable"]
+ Artifact {
+ filePath: "installed-files.txt"
+ fileTags: product.type
+ }
+ prepare: {
+ var cmd = new JavaScriptCommand();
+ cmd.description = "Creating " + output.fileName;
+ cmd.sourceCode = function() {
+ var file = new TextFile(output.filePath, TextFile.WriteOnly);
+ for (var i = 0; i < inputs.installable.length; ++i)
+ file.writeLine(inputs.installable[i].filePath);
+ file.close();
+ };
+ return [cmd];
+ }
+ }
+ }
+}
diff --git a/tests/auto/blackbox/testdata/installable/main.cpp b/tests/auto/blackbox/testdata/installable/main.cpp
new file mode 100644
index 000000000..237c8ce18
--- /dev/null
+++ b/tests/auto/blackbox/testdata/installable/main.cpp
@@ -0,0 +1 @@
+int main() {}
diff --git a/tests/auto/blackbox/testdata/installed-source-files/main.cpp b/tests/auto/blackbox/testdata/installed-source-files/main.cpp
new file mode 100644
index 000000000..76e819701
--- /dev/null
+++ b/tests/auto/blackbox/testdata/installed-source-files/main.cpp
@@ -0,0 +1 @@
+int main() { return 0; }
diff --git a/tests/auto/blackbox/testdata/installed-source-files/project.qbs b/tests/auto/blackbox/testdata/installed-source-files/project.qbs
new file mode 100644
index 000000000..1aa564553
--- /dev/null
+++ b/tests/auto/blackbox/testdata/installed-source-files/project.qbs
@@ -0,0 +1,20 @@
+import qbs
+
+CppApplication {
+ consoleApplication: true
+ files: ["main.cpp"]
+ Group {
+ fileTagsFilter: ["cpp"]
+ qbs.install: true
+ }
+ Group { // this overwrites the properties of the group below
+ fileTagsFilter: ["text"]
+ qbs.install: true
+ }
+ Group {
+ files: ["readme.txt"]
+ fileTags: ["text"]
+ qbs.install: false
+ }
+}
+
diff --git a/tests/auto/blackbox/testdata/installed-source-files/readme.txt b/tests/auto/blackbox/testdata/installed-source-files/readme.txt
new file mode 100644
index 000000000..854a4b656
--- /dev/null
+++ b/tests/auto/blackbox/testdata/installed-source-files/readme.txt
@@ -0,0 +1 @@
+important information
diff --git a/tests/auto/blackbox/testdata/installed_artifact/installed_artifact.qbs b/tests/auto/blackbox/testdata/installed_artifact/installed_artifact.qbs
index 81562a70b..d1f9f54ea 100644
--- a/tests/auto/blackbox/testdata/installed_artifact/installed_artifact.qbs
+++ b/tests/auto/blackbox/testdata/installed_artifact/installed_artifact.qbs
@@ -3,6 +3,7 @@ import qbs 1.0
Application {
name: "installedApp"
type: "application"
+ consoleApplication: true
Depends { name: "cpp" }
Group {
files: "main.cpp"
diff --git a/tests/auto/blackbox/testdata/installpackage/installpackage.qbs b/tests/auto/blackbox/testdata/installpackage/installpackage.qbs
new file mode 100644
index 000000000..9ea561fca
--- /dev/null
+++ b/tests/auto/blackbox/testdata/installpackage/installpackage.qbs
@@ -0,0 +1,43 @@
+import qbs
+
+Project {
+ QtApplication {
+ name: "public_tool"
+ Depends { name: "mylib" }
+ files: ["main.cpp"]
+ Group {
+ fileTagsFilter: product.type
+ qbs.install: true
+ qbs.installDir: "bin"
+ }
+ }
+ QtApplication {
+ name: "internal_tool"
+ Depends { name: "mylib" }
+ files: ["main.cpp"]
+ }
+ DynamicLibrary {
+ name: "mylib"
+ Depends { name: "Qt.core" }
+ files: ["lib.cpp"]
+ Group {
+ name: "public headers"
+ files: ["lib.h"]
+ qbs.install: true
+ qbs.installDir: "include"
+ }
+ Group {
+ fileTagsFilter: product.type
+ qbs.install: true
+ qbs.installDir: "lib"
+ }
+ }
+
+ InstallPackage {
+ archiver.type: "tar"
+ builtByDefault: true
+ name: "tar-package"
+ Depends { name: "public_tool" }
+ Depends { name: "mylib" }
+ }
+}
diff --git a/tests/auto/blackbox/testdata/installpackage/lib.cpp b/tests/auto/blackbox/testdata/installpackage/lib.cpp
new file mode 100644
index 000000000..c77f9dcbd
--- /dev/null
+++ b/tests/auto/blackbox/testdata/installpackage/lib.cpp
@@ -0,0 +1,3 @@
+#include "lib.h"
+
+void f() {}
diff --git a/tests/auto/blackbox/testdata/installpackage/lib.h b/tests/auto/blackbox/testdata/installpackage/lib.h
new file mode 100644
index 000000000..5747f5496
--- /dev/null
+++ b/tests/auto/blackbox/testdata/installpackage/lib.h
@@ -0,0 +1,9 @@
+#include <QtGlobal>
+
+#ifdef MYLIB
+#define MYLIB_EXPORT Q_DECL_EXPORT
+#else
+#define MYLIB_EXPORT Q_DECL_IMPORT
+#endif
+
+MYLIB_EXPORT void f();
diff --git a/tests/auto/blackbox/testdata/installpackage/main.cpp b/tests/auto/blackbox/testdata/installpackage/main.cpp
new file mode 100644
index 000000000..718eed79a
--- /dev/null
+++ b/tests/auto/blackbox/testdata/installpackage/main.cpp
@@ -0,0 +1,6 @@
+#include "lib.h"
+
+int main()
+{
+ f();
+}
diff --git a/tests/auto/blackbox/testdata/java/Car.java b/tests/auto/blackbox/testdata/java/Car.java
new file mode 100644
index 000000000..3dfe73be3
--- /dev/null
+++ b/tests/auto/blackbox/testdata/java/Car.java
@@ -0,0 +1,7 @@
+class Car implements Vehicle
+{
+ public void go()
+ {
+ System.out.println("Driving!");
+ }
+}
diff --git a/tests/auto/blackbox/testdata/java/HelloWorld.java b/tests/auto/blackbox/testdata/java/HelloWorld.java
new file mode 100644
index 000000000..36f91d8c4
--- /dev/null
+++ b/tests/auto/blackbox/testdata/java/HelloWorld.java
@@ -0,0 +1,8 @@
+package io.qt.qbs;
+
+public class HelloWorld {
+ public static void main(String[] args)
+ {
+ System.out.println("Tach.");
+ }
+}
diff --git a/tests/auto/blackbox/testdata/java/Jet.java b/tests/auto/blackbox/testdata/java/Jet.java
new file mode 100644
index 000000000..38c00c041
--- /dev/null
+++ b/tests/auto/blackbox/testdata/java/Jet.java
@@ -0,0 +1,7 @@
+class Jet implements Vehicle
+{
+ public void go()
+ {
+ System.out.println("Flying!");
+ }
+}
diff --git a/tests/auto/blackbox/testdata/java/NoPackage.java b/tests/auto/blackbox/testdata/java/NoPackage.java
new file mode 100644
index 000000000..84045c3ae
--- /dev/null
+++ b/tests/auto/blackbox/testdata/java/NoPackage.java
@@ -0,0 +1,5 @@
+// package this.should.not.be.parsed;
+
+public class NoPackage {
+public static void doSomething() {}
+}
diff --git a/tests/auto/blackbox/testdata/java/Ship.java b/tests/auto/blackbox/testdata/java/Ship.java
new file mode 100644
index 000000000..3ecce635e
--- /dev/null
+++ b/tests/auto/blackbox/testdata/java/Ship.java
@@ -0,0 +1,12 @@
+class Ship implements Vehicle
+{
+ public boolean isInSpace;
+
+ public void go()
+ {
+ if (isInSpace)
+ System.out.println("Flying (this is a space ship)!");
+ else
+ System.out.println("Sailing!");
+ }
+}
diff --git a/tests/auto/blackbox/testdata/java/Vehicle.java b/tests/auto/blackbox/testdata/java/Vehicle.java
new file mode 100644
index 000000000..b3a0f805c
--- /dev/null
+++ b/tests/auto/blackbox/testdata/java/Vehicle.java
@@ -0,0 +1,4 @@
+interface Vehicle
+{
+ public void go();
+}
diff --git a/tests/auto/blackbox/testdata/java/Vehicles.java b/tests/auto/blackbox/testdata/java/Vehicles.java
new file mode 100644
index 000000000..e0a05ed9b
--- /dev/null
+++ b/tests/auto/blackbox/testdata/java/Vehicles.java
@@ -0,0 +1,34 @@
+import java.util.ArrayList;
+
+class Vehicles
+{
+ public static void main(String[] args)
+ {
+ ArrayList<Vehicle> vehicles = new ArrayList<Vehicle>();
+
+ for (int i = 0; i < 3; i++)
+ {
+ vehicles.add(new Car());
+ }
+
+ for (int i = 0; i < 3; i++)
+ {
+ vehicles.add(new Jet());
+ }
+
+ for (int i = 0; i < 4; i++)
+ {
+ Ship ship = new Ship();
+ ship.isInSpace = i % 2 == 0;
+ vehicles.add(ship);
+ }
+
+ for (int i = 0; i < vehicles.size(); i++)
+ {
+ vehicles.get(i).go();
+ }
+
+ // doesn't compile, must be a bug
+ // delete vehicles;
+ }
+}
diff --git a/tests/auto/blackbox/testdata/java/vehicles.qbs b/tests/auto/blackbox/testdata/java/vehicles.qbs
new file mode 100644
index 000000000..a61b03508
--- /dev/null
+++ b/tests/auto/blackbox/testdata/java/vehicles.qbs
@@ -0,0 +1,18 @@
+import qbs
+
+Project {
+ JavaClassCollection {
+ name: "class_collection"
+ java.additionalCompilerFlags: ["-Xlint:all"]
+ files: [
+ "Car.java", "HelloWorld.java", "Jet.java", "NoPackage.java", "Ship.java",
+ "Vehicle.java", "Vehicles.java"
+ ]
+ }
+
+ JavaJarFile {
+ name: "jar_file"
+ entryPoint: "Vehicles"
+ files: ["Car.java", "Jet.java", "Ship.java", "Vehicle.java", "Vehicles.java"]
+ }
+}
diff --git a/tests/auto/blackbox/testdata/jsextensions/propertylist.qbs b/tests/auto/blackbox/testdata/jsextensions/propertylist.qbs
index 8790629c2..a2898f69f 100644
--- a/tests/auto/blackbox/testdata/jsextensions/propertylist.qbs
+++ b/tests/auto/blackbox/testdata/jsextensions/propertylist.qbs
@@ -52,7 +52,7 @@ Product {
xmlfile.close();
var jsontextfile = new TextFile("test.json", TextFile.WriteOnly);
- jsontextfile.write(propertyList.toJSONString());
+ jsontextfile.write(propertyList.toJSON());
jsontextfile.close();
propertyList.writeToFile("test2.json", "json-compact");
@@ -82,14 +82,14 @@ Product {
throw "expected property list format openstep but got " + propertyList.format();
}
- var jsonObj = JSON.parse(propertyList.toJSONString());
+ var jsonObj = JSON.parse(propertyList.toJSON());
if (jsonObj["rootObject"].length != 5) {
throw "going from OpenStep to a JSON string to a JSON object somehow broke";
}
propertyList.clear();
propertyList.readFromString('<dict><key>foo</key><string>barz</string></dict>');
- jsonObj = JSON.parse(propertyList.toJSONString());
+ jsonObj = JSON.parse(propertyList.toJSON());
if (jsonObj["foo"] !== "barz") {
throw "the XML plist did not get parsed properly";
}
@@ -111,12 +111,12 @@ Product {
}
if (propertyList.toString("json") !== propertyList.toString("json-compact") ||
- propertyList.toJSONString() !== propertyList.toJSONString("compact")) {
+ propertyList.toJSON() !== propertyList.toJSON("compact")) {
throw "json and json-compact formats were not equivalent";
}
if (propertyList.toString("json") === propertyList.toString("json-pretty") ||
- propertyList.toJSONString() === propertyList.toJSONString("pretty")) {
+ propertyList.toJSON() === propertyList.toJSON("pretty")) {
throw "json and json-pretty formats were not different";
}
diff --git a/tests/auto/blackbox/testdata/non-broken-files-in-broken-product/project.qbs b/tests/auto/blackbox/testdata/non-broken-files-in-broken-product/project.qbs
index 97f1e9897..1ec764dfa 100644
--- a/tests/auto/blackbox/testdata/non-broken-files-in-broken-product/project.qbs
+++ b/tests/auto/blackbox/testdata/non-broken-files-in-broken-product/project.qbs
@@ -1,5 +1,6 @@
import qbs
CppApplication {
+ consoleApplication: true
files: ["fine.cpp", "broken.cpp"]
}
diff --git a/tests/auto/blackbox/testdata/non-default-product/main.cpp b/tests/auto/blackbox/testdata/non-default-product/main.cpp
new file mode 100644
index 000000000..237c8ce18
--- /dev/null
+++ b/tests/auto/blackbox/testdata/non-default-product/main.cpp
@@ -0,0 +1 @@
+int main() {}
diff --git a/tests/auto/blackbox/testdata/non-default-product/project.qbs b/tests/auto/blackbox/testdata/non-default-product/project.qbs
new file mode 100644
index 000000000..03ee83b6f
--- /dev/null
+++ b/tests/auto/blackbox/testdata/non-default-product/project.qbs
@@ -0,0 +1,16 @@
+import qbs
+
+Project {
+ CppApplication {
+ name: "default app"
+ consoleApplication: true
+ files: "main.cpp"
+ }
+
+ CppApplication {
+ name: "non-default app"
+ consoleApplication: true
+ builtByDefault: false
+ files: "main.cpp"
+ }
+}
diff --git a/tests/auto/blackbox/testdata/objc-arc/arc.m b/tests/auto/blackbox/testdata/objc-arc/arc.m
new file mode 100644
index 000000000..6d8e22f09
--- /dev/null
+++ b/tests/auto/blackbox/testdata/objc-arc/arc.m
@@ -0,0 +1,3 @@
+#if !__has_feature(objc_arc)
+#error Not using ARC but should be
+#endif
diff --git a/tests/auto/blackbox/testdata/objc-arc/arc.mm b/tests/auto/blackbox/testdata/objc-arc/arc.mm
new file mode 100644
index 000000000..6d8e22f09
--- /dev/null
+++ b/tests/auto/blackbox/testdata/objc-arc/arc.mm
@@ -0,0 +1,3 @@
+#if !__has_feature(objc_arc)
+#error Not using ARC but should be
+#endif
diff --git a/tests/auto/blackbox/testdata/objc-arc/main.m b/tests/auto/blackbox/testdata/objc-arc/main.m
new file mode 100644
index 000000000..071c53c9f
--- /dev/null
+++ b/tests/auto/blackbox/testdata/objc-arc/main.m
@@ -0,0 +1,4 @@
+#if __has_feature(objc_arc)
+#error Using ARC but shouldn't be
+#endif
+int main() { return 0; }
diff --git a/tests/auto/blackbox/testdata/objc-arc/mrc.m b/tests/auto/blackbox/testdata/objc-arc/mrc.m
new file mode 100644
index 000000000..1d907b5bf
--- /dev/null
+++ b/tests/auto/blackbox/testdata/objc-arc/mrc.m
@@ -0,0 +1,3 @@
+#if __has_feature(objc_arc)
+#error Using ARC but shouldn't be
+#endif
diff --git a/tests/auto/blackbox/testdata/objc-arc/mrc.mm b/tests/auto/blackbox/testdata/objc-arc/mrc.mm
new file mode 100644
index 000000000..1d907b5bf
--- /dev/null
+++ b/tests/auto/blackbox/testdata/objc-arc/mrc.mm
@@ -0,0 +1,3 @@
+#if __has_feature(objc_arc)
+#error Using ARC but shouldn't be
+#endif
diff --git a/tests/auto/blackbox/testdata/objc-arc/objc-arc.qbs b/tests/auto/blackbox/testdata/objc-arc/objc-arc.qbs
new file mode 100644
index 000000000..ee2cf6f6b
--- /dev/null
+++ b/tests/auto/blackbox/testdata/objc-arc/objc-arc.qbs
@@ -0,0 +1,21 @@
+import qbs
+
+Product {
+ Depends { name: "cpp" }
+ consoleApplication: true
+ type: ["application"]
+ condition: qbs.targetOS.contains("darwin")
+
+ Group {
+ cpp.automaticReferenceCounting: true
+ files: ["arc.m", "arc.mm"]
+ }
+
+ Group {
+ cpp.automaticReferenceCounting: false
+ files: ["mrc.m", "mrc.mm"]
+ }
+
+ files: "main.m"
+ cpp.minimumOsxVersion: "10.6"
+}
diff --git a/tests/auto/blackbox/testdata/overrideProjectProperties/helper_lib.qbs b/tests/auto/blackbox/testdata/overrideProjectProperties/helper_lib.qbs
index 9b14bd42a..16c68064e 100644
--- a/tests/auto/blackbox/testdata/overrideProjectProperties/helper_lib.qbs
+++ b/tests/auto/blackbox/testdata/overrideProjectProperties/helper_lib.qbs
@@ -4,4 +4,5 @@ DynamicLibrary {
name: "helperLib"
files: "helperlib.cpp"
Depends { name: "cpp" }
+ bundle.isBundle: false
}
diff --git a/tests/auto/blackbox/testdata/overrideProjectProperties/project.qbs b/tests/auto/blackbox/testdata/overrideProjectProperties/project.qbs
index acfceec85..a0e934a21 100644
--- a/tests/auto/blackbox/testdata/overrideProjectProperties/project.qbs
+++ b/tests/auto/blackbox/testdata/overrideProjectProperties/project.qbs
@@ -6,6 +6,7 @@ Project {
property int someInt
property stringList someStringList
Product {
+ consoleApplication: true
type: "application"
property string mainFile: ""
name: "MyApp" + nameSuffix
diff --git a/tests/auto/blackbox/testdata/overrideProjectProperties/project_using_helper_lib.qbs b/tests/auto/blackbox/testdata/overrideProjectProperties/project_using_helper_lib.qbs
index c1b4482f1..c61716e6e 100644
--- a/tests/auto/blackbox/testdata/overrideProjectProperties/project_using_helper_lib.qbs
+++ b/tests/auto/blackbox/testdata/overrideProjectProperties/project_using_helper_lib.qbs
@@ -4,7 +4,7 @@ Project {
property bool linkSuccessfully: false
references: linkSuccessfully ? ["helper_lib.qbs"] : []
CppApplication {
- type: "application"
+ consoleApplication: true
Depends {
condition: project.linkSuccessfully
name: "helperLib"
diff --git a/tests/auto/blackbox/testdata/product-dependencies-by-type/main.cpp b/tests/auto/blackbox/testdata/product-dependencies-by-type/main.cpp
new file mode 100644
index 000000000..237c8ce18
--- /dev/null
+++ b/tests/auto/blackbox/testdata/product-dependencies-by-type/main.cpp
@@ -0,0 +1 @@
+int main() {}
diff --git a/tests/auto/blackbox/testdata/product-dependencies-by-type/project.qbs b/tests/auto/blackbox/testdata/product-dependencies-by-type/project.qbs
new file mode 100644
index 000000000..ebfc45d3f
--- /dev/null
+++ b/tests/auto/blackbox/testdata/product-dependencies-by-type/project.qbs
@@ -0,0 +1,66 @@
+import qbs
+import qbs.TextFile
+
+Project {
+ CppApplication {
+ consoleApplication: true
+ name: "no-match"
+ files: "main.cpp"
+ }
+
+ Project {
+ CppApplication {
+ consoleApplication: true
+ name: "app1"
+ files: "main.cpp"
+ }
+ CppApplication {
+ consoleApplication: true
+ name: "app2"
+ files: "main.cpp"
+ }
+ CppApplication {
+ consoleApplication: true
+ name: "app3"
+ files: "main.cpp"
+ }
+
+ DynamicLibrary {
+ Depends { name: "cpp" }
+ name: "lib-product"
+ files: "main.cpp"
+ bundle.isBundle: false
+ }
+
+ CppApplication {
+ type: base.concat(["app-list"])
+ consoleApplication: true
+ name: "app list"
+ Depends {
+ productTypes: ["application"]
+ limitToSubProject: true
+ }
+ files: ["main.cpp"]
+
+ Rule {
+ multiplex: true
+ inputsFromDependencies: "application"
+ Artifact {
+ filePath: "app-list.txt"
+ fileTags: "app-list"
+ }
+ prepare: {
+ var cmd = new JavaScriptCommand();
+ cmd.description = "Collecting apps";
+ cmd.sourceCode = function() {
+ var file = new TextFile(output.filePath, TextFile.WriteOnly);
+ for (var i = 0; i < inputs["application"].length; ++i)
+ file.writeLine(inputs["application"][i].filePath);
+ file.close();
+ };
+ return cmd;
+ }
+ }
+ }
+ }
+}
diff --git a/tests/auto/blackbox/testdata/productproperties/app.qbs b/tests/auto/blackbox/testdata/productproperties/app.qbs
index 08334e791..405d08adb 100644
--- a/tests/auto/blackbox/testdata/productproperties/app.qbs
+++ b/tests/auto/blackbox/testdata/productproperties/app.qbs
@@ -1,6 +1,7 @@
import qbs 1.0
Product {
+ consoleApplication: true
type: "application"
name: "blubb_user"
diff --git a/tests/auto/blackbox/testdata/proper quoting/proper quoting.qbs b/tests/auto/blackbox/testdata/proper quoting/proper quoting.qbs
index c1db3c1b2..7f716996f 100644
--- a/tests/auto/blackbox/testdata/proper quoting/proper quoting.qbs
+++ b/tests/auto/blackbox/testdata/proper quoting/proper quoting.qbs
@@ -3,6 +3,7 @@ import qbs 1.0
Project {
Product {
type: "application"
+ consoleApplication: true
name: "Hello World"
files : [ "main.cpp" ]
Depends { name: "cpp" }
diff --git a/tests/auto/blackbox/testdata/propertyChanges/project.qbs b/tests/auto/blackbox/testdata/propertyChanges/project.qbs
index 02c9633db..a2a96d417 100644
--- a/tests/auto/blackbox/testdata/propertyChanges/project.qbs
+++ b/tests/auto/blackbox/testdata/propertyChanges/project.qbs
@@ -24,6 +24,7 @@ Project {
name: "library"
Depends { name: "Qt.core" }
files: "lib.cpp"
+ bundle.isBundle: false
}
Product {
diff --git a/tests/auto/blackbox/testdata/qml-debugging/project.qbs b/tests/auto/blackbox/testdata/qml-debugging/project.qbs
index 317dd940d..3606b4aa3 100644
--- a/tests/auto/blackbox/testdata/qml-debugging/project.qbs
+++ b/tests/auto/blackbox/testdata/qml-debugging/project.qbs
@@ -2,7 +2,7 @@ import qbs
QtApplication {
name: "debuggable-app"
- type: "application"
+ consoleApplication: true
Depends { name: "Qt.quick" }
Qt.quick.qmlDebugging: true
files: "main.cpp"
diff --git a/tests/auto/blackbox/testdata/qobject-in-mm/main.mm b/tests/auto/blackbox/testdata/qobject-in-mm/main.mm
new file mode 100644
index 000000000..40c464b88
--- /dev/null
+++ b/tests/auto/blackbox/testdata/qobject-in-mm/main.mm
@@ -0,0 +1,13 @@
+#include <QObject>
+
+class Foo : public QObject
+{
+Q_OBJECT
+};
+
+int main()
+{
+ Foo foo;
+ return 0;
+}
+#include "main.moc"
diff --git a/tests/auto/blackbox/testdata/qobject-in-mm/project.qbs b/tests/auto/blackbox/testdata/qobject-in-mm/project.qbs
new file mode 100644
index 000000000..2f819d012
--- /dev/null
+++ b/tests/auto/blackbox/testdata/qobject-in-mm/project.qbs
@@ -0,0 +1,6 @@
+import qbs
+
+CppApplication {
+ Depends { name: "Qt.core" }
+ files: ["main.mm"]
+}
diff --git a/tests/auto/blackbox/testdata/qrc/i.qbs b/tests/auto/blackbox/testdata/qrc/i.qbs
index 46414a066..67b836dd4 100644
--- a/tests/auto/blackbox/testdata/qrc/i.qbs
+++ b/tests/auto/blackbox/testdata/qrc/i.qbs
@@ -2,6 +2,7 @@ import qbs 1.0
Project {
Product {
+ consoleApplication: true
type: "application"
name: "i"
diff --git a/tests/auto/blackbox/testdata/ruleConditions/templates/zorduct.qbs b/tests/auto/blackbox/testdata/ruleConditions/templates/zorduct.qbs
index c36e00850..8f19a5a6d 100644
--- a/tests/auto/blackbox/testdata/ruleConditions/templates/zorduct.qbs
+++ b/tests/auto/blackbox/testdata/ruleConditions/templates/zorduct.qbs
@@ -2,6 +2,7 @@ import qbs 1.0
Product {
type: ["application", "zort"]
+ consoleApplication: true
Depends { name: "cpp" }
Depends { name: "narfzort" }
files: [
diff --git a/tests/auto/blackbox/testdata/separate-debug-info/foo.cpp b/tests/auto/blackbox/testdata/separate-debug-info/foo.cpp
new file mode 100644
index 000000000..f04755bee
--- /dev/null
+++ b/tests/auto/blackbox/testdata/separate-debug-info/foo.cpp
@@ -0,0 +1,7 @@
+#if defined(_WIN32) || defined(WIN32)
+# define EXPORT __declspec(dllexport)
+#else
+# define EXPORT
+#endif
+
+EXPORT int getAnswer() { return 42; }
diff --git a/tests/auto/blackbox/testdata/separate-debug-info/main.cpp b/tests/auto/blackbox/testdata/separate-debug-info/main.cpp
new file mode 100644
index 000000000..76e819701
--- /dev/null
+++ b/tests/auto/blackbox/testdata/separate-debug-info/main.cpp
@@ -0,0 +1 @@
+int main() { return 0; }
diff --git a/tests/auto/blackbox/testdata/separate-debug-info/project.qbs b/tests/auto/blackbox/testdata/separate-debug-info/project.qbs
new file mode 100644
index 000000000..0b87074c3
--- /dev/null
+++ b/tests/auto/blackbox/testdata/separate-debug-info/project.qbs
@@ -0,0 +1,30 @@
+import qbs
+
+Project {
+ CppApplication {
+ name: "app1"
+ type: ["application"]
+ files: ["main.cpp"]
+ cpp.separateDebugInformation: true
+ }
+ DynamicLibrary {
+ Depends { name: "cpp" }
+ name: "foo1"
+ type: ["dynamiclibrary"]
+ files: ["foo.cpp"]
+ cpp.separateDebugInformation: true
+ }
+ CppApplication {
+ name: "app2"
+ type: ["application"]
+ files: ["main.cpp"]
+ cpp.separateDebugInformation: false
+ }
+ DynamicLibrary {
+ Depends { name: "cpp" }
+ name: "foo2"
+ type: ["dynamiclibrary"]
+ files: ["foo.cpp"]
+ cpp.separateDebugInformation: false
+ }
+}
diff --git a/tests/auto/blackbox/testdata/subprofile-change-tracking/main1.cpp b/tests/auto/blackbox/testdata/subprofile-change-tracking/main1.cpp
new file mode 100644
index 000000000..237c8ce18
--- /dev/null
+++ b/tests/auto/blackbox/testdata/subprofile-change-tracking/main1.cpp
@@ -0,0 +1 @@
+int main() {}
diff --git a/tests/auto/blackbox/testdata/subprofile-change-tracking/main2.cpp b/tests/auto/blackbox/testdata/subprofile-change-tracking/main2.cpp
new file mode 100644
index 000000000..237c8ce18
--- /dev/null
+++ b/tests/auto/blackbox/testdata/subprofile-change-tracking/main2.cpp
@@ -0,0 +1 @@
+int main() {}
diff --git a/tests/auto/blackbox/testdata/subprofile-change-tracking/subprofile-change-tracking.qbs b/tests/auto/blackbox/testdata/subprofile-change-tracking/subprofile-change-tracking.qbs
new file mode 100644
index 000000000..4805c5272
--- /dev/null
+++ b/tests/auto/blackbox/testdata/subprofile-change-tracking/subprofile-change-tracking.qbs
@@ -0,0 +1,9 @@
+import qbs
+
+Project {
+ CppApplication { files: ["main1.cpp"] }
+ CppApplication {
+ profiles: ["qbs-autotests-subprofile"]
+ files: ["main2.cpp"]
+ }
+}
diff --git a/tests/auto/blackbox/testdata/trackAddFile/after/project.qbs b/tests/auto/blackbox/testdata/trackAddFile/after/project.qbs
index 747669d90..469aff097 100644
--- a/tests/auto/blackbox/testdata/trackAddFile/after/project.qbs
+++ b/tests/auto/blackbox/testdata/trackAddFile/after/project.qbs
@@ -4,6 +4,7 @@ Project {
Product {
name: 'someapp'
type: 'application'
+ consoleApplication: true
Depends { name: 'cpp' }
files: [
"main.cpp",
diff --git a/tests/auto/blackbox/testdata/trackAddFile/before/project.qbs b/tests/auto/blackbox/testdata/trackAddFile/before/project.qbs
index 0233020c2..fc647cdbe 100644
--- a/tests/auto/blackbox/testdata/trackAddFile/before/project.qbs
+++ b/tests/auto/blackbox/testdata/trackAddFile/before/project.qbs
@@ -4,6 +4,7 @@ Project {
Product {
name: 'someapp'
type: 'application'
+ consoleApplication: true
Depends { name: 'cpp' }
files: [ "main.cpp", "narf.h", "narf.cpp" ]
}
diff --git a/tests/auto/blackbox/testdata/trackFileTags/after/project.qbs b/tests/auto/blackbox/testdata/trackFileTags/after/project.qbs
index e173d5fb2..c0e5c4715 100644
--- a/tests/auto/blackbox/testdata/trackFileTags/after/project.qbs
+++ b/tests/auto/blackbox/testdata/trackFileTags/after/project.qbs
@@ -5,6 +5,7 @@ Project {
Product {
name: 'someapp'
type: 'application'
+ consoleApplication: true
Depends { name: 'cpp' }
Group {
files: [ "main.cpp" ]
diff --git a/tests/auto/blackbox/testdata/trackFileTags/before/project.qbs b/tests/auto/blackbox/testdata/trackFileTags/before/project.qbs
index 521bf528d..7ac895c5f 100644
--- a/tests/auto/blackbox/testdata/trackFileTags/before/project.qbs
+++ b/tests/auto/blackbox/testdata/trackFileTags/before/project.qbs
@@ -5,6 +5,7 @@ Project {
Product {
name: 'someapp'
type: 'application'
+ consoleApplication: true
Depends { name: 'cpp' }
Group {
files: [ "main.cpp" ]
diff --git a/tests/auto/blackbox/testdata/trackProducts/after/product3.qbs b/tests/auto/blackbox/testdata/trackProducts/after/product3.qbs
index cee4a5923..4dac755c0 100644
--- a/tests/auto/blackbox/testdata/trackProducts/after/product3.qbs
+++ b/tests/auto/blackbox/testdata/trackProducts/after/product3.qbs
@@ -3,5 +3,6 @@ import qbs 1.0
Product {
Depends { name: "cpp" }
type: "application"
+ consoleApplication: true
files: ["zoo.cpp"]
}
diff --git a/tests/auto/blackbox/testdata/trackProducts/before/product1.qbs b/tests/auto/blackbox/testdata/trackProducts/before/product1.qbs
index 876c08dfa..60e8b0924 100644
--- a/tests/auto/blackbox/testdata/trackProducts/before/product1.qbs
+++ b/tests/auto/blackbox/testdata/trackProducts/before/product1.qbs
@@ -3,5 +3,6 @@ import qbs 1.0
Product {
Depends { name: "cpp" }
type: "application"
+ consoleApplication: true
files: ["foo.cpp"]
}
diff --git a/tests/auto/blackbox/testdata/trackProducts/before/product2.qbs b/tests/auto/blackbox/testdata/trackProducts/before/product2.qbs
index 810f9969d..5490b8844 100644
--- a/tests/auto/blackbox/testdata/trackProducts/before/product2.qbs
+++ b/tests/auto/blackbox/testdata/trackProducts/before/product2.qbs
@@ -3,5 +3,6 @@ import qbs 1.0
Product {
Depends { name: "cpp" }
type: "application"
+ consoleApplication: true
files: ["bar.cpp"]
}
diff --git a/tests/auto/blackbox/testdata/trackQObjChange/i.qbs b/tests/auto/blackbox/testdata/trackQObjChange/i.qbs
index 381c63bcf..c18fab086 100644
--- a/tests/auto/blackbox/testdata/trackQObjChange/i.qbs
+++ b/tests/auto/blackbox/testdata/trackQObjChange/i.qbs
@@ -3,6 +3,7 @@ import qbs 1.0
Project {
Product {
type: "application"
+ consoleApplication: true
name: "i"
Depends {
diff --git a/tests/auto/blackbox/testdata/usings-as-sole-inputs-non-multiplexed/project.qbs b/tests/auto/blackbox/testdata/usings-as-sole-inputs-non-multiplexed/project.qbs
index 899b4445f..7d4087620 100644
--- a/tests/auto/blackbox/testdata/usings-as-sole-inputs-non-multiplexed/project.qbs
+++ b/tests/auto/blackbox/testdata/usings-as-sole-inputs-non-multiplexed/project.qbs
@@ -43,7 +43,7 @@ Project {
Depends { name: "p1" }
Depends { name: "p2" }
Rule {
- usings: "custom"
+ inputsFromDependencies: "custom"
Artifact {
filePath: FileInfo.fileName(input.filePath) + ".plus"
fileTags: "custom-plus"
diff --git a/tests/auto/blackbox/tst_blackbox.cpp b/tests/auto/blackbox/tst_blackbox.cpp
index 4bb6c5858..8b2460481 100644
--- a/tests/auto/blackbox/tst_blackbox.cpp
+++ b/tests/auto/blackbox/tst_blackbox.cpp
@@ -55,18 +55,6 @@ using qbs::Internal::removeDirectoryWithContents;
using qbs::Profile;
using qbs::Settings;
-static bool regularFileExists(const QString &filePath)
-{
- const QFileInfo fi(filePath);
- return fi.exists() && fi.isFile();
-}
-
-static bool directoryExists(const QString &dirPath)
-{
- const QFileInfo fi(dirPath);
- return fi.exists() && fi.isDir();
-}
-
static QString initQbsExecutableFilePath()
{
QString filePath = QCoreApplication::applicationDirPath() + QLatin1String("/qbs");
@@ -75,13 +63,10 @@ static QString initQbsExecutableFilePath()
}
TestBlackbox::TestBlackbox()
- : testDataDir(QCoreApplication::applicationDirPath() + "/../tests/auto/blackbox/testWorkDir"),
+ : testDataDir(testWorkDir(QStringLiteral("blackbox"))),
testSourceDir(QDir::cleanPath(SRCDIR "/testdata")),
qbsExecutableFilePath(initQbsExecutableFilePath()),
- buildProfileName(QLatin1String("qbs_autotests")),
- buildDir(buildProfileName + QLatin1String("-debug")),
- defaultInstallRoot(buildDir + QLatin1Char('/') + InstallOptions::defaultInstallRoot()),
- buildGraphPath(buildDir + QLatin1Char('/') + buildDir + QLatin1String(".bg"))
+ defaultInstallRoot(relativeBuildDir() + QLatin1Char('/') + InstallOptions::defaultInstallRoot())
{
QLocale::setDefault(QLocale::c());
}
@@ -99,7 +84,7 @@ int TestBlackbox::runQbs(const QbsRunParameters &params)
}
args << params.arguments;
if (params.useProfile)
- args.append(QLatin1String("profile:") + buildProfileName);
+ args.append(QLatin1String("profile:") + profileName());
QString cmdLine = qbsExecutableFilePath;
foreach (const QString &str, args)
cmdLine += QLatin1String(" \"") + str + QLatin1Char('"');
@@ -185,17 +170,17 @@ void TestBlackbox::initTestCase()
QVERIFY(regularFileExists(qbsExecutableFilePath));
Settings settings((QString()));
- if (!settings.profiles().contains(buildProfileName))
- QFAIL(QByteArray("The build profile '" + buildProfileName.toLocal8Bit() +
+ if (!settings.profiles().contains(profileName()))
+ QFAIL(QByteArray("The build profile '" + profileName().toLocal8Bit() +
"' could not be found. Please set it up on your machine."));
- Profile buildProfile(buildProfileName, &settings);
+ Profile buildProfile(profileName(), &settings);
QVariant qtBinPath = buildProfile.value(QLatin1String("Qt.core.binPath"));
if (!qtBinPath.isValid())
- QFAIL(QByteArray("The build profile '" + buildProfileName.toLocal8Bit() +
+ QFAIL(QByteArray("The build profile '" + profileName().toLocal8Bit() +
"' is not a valid Qt profile."));
if (!QFile::exists(qtBinPath.toString()))
- QFAIL(QByteArray("The build profile '" + buildProfileName.toLocal8Bit() +
+ QFAIL(QByteArray("The build profile '" + profileName().toLocal8Bit() +
"' points to an invalid Qt path."));
// Initialize the test data directory.
@@ -205,198 +190,118 @@ void TestBlackbox::initTestCase()
ccp(testSourceDir, testDataDir);
}
-void TestBlackbox::addedFilePersistent()
-{
- QDir::setCurrent(testDataDir + QLatin1String("/added-file-persistent"));
-
- // On the initial run, linking will fail.
- QbsRunParameters failedRunParams;
- failedRunParams.expectFailure = true;
- QVERIFY(runQbs(failedRunParams) != 0);
-
- // Add a file. qbs must schedule it for rule application on the next build.
- waitForNewTimestamp();
- QFile projectFile("project.qbs");
- QVERIFY2(projectFile.open(QIODevice::ReadWrite), qPrintable(projectFile.errorString()));
- const QByteArray originalContent = projectFile.readAll();
- QByteArray addedFileContent = originalContent;
- addedFileContent.replace("/* 'file.cpp' */", "'file.cpp'");
- projectFile.resize(0);
- projectFile.write(addedFileContent);
- projectFile.flush();
- QCOMPARE(runQbs(QbsRunParameters("resolve")), 0);
-
- // Remove the file again. qbs must unschedule the rule application again.
- // Consequently, the linking step must fail as in the initial run.
- waitForNewTimestamp();
- projectFile.resize(0);
- projectFile.write(originalContent);
- projectFile.flush();
- QVERIFY(runQbs(failedRunParams) != 0);
-
- // Add the file again. qbs must schedule it for rule application on the next build.
- waitForNewTimestamp();
- projectFile.resize(0);
- projectFile.write(addedFileContent);
- projectFile.close();
- QCOMPARE(runQbs(QbsRunParameters("resolve")), 0);
-
- // qbs must remember that a file was scheduled for rule application. The build must then
- // succeed, as now all necessary symbols are linked in.
- QCOMPARE(runQbs(), 0);
-}
-
-void TestBlackbox::addQObjectMacroToCppFile()
+static QString findExecutable(const QStringList &fileNames)
{
- QDir::setCurrent(testDataDir + QLatin1String("/add-qobject-macro-to-cpp-file"));
- QCOMPARE(runQbs(), 0);
+ const QStringList path = QString::fromLocal8Bit(qgetenv("PATH"))
+ .split(HostOsInfo::pathListSeparator(), QString::SkipEmptyParts);
- waitForNewTimestamp();
- QFile cppFile("object.cpp");
- QVERIFY2(cppFile.open(QIODevice::ReadWrite), qPrintable(cppFile.errorString()));
- QByteArray contents = cppFile.readAll();
- contents.replace("// ", "");
- cppFile.resize(0);
- cppFile.write(contents);
- cppFile.close();
- QCOMPARE(runQbs(), 0);
+ foreach (const QString &fileName, fileNames) {
+ QFileInfo fi(fileName);
+ if (fi.isAbsolute())
+ return fi.exists() ? fileName : QString();
+ foreach (const QString &ppath, path) {
+ const QString fullPath
+ = HostOsInfo::appendExecutableSuffix(ppath + QLatin1Char('/') + fileName);
+ if (QFileInfo(fullPath).exists())
+ return QDir::cleanPath(fullPath);
+ }
+ }
+ return QString();
}
-void TestBlackbox::baseProperties()
+static QString findArchiver(const QString &fileName)
{
- QDir::setCurrent(testDataDir + QLatin1String("/baseProperties"));
- QCOMPARE(runQbs(), 0);
+ QString binary = findExecutable(QStringList(fileName));
+ if (binary.isEmpty()) {
+ Settings s((QString()));
+ Profile p(profileName(), &s);
+ binary = findExecutable(p.value("archiver.command").toStringList());
+ }
+ return binary;
+}
+
+void TestBlackbox::sevenZip()
+{
+ QDir::setCurrent(testDataDir + "/archiver");
+ QString binary = findArchiver("7z");
+ if (binary.isEmpty())
+ QSKIP("7zip not found");
+ QCOMPARE(runQbs(QbsRunParameters(QStringList() << "archiver.type:7zip")), 0);
+ const QString outputFile = relativeProductBuildDir("archivable") + "/archivable.7z";
+ QVERIFY2(regularFileExists(outputFile), qPrintable(outputFile));
+ QProcess listContents;
+ listContents.start(binary, QStringList() << "t" << outputFile);
+ QVERIFY2(listContents.waitForStarted(), qPrintable(listContents.errorString()));
+ QVERIFY2(listContents.waitForFinished(), qPrintable(listContents.errorString()));
+ QVERIFY2(listContents.exitCode() == 0, listContents.readAllStandardError().constData());
+ const QByteArray output = listContents.readAllStandardOutput();
+ if (output.count("Testing") != 2)
+ qDebug("%s", output.constData());
+ QCOMPARE(output.count("Testing"), 2);
+ QVERIFY2(output.contains("test.txt"), output.constData());
+ QVERIFY2(output.contains("archivable.qbs"), output.constData());
+}
+
+void TestBlackbox::tar()
+{
+ if (HostOsInfo::hostOs() == HostOsInfo::HostOsWindows)
+ QSKIP("Beware of the msys tar");
+ if (HostOsInfo::hostOs() == HostOsInfo::HostOsOsx) {
+ // work around absurd tar behavior on OS X
+ qputenv("COPY_EXTENDED_ATTRIBUTES_DISABLE", "true");
+ qputenv("COPYFILE_DISABLE", "true");
+ }
+ QDir::setCurrent(testDataDir + "/archiver");
+ QString binary = findArchiver("tar");
+ if (binary.isEmpty())
+ QSKIP("tar not found");
+ QCOMPARE(runQbs(QbsRunParameters(QStringList() << "archiver.type:tar")), 0);
+ if (HostOsInfo::hostOs() == HostOsInfo::HostOsOsx) {
+ qunsetenv("COPY_EXTENDED_ATTRIBUTES_DISABLE");
+ qunsetenv("COPYFILE_DISABLE");
+ }
+ const QString outputFile = relativeProductBuildDir("archivable") + "/archivable.tar.gz";
+ QVERIFY2(regularFileExists(outputFile), qPrintable(outputFile));
+ QProcess listContents;
+ listContents.start(binary, QStringList() << "tf" << outputFile);
+ QVERIFY2(listContents.waitForStarted(), qPrintable(listContents.errorString()));
+ QVERIFY2(listContents.waitForFinished(), qPrintable(listContents.errorString()));
+ QVERIFY2(listContents.exitCode() == 0, listContents.readAllStandardError().constData());
+ QFile listFile("list.txt");
+ QVERIFY2(listFile.open(QIODevice::ReadOnly), qPrintable(listFile.errorString()));
+ QCOMPARE(listContents.readAllStandardOutput(), listFile.readAll());
+}
+
+void TestBlackbox::android()
+{
+ QDir::setCurrent(testDataDir + "/android");
+ Settings s((QString()));
+ Profile p("qbs_autotests-android", &s);
+ if (!p.exists() || !p.value("Android.sdk.ndkDir").isValid())
+ QSKIP("No suitable Android test profile");
+ QbsRunParameters params(QStringList("profile:" + p.name())
+ << "Android.ndk.platform:android-21");
+ params.useProfile = false;
+ QCOMPARE(runQbs(params), 0);
+ QVERIFY(m_qbsStdout.contains("Creating com.sample.teapot.apk"));
}
void TestBlackbox::buildDirectories()
{
const QString projectDir
= QDir::cleanPath(testDataDir + QLatin1String("/build-directories"));
- const QString projectBuildDir = projectDir + '/' + buildDir;
+ const QString projectBuildDir = projectDir + '/' + relativeBuildDir();
QDir::setCurrent(projectDir);
QCOMPARE(runQbs(QStringList("-qq")), 0);
const QStringList outputLines
= QString::fromLocal8Bit(m_qbsStderr.trimmed()).split('\n', QString::SkipEmptyParts);
QCOMPARE(outputLines.count(), 4);
- QCOMPARE(outputLines.at(0).trimmed(), projectDir + '/' + productBuildDir("p1"));
- QCOMPARE(outputLines.at(1).trimmed(), projectDir + '/' + productBuildDir("p2"));
+ QCOMPARE(outputLines.at(0).trimmed(), projectDir + '/' + relativeProductBuildDir("p1"));
+ QCOMPARE(outputLines.at(1).trimmed(), projectDir + '/' + relativeProductBuildDir("p2"));
QCOMPARE(outputLines.at(2).trimmed(), projectBuildDir);
QCOMPARE(outputLines.at(3).trimmed(), projectDir);
}
-void TestBlackbox::build_project_data()
-{
- QTest::addColumn<QString>("projectSubDir");
- QTest::addColumn<QString>("productFileName");
- QTest::newRow("BPs in Sources")
- << QString("buildproperties_source")
- << executableFilePath("HelloWorld");
- QTest::newRow("code generator")
- << QString("codegen")
- << executableFilePath("codegen");
- QTest::newRow("link static libs")
- << QString("link_staticlib")
- << executableFilePath("HelloWorld");
- QTest::newRow("precompiled header")
- << QString("precompiledHeader")
- << executableFilePath("MyApp");
- QTest::newRow("lots of dots")
- << QString("lotsofdots")
- << executableFilePath("lots.of.dots");
- QTest::newRow("Qt5 plugin")
- << QString("qt5plugin")
- << productBuildDir("echoplugin") + '/' + HostOsInfo::dynamicLibraryName("echoplugin");
- QTest::newRow("Q_OBJECT in source")
- << QString("moc_cpp")
- << executableFilePath("moc_cpp");
- QTest::newRow("Q_OBJECT in header")
- << QString("moc_hpp")
- << executableFilePath("moc_hpp");
- QTest::newRow("Q_OBJECT in header, moc_XXX.cpp included")
- << QString("moc_hpp_included")
- << executableFilePath("moc_hpp_included");
- QTest::newRow("app and lib with same source file")
- << QString("lib_samesource")
- << executableFilePath("HelloWorldApp");
- QTest::newRow("source files with the same base name but different extensions")
- << QString("sameBaseName")
- << executableFilePath("basename");
- QTest::newRow("static library dependencies")
- << QString("staticLibDeps")
- << executableFilePath("staticLibDeps");
- QTest::newRow("simple probes")
- << QString("simpleProbe")
- << executableFilePath("MyApp");
- QTest::newRow("application without sources")
- << QString("appWithoutSources")
- << executableFilePath("appWithoutSources");
- QTest::newRow("QBS-728")
- << QString("QBS-728")
- << QString();
-}
-
-void TestBlackbox::build_project()
-{
- QFETCH(QString, projectSubDir);
- QFETCH(QString, productFileName);
- if (!projectSubDir.startsWith('/'))
- projectSubDir.prepend('/');
- QVERIFY2(QFile::exists(testDataDir + projectSubDir), qPrintable(testDataDir + projectSubDir));
- QDir::setCurrent(testDataDir + projectSubDir);
- rmDirR(buildDir);
-
- QCOMPARE(runQbs(), 0);
- QVERIFY(regularFileExists(buildGraphPath));
- if (!productFileName.isEmpty()) {
- QVERIFY2(regularFileExists(productFileName), qPrintable(productFileName));
- QVERIFY2(QFile::remove(productFileName), qPrintable(productFileName));
- }
- waitForNewTimestamp();
- QCOMPARE(runQbs(QbsRunParameters(QStringList("--check-timestamps"))), 0);
- if (!productFileName.isEmpty())
- QVERIFY2(regularFileExists(productFileName), qPrintable(productFileName));
- QVERIFY(regularFileExists(buildGraphPath));
-}
-
-void TestBlackbox::build_project_dry_run_data()
-{
- build_project_data();
-}
-
-void TestBlackbox::build_project_dry_run()
-{
- QFETCH(QString, projectSubDir);
- QFETCH(QString, productFileName);
- if (!projectSubDir.startsWith('/'))
- projectSubDir.prepend('/');
- QVERIFY2(QFile::exists(testDataDir + projectSubDir), qPrintable(testDataDir + projectSubDir));
- QDir::setCurrent(testDataDir + projectSubDir);
- rmDirR(buildDir);
-
- QCOMPARE(runQbs(QbsRunParameters(QStringList("-n"))), 0);
- const QStringList &buildDirContents
- = QDir(buildDir).entryList(QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs);
- QVERIFY2(buildDirContents.isEmpty(), qPrintable(buildDirContents.join(" ")));
-}
-
-void TestBlackbox::changeDependentLib()
-{
- QDir::setCurrent(testDataDir + "/change-dependent-lib");
- QCOMPARE(runQbs(), 0);
- waitForNewTimestamp();
- const QString qbsFileName("change-dependent-lib.qbs");
- QFile qbsFile(qbsFileName);
- QVERIFY(qbsFile.open(QIODevice::ReadWrite));
- const QByteArray content1 = qbsFile.readAll();
- QByteArray content2 = content1;
- content2.replace("cpp.defines: [\"XXXX\"]", "cpp.defines: [\"ABCD\"]");
- QVERIFY(content1 != content2);
- qbsFile.seek(0);
- qbsFile.write(content2);
- qbsFile.close();
- QCOMPARE(runQbs(), 0);
-}
-
void TestBlackbox::changedFiles_data()
{
QTest::addColumn<bool>("useChangedFilesForInitialBuild");
@@ -409,7 +314,7 @@ void TestBlackbox::changedFiles()
QFETCH(bool, useChangedFilesForInitialBuild);
QDir::setCurrent(testDataDir + "/changed-files");
- rmDirR(buildDir);
+ rmDirR(relativeBuildDir());
const QString changedFile = QDir::cleanPath(QDir::currentPath() + "/file1.cpp");
QbsRunParameters params1;
if (useChangedFilesForInitialBuild)
@@ -452,7 +357,7 @@ void TestBlackbox::dependenciesProperty()
{
QDir::setCurrent(testDataDir + QLatin1String("/dependenciesProperty"));
QCOMPARE(runQbs(), 0);
- QFile depsFile(productBuildDir("product1") + QLatin1String("/product1.deps"));
+ QFile depsFile(relativeProductBuildDir("product1") + QLatin1String("/product1.deps"));
QVERIFY(depsFile.open(QFile::ReadOnly));
QString deps = QString::fromLatin1(depsFile.readAll());
QVERIFY(!deps.isEmpty());
@@ -493,68 +398,11 @@ void TestBlackbox::dependenciesProperty()
QCOMPARE(product2_cpp.property("defines").toString(), QLatin1String("SMURF"));
}
-void TestBlackbox::resolve_project_data()
-{
- return build_project_data();
-}
-
-void TestBlackbox::resolve_project()
-{
- QFETCH(QString, projectSubDir);
- QFETCH(QString, productFileName);
- if (!projectSubDir.startsWith('/'))
- projectSubDir.prepend('/');
- QVERIFY2(QFile::exists(testDataDir + projectSubDir), qPrintable(testDataDir + projectSubDir));
- QDir::setCurrent(testDataDir + projectSubDir);
- rmDirR(buildDir);
-
- QCOMPARE(runQbs(QbsRunParameters("resolve")), 0);
- QVERIFY2(!QFile::exists(productFileName), qPrintable(productFileName));
- QVERIFY(regularFileExists(buildGraphPath));
-}
-
-void TestBlackbox::resolve_project_dry_run_data()
-{
- return resolve_project_data();
-}
-
-void TestBlackbox::resolve_project_dry_run()
-{
- QFETCH(QString, projectSubDir);
- QFETCH(QString, productFileName);
- if (!projectSubDir.startsWith('/'))
- projectSubDir.prepend('/');
- QVERIFY2(QFile::exists(testDataDir + projectSubDir), qPrintable(testDataDir + projectSubDir));
- QDir::setCurrent(testDataDir + projectSubDir);
- rmDirR(buildDir);
-
- QCOMPARE(runQbs(QbsRunParameters(QLatin1String("resolve"), QStringList("-n"))), 0);
- QVERIFY2(!QFile::exists(productFileName), qPrintable(productFileName));
- QVERIFY2(!QFile::exists(buildGraphPath), qPrintable(buildGraphPath));
-}
-
-void TestBlackbox::typeChange()
-{
- QDir::setCurrent(testDataDir + "/type-change");
- QCOMPARE(runQbs(), 0);
- QVERIFY2(!m_qbsStdout.contains("compiling"), m_qbsStdout.constData());
- waitForNewTimestamp();
- QFile projectFile("project.qbs");
- QVERIFY2(projectFile.open(QIODevice::ReadWrite), qPrintable(projectFile.errorString()));
- QByteArray content = projectFile.readAll();
- content.replace("//", "");
- projectFile.resize(0);
- projectFile.write(content);
- projectFile.close();
- QCOMPARE(runQbs(), 0);
- QVERIFY2(m_qbsStdout.contains("compiling"), m_qbsStdout.constData());
-}
-
void TestBlackbox::usingsAsSoleInputsNonMultiplexed()
{
QDir::setCurrent(testDataDir + QLatin1String("/usings-as-sole-inputs-non-multiplexed"));
QCOMPARE(runQbs(), 0);
- const QString p3BuildDir = productBuildDir("p3");
+ const QString p3BuildDir = relativeProductBuildDir("p3");
QVERIFY(regularFileExists(p3BuildDir + "/custom1.out.plus"));
QVERIFY(regularFileExists(p3BuildDir + "/custom2.out.plus"));
}
@@ -566,12 +414,13 @@ static bool symlinkExists(const QString &linkFilePath)
void TestBlackbox::clean()
{
- const QString appObjectFilePath = productBuildDir("app")
- + objectFileName("/.obj/main.cpp", buildProfileName);
- const QString appExeFilePath = executableFilePath("app");
- const QString depObjectFilePath = productBuildDir("dep")
- + objectFileName("/.obj/dep.cpp", buildProfileName);
- const QString depLibBase = productBuildDir("dep") + '/' + QBS_HOST_DYNAMICLIB_PREFIX + "dep";
+ const QString appObjectFilePath = relativeProductBuildDir("app") + "/.obj/" + inputDirHash(".")
+ + objectFileName("/main.cpp", profileName());
+ const QString appExeFilePath = relativeExecutableFilePath("app");
+ const QString depObjectFilePath = relativeProductBuildDir("dep") + "/.obj/" + inputDirHash(".")
+ + objectFileName("/dep.cpp", profileName());
+ const QString depLibBase = relativeProductBuildDir("dep")
+ + '/' + QBS_HOST_DYNAMICLIB_PREFIX + "dep";
QString depLibFilePath;
QStringList symlinks;
if (qbs::Internal::HostOsInfo::isOsxHost()) {
@@ -664,47 +513,6 @@ void TestBlackbox::clean()
QVERIFY2(symlinkExists(symLink), qPrintable(symLink));
}
-void TestBlackbox::exportSimple()
-{
- QDir::setCurrent(testDataDir + "/exportSimple");
- QCOMPARE(runQbs(), 0);
-}
-
-void TestBlackbox::exportWithRecursiveDepends()
-{
- QDir::setCurrent(testDataDir + "/exportWithRecursiveDepends");
- QEXPECT_FAIL("", "QBS-706", Abort);
- QbsRunParameters params;
- params.expectFailure = true; // Remove when test no longer fails.
- QCOMPARE(runQbs(params), 0);
-}
-
-void TestBlackbox::fileTagger()
-{
- QDir::setCurrent(testDataDir + "/fileTagger");
- QCOMPARE(runQbs(), 0);
- QVERIFY(m_qbsStdout.contains("moc bla.cpp"));
-}
-
-void TestBlackbox::rc()
-{
- QDir::setCurrent(testDataDir + "/rc");
- QCOMPARE(runQbs(), 0);
- const bool rcFileWasCompiled = m_qbsStdout.contains("compiling test.rc");
- QCOMPARE(rcFileWasCompiled, HostOsInfo::isWindowsHost());
-}
-
-void TestBlackbox::removeFileDependency()
-{
- QDir::setCurrent(testDataDir + "/removeFileDependency");
- QCOMPARE(runQbs(), 0);
- QFile::remove("someheader.h");
- QbsRunParameters params;
- params.expectFailure = true;
- QVERIFY(runQbs(params) != 0);
- QVERIFY(m_qbsStdout.contains("compiling main.cpp"));
-}
-
void TestBlackbox::renameDependency()
{
QDir::setCurrent(testDataDir + "/renameDependency");
@@ -725,117 +533,43 @@ void TestBlackbox::renameDependency()
QVERIFY(m_qbsStdout.contains("compiling main.cpp"));
}
-void TestBlackbox::renameProduct()
-{
- QDir::setCurrent(testDataDir + "/renameProduct");
-
- // Initial run.
- QCOMPARE(runQbs(), 0);
-
- // Rename lib and adapt Depends item.
- waitForNewTimestamp();
- QFile f("rename.qbs");
- QVERIFY(f.open(QIODevice::ReadWrite));
- QByteArray contents = f.readAll();
- contents.replace("TheLib", "thelib");
- f.resize(0);
- f.write(contents);
- f.close();
- QCOMPARE(runQbs(), 0);
-
- // Rename lib and don't adapt Depends item.
- waitForNewTimestamp();
- QVERIFY(f.open(QIODevice::ReadWrite));
- contents = f.readAll();
- const int libNameIndex = contents.lastIndexOf("thelib");
- QVERIFY(libNameIndex != -1);
- contents.replace(libNameIndex, 6, "TheLib");
- f.resize(0);
- f.write(contents);
- f.close();
- QbsRunParameters params;
- params.expectFailure = true;
- QVERIFY(runQbs(params) != 0);
-}
-
-void TestBlackbox::renameTargetArtifact()
-{
- QDir::setCurrent(testDataDir + "/renameTargetArtifact");
-
- // Initial run.
- QCOMPARE(runQbs(), 0);
- QVERIFY(m_qbsStdout.contains("compiling"));
- QCOMPARE(m_qbsStdout.count("linking"), 2);
-
- // Rename library file name.
- waitForNewTimestamp();
- QFile f("rename.qbs");
- QVERIFY(f.open(QIODevice::ReadWrite));
- QByteArray contents = f.readAll();
- contents.replace("the_lib", "TheLib");
- f.resize(0);
- f.write(contents);
- f.close();
- QCOMPARE(runQbs(), 0);
- QVERIFY(!m_qbsStdout.contains("compiling"));
- QCOMPARE(m_qbsStdout.count("linking"), 2);
-}
-
-void TestBlackbox::softDependency()
+void TestBlackbox::separateDebugInfo()
{
- QDir::setCurrent(testDataDir + "/soft-dependency");
- QCOMPARE(runQbs(), 0);
-}
-
-void TestBlackbox::subProjects()
-{
- QDir::setCurrent(testDataDir + "/subprojects");
-
- // Check all three types of subproject creation, plus property overrides.
+ QDir::setCurrent(testDataDir + "/separate-debug-info");
QCOMPARE(runQbs(), 0);
- // Disabling both the project with the dependency and the one with the dependent
- // should not cause an error.
- waitForNewTimestamp();
- QFile f(testDataDir + "/subprojects/toplevelproject.qbs");
- QVERIFY(f.open(QIODevice::ReadWrite));
- QByteArray contents = f.readAll();
- contents.replace("condition: true", "condition: false");
- f.resize(0);
- f.write(contents);
- f.close();
- f.setFileName(testDataDir + "/subprojects/subproject2/subproject2.qbs");
- QVERIFY(f.open(QIODevice::ReadWrite));
- contents = f.readAll();
- contents.replace("condition: true", "condition: false");
- f.resize(0);
- f.write(contents);
- f.close();
- QCOMPARE(runQbs(), 0);
-
- // Disabling the project with the dependency only is an error.
- // This tests also whether changes in sub-projects are detected.
- waitForNewTimestamp();
- f.setFileName(testDataDir + "/subprojects/toplevelproject.qbs");
- QVERIFY(f.open(QIODevice::ReadWrite));
- contents = f.readAll();
- contents.replace("condition: false", "condition: true");
- f.resize(0);
- f.write(contents);
- f.close();
- QbsRunParameters params;
- params.expectFailure = true;
- QVERIFY(runQbs(params) != 0);
+ Settings settings((QString()));
+ Profile buildProfile(profileName(), &settings);
+ QStringList toolchain = buildProfile.value("qbs.toolchain").toStringList();
+ QStringList targetOS = buildProfile.value("qbs.targetOS").toStringList();
+ if (targetOS.contains("darwin")) {
+ QVERIFY(QFile::exists(relativeProductBuildDir("app1") + "/app1.app.dSYM"));
+ QVERIFY(!QFile::exists(relativeProductBuildDir("app2") + "/app2.app.dSYM"));
+ QVERIFY(QFile::exists(relativeProductBuildDir("foo1") + "/foo1.framework.dSYM"));
+ QVERIFY(!QFile::exists(relativeProductBuildDir("foo2") + "/foo2.framework.dSYM"));
+ } else if (toolchain.contains("gcc")) {
+ QVERIFY(QFile::exists(relativeProductBuildDir("app1") + "/app1.debug"));
+ QVERIFY(!QFile::exists(relativeProductBuildDir("app2") + "/app2.debug"));
+ QVERIFY(QFile::exists(relativeProductBuildDir("foo1") + "/libfoo1.so.debug"));
+ QVERIFY(!QFile::exists(relativeProductBuildDir("foo2") + "/libfoo2.so.debug"));
+ } else if (toolchain.contains("msvc")) {
+ QVERIFY(QFile::exists(relativeProductBuildDir("app1") + "/app1.pdb"));
+ QVERIFY(!QFile::exists(relativeProductBuildDir("app2") + "/app2.pdb"));
+ QVERIFY(QFile::exists(relativeProductBuildDir("foo1") + "/foo1.pdb"));
+ QVERIFY(!QFile::exists(relativeProductBuildDir("foo2") + "/foo2.pdb"));
+ } else {
+ QSKIP("Unsupported toolchain. Skipping.");
+ }
}
void TestBlackbox::track_qrc()
{
QDir::setCurrent(testDataDir + "/qrc");
QCOMPARE(runQbs(), 0);
- const QString fileName = executableFilePath("i");
+ const QString fileName = relativeExecutableFilePath("i");
QVERIFY2(regularFileExists(fileName), qPrintable(fileName));
QDateTime dt = QFileInfo(fileName).lastModified();
- QTest::qSleep(2020);
+ waitForNewTimestamp();
{
QFile f("stuff.txt");
f.remove();
@@ -853,13 +587,13 @@ void TestBlackbox::track_qobject_change()
QDir::setCurrent(testDataDir + "/trackQObjChange");
copyFileAndUpdateTimestamp("bla_qobject.h", "bla.h");
QCOMPARE(runQbs(), 0);
- const QString productFilePath = executableFilePath("i");
+ const QString productFilePath = relativeExecutableFilePath("i");
QVERIFY2(regularFileExists(productFilePath), qPrintable(productFilePath));
- QString moc_bla_objectFileName = productBuildDir("i")
- + objectFileName("/.obj/GeneratedFiles/moc_bla.cpp", buildProfileName);
+ QString moc_bla_objectFileName = relativeProductBuildDir("i") + "/.obj/"
+ + inputDirHash("GeneratedFiles") + objectFileName("/moc_bla.cpp", profileName());
QVERIFY2(regularFileExists(moc_bla_objectFileName), qPrintable(moc_bla_objectFileName));
- QTest::qSleep(1000);
+ waitForNewTimestamp();
copyFileAndUpdateTimestamp("bla_noqobject.h", "bla.h");
QCOMPARE(runQbs(), 0);
QVERIFY(regularFileExists(productFilePath));
@@ -878,14 +612,15 @@ void TestBlackbox::trackAddFile()
QDir::setCurrent(testDataDir + "/trackAddFile/work");
QCOMPARE(runQbs(), 0);
- process.start(executableFilePath("someapp"));
+ process.start(relativeExecutableFilePath("someapp"));
QVERIFY2(process.waitForStarted(), qPrintable(process.errorString()));
QVERIFY2(process.waitForFinished(), qPrintable(process.errorString()));
QCOMPARE(process.exitCode(), 0);
output = process.readAllStandardOutput().split('\n');
QCOMPARE(output.takeFirst().trimmed().constData(), "Hello World!");
QCOMPARE(output.takeFirst().trimmed().constData(), "NARF!");
- QString unchangedObjectFile = buildDir + objectFileName("/someapp/narf.cpp", buildProfileName);
+ QString unchangedObjectFile = relativeBuildDir()
+ + objectFileName("/someapp/narf.cpp", profileName());
QDateTime unchangedObjectFileTime1 = QFileInfo(unchangedObjectFile).lastModified();
waitForNewTimestamp();
@@ -894,7 +629,7 @@ void TestBlackbox::trackAddFile()
touch("main.cpp");
QCOMPARE(runQbs(), 0);
- process.start(executableFilePath("someapp"));
+ process.start(relativeExecutableFilePath("someapp"));
QVERIFY(process.waitForStarted());
QVERIFY(process.waitForFinished());
QCOMPARE(process.exitCode(), 0);
@@ -925,7 +660,7 @@ void TestBlackbox::trackExternalProductChanges()
QVERIFY(!m_qbsStdout.contains("compiling jsFileChange.cpp"));
QVERIFY(!m_qbsStdout.contains("compiling fileExists.cpp"));
- rmDirR(buildDir);
+ rmDirR(relativeBuildDir());
QCOMPARE(runQbs(), 0);
QVERIFY(m_qbsStdout.contains("compiling main.cpp"));
QVERIFY(!m_qbsStdout.contains("compiling environmentChange.cpp"));
@@ -946,7 +681,7 @@ void TestBlackbox::trackExternalProductChanges()
QVERIFY(m_qbsStdout.contains("compiling jsFileChange.cpp"));
QVERIFY(!m_qbsStdout.contains("compiling fileExists.cpp"));
- rmDirR(buildDir);
+ rmDirR(relativeBuildDir());
QVERIFY(jsFile.open(QIODevice::ReadWrite));
jsCode = jsFile.readAll();
jsCode.replace("['jsFileChange.cpp']", "[]");
@@ -983,7 +718,7 @@ void TestBlackbox::trackRemoveFile()
QDir::setCurrent(testDataDir + "/trackAddFile/work");
QCOMPARE(runQbs(), 0);
- process.start(executableFilePath("someapp"));
+ process.start(relativeExecutableFilePath("someapp"));
QVERIFY2(process.waitForStarted(), qPrintable(process.errorString()));
QVERIFY2(process.waitForFinished(), qPrintable(process.errorString()));
QCOMPARE(process.exitCode(), 0);
@@ -991,7 +726,8 @@ void TestBlackbox::trackRemoveFile()
QCOMPARE(output.takeFirst().trimmed().constData(), "Hello World!");
QCOMPARE(output.takeFirst().trimmed().constData(), "NARF!");
QCOMPARE(output.takeFirst().trimmed().constData(), "ZORT!");
- QString unchangedObjectFile = buildDir + objectFileName("/someapp/narf.cpp", buildProfileName);
+ QString unchangedObjectFile = relativeBuildDir()
+ + objectFileName("/someapp/narf.cpp", profileName());
QDateTime unchangedObjectFileTime1 = QFileInfo(unchangedObjectFile).lastModified();
waitForNewTimestamp();
@@ -1007,7 +743,7 @@ void TestBlackbox::trackRemoveFile()
touch("project.qbs");
QCOMPARE(runQbs(), 0);
- process.start(executableFilePath("someapp"));
+ process.start(relativeExecutableFilePath("someapp"));
QVERIFY(process.waitForStarted());
QVERIFY(process.waitForFinished());
QCOMPARE(process.exitCode(), 0);
@@ -1020,7 +756,8 @@ void TestBlackbox::trackRemoveFile()
QCOMPARE(unchangedObjectFileTime1, unchangedObjectFileTime2);
// the object file for the removed cpp file should have vanished too
- QVERIFY(!regularFileExists(buildDir + objectFileName("/someapp/zort.cpp", buildProfileName)));
+ QVERIFY(!regularFileExists(relativeBuildDir()
+ + objectFileName("/someapp/zort.cpp", profileName())));
}
void TestBlackbox::trackAddFileTag()
@@ -1035,7 +772,7 @@ void TestBlackbox::trackAddFileTag()
QDir::setCurrent(testDataDir + "/trackFileTags/work");
QCOMPARE(runQbs(), 0);
- process.start(executableFilePath("someapp"));
+ process.start(relativeExecutableFilePath("someapp"));
QVERIFY2(process.waitForStarted(), qPrintable(process.errorString()));
QVERIFY2(process.waitForFinished(), qPrintable(process.errorString()));
QCOMPARE(process.exitCode(), 0);
@@ -1048,7 +785,7 @@ void TestBlackbox::trackAddFileTag()
touch("project.qbs");
QCOMPARE(runQbs(), 0);
- process.start(executableFilePath("someapp"));
+ process.start(relativeExecutableFilePath("someapp"));
QVERIFY(process.waitForStarted());
QVERIFY(process.waitForFinished());
QCOMPARE(process.exitCode(), 0);
@@ -1069,12 +806,12 @@ void TestBlackbox::trackRemoveFileTag()
QCOMPARE(runQbs(), 0);
// check if the artifacts are here that will become stale in the 2nd step
- QVERIFY(regularFileExists(productBuildDir("someapp")
- + objectFileName("/.obj/main_foo.cpp", buildProfileName)));
- QVERIFY(regularFileExists(productBuildDir("someapp") + "/main_foo.cpp"));
- QVERIFY(regularFileExists(productBuildDir("someapp") + "/main.foo"));
+ QVERIFY(regularFileExists(relativeProductBuildDir("someapp") + "/.obj/" + inputDirHash(".")
+ + objectFileName("/main_foo.cpp", profileName())));
+ QVERIFY(regularFileExists(relativeProductBuildDir("someapp") + "/main_foo.cpp"));
+ QVERIFY(regularFileExists(relativeProductBuildDir("someapp") + "/main.foo"));
- process.start(executableFilePath("someapp"));
+ process.start(relativeExecutableFilePath("someapp"));
QVERIFY(process.waitForStarted());
QVERIFY(process.waitForFinished());
QCOMPARE(process.exitCode(), 0);
@@ -1087,7 +824,7 @@ void TestBlackbox::trackRemoveFileTag()
touch("project.qbs");
QCOMPARE(runQbs(), 0);
- process.start(executableFilePath("someapp"));
+ process.start(relativeExecutableFilePath("someapp"));
QVERIFY(process.waitForStarted());
QVERIFY(process.waitForFinished());
QCOMPARE(process.exitCode(), 0);
@@ -1095,10 +832,10 @@ void TestBlackbox::trackRemoveFileTag()
QCOMPARE(output.takeFirst().trimmed().constData(), "there's no foo here");
// check if stale artifacts have been removed
- QCOMPARE(regularFileExists(productBuildDir("someapp")
- + objectFileName("/.obj/main_foo.cpp", buildProfileName)), false);
- QCOMPARE(regularFileExists(productBuildDir("someapp") + "/main_foo.cpp"), false);
- QCOMPARE(regularFileExists(productBuildDir("someapp") + "/main.foo"), false);
+ QCOMPARE(regularFileExists(relativeProductBuildDir("someapp") + "/.obj/" + inputDirHash(".")
+ + objectFileName("/main_foo.cpp", profileName())), false);
+ QCOMPARE(regularFileExists(relativeProductBuildDir("someapp") + "/main_foo.cpp"), false);
+ QCOMPARE(regularFileExists(relativeProductBuildDir("someapp") + "/main.foo"), false);
}
void TestBlackbox::trackAddMocInclude()
@@ -1178,25 +915,14 @@ void TestBlackbox::trackRemoveProduct()
QVERIFY(!m_qbsStdout.contains("linking product3"));
}
-void TestBlackbox::transformers()
-{
- QDir::setCurrent(testDataDir + "/transformers");
- QCOMPARE(runQbs(), 0);
-}
-
-void TestBlackbox::uic()
-{
- QDir::setCurrent(testDataDir + "/uic");
- QCOMPARE(runQbs(), 0);
-}
-
void TestBlackbox::wildcardRenaming()
{
QDir::setCurrent(testDataDir + "/wildcard_renaming");
QCOMPARE(runQbs(QbsRunParameters("install")), 0);
QVERIFY(QFileInfo(defaultInstallRoot + "/pioniere.txt").exists());
QFile::rename(QDir::currentPath() + "/pioniere.txt", QDir::currentPath() + "/fdj.txt");
- QCOMPARE(runQbs(QbsRunParameters(QLatin1String("install"), QStringList("--remove-first"))), 0);
+ QCOMPARE(runQbs(QbsRunParameters(QLatin1String("install"),
+ QStringList("--clean-install-root"))), 0);
QVERIFY(!QFileInfo(defaultInstallRoot + "/pioniere.txt").exists());
QVERIFY(QFileInfo(defaultInstallRoot + "/fdj.txt").exists());
}
@@ -1209,7 +935,8 @@ void TestBlackbox::recursiveRenaming()
QVERIFY(QFileInfo(defaultInstallRoot + "/dir/subdir/blubb.txt").exists());
waitForNewTimestamp();
QVERIFY(QFile::rename(QDir::currentPath() + "/dir/wasser.txt", QDir::currentPath() + "/dir/wein.txt"));
- QCOMPARE(runQbs(QbsRunParameters(QLatin1String("install"), QStringList("--remove-first"))), 0);
+ QCOMPARE(runQbs(QbsRunParameters(QLatin1String("install"),
+ QStringList("--clean-install-root"))), 0);
QVERIFY(!QFileInfo(defaultInstallRoot + "/dir/wasser.txt").exists());
QVERIFY(QFileInfo(defaultInstallRoot + "/dir/wein.txt").exists());
QVERIFY(QFileInfo(defaultInstallRoot + "/dir/subdir/blubb.txt").exists());
@@ -1227,10 +954,10 @@ void TestBlackbox::ruleConditions()
{
QDir::setCurrent(testDataDir + "/ruleConditions");
QCOMPARE(runQbs(), 0);
- QVERIFY(QFileInfo(executableFilePath("zorted")).exists());
- QVERIFY(QFileInfo(executableFilePath("unzorted")).exists());
- QVERIFY(QFileInfo(productBuildDir("zorted") + "/zorted.foo.narf.zort").exists());
- QVERIFY(!QFileInfo(productBuildDir("unzorted") + "/unzorted.foo.narf.zort").exists());
+ QVERIFY(QFileInfo(relativeExecutableFilePath("zorted")).exists());
+ QVERIFY(QFileInfo(relativeExecutableFilePath("unzorted")).exists());
+ QVERIFY(QFileInfo(relativeProductBuildDir("zorted") + "/zorted.foo.narf.zort").exists());
+ QVERIFY(!QFileInfo(relativeProductBuildDir("unzorted") + "/unzorted.foo.narf.zort").exists());
}
void TestBlackbox::ruleCycle()
@@ -1242,47 +969,6 @@ void TestBlackbox::ruleCycle()
QVERIFY(m_qbsStderr.contains("Cycle detected in rule dependencies"));
}
-void TestBlackbox::trackAddQObjectHeader()
-{
- QDir::setCurrent(testDataDir + "/missingqobjectheader");
- const QString qbsFileName("missingheader.qbs");
- QFile qbsFile(qbsFileName);
- QVERIFY(qbsFile.open(QIODevice::WriteOnly | QIODevice::Truncate));
- qbsFile.write("import qbs.base 1.0\nCppApplication {\n Depends { name: 'Qt.core' }\n"
- " files: ['main.cpp', 'myobject.cpp']\n}");
- qbsFile.close();
- QbsRunParameters params;
- params.expectFailure = true;
- QVERIFY(runQbs(params) != 0);
- waitForNewTimestamp();
- QVERIFY(qbsFile.open(QIODevice::WriteOnly | QIODevice::Truncate));
- qbsFile.write("import qbs.base 1.0\nCppApplication {\n Depends { name: 'Qt.core' }\n"
- " files: ['main.cpp', 'myobject.cpp','myobject.h']\n}");
- qbsFile.close();
- params.expectFailure = false;
- QCOMPARE(runQbs(params), 0);
-}
-
-void TestBlackbox::trackRemoveQObjectHeader()
-{
- QDir::setCurrent(testDataDir + "/missingqobjectheader");
- const QString qbsFileName("missingheader.qbs");
- QFile qbsFile(qbsFileName);
- QVERIFY(qbsFile.open(QIODevice::WriteOnly | QIODevice::Truncate));
- qbsFile.write("import qbs.base 1.0\nCppApplication {\n Depends { name: 'Qt.core' }\n"
- " files: ['main.cpp', 'myobject.cpp','myobject.h']\n}");
- qbsFile.close();
- QbsRunParameters params;
- QCOMPARE(runQbs(params), 0);
- waitForNewTimestamp();
- QVERIFY(qbsFile.open(QIODevice::WriteOnly | QIODevice::Truncate));
- qbsFile.write("import qbs.base 1.0\nCppApplication {\n Depends { name: 'Qt.core' }\n"
- " files: ['main.cpp', 'myobject.cpp']\n}");
- qbsFile.close();
- params.expectFailure = true;
- QVERIFY(runQbs(params) != 0);
-}
-
void TestBlackbox::overrideProjectProperties()
{
QDir::setCurrent(testDataDir + "/overrideProjectProperties");
@@ -1294,14 +980,14 @@ void TestBlackbox::overrideProjectProperties()
<< QLatin1String("project.someInt:156")
<< QLatin1String("project.someStringList:one")
<< QLatin1String("MyAppForYou.mainFile:main.cpp"))), 0);
- QVERIFY(regularFileExists(executableFilePath("MyAppForYou")));
- QVERIFY(QFile::remove(buildGraphPath));
+ QVERIFY(regularFileExists(relativeExecutableFilePath("MyAppForYou")));
+ QVERIFY(QFile::remove(relativeBuildGraphFilePath()));
QbsRunParameters params;
params.arguments << QLatin1String("-f") << QLatin1String("project_using_helper_lib.qbs");
params.expectFailure = true;
QVERIFY(runQbs(params) != 0);
- rmDirR(buildDir);
+ rmDirR(relativeBuildDir());
params.arguments = QStringList() << QLatin1String("-f")
<< QLatin1String("project_using_helper_lib.qbs")
<< QLatin1String("project.linkSuccessfully:true");
@@ -1314,7 +1000,7 @@ void TestBlackbox::productProperties()
QDir::setCurrent(testDataDir + "/productproperties");
QCOMPARE(runQbs(QbsRunParameters(QStringList() << QLatin1String("-f")
<< QLatin1String("project.qbs"))), 0);
- QVERIFY(regularFileExists(executableFilePath("blubb_user")));
+ QVERIFY(regularFileExists(relativeExecutableFilePath("blubb_user")));
}
void TestBlackbox::propertyChanges()
@@ -1332,7 +1018,7 @@ void TestBlackbox::propertyChanges()
QVERIFY(m_qbsStdout.contains("linking product 1.debug"));
QVERIFY(m_qbsStdout.contains("generated.txt"));
QVERIFY(m_qbsStdout.contains("Making output from input"));
- QFile generatedFile(productBuildDir("generated text file") + "/generated.txt");
+ QFile generatedFile(relativeProductBuildDir("generated text file") + "/generated.txt");
QVERIFY(generatedFile.open(QIODevice::ReadOnly));
QCOMPARE(generatedFile.readAll(), QByteArray("prefix 1contents 1suffix 1"));
generatedFile.close();
@@ -1535,61 +1221,12 @@ void TestBlackbox::propertyChanges()
QVERIFY(m_qbsStdout.contains("Making output from input"));
}
-void TestBlackbox::disabledProject()
-{
- QDir::setCurrent(testDataDir + "/disabledProject");
- QCOMPARE(runQbs(), 0);
-}
-
-void TestBlackbox::enableAndDisableProduct()
-{
- QDir::setCurrent(testDataDir + "/enable-and-disable-product");
- QCOMPARE(runQbs(), 0);
- QVERIFY(!m_qbsStdout.contains("compiling"));
- waitForNewTimestamp();
- QFile projectFile("project.qbs");
- QVERIFY(projectFile.open(QIODevice::ReadWrite));
- QByteArray content = projectFile.readAll();
- content.replace("undefined", "'hidden'");
- projectFile.resize(0);
- projectFile.write(content);
- projectFile.close();
- QCOMPARE(runQbs(), 0);
- QVERIFY(m_qbsStdout.contains("linking"));
- waitForNewTimestamp();
- touch("main.cpp");
- QVERIFY(projectFile.open(QIODevice::ReadWrite));
- content = projectFile.readAll();
- content.replace("'hidden'", "undefined");
- projectFile.resize(0);
- projectFile.write(content);
- projectFile.close();
- QCOMPARE(runQbs(), 0);
- QVERIFY(!m_qbsStdout.contains("compiling"));
-}
-
-void TestBlackbox::duplicateProductNames()
-{
- QDir::setCurrent(testDataDir + "/duplicateProductNames");
- QFETCH(QString, projectFileName);
- QbsRunParameters params;
- params.expectFailure = true;
- params.arguments = QStringList() << "-f" << projectFileName;
- QVERIFY(runQbs(params) != 0);
- QVERIFY(m_qbsStderr.contains("Duplicate product name"));
-}
-
-void TestBlackbox::duplicateProductNames_data()
+void TestBlackbox::qobjectInObjectiveCpp()
{
- QTest::addColumn<QString>("projectFileName");
- QTest::newRow("Names explicitly set") << QString("explicit.qbs");
- QTest::newRow("Unnamed products in same file") << QString("implicit.qbs");
- QTest::newRow("Unnamed products in files of the same name") << QString("implicit-indirect.qbs");
-}
-
-void TestBlackbox::dynamicLibs()
-{
- QDir::setCurrent(testDataDir + "/dynamicLibs");
+ if (!HostOsInfo::isOsxHost())
+ QSKIP("only applies on OS X");
+ const QString testDir = testDataDir + "/qobject-in-mm";
+ QDir::setCurrent(testDir);
QCOMPARE(runQbs(), 0);
}
@@ -1598,7 +1235,7 @@ void TestBlackbox::dynamicMultiplexRule()
const QString testDir = testDataDir + "/dynamicMultiplexRule";
QDir::setCurrent(testDir);
QCOMPARE(runQbs(), 0);
- const QString outputFilePath = productBuildDir("dynamicMultiplexRule") + "/stuff-from-3-inputs";
+ const QString outputFilePath = relativeProductBuildDir("dynamicMultiplexRule") + "/stuff-from-3-inputs";
QVERIFY(regularFileExists(outputFilePath));
waitForNewTimestamp();
touch("two.txt");
@@ -1617,10 +1254,10 @@ void TestBlackbox::dynamicRuleOutputs()
QDir::setCurrent(testDir + "/work");
QCOMPARE(runQbs(), 0);
- const QString appFile = executableFilePath("genlexer");
- const QString headerFile1 = productBuildDir("genlexer") + "/GeneratedFiles/numberscanner.h";
- const QString sourceFile1 = productBuildDir("genlexer") + "/GeneratedFiles/numberscanner.c";
- const QString sourceFile2 = productBuildDir("genlexer") + "/GeneratedFiles/lex.yy.c";
+ const QString appFile = relativeExecutableFilePath("genlexer");
+ const QString headerFile1 = relativeProductBuildDir("genlexer") + "/GeneratedFiles/numberscanner.h";
+ const QString sourceFile1 = relativeProductBuildDir("genlexer") + "/GeneratedFiles/numberscanner.c";
+ const QString sourceFile2 = relativeProductBuildDir("genlexer") + "/GeneratedFiles/lex.yy.c";
// Check build #1: source and header file name are specified in numbers.l
QVERIFY(regularFileExists(appFile));
@@ -1654,18 +1291,6 @@ void TestBlackbox::dynamicRuleOutputs()
QVERIFY(!QFile::exists(sourceFile2));
}
-void TestBlackbox::emptyFileTagList()
-{
- QDir::setCurrent(testDataDir + "/empty-filetag-list");
- QCOMPARE(runQbs(), 0);
-}
-
-void TestBlackbox::emptySubmodulesList()
-{
- QDir::setCurrent(testDataDir + "/empty-submodules-list");
- QCOMPARE(runQbs(), 0);
-}
-
void TestBlackbox::erroneousFiles_data()
{
QTest::addColumn<QString>("errorMessage");
@@ -1688,27 +1313,21 @@ void TestBlackbox::erroneousFiles()
}
}
-void TestBlackbox::explicitlyDependsOn()
+void TestBlackbox::exportRule()
{
- QDir::setCurrent(testDataDir + "/explicitlyDependsOn");
- QCOMPARE(runQbs(), 0);
- QVERIFY(m_qbsStdout.contains("Creating output artifact"));
- QCOMPARE(runQbs(), 0);
- QVERIFY(!m_qbsStdout.contains("Creating output artifact"));
- waitForNewTimestamp();
- touch("dependency.txt");
- QCOMPARE(runQbs(), 0);
- QVERIFY(m_qbsStdout.contains("Creating output artifact"));
+ QDir::setCurrent(testDataDir + "/export-rule");
+ QbsRunParameters params;
+ QCOMPARE(runQbs(params), 0);
}
void TestBlackbox::fileDependencies()
{
QDir::setCurrent(testDataDir + "/fileDependencies");
- rmDirR(buildDir);
+ rmDirR(relativeBuildDir());
QCOMPARE(runQbs(), 0);
QVERIFY(m_qbsStdout.contains("compiling narf.cpp"));
QVERIFY(m_qbsStdout.contains("compiling zort.cpp"));
- const QString productFileName = executableFilePath("myapp");
+ const QString productFileName = relativeExecutableFilePath("myapp");
QVERIFY2(regularFileExists(productFileName), qPrintable(productFileName));
// Incremental build without changes.
@@ -1734,11 +1353,94 @@ void TestBlackbox::fileDependencies()
void TestBlackbox::installedTransformerOutput()
{
QDir::setCurrent(testDataDir + "/installed-transformer-output");
- QCOMPARE(runQbs(QbsRunParameters("install")), 0);
+ QCOMPARE(runQbs(), 0);
const QString installedFilePath = defaultInstallRoot + "/textfiles/HelloWorld.txt";
QVERIFY2(QFile::exists(installedFilePath), qPrintable(installedFilePath));
}
+void TestBlackbox::inputsFromDependencies()
+{
+ QDir::setCurrent(testDataDir + "/inputs-from-dependencies");
+ QbsRunParameters params(QStringList("-qq"));
+ QCOMPARE(runQbs(params), 0);
+ const QList<QByteArray> output = m_qbsStderr.trimmed().split('\n');
+ QVERIFY2(output.count() == 3, m_qbsStderr.constData());
+}
+
+void TestBlackbox::installPackage()
+{
+ if (HostOsInfo::hostOs() == HostOsInfo::HostOsWindows)
+ QSKIP("Beware of the msys tar");
+ QString binary = findArchiver("tar");
+ if (binary.isEmpty())
+ QSKIP("tar not found");
+ QDir::setCurrent(testDataDir + "/installpackage");
+ QCOMPARE(runQbs(), 0);
+ const QString tarFilePath = relativeProductBuildDir("tar-package") + "/tar-package.tar.gz";
+ QVERIFY2(regularFileExists(tarFilePath), qPrintable(tarFilePath));
+ QProcess tarList;
+ tarList.start(binary, QStringList() << "tf" << tarFilePath);
+ QVERIFY2(tarList.waitForStarted(), qPrintable(tarList.errorString()));
+ QVERIFY2(tarList.waitForFinished(), qPrintable(tarList.errorString()));
+ const QList<QByteArray> outputLines = tarList.readAllStandardOutput().split('\n');
+ QList<QByteArray> cleanOutputLines;
+ foreach (const QByteArray &line, outputLines) {
+ const QByteArray trimmedLine = line.trimmed();
+ if (!trimmedLine.isEmpty())
+ cleanOutputLines << trimmedLine;
+ }
+ QCOMPARE(cleanOutputLines.count(), 3);
+ foreach (const QByteArray &line, cleanOutputLines) {
+ QVERIFY2(line.contains("public_tool") || line.contains("mylib") || line.contains("lib.h"),
+ line.constData());
+ }
+}
+
+void TestBlackbox::installable()
+{
+ QDir::setCurrent(testDataDir + "/installable");
+ QCOMPARE(runQbs(), 0);
+ QFile installList(relativeProductBuildDir("install-list") + "/installed-files.txt");
+ QVERIFY2(installList.open(QIODevice::ReadOnly), qPrintable(installList.errorString()));
+ QCOMPARE(installList.readAll().count('\n'), 2);
+}
+
+void TestBlackbox::java()
+{
+ Settings settings((QString()));
+ Profile p(profileName(), &settings);
+ if (p.value("java.jdkPath").toString().isEmpty())
+ QSKIP("java.jdkPath not set");
+ QDir::setCurrent(testDataDir + "/java");
+ QCOMPARE(runQbs(), 0);
+
+ const QStringList classFiles =
+ QStringList() << "Car" << "Jet" << "Ship" << "Vehicle" << "Vehicles";
+ QStringList classFiles1 = QStringList(classFiles) << "io/qt/qbs/HelloWorld" << "NoPackage";
+ for (int i = 0; i < classFiles1.count(); ++i) {
+ QString &classFile = classFiles1[i];
+ classFile = relativeProductBuildDir("class_collection") + "/classFiles/"
+ + classFile + ".class";
+ QVERIFY2(regularFileExists(classFile), qPrintable(classFile));
+ }
+
+ foreach (const QString &classFile, classFiles) {
+ const QString filePath = relativeProductBuildDir("jar_file") + "/classFiles/" + classFile
+ + ".class";
+ QVERIFY2(regularFileExists(filePath), qPrintable(filePath));
+ }
+ const QString jarFilePath = relativeProductBuildDir("jar_file") + '/' + "jar_file.jar";
+ QVERIFY2(regularFileExists(jarFilePath), qPrintable(jarFilePath));
+
+ // Now check whether we correctly predicted the class file output paths.
+ QCOMPARE(runQbs(QbsRunParameters("clean", QStringList() << "--all-artifacts")), 0);
+ foreach (const QString &classFile, classFiles1) {
+ if (classFile.contains("NoPackage"))
+ QEXPECT_FAIL(0, "Fix parser", Continue);
+ QVERIFY2(!regularFileExists(classFile), qPrintable(classFile));
+ }
+}
+
void TestBlackbox::jsExtensionsFile()
{
QDir::setCurrent(testDataDir + "/jsextensions");
@@ -1808,7 +1510,7 @@ void TestBlackbox::jsExtensionsProcess()
void TestBlackbox::jsExtensionsPropertyList()
{
if (!HostOsInfo::isOsxHost())
- SKIP_TEST("temporarily only applies on OS X");
+ QSKIP("temporarily only applies on OS X");
QDir::setCurrent(testDataDir + "/jsextensions");
QbsRunParameters params(QStringList() << "-nf" << "propertylist.qbs");
@@ -1824,7 +1526,13 @@ void TestBlackbox::jsExtensionsPropertyList()
QVERIFY(file3.open(QIODevice::ReadOnly));
QByteArray file1Contents = file1.readAll();
QCOMPARE(file3.readAll(), file1Contents);
- QCOMPARE(file1Contents, file2.readAll());
+ //QCOMPARE(file1Contents, file2.readAll()); // keys don't have guaranteed order
+#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
+ QJsonParseError err1, err2;
+ QCOMPARE(QJsonDocument::fromJson(file1Contents, &err1),
+ QJsonDocument::fromJson(file2.readAll(), &err2));
+ QVERIFY(err1.error == QJsonParseError::NoError && err2.error == QJsonParseError::NoError);
+#endif
QFile file4("test.openstep.plist");
QVERIFY(file4.exists());
QFile file5("test3.json");
@@ -1854,17 +1562,11 @@ void TestBlackbox::jsExtensionsTextFile()
QCOMPARE(lines.at(4).trimmed().constData(), "true");
}
-void TestBlackbox::inheritQbsSearchPaths()
-{
- QDir::setCurrent(testDataDir + "/inheritQbsSearchPaths");
- QCOMPARE(runQbs(), 0);
-}
-
void TestBlackbox::mixedBuildVariants()
{
QDir::setCurrent(testDataDir + "/mixed-build-variants");
Settings settings((QString()));
- Profile profile(buildProfileName, &settings);
+ Profile profile(profileName(), &settings);
if (profile.value("qbs.toolchain").toStringList().contains("msvc")) {
QbsRunParameters params;
params.expectFailure = true;
@@ -1880,30 +1582,6 @@ void TestBlackbox::mixedBuildVariants()
}
}
-void TestBlackbox::mocCppIncluded()
-{
- QDir::setCurrent(testDataDir + "/moc_hpp_included");
- QCOMPARE(runQbs(), 0); // Initial build.
-
- // Touch header and try again.
- waitForNewTimestamp();
- QFile headerFile("object.h");
- QVERIFY2(headerFile.open(QIODevice::WriteOnly | QIODevice::Append),
- qPrintable(headerFile.errorString()));
- headerFile.write("\n");
- headerFile.close();
- QCOMPARE(runQbs(), 0);
-
- // Touch cpp file and try again.
- waitForNewTimestamp();
- QFile cppFile("object.cpp");
- QVERIFY2(cppFile.open(QIODevice::WriteOnly | QIODevice::Append),
- qPrintable(cppFile.errorString()));
- cppFile.write("\n");
- cppFile.close();
- QCOMPARE(runQbs(), 0);
-}
-
void TestBlackbox::nestedProperties()
{
QDir::setCurrent(testDataDir + "/nested-properties");
@@ -1912,51 +1590,6 @@ void TestBlackbox::nestedProperties()
QVERIFY2(m_qbsStdout.contains("value in higherlevel"), m_qbsStdout.constData());
}
-void TestBlackbox::newOutputArtifactInDependency()
-{
- QDir::setCurrent(testDataDir + "/new-output-artifact-in-dependency");
- QCOMPARE(runQbs(), 0);
- QVERIFY(m_qbsStdout.contains("linking app"));
- const QByteArray linkingLibString = QByteArray("linking ")
- + HostOsInfo::dynamicLibraryName("lib").toLatin1();
- QVERIFY(!m_qbsStdout.contains(linkingLibString));
-
- waitForNewTimestamp();
- QFile projectFile("project.qbs");
- QVERIFY2(projectFile.open(QIODevice::ReadWrite), qPrintable(projectFile.errorString()));
- QByteArray contents = projectFile.readAll();
- contents.replace("//Depends", "Depends");
- projectFile.resize(0);
- projectFile.write(contents);
- projectFile.close();
- QCOMPARE(runQbs(), 0);
- QVERIFY(m_qbsStdout.contains("linking app"));
- QVERIFY(m_qbsStdout.contains(linkingLibString));
-}
-
-void TestBlackbox::newPatternMatch()
-{
- QDir::setCurrent(testDataDir + "/new-pattern-match");
- QCOMPARE(runQbs(), 0);
- QVERIFY(m_qbsStdout.contains("Resolving"));
- waitForNewTimestamp();
- QCOMPARE(runQbs(), 0);
- QVERIFY(!m_qbsStdout.contains("Resolving"));
- waitForNewTimestamp();
- QFile f("test.txt");
- QVERIFY2(f.open(QIODevice::WriteOnly), qPrintable(f.errorString()));
- f.close();
- QCOMPARE(runQbs(), 0);
- QVERIFY(m_qbsStdout.contains("Resolving"));
- waitForNewTimestamp();
- QCOMPARE(runQbs(), 0);
- QVERIFY(!m_qbsStdout.contains("Resolving"));
- waitForNewTimestamp();
- f.remove();
- QCOMPARE(runQbs(), 0);
- QVERIFY(m_qbsStdout.contains("Resolving"));
-}
-
void TestBlackbox::nonBrokenFilesInBrokenProduct()
{
QDir::setCurrent(testDataDir + "/non-broken-files-in-broken-product");
@@ -1968,10 +1601,18 @@ void TestBlackbox::nonBrokenFilesInBrokenProduct()
QVERIFY(!m_qbsStdout.contains("fine.cpp")); // The non-broken file must not be recompiled.
}
-void TestBlackbox::objC()
+void TestBlackbox::nonDefaultProduct()
{
- QDir::setCurrent(testDataDir + "/objc");
+ QDir::setCurrent(testDataDir + "/non-default-product");
+ const QString defaultAppExe = relativeExecutableFilePath("default app");
+ const QString nonDefaultAppExe = relativeExecutableFilePath("non-default app");
+
QCOMPARE(runQbs(), 0);
+ QVERIFY2(QFile::exists(defaultAppExe), qPrintable(defaultAppExe));
+ QVERIFY2(!QFile::exists(nonDefaultAppExe), qPrintable(nonDefaultAppExe));
+
+ QCOMPARE(runQbs(QbsRunParameters("--all-products")), 0);
+ QVERIFY2(QFile::exists(nonDefaultAppExe), qPrintable(nonDefaultAppExe));
}
void TestBlackbox::qmlDebugging()
@@ -1979,11 +1620,11 @@ void TestBlackbox::qmlDebugging()
QDir::setCurrent(testDataDir + "/qml-debugging");
QCOMPARE(runQbs(), 0);
Settings settings((QString()));
- Profile profile(buildProfileName, &settings);
+ Profile profile(profileName(), &settings);
if (!profile.value("qbs.toolchain").toStringList().contains("gcc"))
return;
QProcess nm;
- nm.start("nm", QStringList(executableFilePath("debuggable-app")));
+ nm.start("nm", QStringList(relativeExecutableFilePath("debuggable-app")));
if (nm.waitForStarted()) { // Let's ignore hosts without nm.
QVERIFY2(nm.waitForFinished(), qPrintable(nm.errorString()));
QVERIFY2(nm.exitCode() == 0, nm.readAllStandardError().constData());
@@ -1992,10 +1633,23 @@ void TestBlackbox::qmlDebugging()
}
}
-void TestBlackbox::projectWithPropertiesItem()
+void TestBlackbox::productDependenciesByType()
{
- QDir::setCurrent(testDataDir + "/project-with-properties-item");
+ QDir::setCurrent(testDataDir + "/product-dependencies-by-type");
QCOMPARE(runQbs(), 0);
+ QFile appListFile(relativeProductBuildDir("app list") + "/app-list.txt");
+ QVERIFY2(appListFile.open(QIODevice::ReadOnly), qPrintable(appListFile.fileName()));
+ const QList<QByteArray> appList = appListFile.readAll().trimmed().split('\n');
+ QCOMPARE(appList.count(), 3);
+ QStringList apps = QStringList()
+ << QDir::currentPath() + '/' + relativeExecutableFilePath("app1")
+ << QDir::currentPath() + '/' + relativeExecutableFilePath("app2")
+ << QDir::currentPath() + '/' + relativeExecutableFilePath("app3");
+ foreach (const QByteArray &line, appList) {
+ const QString cleanLine = QString::fromLocal8Bit(line.trimmed());
+ QVERIFY2(apps.removeOne(cleanLine), qPrintable(cleanLine));
+ }
+ QVERIFY(apps.isEmpty());
}
void TestBlackbox::properQuoting()
@@ -2010,12 +1664,6 @@ void TestBlackbox::properQuoting()
QCOMPARE(unifiedLineEndings(m_qbsStdout).constData(), expectedOutput);
}
-void TestBlackbox::propertiesBlocks()
-{
- QDir::setCurrent(testDataDir + "/propertiesBlocks");
- QCOMPARE(runQbs(), 0);
-}
-
void TestBlackbox::radAfterIncompleteBuild_data()
{
QTest::addColumn<QString>("projectFileName");
@@ -2026,7 +1674,7 @@ void TestBlackbox::radAfterIncompleteBuild_data()
void TestBlackbox::radAfterIncompleteBuild()
{
QDir::setCurrent(testDataDir + "/rad-after-incomplete-build");
- rmDirR(buildDir);
+ rmDirR(relativeBuildDir());
QFETCH(QString, projectFileName);
// Step 1: Have a directory where a file used to be.
@@ -2079,16 +1727,33 @@ void TestBlackbox::radAfterIncompleteBuild()
QCOMPARE(runQbs(params), 0);
}
+void TestBlackbox::subProfileChangeTracking()
+{
+ QDir::setCurrent(testDataDir + "/subprofile-change-tracking");
+ qbs::Settings settings((QString()));
+ qbs::Internal::TemporaryProfile subProfile("qbs-autotests-subprofile", &settings);
+ subProfile.p.setValue("baseProfile", profileName());
+ subProfile.p.setValue("cpp.includePaths", QStringList("/tmp/include1"));
+ settings.sync();
+ QCOMPARE(runQbs(), 0);
+
+ subProfile.p.setValue("cpp.includePaths", QStringList("/tmp/include2"));
+ settings.sync();
+ QCOMPARE(runQbs(), 0);
+ QVERIFY(!m_qbsStdout.contains("main1.cpp"));
+ QVERIFY(m_qbsStdout.contains("main2.cpp"));
+}
+
void TestBlackbox::installedApp()
{
QDir::setCurrent(testDataDir + "/installed_artifact");
- QCOMPARE(runQbs(QbsRunParameters("install")), 0);
+ QCOMPARE(runQbs(), 0);
QVERIFY(regularFileExists(defaultInstallRoot
+ HostOsInfo::appendExecutableSuffix(QLatin1String("/usr/bin/installedApp"))));
- QCOMPARE(runQbs(QbsRunParameters(QLatin1String("install"), QStringList("--install-root")
- << (testDataDir + "/installed-app"))), 0);
+ QCOMPARE(runQbs(QbsRunParameters(QStringList("qbs.installRoot:" + testDataDir
+ + "/installed-app"))), 0);
QVERIFY(regularFileExists(testDataDir
+ HostOsInfo::appendExecutableSuffix("/installed-app/usr/bin/installedApp")));
@@ -2096,7 +1761,7 @@ void TestBlackbox::installedApp()
QVERIFY(addedFile.open(QIODevice::WriteOnly));
addedFile.close();
QVERIFY(addedFile.exists());
- QCOMPARE(runQbs(QbsRunParameters(QLatin1String("install"), QStringList("--remove-first"))), 0);
+ QCOMPARE(runQbs(QbsRunParameters(QStringList("--clean-install-root"))), 0);
QVERIFY(regularFileExists(defaultInstallRoot
+ HostOsInfo::appendExecutableSuffix(QLatin1String("/usr/bin/installedApp"))));
QVERIFY(regularFileExists(defaultInstallRoot + QLatin1String("/usr/src/main.cpp")));
@@ -2111,7 +1776,7 @@ void TestBlackbox::installedApp()
projectFile.resize(0);
projectFile.write(content);
QVERIFY(projectFile.flush());
- QCOMPARE(runQbs(QbsRunParameters(QLatin1String("install"))), 0);
+ QCOMPARE(runQbs(), 0);
QVERIFY(regularFileExists(defaultInstallRoot
+ HostOsInfo::appendExecutableSuffix(QLatin1String("/usr/local/bin/installedApp"))));
QVERIFY(regularFileExists(defaultInstallRoot + QLatin1String("/usr/local/src/main.cpp")));
@@ -2122,7 +1787,7 @@ void TestBlackbox::installedApp()
projectFile.resize(0);
projectFile.write(content);
QVERIFY(projectFile.flush());
- QCOMPARE(runQbs(QbsRunParameters(QLatin1String("install"))), 0);
+ QCOMPARE(runQbs(), 0);
QVERIFY(regularFileExists(defaultInstallRoot
+ HostOsInfo::appendExecutableSuffix(QLatin1String("/usr/local/custom/installedApp"))));
@@ -2132,18 +1797,37 @@ void TestBlackbox::installedApp()
projectFile.resize(0);
projectFile.write(content);
projectFile.close();
- QCOMPARE(runQbs(QbsRunParameters(QLatin1String("install"))), 0);
+ QCOMPARE(runQbs(), 0);
QVERIFY(regularFileExists(defaultInstallRoot + QLatin1String("/usr/local/source/main.cpp")));
- rmDirR(buildDir);
- QbsRunParameters params;
- params.command = "install";
- params.arguments << "--no-build";
+ // Check whether changing install parameters on the command line causes re-installation.
+ QbsRunParameters(QStringList("qbs.installRoot:" + relativeBuildDir() + "/blubb"));
+ QCOMPARE(runQbs(QbsRunParameters(QStringList("qbs.installRoot:" + relativeBuildDir()
+ + "/blubb"))), 0);
+ QVERIFY(regularFileExists(relativeBuildDir() + "/blubb/usr/local/source/main.cpp"));
+
+ // Check --no-install
+ rmDirR(relativeBuildDir());
+ QCOMPARE(runQbs(QbsRunParameters(QStringList("--no-install"))), 0);
+ QCOMPARE(QDir(defaultInstallRoot).entryList(QDir::NoDotAndDotDot).count(), 0);
+
+ // Check --no-build
+ rmDirR(relativeBuildDir());
+ QbsRunParameters params("install", QStringList("--no-build"));
params.expectFailure = true;
QVERIFY(runQbs(params) != 0);
QVERIFY(m_qbsStderr.contains("No build graph"));
}
+void TestBlackbox::installedSourceFiles()
+{
+ QDir::setCurrent(testDataDir + "/installed-source-files");
+
+ QCOMPARE(runQbs(), 0);
+ QVERIFY(regularFileExists(defaultInstallRoot + QLatin1String("/readme.txt")));
+ QVERIFY(regularFileExists(defaultInstallRoot + QLatin1String("/main.cpp")));
+}
+
void TestBlackbox::toolLookup()
{
QbsRunParameters params(QLatin1String("setup-toolchains"), QStringList("--help"));
@@ -2207,7 +1891,7 @@ void TestBlackbox::missingProfile()
void TestBlackbox::testAssembly()
{
Settings settings((QString()));
- Profile profile(buildProfileName, &settings);
+ Profile profile(profileName(), &settings);
bool haveGcc = profile.value("qbs.toolchain").toStringList().contains("gcc");
QDir::setCurrent(testDataDir + "/assembly");
QVERIFY(runQbs() == 0);
@@ -2245,12 +1929,12 @@ void TestBlackbox::testNsis()
}
if (!haveMakeNsis) {
- SKIP_TEST("makensis is not installed");
+ QSKIP("makensis is not installed");
return;
}
Settings settings((QString()));
- Profile profile(buildProfileName, &settings);
+ Profile profile(profileName(), &settings);
bool targetIsWindows = profile.value("qbs.targetOS").toStringList().contains("windows");
QDir::setCurrent(testDataDir + "/nsis");
QVERIFY(runQbs() == 0);
@@ -2262,7 +1946,7 @@ void TestBlackbox::testNsis()
void TestBlackbox::testEmbedInfoPlist()
{
if (!HostOsInfo::isOsxHost())
- SKIP_TEST("only applies on OS X");
+ QSKIP("only applies on OS X");
QDir::setCurrent(testDataDir + QLatin1String("/embedInfoPlist"));
@@ -2270,11 +1954,33 @@ void TestBlackbox::testEmbedInfoPlist()
params.command = QLatin1String("run");
QCOMPARE(runQbs(params), 0);
- params.arguments = QStringList(QLatin1String("cpp.embedInfoPlist:false"));
+ params.arguments = QStringList(QLatin1String("bundle.embedInfoPlist:false"));
params.expectFailure = true;
QVERIFY(runQbs(params) != 0);
}
+void TestBlackbox::testFrameworkStructure()
+{
+ if (!HostOsInfo::isOsxHost())
+ QSKIP("only applies on OS X");
+
+ QDir::setCurrent(testDataDir + QLatin1String("/frameworkStructure"));
+
+ QbsRunParameters params;
+ QCOMPARE(runQbs(params), 0);
+
+ QVERIFY(regularFileExists(relativeProductBuildDir("Widget") + "/Widget.framework/Versions/A/Widget"));
+ QVERIFY(regularFileExists(relativeProductBuildDir("Widget") + "/Widget.framework/Versions/A/Headers/Widget.h"));
+ QVERIFY(regularFileExists(relativeProductBuildDir("Widget") + "/Widget.framework/Versions/A/PrivateHeaders/WidgetPrivate.h"));
+ QVERIFY(regularFileExists(relativeProductBuildDir("Widget") + "/Widget.framework/Versions/A/Resources/BaseResource"));
+ QVERIFY(regularFileExists(relativeProductBuildDir("Widget") + "/Widget.framework/Versions/A/Resources/en.lproj/EnglishResource"));
+ QVERIFY(directoryExists(relativeProductBuildDir("Widget") + "/Widget.framework/Versions/Current"));
+ QVERIFY(regularFileExists(relativeProductBuildDir("Widget") + "/Widget.framework/Widget"));
+ QVERIFY(directoryExists(relativeProductBuildDir("Widget") + "/Widget.framework/Headers"));
+ QVERIFY(directoryExists(relativeProductBuildDir("Widget") + "/Widget.framework/PrivateHeaders"));
+ QVERIFY(directoryExists(relativeProductBuildDir("Widget") + "/Widget.framework/Resources"));
+}
+
static bool haveWiX()
{
QStringList regKeys;
@@ -2311,17 +2017,17 @@ static bool haveWiX()
void TestBlackbox::testWiX()
{
if (!HostOsInfo::isWindowsHost()) {
- SKIP_TEST("only applies on Windows");
+ QSKIP("only applies on Windows");
return;
}
if (!haveWiX()) {
- SKIP_TEST("WiX is not installed");
+ QSKIP("WiX is not installed");
return;
}
Settings settings((QString()));
- Profile profile(buildProfileName, &settings);
+ Profile profile(profileName(), &settings);
const QByteArray arch = profile.value("qbs.architecture").toString().toLatin1();
QDir::setCurrent(testDataDir + "/wix");
@@ -2330,23 +2036,8 @@ void TestBlackbox::testWiX()
QVERIFY(m_qbsStdout.contains("compiling QbsBootstrapper.wxs"));
QVERIFY(m_qbsStdout.contains("linking qbs-" + arch + ".msi"));
QVERIFY(m_qbsStdout.contains("linking qbs-setup-" + arch + ".exe"));
- QVERIFY(regularFileExists(productBuildDir("QbsSetup") + "/qbs-" + arch + ".msi"));
- QVERIFY(regularFileExists(productBuildDir("QbsBootstrapper") + "/qbs-setup-" + arch + ".exe"));
-}
-
-static QString findExecutable(const QStringList &fileNames)
-{
- const QStringList path = QString::fromLocal8Bit(qgetenv("PATH"))
- .split(HostOsInfo::pathListSeparator(), QString::SkipEmptyParts);
-
- foreach (const QString &fileName, fileNames) {
- foreach (const QString &ppath, path) {
- const QString fullPath = ppath + QLatin1Char('/') + fileName;
- if (QFileInfo(fullPath).exists())
- return QDir::cleanPath(fullPath);
- }
- }
- return QString();
+ QVERIFY(regularFileExists(relativeProductBuildDir("QbsSetup") + "/qbs-" + arch + ".msi"));
+ QVERIFY(regularFileExists(relativeProductBuildDir("QbsBootstrapper") + "/qbs-setup-" + arch + ".exe"));
}
static bool haveNodeJs()
@@ -2361,7 +2052,7 @@ static bool haveNodeJs()
void TestBlackbox::testNodeJs()
{
if (!haveNodeJs()) {
- SKIP_TEST("Node.js is not installed");
+ QSKIP("Node.js is not installed");
return;
}
@@ -2371,13 +2062,13 @@ void TestBlackbox::testNodeJs()
params.command = QLatin1String("run");
QCOMPARE(runQbs(params), 0);
QVERIFY((bool)m_qbsStdout.contains("hello world"));
- QVERIFY(regularFileExists(productBuildDir("hello") + "/hello.js"));
+ QVERIFY(regularFileExists(relativeProductBuildDir("hello") + "/hello.js"));
}
void TestBlackbox::testTypeScript()
{
if (!haveNodeJs()) {
- SKIP_TEST("node.js is not installed");
+ QSKIP("node.js is not installed");
return;
}
@@ -2388,15 +2079,15 @@ void TestBlackbox::testTypeScript()
params.arguments = QStringList() << "-p" << "animals";
QCOMPARE(runQbs(params), 0);
- QVERIFY(regularFileExists(productBuildDir("animals") + "/animals.js"));
- QVERIFY(regularFileExists(productBuildDir("animals") + "/extra.js"));
- QVERIFY(regularFileExists(productBuildDir("animals") + "/main.js"));
+ QVERIFY(regularFileExists(relativeProductBuildDir("animals") + "/animals.js"));
+ QVERIFY(regularFileExists(relativeProductBuildDir("animals") + "/extra.js"));
+ QVERIFY(regularFileExists(relativeProductBuildDir("animals") + "/main.js"));
}
void TestBlackbox::testIconset()
{
if (!HostOsInfo::isOsxHost())
- SKIP_TEST("only applies on OS X");
+ QSKIP("only applies on OS X");
QDir::setCurrent(testDataDir + QLatin1String("/ib/iconset"));
@@ -2404,13 +2095,13 @@ void TestBlackbox::testIconset()
params.arguments = QStringList() << "-f" << "iconset.qbs";
QCOMPARE(runQbs(params), 0);
- QVERIFY(regularFileExists(productBuildDir("iconset") + "/white.icns"));
+ QVERIFY(regularFileExists(relativeProductBuildDir("iconset") + "/white.icns"));
}
void TestBlackbox::testIconsetApp()
{
if (!HostOsInfo::isOsxHost())
- SKIP_TEST("only applies on OS X");
+ QSKIP("only applies on OS X");
QDir::setCurrent(testDataDir + QLatin1String("/ib/iconsetapp"));
@@ -2418,16 +2109,16 @@ void TestBlackbox::testIconsetApp()
params.arguments = QStringList() << "-f" << "iconsetapp.qbs";
QCOMPARE(runQbs(params), 0);
- QVERIFY(regularFileExists(productBuildDir("iconsetapp") + "/iconsetapp.app/Contents/Resources/white.icns"));
+ QVERIFY(regularFileExists(relativeProductBuildDir("iconsetapp") + "/iconsetapp.app/Contents/Resources/white.icns"));
}
void TestBlackbox::testAssetCatalog()
{
if (!HostOsInfo::isOsxHost())
- SKIP_TEST("only applies on OS X");
+ QSKIP("only applies on OS X");
#ifdef Q_OS_MAC
if (QSysInfo::macVersion() < Q_MV_OSX(10, 9))
- SKIP_TEST("This test needs at least OS X 10.9.");
+ QSKIP("This test needs at least OS X 10.9.");
#endif
QDir::setCurrent(testDataDir + QLatin1String("/ib/assetcatalog"));
@@ -2440,48 +2131,43 @@ void TestBlackbox::testAssetCatalog()
QVERIFY((bool)m_qbsStdout.contains("actool"));
// should not produce a CAR since minimumOsxVersion will be < 10.9
- QVERIFY(!regularFileExists(productBuildDir("assetcatalogempty") + "/assetcatalogempty.app/Contents/Resources/Assets.car"));
+ QVERIFY(!regularFileExists(relativeProductBuildDir("assetcatalogempty") + "/assetcatalogempty.app/Contents/Resources/Assets.car"));
- rmDirR(buildDir);
+ rmDirR(relativeBuildDir());
params.arguments.append("cpp.minimumOsxVersion:10.9"); // force CAR generation
QCOMPARE(runQbs(params), 0);
// empty asset catalogs must still produce output
QVERIFY((bool)m_qbsStdout.contains("actool"));
- QVERIFY(regularFileExists(productBuildDir("assetcatalogempty") + "/assetcatalogempty.app/Contents/Resources/Assets.car"));
+ QVERIFY(regularFileExists(relativeProductBuildDir("assetcatalogempty") + "/assetcatalogempty.app/Contents/Resources/Assets.car"));
// this asset catalog happens to have an embedded icon set,
// but this should NOT be built since it is not in the files list
QVERIFY(!(bool)m_qbsStdout.contains("iconutil"));
// now we'll add the iconset
- rmDirR(buildDir);
+ rmDirR(relativeBuildDir());
params.arguments.append("project.includeIconset:true");
QCOMPARE(runQbs(params), 0);
QVERIFY(!(bool)m_qbsStdout.contains("actool"));
QVERIFY((bool)m_qbsStdout.contains("iconutil"));
// make sure the nibs/storyboards are in there
- QVERIFY(regularFileExists(productBuildDir("assetcatalogempty") + "/assetcatalogempty.app/Contents/Resources/MainMenu.nib"));
+ QVERIFY(regularFileExists(relativeProductBuildDir("assetcatalogempty") + "/assetcatalogempty.app/Contents/Resources/MainMenu.nib"));
#ifdef Q_OS_MAC
if (QSysInfo::macVersion() >= Q_MV_OSX(10, 10))
#endif
- QVERIFY(directoryExists(productBuildDir("assetcatalogempty") + "/assetcatalogempty.app/Contents/Resources/Storyboard.storyboardc"));
+ QVERIFY(directoryExists(relativeProductBuildDir("assetcatalogempty") + "/assetcatalogempty.app/Contents/Resources/Storyboard.storyboardc"));
}
-QString TestBlackbox::uniqueProductName(const QString &productName) const
+void TestBlackbox::testObjcArc()
{
- return productName + '.' + buildProfileName;
-}
+ if (!HostOsInfo::isOsxHost())
+ QSKIP("only applies on platforms supporting Objective-C");
-QString TestBlackbox::productBuildDir(const QString &productName) const
-{
- return buildDir + '/' + uniqueProductName(productName);
-}
+ QDir::setCurrent(testDataDir + QLatin1String("/objc-arc"));
-QString TestBlackbox::executableFilePath(const QString &productName) const
-{
- return productBuildDir(productName) + '/' + HostOsInfo::appendExecutableSuffix(productName);
+ QCOMPARE(runQbs(), 0);
}
void TestBlackbox::wildCardsAndRules()
@@ -2489,7 +2175,7 @@ void TestBlackbox::wildCardsAndRules()
QDir::setCurrent(testDataDir + "/wildcards-and-rules");
QCOMPARE(runQbs(), 0);
QVERIFY(m_qbsStdout.contains("Creating output artifact"));
- QFile output(productBuildDir("wildcards-and-rules") + "/test.mytype");
+ QFile output(relativeProductBuildDir("wildcards-and-rules") + "/test.mytype");
QVERIFY2(output.open(QIODevice::ReadOnly), qPrintable(output.errorString()));
QCOMPARE(output.readAll().count('\n'), 1);
output.close();
diff --git a/tests/auto/blackbox/tst_blackbox.h b/tests/auto/blackbox/tst_blackbox.h
index 2dd1215cf..f3a505774 100644
--- a/tests/auto/blackbox/tst_blackbox.h
+++ b/tests/auto/blackbox/tst_blackbox.h
@@ -78,10 +78,7 @@ class TestBlackbox : public QObject
const QString testDataDir;
const QString testSourceDir;
const QString qbsExecutableFilePath;
- const QString buildProfileName;
- const QString buildDir;
const QString defaultInstallRoot;
- const QString buildGraphPath;
public:
TestBlackbox();
@@ -96,69 +93,44 @@ public slots:
void initTestCase();
private slots:
- void addedFilePersistent();
- void addQObjectMacroToCppFile();
- void baseProperties();
+ void android();
void buildDirectories();
- void build_project_data();
- void build_project();
- void build_project_dry_run_data();
- void build_project_dry_run();
- void changeDependentLib();
void changedFiles_data();
void changedFiles();
void changeInDisabledProduct();
void dependenciesProperty();
- void disabledProject();
- void enableAndDisableProduct();
- void duplicateProductNames();
- void duplicateProductNames_data();
- void dynamicLibs();
void dynamicMultiplexRule();
void dynamicRuleOutputs();
- void emptyFileTagList();
- void emptySubmodulesList();
void erroneousFiles_data();
void erroneousFiles();
- void explicitlyDependsOn();
+ void exportRule();
void fileDependencies();
void installedTransformerOutput();
+ void inputsFromDependencies();
+ void installPackage();
+ void installable();
+ void java();
void jsExtensionsFile();
void jsExtensionsFileInfo();
void jsExtensionsProcess();
void jsExtensionsPropertyList();
void jsExtensionsTextFile();
- void inheritQbsSearchPaths();
void mixedBuildVariants();
- void mocCppIncluded();
void nestedProperties();
- void newOutputArtifactInDependency();
- void newPatternMatch();
void nonBrokenFilesInBrokenProduct();
- void objC();
+ void nonDefaultProduct();
void qmlDebugging();
- void projectWithPropertiesItem();
+ void productDependenciesByType();
void properQuoting();
- void propertiesBlocks();
void radAfterIncompleteBuild_data();
void radAfterIncompleteBuild();
- void resolve_project_data();
- void resolve_project();
- void resolve_project_dry_run_data();
- void resolve_project_dry_run();
- void typeChange();
+ void subProfileChangeTracking();
void usingsAsSoleInputsNonMultiplexed();
void clean();
- void exportSimple();
- void exportWithRecursiveDepends();
- void fileTagger();
- void rc();
- void removeFileDependency();
void renameDependency();
- void renameProduct();
- void renameTargetArtifact();
- void softDependency();
- void subProjects();
+ void separateDebugInfo();
+ void sevenZip();
+ void tar();
void track_qrc();
void track_qobject_change();
void trackAddFile();
@@ -169,38 +141,34 @@ private slots:
void trackAddMocInclude();
void trackAddProduct();
void trackRemoveProduct();
- void transformers();
- void uic();
void wildcardRenaming();
void recursiveRenaming();
void recursiveWildcards();
void ruleConditions();
void ruleCycle();
- void trackAddQObjectHeader();
- void trackRemoveQObjectHeader();
void overrideProjectProperties();
void productProperties();
void propertyChanges();
+ void qobjectInObjectiveCpp();
void installedApp();
+ void installedSourceFiles();
void toolLookup();
void checkProjectFilePath();
void missingProfile();
void testAssembly();
void testNsis();
void testEmbedInfoPlist();
+ void testFrameworkStructure();
void testWiX();
void testNodeJs();
void testTypeScript();
void testIconset();
void testIconsetApp();
void testAssetCatalog();
+ void testObjcArc();
void wildCardsAndRules();
private:
- QString uniqueProductName(const QString &productName) const;
- QString productBuildDir(const QString &productName) const;
- QString executableFilePath(const QString &productName) const;
-
QByteArray m_qbsStderr;
QByteArray m_qbsStdout;
};
diff --git a/tests/auto/buildgraph/buildgraph.qbs b/tests/auto/buildgraph/buildgraph.qbs
index 69ef0ddde..cc5885ca2 100644
--- a/tests/auto/buildgraph/buildgraph.qbs
+++ b/tests/auto/buildgraph/buildgraph.qbs
@@ -1,6 +1,6 @@
-import "../autotest.qbs" as AutoTest
+import qbs
-AutoTest {
+QbsAutotest {
testName: "buildgraph"
files: "tst_buildgraph.cpp"
}
diff --git a/tests/auto/cmdlineparser/cmdlineparser.qbs b/tests/auto/cmdlineparser/cmdlineparser.qbs
index 105d51be6..ddd0e62ce 100644
--- a/tests/auto/cmdlineparser/cmdlineparser.qbs
+++ b/tests/auto/cmdlineparser/cmdlineparser.qbs
@@ -1,10 +1,13 @@
-import "../autotest.qbs" as AutoTest
-import "../../../version.js" as Version
+import qbs
+import QbsFunctions
-AutoTest {
+QbsAutotest {
testName: "cmdlineparser"
files: ["tst_cmdlineparser.cpp", "../../../src/app/qbs/qbstool.cpp"]
- cpp.defines: base.concat(['SRCDIR="' + path + '"', "QBS_VERSION=\"" + Version.qbsVersion() + "\""])
+ cpp.defines: base.concat([
+ 'SRCDIR="' + path + '"',
+ "QBS_VERSION=\"" + QbsFunctions.qbsVersion() + "\""
+ ])
// TODO: Make parser a static library?
Group {
diff --git a/tests/auto/language/language.qbs b/tests/auto/language/language.qbs
index af081b741..ff9f518f2 100644
--- a/tests/auto/language/language.qbs
+++ b/tests/auto/language/language.qbs
@@ -1,6 +1,6 @@
-import "../autotest.qbs" as AutoTest
+import qbs
-AutoTest {
+QbsAutotest {
testName: "language"
files: "tst_language.cpp"
}
diff --git a/tests/auto/shared.h b/tests/auto/shared.h
index 996e675ec..8e0c109fc 100644
--- a/tests/auto/shared.h
+++ b/tests/auto/shared.h
@@ -34,22 +34,69 @@
#include <tools/profile.h>
#include <tools/settings.h>
+#include <QCryptographicHash>
+#include <QDir>
#include <QFile>
+#include <QFileInfo>
#include <QtTest>
-#if QT_VERSION >= 0x050000
-#define SKIP_TEST(message) QSKIP(message)
-#else
-#define SKIP_TEST(message) QSKIP(message, SkipAll)
-#endif
+#include <ctime>
+
+inline QString profileName() { return QLatin1String("qbs_autotests"); }
+inline QString relativeBuildDir() { return profileName() + QLatin1String("-debug"); }
+
+inline QString relativeBuildGraphFilePath() {
+ return relativeBuildDir() + QLatin1Char('/') + relativeBuildDir() + QLatin1String(".bg");
+}
+
+inline bool regularFileExists(const QString &filePath)
+{
+ const QFileInfo fi(filePath);
+ return fi.exists() && fi.isFile();
+}
+
+inline bool directoryExists(const QString &dirPath)
+{
+ const QFileInfo fi(dirPath);
+ return fi.exists() && fi.isDir();
+}
+
+inline QString uniqueProductName(const QString &productName, const QString &_profileName)
+{
+ const QString p = _profileName.isEmpty() ? profileName() : _profileName;
+ return productName + '.' + p;
+}
+
+inline QString relativeProductBuildDir(const QString &productName,
+ const QString &profileName = QString())
+{
+ const QString fullName = uniqueProductName(productName, profileName);
+ QString dirName = qbs::Internal::HostOsInfo::rfc1034Identifier(fullName);
+ const QByteArray hash = QCryptographicHash::hash(fullName.toUtf8(), QCryptographicHash::Sha1);
+ dirName.append('.').append(hash.toHex().left(8));
+ return relativeBuildDir() + '/' + dirName;
+}
+
+inline QString relativeExecutableFilePath(const QString &productName)
+{
+ return relativeProductBuildDir(productName) + '/'
+ + qbs::Internal::HostOsInfo::appendExecutableSuffix(productName);
+}
inline void waitForNewTimestamp()
{
// Waits for the time that corresponds to the host file system's time stamp granularity.
- if (qbs::Internal::HostOsInfo::isWindowsHost())
+ if (qbs::Internal::HostOsInfo::isWindowsHost()) {
QTest::qWait(1); // NTFS has 100 ns precision. Let's ignore exFAT.
- else
- QTest::qWait(1000);
+ } else {
+ time_t oldTime;
+ time_t newTime = std::time(0);
+ do {
+ oldTime = newTime;
+ QTest::qWait(50);
+ newTime = std::time(0);
+ } while (oldTime == newTime);
+ }
}
inline void touch(const QString &fn)
@@ -79,4 +126,21 @@ inline QString objectFileName(const QString &baseName, const QString &profileNam
return baseName + '.' + suffix;
}
+inline QString inputDirHash(const QString &dir)
+{
+ return QCryptographicHash::hash(dir.toLatin1(), QCryptographicHash::Sha1).toHex().left(16);
+}
+
+inline QString testWorkDir(const QString &testName)
+{
+ QString dir = QDir::fromNativeSeparators(QString::fromLocal8Bit(qgetenv("QBS_TEST_WORK_ROOT")));
+ if (dir.isEmpty()) {
+ dir = QCoreApplication::applicationDirPath() + QStringLiteral("/../tests/auto/");
+ } else {
+ if (!dir.endsWith(QLatin1Char('/')))
+ dir += QLatin1Char('/');
+ }
+ return dir + testName + "/testWorkDir";
+}
+
#endif // Include guard.
diff --git a/tests/auto/tools/tools.qbs b/tests/auto/tools/tools.qbs
index e0cb6c785..54a6ea485 100644
--- a/tests/auto/tools/tools.qbs
+++ b/tests/auto/tools/tools.qbs
@@ -1,6 +1,6 @@
-import "../autotest.qbs" as AutoTest
+import qbs
-AutoTest {
+QbsAutotest {
testName: "tools"
files: ["tst_tools.cpp"]
}
diff --git a/tests/fuzzy-test/fuzzy-test.qbs b/tests/fuzzy-test/fuzzy-test.qbs
index c9c4fb0ac..403e56c64 100644
--- a/tests/fuzzy-test/fuzzy-test.qbs
+++ b/tests/fuzzy-test/fuzzy-test.qbs
@@ -3,7 +3,6 @@ import qbs
QtApplication {
name: "qbs_fuzzy-test"
destinationDirectory: "bin"
- condition: Qt.core.versionMajor >= 5 // We use QDir::removeRecursively()
type: "application"
consoleApplication: true
files: [
diff --git a/tests/manual/configure/configure.qbs b/tests/manual/configure/configure.qbs
index acb257a3e..1a3c02bb5 100644
--- a/tests/manual/configure/configure.qbs
+++ b/tests/manual/configure/configure.qbs
@@ -6,6 +6,7 @@ Project {
qbsSearchPaths: '.'
Product {
type: 'application'
+ consoleApplication: true
name: project.name
files: 'main.cpp'
Depends { name: 'cpp' }
diff --git a/tests/manual/includeLookup/includeLookup.qbs b/tests/manual/includeLookup/includeLookup.qbs
index 61af93ade..452e4b5bd 100644
--- a/tests/manual/includeLookup/includeLookup.qbs
+++ b/tests/manual/includeLookup/includeLookup.qbs
@@ -6,6 +6,7 @@ Project {
qbsSearchPaths: '.'
Product {
type: 'application'
+ consoleApplication: true
name: project.name
files: 'main.cpp'
Depends { name: 'cpp' }
diff --git a/tests/manual/localDeployment/localDeployment.qbs b/tests/manual/localDeployment/localDeployment.qbs
index 6d5e7eb3e..83f02120b 100644
--- a/tests/manual/localDeployment/localDeployment.qbs
+++ b/tests/manual/localDeployment/localDeployment.qbs
@@ -3,6 +3,7 @@ import qbs 1.0
Project {
Product {
type: ["application"]
+ consoleApplication: true
name: "HelloWorld"
destinationDirectory: "bin"
diff --git a/tests/manual/minimumSystemVersion/minimumSystemVersion.qbs b/tests/manual/minimumSystemVersion/minimumSystemVersion.qbs
index fbb592cc9..177022381 100644
--- a/tests/manual/minimumSystemVersion/minimumSystemVersion.qbs
+++ b/tests/manual/minimumSystemVersion/minimumSystemVersion.qbs
@@ -3,9 +3,9 @@ import qbs 1.0
Project {
// no minimum versions are specified so the profile defaults will be used
QtApplication {
- type: "application"
name: "unspecified"
files: "main.cpp"
+ consoleApplication: true
Properties {
condition: qbs.targetOS.contains("darwin")
@@ -16,9 +16,9 @@ Project {
// no minimum versions are specified, and explicitly set to undefined in
// case the profile has set it
QtApplication {
- type: "application"
name: "unspecified-forced"
files: "main.cpp"
+ consoleApplication: true
cpp.minimumWindowsVersion: undefined
cpp.minimumOsxVersion: undefined
cpp.minimumIosVersion: undefined
@@ -34,10 +34,10 @@ Project {
// when the application is run its output should confirm
// that the given values took effect
QtApplication {
- type: "application"
condition: qbs.targetOS.contains("windows") || qbs.targetOS.contains("osx")
name: "specific"
files: "main.cpp"
+ consoleApplication: true
Properties {
condition: qbs.targetOS.contains("windows")
@@ -55,10 +55,10 @@ Project {
// (but will still compile and link since we avoid passing a
// bad value to the linker)
QtApplication {
- type: "application"
condition: qbs.targetOS.contains("windows")
name: "fakewindows"
files: "main.cpp"
+ consoleApplication: true
cpp.minimumWindowsVersion: "5.3"
}
@@ -66,10 +66,10 @@ Project {
// this only affects the value of __MAC_OS_X_VERSION_MIN_REQUIRED,
// not the actual LC_VERSION_MIN_MACOSX command which is limited to two
QtApplication {
- type: "application"
condition: qbs.targetOS.contains("osx")
name: "macappstore"
files: "main.cpp"
+ consoleApplication: true
cpp.frameworks: "Foundation"
cpp.minimumOsxVersion: "10.6.8"
}
diff --git a/tests/tests.pro b/tests/tests.pro
index e85059d70..8a102073b 100644
--- a/tests/tests.pro
+++ b/tests/tests.pro
@@ -1,3 +1,2 @@
TEMPLATE = subdirs
-SUBDIRS = auto
-greaterThan(QT_MAJOR_VERSION, 4):SUBDIRS += fuzzy-test # We use QDir::removeRecursively()
+SUBDIRS = auto fuzzy-test