!contains(TEMPLATE,subdirs) {

check.files                =
check.path                 = .

# If the test ends up in a different directory, we should cd to that directory.
# Note that qmake modifies DESTDIR after this file is processed,
# therefore, testing DESTDIR for emptiness is not sufficient.
# Also note that in debug-and-release mode we don't want to cd into the debug/release
# directory (e.g. if the test goes to foo/release/tst_thing.exe, we want to do
#  cd foo && release/tst_thing.exe ).
MUNGED_DESTDIR=$$DESTDIR
MUNGED_TARGET=$$TARGET
win32:debug_and_release {
    contains(DESTDIR,^release$)|contains(DESTDIR,^debug$):MUNGED_DESTDIR=

    # In debug-and-release mode, the first ../ in TARGET breaks out of the debug/release
    # subdirectory. However, since make's working directory is already outside of the
    # debug/release subdirectory, this first ../ should be ignored when deciding if
    # we have to change directory before running the test.
    MUNGED_TARGET=$$replace(MUNGED_TARGET,^\\.\\./,)
}
!isEmpty(MUNGED_DESTDIR):!contains(MUNGED_DESTDIR,^\\./?):check.commands = cd $(DESTDIR) &&
contains(MUNGED_TARGET,.*/.*):check.commands = cd $(DESTDIR) &&

# Allow for a custom test runner script
check.commands += $(TESTRUNNER)

macx {
    app_bundle: check.commands += ./$(QMAKE_TARGET).app/Contents/MacOS/$(QMAKE_TARGET)
    else:       check.commands += ./$(QMAKE_TARGET)
}
else:unix:      check.commands += ./$(QMAKE_TARGET)
else:           check.commands += $(DESTDIR_TARGET)

# For Qt/Embedded, run every test app as a QWS server
embedded:       check.commands += -qws

# Allow for custom arguments to tests
check.commands += $(TESTARGS)
QMAKE_EXTRA_TARGETS *= check

!debug_and_release|build_pass {
    check.depends = first
} else {
    check.CONFIG = recursive
    # In debug and release mode, only run the test once.
    # Run debug if available, release otherwise.
    debug_and_release {
        check.target = dummy_check
        check.recurse_target = check
        debug {
            real_check.depends = debug-check
            real_check.target = check
            QMAKE_EXTRA_TARGETS += real_check
        } else {
            real_check.depends = release-check
            real_check.target = check
            QMAKE_EXTRA_TARGETS += real_check
        }
    }
}

}

