diff options
Diffstat (limited to 'tests/ECMPoQmToolsTest')
-rw-r--r-- | tests/ECMPoQmToolsTest/CMakeLists.txt | 44 | ||||
-rw-r--r-- | tests/ECMPoQmToolsTest/check.cmake.in | 3 | ||||
-rw-r--r-- | tests/ECMPoQmToolsTest/check_conf.cmake.in | 2 | ||||
-rw-r--r-- | tests/ECMPoQmToolsTest/tr_thread_test.cpp | 69 | ||||
-rw-r--r-- | tests/ECMPoQmToolsTest/tr_thread_test_module.cpp | 12 |
5 files changed, 128 insertions, 2 deletions
diff --git a/tests/ECMPoQmToolsTest/CMakeLists.txt b/tests/ECMPoQmToolsTest/CMakeLists.txt index 73d2b427..2cd76f8f 100644 --- a/tests/ECMPoQmToolsTest/CMakeLists.txt +++ b/tests/ECMPoQmToolsTest/CMakeLists.txt @@ -82,7 +82,7 @@ target_link_libraries(tr_test PRIVATE Qt5::Core) # -# single-threaded test (different catalog name) +# single-threaded test (different catalog name, automoc) # # This is to check we don't overwrite previously-generated files. set(tr_test_2_SRCS @@ -90,15 +90,55 @@ set(tr_test_2_SRCS ) ecm_create_qm_loader(tr_test_2_SRCS catalog2) add_executable(tr_test_2 ${tr_test_2_SRCS}) +set_target_properties(tr_test_2 PROPERTIES AUTOMOC ON) +target_include_directories(tr_test_2 PRIVATE "${CMAKE_CURRENT_BINARY_DIR}") target_link_libraries(tr_test_2 PRIVATE Qt5::Core) # +# module for tr_thread_test +# +add_library(tr_thread_module MODULE tr_thread_test_module.cpp ${QMLOADER_FILES}) +target_link_libraries(tr_thread_module PRIVATE Qt5::Core) + + +# +# loading a module on a thread other than the main thread +# (automoc) +# +set(tr_thread_test_SRCS + tr_thread_test.cpp +) +ecm_create_qm_loader(tr_thread_test_SRCS catalog) +add_executable(tr_thread_test ${tr_thread_test_SRCS}) +set_target_properties(tr_thread_test PROPERTIES AUTOMOC ON) +target_include_directories(tr_thread_test PRIVATE "${CMAKE_CURRENT_BINARY_DIR}") +target_compile_definitions(tr_thread_test PRIVATE "MODULE_PATH=\"$<TARGET_FILE:tr_thread_module>\"") +target_link_libraries(tr_thread_test PRIVATE Qt5::Core) + + +# +# loading a module on a thread other than the main thread +# (different catalog, no AUTOMOC) +# +qt5_generate_moc(tr_thread_test.cpp "${CMAKE_CURRENT_BINARY_DIR}/tr_thread_test.moc") +set(tr_thread_test_2_SRCS + tr_thread_test.cpp + "${CMAKE_CURRENT_BINARY_DIR}/tr_thread_test.moc" +) +ecm_create_qm_loader(tr_thread_test_2_SRCS catalog2) +add_executable(tr_thread_test_2 ${tr_thread_test_2_SRCS}) +target_include_directories(tr_thread_test_2 PRIVATE "${CMAKE_CURRENT_BINARY_DIR}") +target_compile_definitions(tr_thread_test_2 PRIVATE "MODULE_PATH=\"$<TARGET_FILE:tr_thread_module>\"") +target_link_libraries(tr_thread_test_2 PRIVATE Qt5::Core) + + +# # call to ecm_create_qm_loader is in a different CMakeLists.txt to where # the target it is added to is defined # # This is not something we want people to do, but it's unfortunately something -# projects have done and we need to keep them building +# projects have done and we need to keep them building. unset(QMLOADER_FILES) ecm_create_qm_loader(QMLOADER_FILES catalog) assert_var_defined(QMLOADER_FILES) diff --git a/tests/ECMPoQmToolsTest/check.cmake.in b/tests/ECMPoQmToolsTest/check.cmake.in index 5329b78d..4fe2ac33 100644 --- a/tests/ECMPoQmToolsTest/check.cmake.in +++ b/tests/ECMPoQmToolsTest/check.cmake.in @@ -87,6 +87,9 @@ if("@CMAKE_SYSTEM_NAME@" STREQUAL "Linux") check_translations(TR_TEST_2 "${TR_TEST_2_EXEC}" catalog2) check_translations(TR_TEST_SUBDIR "${TR_TEST_SUBDIR_EXEC}" catalog) + + check_translations(TR_THREAD_TEST "${TR_THREAD_TEST_EXEC}" catalog) + check_translations(TR_THREAD_TEST_2 "${TR_THREAD_TEST_2_EXEC}" catalog2) endif() if (fail) diff --git a/tests/ECMPoQmToolsTest/check_conf.cmake.in b/tests/ECMPoQmToolsTest/check_conf.cmake.in index 7bd11c36..a752d5bd 100644 --- a/tests/ECMPoQmToolsTest/check_conf.cmake.in +++ b/tests/ECMPoQmToolsTest/check_conf.cmake.in @@ -1,3 +1,5 @@ set(TR_TEST_EXEC "$<TARGET_FILE:tr_test>") set(TR_TEST_2_EXEC "$<TARGET_FILE:tr_test_2>") set(TR_TEST_SUBDIR_EXEC "$<TARGET_FILE:tr_test_subdir>") +set(TR_THREAD_TEST_EXEC "$<TARGET_FILE:tr_thread_test>") +set(TR_THREAD_TEST_2_EXEC "$<TARGET_FILE:tr_thread_test_2>") diff --git a/tests/ECMPoQmToolsTest/tr_thread_test.cpp b/tests/ECMPoQmToolsTest/tr_thread_test.cpp new file mode 100644 index 00000000..40e4d1eb --- /dev/null +++ b/tests/ECMPoQmToolsTest/tr_thread_test.cpp @@ -0,0 +1,69 @@ +#include <QCoreApplication> +#include <QLibrary> +#include <QMetaObject> +#include <QThread> + +class Thread : public QThread +{ + Q_OBJECT + + QLibrary *m_lib; + +public: + Thread() + : m_lib(0) + {} + ~Thread() + { + delete m_lib; + } + +Q_SIGNALS: + void libraryLoaded(); + +public Q_SLOTS: + void printStrings() + { + Q_ASSERT(QThread::currentThread() == QCoreApplication::instance()->thread()); + + QFunctionPointer print_strings = m_lib->resolve("print_strings"); + if (print_strings) { + print_strings(); + } else { + qFatal("Could not resolve print_strings: %s", qPrintable(m_lib->errorString())); + } + + QCoreApplication::instance()->quit(); + } +protected: + void run() + { + m_lib = new QLibrary(MODULE_PATH); + + if (!m_lib->load()) { + qFatal("Could not load module: %s", m_lib->errorString().toUtf8().data()); + } + + // Queue a call to printStrings() on the main event loop (giving the + // translations a chance to be loaded). + QMetaObject::invokeMethod(this, "printStrings", Qt::QueuedConnection); + } +}; + +int main(int argc, char** argv) +{ + QCoreApplication app(argc, argv); + + Thread thread; + + // Start the thread *after* QCoreApplication is started (otherwise the + // plugin's startup function won't be run on the Thread, and we won't test + // what we wanted to test). + QMetaObject::invokeMethod(&thread, "start", Qt::QueuedConnection); + + app.exec(); + + return 0; +} + +#include "tr_thread_test.moc" diff --git a/tests/ECMPoQmToolsTest/tr_thread_test_module.cpp b/tests/ECMPoQmToolsTest/tr_thread_test_module.cpp new file mode 100644 index 00000000..b9000ffa --- /dev/null +++ b/tests/ECMPoQmToolsTest/tr_thread_test_module.cpp @@ -0,0 +1,12 @@ +#include <QCoreApplication> +#include <QTextStream> + +#include <stdio.h> + +extern "C" Q_DECL_EXPORT void print_strings() +{ + QTextStream output(stdout); + + output << QCoreApplication::translate("testcontext", "test string") << ":"; + output << QCoreApplication::translate("testcontext", "test plural %n", 0, 5) << '\n'; +} |