diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/api/api.pro | 1 | ||||
-rw-r--r-- | tests/auto/api/api.qbs | 4 | ||||
-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.qbs | 10 | ||||
-rw-r--r-- | tests/auto/api/testdata/disabled-product/main.cpp | 1 | ||||
-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.qbs | 1 | ||||
-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.qbs | 1 | ||||
-rw-r--r-- | tests/auto/api/testdata/infinite-loop-process/infinite-loop.qbs | 5 | ||||
-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.qbs | 19 | ||||
-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.qbs | 1 | ||||
-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.cpp | 1 | ||||
-rw-r--r-- | tests/auto/api/testdata/productNameWithDots/project.qbs | 17 | ||||
-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.txt | 0 | ||||
-rw-r--r-- | tests/auto/api/testdata/recursive-wildcards/dir/subdir/file2.txt | 0 | ||||
-rw-r--r-- | tests/auto/api/testdata/recursive-wildcards/recursive_wildcards.qbs | 7 | ||||
-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.cpp | 1 | ||||
-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.cpp | 1 | ||||
-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.cpp | 1115 | ||||
-rw-r--r-- | tests/auto/api/tst_api.h | 56 | ||||
-rw-r--r-- | tests/auto/auto.pri | 1 | ||||
-rw-r--r-- | tests/auto/auto.pro | 3 | ||||
-rw-r--r-- | tests/auto/autotest.qbs | 21 | ||||
-rw-r--r-- | tests/auto/blackbox/blackbox.qbs | 5 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/android/android-project.qbs | 90 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/archiver/archivable.qbs | 13 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/archiver/list.txt | 2 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/archiver/test.txt | 0 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/build-directories/project.qbs | 2 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/changed-files/project.qbs | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/clean/clean.qbs | 3 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/dependenciesProperty/dependenciesProperty.qbs | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/dynamicRuleOutputs/before/genlexer.qbs | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/embedInfoPlist/embedInfoPlist.qbs | 4 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/export-rule/blubber.cpp | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/export-rule/export-rule.qbs | 37 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/export-rule/myapp.blubb | 8 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/fileDependencies/fileDependencies.qbs | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/frameworkStructure/BaseResource | 0 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/frameworkStructure/Widget.cpp | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/frameworkStructure/Widget.h | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/frameworkStructure/WidgetPrivate.h | 0 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/frameworkStructure/en.lproj/EnglishResource | 0 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/frameworkStructure/frameworkStructure.qbs | 13 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/inputs-from-dependencies/file1.txt | 0 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/inputs-from-dependencies/file2.txt | 0 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/inputs-from-dependencies/file3.txt | 0 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/inputs-from-dependencies/file4.txt | 0 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/inputs-from-dependencies/project.qbs | 51 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/installable/installable.qbs | 43 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/installable/main.cpp | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/installed-source-files/main.cpp | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/installed-source-files/project.qbs | 20 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/installed-source-files/readme.txt | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/installed_artifact/installed_artifact.qbs | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/installpackage/installpackage.qbs | 43 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/installpackage/lib.cpp | 3 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/installpackage/lib.h | 9 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/installpackage/main.cpp | 6 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/java/Car.java | 7 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/java/HelloWorld.java | 8 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/java/Jet.java | 7 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/java/NoPackage.java | 5 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/java/Ship.java | 12 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/java/Vehicle.java | 4 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/java/Vehicles.java | 34 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/java/vehicles.qbs | 18 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/jsextensions/propertylist.qbs | 10 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/non-broken-files-in-broken-product/project.qbs | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/non-default-product/main.cpp | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/non-default-product/project.qbs | 16 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/objc-arc/arc.m | 3 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/objc-arc/arc.mm | 3 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/objc-arc/main.m | 4 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/objc-arc/mrc.m | 3 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/objc-arc/mrc.mm | 3 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/objc-arc/objc-arc.qbs | 21 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/overrideProjectProperties/helper_lib.qbs | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/overrideProjectProperties/project.qbs | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/overrideProjectProperties/project_using_helper_lib.qbs | 2 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/product-dependencies-by-type/main.cpp | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/product-dependencies-by-type/project.qbs | 66 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/productproperties/app.qbs | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/proper quoting/proper quoting.qbs | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/propertyChanges/project.qbs | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/qml-debugging/project.qbs | 2 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/qobject-in-mm/main.mm | 13 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/qobject-in-mm/project.qbs | 6 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/qrc/i.qbs | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/ruleConditions/templates/zorduct.qbs | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/separate-debug-info/foo.cpp | 7 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/separate-debug-info/main.cpp | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/separate-debug-info/project.qbs | 30 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/subprofile-change-tracking/main1.cpp | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/subprofile-change-tracking/main2.cpp | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/subprofile-change-tracking/subprofile-change-tracking.qbs | 9 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/trackAddFile/after/project.qbs | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/trackAddFile/before/project.qbs | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/trackFileTags/after/project.qbs | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/trackFileTags/before/project.qbs | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/trackProducts/after/product3.qbs | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/trackProducts/before/product1.qbs | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/trackProducts/before/product2.qbs | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/trackQObjChange/i.qbs | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/usings-as-sole-inputs-non-multiplexed/project.qbs | 2 | ||||
-rw-r--r-- | tests/auto/blackbox/tst_blackbox.cpp | 1148 | ||||
-rw-r--r-- | tests/auto/blackbox/tst_blackbox.h | 64 | ||||
-rw-r--r-- | tests/auto/buildgraph/buildgraph.qbs | 4 | ||||
-rw-r--r-- | tests/auto/cmdlineparser/cmdlineparser.qbs | 11 | ||||
-rw-r--r-- | tests/auto/language/language.qbs | 4 | ||||
-rw-r--r-- | tests/auto/shared.h | 80 | ||||
-rw-r--r-- | tests/auto/tools/tools.qbs | 4 | ||||
-rw-r--r-- | tests/fuzzy-test/fuzzy-test.qbs | 1 | ||||
-rw-r--r-- | tests/manual/configure/configure.qbs | 1 | ||||
-rw-r--r-- | tests/manual/includeLookup/includeLookup.qbs | 1 | ||||
-rw-r--r-- | tests/manual/localDeployment/localDeployment.qbs | 1 | ||||
-rw-r--r-- | tests/manual/minimumSystemVersion/minimumSystemVersion.qbs | 10 | ||||
-rw-r--r-- | tests/tests.pro | 3 |
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 ¶ms) { - 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 ¶ms) } 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 |