From 84af73a58210d819d0049120fdffa757ade9e784 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 1 Apr 2018 16:39:51 +0200 Subject: [PATCH] plugins: new testing workflow. The current testing workflow had quite a few major flaws and it was no longer possible after the move of Any* plugins to core. Among the flaws is: * Every plugin was basically built twice, once as the real plugin and once as a static testing library. Most of the build shared common object files, but nevertheless it inflated build times and made the buildsystem extremely complex. * Because the actual plugin binary was never actually loaded during the test, it couldn't spot problems like: - undefined references - errors in metadata files - mismatched plugin interface/version, missing entry points - broken static plugin import files * Tests that made use of independent plugins (such as TgaImageConverter test using TgaImporter to verify the output) had a hardcoded dependency on such plugins, making a minimal setup very hard. * Dynamic loading of plugins from the Any* proxies was always directed to the install location on the filesystem with no possibility to load these directly from the build tree. That caused random ABI mismatch crashes, or, on the other hand, if no plugins were installed, particular portions of the codebase weren't tested at all. Now the workflow is the following: * Every plugin is built exactly once, either as dynamic or as static. * The test always loads it via the plugin manager. If it's dynamic, it's loaded straight from the build directory; if it's static, it gets linked to the test executable directly. * Plugins used indirectly are always served from the build directory (if enabled) to ensure reproducibility and independence on what's installed on the filesystem. Missing presence of these plugins causes particular tests to be simply skipped. * Plugins that have extensive tests for internal functionality that's not exposed through the plugin interface are still built in two parts, but the internal tests are simply consuming the OBJECT files directly instead of linking to a static library. --- .../AnyAudioImporter/AnyImporter.cpp | 3 + .../AnyAudioImporter/AnyImporter.h | 2 +- .../AnyAudioImporter/CMakeLists.txt | 40 +- .../AnyAudioImporter/Test/CMakeLists.txt | 38 +- .../AnyAudioImporter/Test/Test.cpp | 34 +- .../AnyAudioImporter/Test/configure.h.cmake | 8 +- .../AnyAudioImporter/pluginRegistration.cpp | 29 -- .../AnyImageConverter/AnyImageConverter.cpp | 4 + .../AnyImageConverter/AnyImageConverter.h | 2 +- .../AnyImageConverter/CMakeLists.txt | 39 +- .../AnyImageConverter/Test/CMakeLists.txt | 39 +- .../AnyImageConverter/Test/Test.cpp | 34 +- .../AnyImageConverter/Test/configure.h.cmake | 8 +- .../AnyImageConverter/pluginRegistration.cpp | 29 -- .../AnyImageImporter/AnyImageImporter.cpp | 3 + .../AnyImageImporter/AnyImageImporter.h | 2 +- .../AnyImageImporter/CMakeLists.txt | 39 +- .../AnyImageImporter/Test/CMakeLists.txt | 38 +- .../AnyImageImporter/Test/Test.cpp | 33 +- .../AnyImageImporter/Test/configure.h.cmake | 8 +- .../AnyImageImporter/pluginRegistration.cpp | 29 -- .../AnySceneImporter/AnySceneImporter.cpp | 3 + .../AnySceneImporter/AnySceneImporter.h | 2 +- .../AnySceneImporter/CMakeLists.txt | 39 +- .../AnySceneImporter/Test/CMakeLists.txt | 38 +- .../AnySceneImporter/Test/Test.cpp | 33 +- .../AnySceneImporter/Test/configure.h.cmake | 8 +- .../AnySceneImporter/pluginRegistration.cpp | 29 -- src/MagnumPlugins/MagnumFont/CMakeLists.txt | 54 +-- src/MagnumPlugins/MagnumFont/MagnumFont.cpp | 3 + src/MagnumPlugins/MagnumFont/MagnumFont.h | 2 +- .../MagnumFont/Test/CMakeLists.txt | 28 +- .../MagnumFont/Test/MagnumFontGLTest.cpp | 51 ++- .../MagnumFont/Test/configure.h.cmake | 2 + .../MagnumFontConverter/CMakeLists.txt | 54 +-- .../MagnumFontConverter.cpp | 3 + .../MagnumFontConverter/MagnumFontConverter.h | 2 +- .../MagnumFontConverter/Test/CMakeLists.txt | 46 ++- .../Test/MagnumFontConverterGLTest.cpp | 35 +- .../Test/configure.h.cmake | 4 + .../pluginRegistration.cpp | 31 -- src/MagnumPlugins/ObjImporter/CMakeLists.txt | 37 +- src/MagnumPlugins/ObjImporter/ObjImporter.cpp | 3 + src/MagnumPlugins/ObjImporter/ObjImporter.h | 2 +- .../ObjImporter/Test/CMakeLists.txt | 34 +- src/MagnumPlugins/ObjImporter/Test/Test.cpp | 353 +++++++++--------- .../ObjImporter/Test/configure.h.cmake | 1 + .../TgaImageConverter/CMakeLists.txt | 35 +- .../TgaImageConverter/Test/CMakeLists.txt | 40 +- .../Test/TgaImageConverterTest.cpp | 52 ++- .../Test/configure.h.cmake} | 6 +- .../TgaImageConverter/TgaImageConverter.cpp | 3 + .../TgaImageConverter/pluginRegistration.cpp | 29 -- src/MagnumPlugins/TgaImporter/CMakeLists.txt | 42 +-- .../TgaImporter/Test/CMakeLists.txt | 34 +- .../TgaImporter/Test/TgaImporterTest.cpp | 67 ++-- .../TgaImporter/Test/configure.h.cmake | 1 + src/MagnumPlugins/TgaImporter/TgaImporter.cpp | 3 + src/MagnumPlugins/TgaImporter/TgaImporter.h | 2 +- .../TgaImporter/pluginRegistration.cpp | 29 -- .../WavAudioImporter/CMakeLists.txt | 34 +- .../WavAudioImporter/Test/CMakeLists.txt | 43 ++- .../Test/WavHeaderTest.cpp} | 32 +- .../WavAudioImporter/Test/WavImporterTest.cpp | 232 ++++++------ .../WavAudioImporter/Test/configure.h.cmake | 1 + .../WavAudioImporter/WavImporter.cpp | 3 + .../WavAudioImporter/pluginRegistration.cpp | 29 -- 67 files changed, 940 insertions(+), 1135 deletions(-) delete mode 100644 src/MagnumPlugins/AnyAudioImporter/pluginRegistration.cpp delete mode 100644 src/MagnumPlugins/AnyImageConverter/pluginRegistration.cpp delete mode 100644 src/MagnumPlugins/AnyImageImporter/pluginRegistration.cpp delete mode 100644 src/MagnumPlugins/AnySceneImporter/pluginRegistration.cpp delete mode 100644 src/MagnumPlugins/MagnumFontConverter/pluginRegistration.cpp rename src/MagnumPlugins/{ObjImporter/pluginRegistration.cpp => TgaImageConverter/Test/configure.h.cmake} (88%) delete mode 100644 src/MagnumPlugins/TgaImageConverter/pluginRegistration.cpp delete mode 100644 src/MagnumPlugins/TgaImporter/pluginRegistration.cpp rename src/MagnumPlugins/{MagnumFont/pluginRegistration.cpp => WavAudioImporter/Test/WavHeaderTest.cpp} (61%) delete mode 100644 src/MagnumPlugins/WavAudioImporter/pluginRegistration.cpp diff --git a/src/MagnumPlugins/AnyAudioImporter/AnyImporter.cpp b/src/MagnumPlugins/AnyAudioImporter/AnyImporter.cpp index 1242f183b..ccfdd4781 100644 --- a/src/MagnumPlugins/AnyAudioImporter/AnyImporter.cpp +++ b/src/MagnumPlugins/AnyAudioImporter/AnyImporter.cpp @@ -82,3 +82,6 @@ UnsignedInt AnyImporter::doFrequency() const { return _in->frequency(); } Containers::Array AnyImporter::doData() { return _in->data(); } }} + +CORRADE_PLUGIN_REGISTER(AnyAudioImporter, Magnum::Audio::AnyImporter, + "cz.mosra.magnum.Audio.AbstractImporter/0.1") diff --git a/src/MagnumPlugins/AnyAudioImporter/AnyImporter.h b/src/MagnumPlugins/AnyAudioImporter/AnyImporter.h index c521428db..6815497ea 100644 --- a/src/MagnumPlugins/AnyAudioImporter/AnyImporter.h +++ b/src/MagnumPlugins/AnyAudioImporter/AnyImporter.h @@ -36,7 +36,7 @@ #ifndef DOXYGEN_GENERATING_OUTPUT #ifndef MAGNUM_ANYAUDIOIMPORTER_BUILD_STATIC - #if defined(AnyAudioImporter_EXPORTS) || defined(AnyAudioImporterObjects_EXPORTS) + #ifdef AnyAudioImporter_EXPORTS #define MAGNUM_ANYAUDIOIMPORTER_EXPORT CORRADE_VISIBILITY_EXPORT #else #define MAGNUM_ANYAUDIOIMPORTER_EXPORT CORRADE_VISIBILITY_IMPORT diff --git a/src/MagnumPlugins/AnyAudioImporter/CMakeLists.txt b/src/MagnumPlugins/AnyAudioImporter/CMakeLists.txt index 1e1d0afc6..ba2431239 100644 --- a/src/MagnumPlugins/AnyAudioImporter/CMakeLists.txt +++ b/src/MagnumPlugins/AnyAudioImporter/CMakeLists.txt @@ -30,42 +30,20 @@ endif() configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/configure.h) -set(AnyAudioImporter_SRCS - AnyImporter.cpp) - -set(AnyAudioImporter_HEADERS - AnyImporter.h) - -# Objects shared between plugin and test library -add_library(AnyAudioImporterObjects OBJECT - ${AnyAudioImporter_SRCS} - ${AnyAudioImporter_HEADERS}) -target_include_directories(AnyAudioImporterObjects PUBLIC - $ - $) -target_compile_definitions(AnyAudioImporterObjects PRIVATE "AnyAudioImporterObjects_EXPORTS") -if(NOT BUILD_STATIC OR BUILD_STATIC_PIC) - set_target_properties(AnyAudioImporterObjects PROPERTIES POSITION_INDEPENDENT_CODE ON) -endif() -set_target_properties(AnyAudioImporterObjects PROPERTIES FOLDER "MagnumPlugins/AnyAudioImporter") - # AnyAudioImporter plugin add_plugin(AnyAudioImporter "${MAGNUM_PLUGINS_AUDIOIMPORTER_DEBUG_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_AUDIOIMPORTER_DEBUG_LIBRARY_INSTALL_DIR}" "${MAGNUM_PLUGINS_AUDIOIMPORTER_RELEASE_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_AUDIOIMPORTER_RELEASE_LIBRARY_INSTALL_DIR}" AnyAudioImporter.conf - $ - pluginRegistration.cpp) -if(BUILD_STATIC_PIC) + AnyImporter.cpp + AnyImporter.h) +if(BUILD_PLUGINS_STATIC AND BUILD_STATIC_PIC) set_target_properties(AnyAudioImporter PROPERTIES POSITION_INDEPENDENT_CODE ON) endif() -target_include_directories(AnyAudioImporter PUBLIC - ${PROJECT_SOURCE_DIR}/src - ${PROJECT_BINARY_DIR}/src) target_link_libraries(AnyAudioImporter PUBLIC Magnum MagnumAudio) -install(FILES ${AnyAudioImporter_HEADERS} DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/AnyAudioImporter) -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/configure.h DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/AnyAudioImporter) +install(FILES AnyImporter.h ${CMAKE_CURRENT_BINARY_DIR}/configure.h + DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/AnyAudioImporter) # Automatic static plugin import if(BUILD_PLUGINS_STATIC) @@ -76,14 +54,6 @@ if(BUILD_PLUGINS_STATIC) endif() if(BUILD_TESTS) - add_library(MagnumAnyAudioImporterTestLib STATIC - $ - ${PROJECT_SOURCE_DIR}/src/dummy.cpp) # XCode workaround, see file comment for details - target_include_directories(MagnumAnyAudioImporterTestLib PUBLIC - ${PROJECT_SOURCE_DIR}/src - ${PROJECT_BINARY_DIR}/src) - set_target_properties(MagnumAnyAudioImporterTestLib PROPERTIES FOLDER "MagnumPlugins/AnyAudioImporter") - target_link_libraries(MagnumAnyAudioImporterTestLib PUBLIC Magnum MagnumAudio) add_subdirectory(Test) endif() diff --git a/src/MagnumPlugins/AnyAudioImporter/Test/CMakeLists.txt b/src/MagnumPlugins/AnyAudioImporter/Test/CMakeLists.txt index 9d9484bfd..017095e47 100644 --- a/src/MagnumPlugins/AnyAudioImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/AnyAudioImporter/Test/CMakeLists.txt @@ -29,19 +29,37 @@ else() set(WAV_FILE ${PROJECT_SOURCE_DIR}/src/MagnumPlugins/WavAudioImporter/Test/stereo8.wav) endif() -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake - ${CMAKE_CURRENT_BINARY_DIR}/configure.h) +# CMake before 3.8 has broken $ expressions for iOS (see +# https://gitlab.kitware.com/cmake/cmake/merge_requests/404) and since Corrade +# doesn't support dynamic plugins on iOS, this sorta works around that. Should +# be revisited when updating Travis to newer Xcode (current has CMake 3.6). +if(NOT BUILD_PLUGINS_STATIC) + set(ANYAUDIOIMPORTER_PLUGIN_FILENAME $) + if(WITH_WAVAUDIOIMPORTER) + set(WAVAUDIOIMPORTER_PLUGIN_FILENAME $) + endif() + + # First replace ${} variables, then $<> generator expressions + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h.in) + file(GENERATE OUTPUT $/configure.h + INPUT ${CMAKE_CURRENT_BINARY_DIR}/configure.h.in) +else() + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h) +endif() corrade_add_test(AnyAudioImporterTest Test.cpp - LIBRARIES MagnumAnyAudioImporterTestLib + LIBRARIES MagnumAudio FILES ../../WavAudioImporter/Test/stereo8.wav) -target_include_directories(AnyAudioImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) -# On Win32 we need to avoid dllimporting AnyAudioImporter symbols, because it -# would search for the symbols in some DLL even when they were linked -# statically. However it apparently doesn't matter that they were dllexported -# when building the static library. EH. -if(WIN32) - target_compile_definitions(AnyAudioImporterTest PRIVATE "MAGNUM_ANYAUDIOIMPORTER_BUILD_STATIC") +if(NOT BUILD_PLUGINS_STATIC) + target_include_directories(AnyAudioImporterTest PRIVATE $) +else() + target_include_directories(AnyAudioImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + target_link_libraries(AnyAudioImporterTest PRIVATE AnyAudioImporter) + if(WITH_WAVAUDIOIMPORTER) + target_link_libraries(AnyAudioImporterTest PRIVATE WavAudioImporter) + endif() endif() set_target_properties(AnyAudioImporterTest PROPERTIES FOLDER "MagnumPlugins/AnyAudioImporter/Test") diff --git a/src/MagnumPlugins/AnyAudioImporter/Test/Test.cpp b/src/MagnumPlugins/AnyAudioImporter/Test/Test.cpp index e81f7d63c..fcfe99f15 100644 --- a/src/MagnumPlugins/AnyAudioImporter/Test/Test.cpp +++ b/src/MagnumPlugins/AnyAudioImporter/Test/Test.cpp @@ -27,7 +27,7 @@ #include #include -#include "MagnumPlugins/AnyAudioImporter/AnyImporter.h" +#include "Magnum/Audio/AbstractImporter.h" #include "configure.h" @@ -40,34 +40,44 @@ struct AnyImporterTest: TestSuite::Tester { void unknown(); -private: - PluginManager::Manager _manager; + /* Explicitly forbid system-wide plugin dependencies */ + PluginManager::Manager _manager{"nonexistent"}; }; -AnyImporterTest::AnyImporterTest(): _manager{MAGNUM_PLUGINS_AUDIOIMPORTER_DIR} { +AnyImporterTest::AnyImporterTest() { addTests({&AnyImporterTest::wav, &AnyImporterTest::unknown}); + + /* Load the plugin directly from the build tree. Otherwise it's static and + already loaded. */ + #ifdef ANYAUDIOIMPORTER_PLUGIN_FILENAME + CORRADE_INTERNAL_ASSERT(_manager.load(ANYAUDIOIMPORTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); + #endif + /* Optional plugins that don't have to be here */ + #ifdef WAVAUDIOIMPORTER_PLUGIN_FILENAME + CORRADE_INTERNAL_ASSERT(_manager.load(WAVAUDIOIMPORTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); + #endif } void AnyImporterTest::wav() { - if(_manager.loadState("WavAudioImporter") == PluginManager::LoadState::NotFound) - CORRADE_SKIP("WavAudioImporter plugin not found, cannot test"); + if(!(_manager.loadState("WavAudioImporter") & PluginManager::LoadState::Loaded)) + CORRADE_SKIP("WavAudioImporter plugin not enabled, cannot test"); - AnyImporter importer{_manager}; - CORRADE_VERIFY(importer.openFile(WAV_FILE)); + std::unique_ptr importer = _manager.instantiate("AnyAudioImporter"); + CORRADE_VERIFY(importer->openFile(WAV_FILE)); /* Check only parameters, as it is good enough proof that it is working */ - CORRADE_COMPARE(importer.format(), Buffer::Format::Stereo8); - CORRADE_COMPARE(importer.frequency(), 96000); + CORRADE_COMPARE(importer->format(), Buffer::Format::Stereo8); + CORRADE_COMPARE(importer->frequency(), 96000); } void AnyImporterTest::unknown() { std::ostringstream output; Error redirectError{&output}; - AnyImporter importer{_manager}; - CORRADE_VERIFY(!importer.openFile("sound.mid")); + std::unique_ptr importer = _manager.instantiate("AnyAudioImporter"); + CORRADE_VERIFY(!importer->openFile("sound.mid")); CORRADE_COMPARE(output.str(), "Audio::AnyImporter::openFile(): cannot determine type of file sound.mid\n"); } diff --git a/src/MagnumPlugins/AnyAudioImporter/Test/configure.h.cmake b/src/MagnumPlugins/AnyAudioImporter/Test/configure.h.cmake index 4129f50ab..99198c29a 100644 --- a/src/MagnumPlugins/AnyAudioImporter/Test/configure.h.cmake +++ b/src/MagnumPlugins/AnyAudioImporter/Test/configure.h.cmake @@ -23,10 +23,6 @@ DEALINGS IN THE SOFTWARE. */ -#ifdef CORRADE_IS_DEBUG_BUILD -#define MAGNUM_PLUGINS_AUDIOIMPORTER_DIR "${MAGNUM_PLUGINS_AUDIOIMPORTER_DEBUG_DIR}" -#else -#define MAGNUM_PLUGINS_AUDIOIMPORTER_DIR "${MAGNUM_PLUGINS_AUDIOIMPORTER_DIR}" -#endif - +#cmakedefine ANYAUDIOIMPORTER_PLUGIN_FILENAME "${ANYAUDIOIMPORTER_PLUGIN_FILENAME}" +#cmakedefine WAVAUDIOIMPORTER_PLUGIN_FILENAME "${WAVAUDIOIMPORTER_PLUGIN_FILENAME}" #define WAV_FILE "${WAV_FILE}" diff --git a/src/MagnumPlugins/AnyAudioImporter/pluginRegistration.cpp b/src/MagnumPlugins/AnyAudioImporter/pluginRegistration.cpp deleted file mode 100644 index 67af6d38c..000000000 --- a/src/MagnumPlugins/AnyAudioImporter/pluginRegistration.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* - This file is part of Magnum. - - Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 - Vladimír Vondruš - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. -*/ - -#include "MagnumPlugins/AnyAudioImporter/AnyImporter.h" - -CORRADE_PLUGIN_REGISTER(AnyAudioImporter, Magnum::Audio::AnyImporter, - "cz.mosra.magnum.Audio.AbstractImporter/0.1") diff --git a/src/MagnumPlugins/AnyImageConverter/AnyImageConverter.cpp b/src/MagnumPlugins/AnyImageConverter/AnyImageConverter.cpp index 925daf35b..4c4b815de 100644 --- a/src/MagnumPlugins/AnyImageConverter/AnyImageConverter.cpp +++ b/src/MagnumPlugins/AnyImageConverter/AnyImageConverter.cpp @@ -86,3 +86,7 @@ bool AnyImageConverter::doExportToFile(const CompressedImageView2D&, const std:: } }} + + +CORRADE_PLUGIN_REGISTER(AnyImageConverter, Magnum::Trade::AnyImageConverter, + "cz.mosra.magnum.Trade.AbstractImageConverter/0.2.1") diff --git a/src/MagnumPlugins/AnyImageConverter/AnyImageConverter.h b/src/MagnumPlugins/AnyImageConverter/AnyImageConverter.h index d90de7fa9..61b3adfe1 100644 --- a/src/MagnumPlugins/AnyImageConverter/AnyImageConverter.h +++ b/src/MagnumPlugins/AnyImageConverter/AnyImageConverter.h @@ -35,7 +35,7 @@ #ifndef DOXYGEN_GENERATING_OUTPUT #ifndef MAGNUM_ANYIMAGECONVERTER_BUILD_STATIC - #if defined(AnyImageConverter_EXPORTS) || defined(AnyImageConverterObjects_EXPORTS) + #ifdef AnyImageConverter_EXPORTS #define MAGNUM_ANYIMAGECONVERTER_EXPORT CORRADE_VISIBILITY_EXPORT #else #define MAGNUM_ANYIMAGECONVERTER_EXPORT CORRADE_VISIBILITY_IMPORT diff --git a/src/MagnumPlugins/AnyImageConverter/CMakeLists.txt b/src/MagnumPlugins/AnyImageConverter/CMakeLists.txt index 9f18dfc03..433b047c0 100644 --- a/src/MagnumPlugins/AnyImageConverter/CMakeLists.txt +++ b/src/MagnumPlugins/AnyImageConverter/CMakeLists.txt @@ -30,41 +30,20 @@ endif() configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/configure.h) -set(AnyImageConverter_SRCS - AnyImageConverter.cpp) - -set(AnyImageConverter_HEADERS - AnyImageConverter.h) - -# Objects shared between plugin and test library -add_library(AnyImageConverterObjects OBJECT - ${AnyImageConverter_SRCS} - ${AnyImageConverter_HEADERS}) -target_include_directories(AnyImageConverterObjects PUBLIC - $) -target_compile_definitions(AnyImageConverterObjects PRIVATE "AnyImageConverterObjects_EXPORTS") -if(NOT BUILD_STATIC OR BUILD_STATIC_PIC) - set_target_properties(AnyImageConverterObjects PROPERTIES POSITION_INDEPENDENT_CODE ON) -endif() -set_target_properties(AnyImageConverterObjects PROPERTIES FOLDER "MagnumPlugins/AnyImageConverter") - # AnyImageConverter plugin add_plugin(AnyImageConverter "${MAGNUM_PLUGINS_IMAGECONVERTER_DEBUG_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_IMAGECONVERTER_DEBUG_LIBRARY_INSTALL_DIR}" "${MAGNUM_PLUGINS_IMAGECONVERTER_RELEASE_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_IMAGECONVERTER_RELEASE_LIBRARY_INSTALL_DIR}" AnyImageConverter.conf - $ - pluginRegistration.cpp) -if(BUILD_STATIC_PIC) + AnyImageConverter.cpp + AnyImageConverter.h) +if(BUILD_PLUGINS_STATIC AND BUILD_STATIC_PIC) set_target_properties(AnyImageConverter PROPERTIES POSITION_INDEPENDENT_CODE ON) endif() -target_include_directories(AnyImageConverter PUBLIC - ${PROJECT_SOURCE_DIR}/src - ${PROJECT_BINARY_DIR}/src) target_link_libraries(AnyImageConverter PUBLIC Magnum) -install(FILES ${AnyImageConverter_HEADERS} DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/AnyImageConverter) -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/configure.h DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/AnyImageConverter) +install(FILES AnyImageConverter.h ${CMAKE_CURRENT_BINARY_DIR}/configure.h + DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/AnyImageConverter) # Automatic static plugin import if(BUILD_PLUGINS_STATIC) @@ -75,14 +54,6 @@ if(BUILD_PLUGINS_STATIC) endif() if(BUILD_TESTS) - add_library(MagnumAnyImageConverterTestLib STATIC - $ - ${PROJECT_SOURCE_DIR}/src/dummy.cpp) # XCode workaround, see file comment for details - target_include_directories(MagnumAnyImageConverterTestLib PUBLIC - ${PROJECT_SOURCE_DIR}/src - ${PROJECT_BINARY_DIR}/src) - set_target_properties(MagnumAnyImageConverterTestLib PROPERTIES FOLDER "MagnumPlugins/AnyImageConverter") - target_link_libraries(MagnumAnyImageConverterTestLib PUBLIC Magnum) add_subdirectory(Test) endif() diff --git a/src/MagnumPlugins/AnyImageConverter/Test/CMakeLists.txt b/src/MagnumPlugins/AnyImageConverter/Test/CMakeLists.txt index d3f2be57c..97d74e9ca 100644 --- a/src/MagnumPlugins/AnyImageConverter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/AnyImageConverter/Test/CMakeLists.txt @@ -29,17 +29,34 @@ else() set(ANYIMAGECONVERTER_TEST_DIR ${CMAKE_CURRENT_BINARY_DIR}) endif() -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake - ${CMAKE_CURRENT_BINARY_DIR}/configure.h) +# CMake before 3.8 has broken $ expressions for iOS (see +# https://gitlab.kitware.com/cmake/cmake/merge_requests/404) and since Corrade +# doesn't support dynamic plugins on iOS, this sorta works around that. Should +# be revisited when updating Travis to newer Xcode (current has CMake 3.6). +if(NOT BUILD_PLUGINS_STATIC) + set(ANYIMAGECONVERTER_PLUGIN_FILENAME $) + if(WITH_TGAIMAGECONVERTER) + set(TGAIMAGECONVERTER_PLUGIN_FILENAME $) + endif() -corrade_add_test(AnyImageConverterTest Test.cpp - LIBRARIES MagnumAnyImageConverterTestLib) -target_include_directories(AnyImageConverterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) -# On Win32 we need to avoid dllimporting AnyImageConverter symbols, because it -# would search for the symbols in some DLL even when they were linked -# statically. However it apparently doesn't matter that they were dllexported -# when building the static library. EH. -if(WIN32) - target_compile_definitions(AnyImageConverterTest PRIVATE "MAGNUM_ANYIMAGECONVERTER_BUILD_STATIC") + # First replace ${} variables, then $<> generator expressions + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h.in) + file(GENERATE OUTPUT $/configure.h + INPUT ${CMAKE_CURRENT_BINARY_DIR}/configure.h.in) +else() + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h) +endif() + +corrade_add_test(AnyImageConverterTest Test.cpp LIBRARIES Magnum) +if(NOT BUILD_PLUGINS_STATIC) + target_include_directories(AnyImageConverterTest PRIVATE $) +else() + target_include_directories(AnyImageConverterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + target_link_libraries(AnyImageConverterTest PRIVATE AnyImageConverter) + if(WITH_TGAIMAGECONVERTER) + target_link_libraries(AnyImageConverterTest PRIVATE TgaImageConverter) + endif() endif() set_target_properties(AnyImageConverterTest PROPERTIES FOLDER "MagnumPlugins/AnyImageConverter/Test") diff --git a/src/MagnumPlugins/AnyImageConverter/Test/Test.cpp b/src/MagnumPlugins/AnyImageConverter/Test/Test.cpp index 1af5e0895..a1da15d26 100644 --- a/src/MagnumPlugins/AnyImageConverter/Test/Test.cpp +++ b/src/MagnumPlugins/AnyImageConverter/Test/Test.cpp @@ -29,10 +29,9 @@ #include #include "Magnum/PixelFormat.h" +#include "Magnum/Trade/AbstractImageConverter.h" #include "Magnum/Trade/ImageData.h" -#include "MagnumPlugins/AnyImageConverter/AnyImageConverter.h" - #include "configure.h" namespace Magnum { namespace Trade { namespace Test { @@ -44,14 +43,27 @@ struct AnyImageConverterTest: TestSuite::Tester { void unknown(); - private: - PluginManager::Manager _manager; + /* Explicitly forbid system-wide plugin dependencies */ + PluginManager::Manager _manager{"nonexistent"}; }; -AnyImageConverterTest::AnyImageConverterTest(): _manager{MAGNUM_PLUGINS_IMAGECONVERTER_DIR} { +AnyImageConverterTest::AnyImageConverterTest() { addTests({&AnyImageConverterTest::tga, &AnyImageConverterTest::unknown}); + + /* Load the plugin directly from the build tree. Otherwise it's static and + already loaded. */ + #ifdef ANYIMAGECONVERTER_PLUGIN_FILENAME + CORRADE_INTERNAL_ASSERT(_manager.load(ANYIMAGECONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); + #endif + /* Optional plugins that don't have to be here */ + #ifdef TGAIMAGECONVERTER_PLUGIN_FILENAME + CORRADE_INTERNAL_ASSERT(_manager.load(TGAIMAGECONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); + #endif + + /* Create the output directory if it doesn't exist yet */ + CORRADE_INTERNAL_ASSERT(Utility::Directory::mkpath(ANYIMAGECONVERTER_TEST_DIR)); } namespace { @@ -65,8 +77,8 @@ namespace { } void AnyImageConverterTest::tga() { - if(_manager.loadState("TgaImageConverter") == PluginManager::LoadState::NotFound) - CORRADE_SKIP("TgaImageConverter plugin not found, cannot test"); + if(!(_manager.loadState("TgaImageConverter") & PluginManager::LoadState::Loaded)) + CORRADE_SKIP("TgaImageConverter plugin not enabled, cannot test"); const std::string filename = Utility::Directory::join(ANYIMAGECONVERTER_TEST_DIR, "output.tga"); @@ -74,8 +86,8 @@ void AnyImageConverterTest::tga() { CORRADE_VERIFY(Utility::Directory::rm(filename)); /* Just test that the exported file exists */ - AnyImageConverter converter{_manager}; - CORRADE_VERIFY(converter.exportToFile(Image, filename)); + std::unique_ptr converter = _manager.instantiate("AnyImageConverter"); + CORRADE_VERIFY(converter->exportToFile(Image, filename)); CORRADE_VERIFY(Utility::Directory::fileExists(filename)); } @@ -83,8 +95,8 @@ void AnyImageConverterTest::unknown() { std::ostringstream output; Error redirectError{&output}; - AnyImageConverter converter{_manager}; - CORRADE_VERIFY(!converter.exportToFile(Image, "image.xcf")); + std::unique_ptr converter = _manager.instantiate("AnyImageConverter"); + CORRADE_VERIFY(!converter->exportToFile(Image, "image.xcf")); CORRADE_COMPARE(output.str(), "Trade::AnyImageConverter::exportToFile(): cannot determine type of file image.xcf\n"); } diff --git a/src/MagnumPlugins/AnyImageConverter/Test/configure.h.cmake b/src/MagnumPlugins/AnyImageConverter/Test/configure.h.cmake index 6bc996f64..008f84cf7 100644 --- a/src/MagnumPlugins/AnyImageConverter/Test/configure.h.cmake +++ b/src/MagnumPlugins/AnyImageConverter/Test/configure.h.cmake @@ -23,10 +23,6 @@ DEALINGS IN THE SOFTWARE. */ -#ifdef CORRADE_IS_DEBUG_BUILD -#define MAGNUM_PLUGINS_IMAGECONVERTER_DIR "${MAGNUM_PLUGINS_IMAGECONVERTER_DEBUG_DIR}" -#else -#define MAGNUM_PLUGINS_IMAGECONVERTER_DIR "${MAGNUM_PLUGINS_IMAGECONVERTER_DIR}" -#endif - +#cmakedefine ANYIMAGECONVERTER_PLUGIN_FILENAME "${ANYIMAGECONVERTER_PLUGIN_FILENAME}" +#cmakedefine TGAIMAGECONVERTER_PLUGIN_FILENAME "${TGAIMAGECONVERTER_PLUGIN_FILENAME}" #define ANYIMAGECONVERTER_TEST_DIR "${ANYIMAGECONVERTER_TEST_DIR}" diff --git a/src/MagnumPlugins/AnyImageConverter/pluginRegistration.cpp b/src/MagnumPlugins/AnyImageConverter/pluginRegistration.cpp deleted file mode 100644 index 7a0ecc66b..000000000 --- a/src/MagnumPlugins/AnyImageConverter/pluginRegistration.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* - This file is part of Magnum. - - Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 - Vladimír Vondruš - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. -*/ - -#include "MagnumPlugins/AnyImageConverter/AnyImageConverter.h" - -CORRADE_PLUGIN_REGISTER(AnyImageConverter, Magnum::Trade::AnyImageConverter, - "cz.mosra.magnum.Trade.AbstractImageConverter/0.2.1") diff --git a/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.cpp b/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.cpp index 1b1c311b1..bbee8d9d1 100644 --- a/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.cpp +++ b/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.cpp @@ -123,3 +123,6 @@ UnsignedInt AnyImageImporter::doImage2DCount() const { return _in->image2DCount( Containers::Optional AnyImageImporter::doImage2D(const UnsignedInt id) { return _in->image2D(id); } }} + +CORRADE_PLUGIN_REGISTER(AnyImageImporter, Magnum::Trade::AnyImageImporter, + "cz.mosra.magnum.Trade.AbstractImporter/0.3") diff --git a/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.h b/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.h index b6783366e..a9887b07d 100644 --- a/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.h +++ b/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.h @@ -35,7 +35,7 @@ #ifndef DOXYGEN_GENERATING_OUTPUT #ifndef MAGNUM_ANYIMAGEIMPORTER_BUILD_STATIC - #if defined(AnyImageImporter_EXPORTS) || defined(AnyImageImporterObjects_EXPORTS) + #ifdef AnyImageImporter_EXPORTS #define MAGNUM_ANYIMAGEIMPORTER_EXPORT CORRADE_VISIBILITY_EXPORT #else #define MAGNUM_ANYIMAGEIMPORTER_EXPORT CORRADE_VISIBILITY_IMPORT diff --git a/src/MagnumPlugins/AnyImageImporter/CMakeLists.txt b/src/MagnumPlugins/AnyImageImporter/CMakeLists.txt index c60e68991..3c67596fd 100644 --- a/src/MagnumPlugins/AnyImageImporter/CMakeLists.txt +++ b/src/MagnumPlugins/AnyImageImporter/CMakeLists.txt @@ -30,41 +30,20 @@ endif() configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/configure.h) -set(AnyImageImporter_SRCS - AnyImageImporter.cpp) - -set(AnyImageImporter_HEADERS - AnyImageImporter.h) - -# Objects shared between plugin and test library -add_library(AnyImageImporterObjects OBJECT - ${AnyImageImporter_SRCS} - ${AnyImageImporter_HEADERS}) -target_include_directories(AnyImageImporterObjects PUBLIC - $) -target_compile_definitions(AnyImageImporterObjects PRIVATE "AnyImageImporterObjects_EXPORTS") -if(NOT BUILD_STATIC OR BUILD_STATIC_PIC) - set_target_properties(AnyImageImporterObjects PROPERTIES POSITION_INDEPENDENT_CODE ON) -endif() -set_target_properties(AnyImageImporterObjects PROPERTIES FOLDER "MagnumPlugins/AnyImageImporter") - # AnyImageImporter plugin add_plugin(AnyImageImporter "${MAGNUM_PLUGINS_IMPORTER_DEBUG_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_IMPORTER_DEBUG_LIBRARY_INSTALL_DIR}" "${MAGNUM_PLUGINS_IMPORTER_RELEASE_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_IMPORTER_RELEASE_LIBRARY_INSTALL_DIR}" AnyImageImporter.conf - $ - pluginRegistration.cpp) -if(BUILD_STATIC_PIC) + AnyImageImporter.cpp + AnyImageImporter.h) +if(BUILD_PLUGINS_STATIC AND BUILD_STATIC_PIC) set_target_properties(AnyImageImporter PROPERTIES POSITION_INDEPENDENT_CODE ON) endif() -target_include_directories(AnyImageImporter PUBLIC - ${PROJECT_SOURCE_DIR}/src - ${PROJECT_BINARY_DIR}/src) target_link_libraries(AnyImageImporter PUBLIC Magnum) -install(FILES ${AnyImageImporter_HEADERS} DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/AnyImageImporter) -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/configure.h DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/AnyImageImporter) +install(FILES AnyImageImporter.h ${CMAKE_CURRENT_BINARY_DIR}/configure.h + DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/AnyImageImporter) # Automatic static plugin import if(BUILD_PLUGINS_STATIC) @@ -75,14 +54,6 @@ if(BUILD_PLUGINS_STATIC) endif() if(BUILD_TESTS) - add_library(MagnumAnyImageImporterTestLib STATIC - $ - ${PROJECT_SOURCE_DIR}/src/dummy.cpp) # XCode workaround, see file comment for details - target_include_directories(MagnumAnyImageImporterTestLib PUBLIC - ${PROJECT_SOURCE_DIR}/src - ${PROJECT_BINARY_DIR}/src) - set_target_properties(MagnumAnyImageImporterTestLib PROPERTIES FOLDER "MagnumPlugins/AnyImageImporter") - target_link_libraries(MagnumAnyImageImporterTestLib PUBLIC Magnum) add_subdirectory(Test) endif() diff --git a/src/MagnumPlugins/AnyImageImporter/Test/CMakeLists.txt b/src/MagnumPlugins/AnyImageImporter/Test/CMakeLists.txt index 39ab280a7..45a1ec4ae 100644 --- a/src/MagnumPlugins/AnyImageImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/AnyImageImporter/Test/CMakeLists.txt @@ -29,19 +29,37 @@ else() set(TGA_FILE ${PROJECT_SOURCE_DIR}/src/MagnumPlugins/TgaImporter/Test/file.tga) endif() -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake - ${CMAKE_CURRENT_BINARY_DIR}/configure.h) +# CMake before 3.8 has broken $ expressions for iOS (see +# https://gitlab.kitware.com/cmake/cmake/merge_requests/404) and since Corrade +# doesn't support dynamic plugins on iOS, this sorta works around that. Should +# be revisited when updating Travis to newer Xcode (current has CMake 3.6). +if(NOT BUILD_PLUGINS_STATIC) + set(ANYIMAGEIMPORTER_PLUGIN_FILENAME $) + if(WITH_TGAIMPORTER) + set(TGAIMAGEIMPORTER_PLUGIN_FILENAME $) + endif() + + # First replace ${} variables, then $<> generator expressions + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h.in) + file(GENERATE OUTPUT $/configure.h + INPUT ${CMAKE_CURRENT_BINARY_DIR}/configure.h.in) +else() + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h) +endif() corrade_add_test(AnyImageImporterTest Test.cpp - LIBRARIES MagnumAnyImageImporterTestLib + LIBRARIES Magnum FILES ../../TgaImporter/Test/file.tga) -target_include_directories(AnyImageImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) -# On Win32 we need to avoid dllimporting AnyImageImporter symbols, because it -# would search for the symbols in some DLL even when they were linked -# statically. However it apparently doesn't matter that they were dllexported -# when building the static library. EH. -if(WIN32) - target_compile_definitions(AnyImageImporterTest PRIVATE "MAGNUM_ANYIMAGEIMPORTER_BUILD_STATIC") +if(NOT BUILD_PLUGINS_STATIC) + target_include_directories(AnyImageImporterTest PRIVATE $) +else() + target_include_directories(AnyImageImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + target_link_libraries(AnyImageImporterTest PRIVATE AnyImageImporter) + if(WITH_TGAIMPORTER) + target_link_libraries(AnyImageImporterTest PRIVATE TgaImporter) + endif() endif() set_target_properties(AnyImageImporterTest PROPERTIES FOLDER "MagnumPlugins/AnyImageImporter/Test") diff --git a/src/MagnumPlugins/AnyImageImporter/Test/Test.cpp b/src/MagnumPlugins/AnyImageImporter/Test/Test.cpp index a8523ec46..811760160 100644 --- a/src/MagnumPlugins/AnyImageImporter/Test/Test.cpp +++ b/src/MagnumPlugins/AnyImageImporter/Test/Test.cpp @@ -27,10 +27,9 @@ #include #include +#include "Magnum/Trade/AbstractImporter.h" #include "Magnum/Trade/ImageData.h" -#include "MagnumPlugins/AnyImageImporter/AnyImageImporter.h" - #include "configure.h" namespace Magnum { namespace Trade { namespace Test { @@ -42,25 +41,35 @@ struct AnyImageImporterTest: TestSuite::Tester { void unknown(); - private: - PluginManager::Manager _manager; + /* Explicitly forbid system-wide plugin dependencies */ + PluginManager::Manager _manager{"nonexistent"}; }; -AnyImageImporterTest::AnyImageImporterTest(): _manager{MAGNUM_PLUGINS_IMPORTER_DIR} { +AnyImageImporterTest::AnyImageImporterTest() { addTests({&AnyImageImporterTest::tga, &AnyImageImporterTest::unknown}); + + /* Load the plugin directly from the build tree. Otherwise it's static and + already loaded. */ + #ifdef ANYIMAGEIMPORTER_PLUGIN_FILENAME + CORRADE_INTERNAL_ASSERT(_manager.load(ANYIMAGEIMPORTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); + #endif + /* Optional plugins that don't have to be here */ + #ifdef TGAIMPORTER_PLUGIN_FILENAME + CORRADE_INTERNAL_ASSERT(_manager.load(TGAIMPORTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); + #endif } void AnyImageImporterTest::tga() { - if(_manager.loadState("TgaImporter") == PluginManager::LoadState::NotFound) - CORRADE_SKIP("TgaImporter plugin not found, cannot test"); + if(!(_manager.loadState("TgaImporter") & PluginManager::LoadState::Loaded)) + CORRADE_SKIP("TgaImporter plugin not enabled, cannot test"); - AnyImageImporter importer{_manager}; - CORRADE_VERIFY(importer.openFile(TGA_FILE)); + std::unique_ptr importer = _manager.instantiate("AnyImageImporter"); + CORRADE_VERIFY(importer->openFile(TGA_FILE)); /* Check only size, as it is good enough proof that it is working */ - Containers::Optional image = importer.image2D(0); + Containers::Optional image = importer->image2D(0); CORRADE_VERIFY(image); CORRADE_COMPARE(image->size(), Vector2i(2, 3)); } @@ -69,8 +78,8 @@ void AnyImageImporterTest::unknown() { std::ostringstream output; Error redirectError{&output}; - AnyImageImporter importer{_manager}; - CORRADE_VERIFY(!importer.openFile("image.xcf")); + std::unique_ptr importer = _manager.instantiate("AnyImageImporter"); + CORRADE_VERIFY(!importer->openFile("image.xcf")); CORRADE_COMPARE(output.str(), "Trade::AnyImageImporter::openFile(): cannot determine type of file image.xcf\n"); } diff --git a/src/MagnumPlugins/AnyImageImporter/Test/configure.h.cmake b/src/MagnumPlugins/AnyImageImporter/Test/configure.h.cmake index 41f7601ef..0772b3c53 100644 --- a/src/MagnumPlugins/AnyImageImporter/Test/configure.h.cmake +++ b/src/MagnumPlugins/AnyImageImporter/Test/configure.h.cmake @@ -23,10 +23,6 @@ DEALINGS IN THE SOFTWARE. */ -#ifdef CORRADE_IS_DEBUG_BUILD -#define MAGNUM_PLUGINS_IMPORTER_DIR "${MAGNUM_PLUGINS_IMPORTER_DEBUG_DIR}" -#else -#define MAGNUM_PLUGINS_IMPORTER_DIR "${MAGNUM_PLUGINS_IMPORTER_DIR}" -#endif - +#cmakedefine ANYIMAGEIMPORTER_PLUGIN_FILENAME "${ANYIMAGEIMPORTER_PLUGIN_FILENAME}" +#cmakedefine TGAIMPORTER_PLUGIN_FILENAME "${TGAIMPORTER_PLUGIN_FILENAME}" #define TGA_FILE "${TGA_FILE}" diff --git a/src/MagnumPlugins/AnyImageImporter/pluginRegistration.cpp b/src/MagnumPlugins/AnyImageImporter/pluginRegistration.cpp deleted file mode 100644 index 9d4239cd7..000000000 --- a/src/MagnumPlugins/AnyImageImporter/pluginRegistration.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* - This file is part of Magnum. - - Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 - Vladimír Vondruš - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. -*/ - -#include "MagnumPlugins/AnyImageImporter/AnyImageImporter.h" - -CORRADE_PLUGIN_REGISTER(AnyImageImporter, Magnum::Trade::AnyImageImporter, - "cz.mosra.magnum.Trade.AbstractImporter/0.3") diff --git a/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.cpp b/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.cpp index 186f56734..c14317564 100644 --- a/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.cpp +++ b/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.cpp @@ -198,3 +198,6 @@ std::string AnySceneImporter::doImage3DName(const UnsignedInt id) { return _in-> Containers::Optional AnySceneImporter::doImage3D(const UnsignedInt id) { return _in->image3D(id); } }} + +CORRADE_PLUGIN_REGISTER(AnySceneImporter, Magnum::Trade::AnySceneImporter, + "cz.mosra.magnum.Trade.AbstractImporter/0.3") diff --git a/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.h b/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.h index e3c18298b..9fd47638c 100644 --- a/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.h +++ b/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.h @@ -35,7 +35,7 @@ #ifndef DOXYGEN_GENERATING_OUTPUT #ifndef MAGNUM_ANYSCENEIMPORTER_BUILD_STATIC - #if defined(AnySceneImporter_EXPORTS) || defined(AnySceneImporterObjects_EXPORTS) + #ifdef AnySceneImporter_EXPORTS #define MAGNUM_ANYSCENEIMPORTER_EXPORT CORRADE_VISIBILITY_EXPORT #else #define MAGNUM_ANYSCENEIMPORTER_EXPORT CORRADE_VISIBILITY_IMPORT diff --git a/src/MagnumPlugins/AnySceneImporter/CMakeLists.txt b/src/MagnumPlugins/AnySceneImporter/CMakeLists.txt index e71fa8332..5e6bd2324 100644 --- a/src/MagnumPlugins/AnySceneImporter/CMakeLists.txt +++ b/src/MagnumPlugins/AnySceneImporter/CMakeLists.txt @@ -30,41 +30,20 @@ endif() configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/configure.h) -set(AnySceneImporter_SRCS - AnySceneImporter.cpp) - -set(AnySceneImporter_HEADERS - AnySceneImporter.h) - -# Objects shared between plugin and test library -add_library(AnySceneImporterObjects OBJECT - ${AnySceneImporter_SRCS} - ${AnySceneImporter_HEADERS}) -target_include_directories(AnySceneImporterObjects PUBLIC - $) -target_compile_definitions(AnySceneImporterObjects PRIVATE "AnySceneImporterObjects_EXPORTS") -if(NOT BUILD_STATIC OR BUILD_STATIC_PIC) - set_target_properties(AnySceneImporterObjects PROPERTIES POSITION_INDEPENDENT_CODE ON) -endif() -set_target_properties(AnySceneImporterObjects PROPERTIES FOLDER "MagnumPlugins/AnySceneImporter") - # AnySceneImporter plugin add_plugin(AnySceneImporter "${MAGNUM_PLUGINS_IMPORTER_DEBUG_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_IMPORTER_DEBUG_LIBRARY_INSTALL_DIR}" "${MAGNUM_PLUGINS_IMPORTER_RELEASE_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_IMPORTER_RELEASE_LIBRARY_INSTALL_DIR}" AnySceneImporter.conf - $ - pluginRegistration.cpp) -if(BUILD_STATIC_PIC) + AnySceneImporter.cpp + AnySceneImporter.h) +if(BUILD_PLUGINS_STATIC AND BUILD_STATIC_PIC) set_target_properties(AnySceneImporter PROPERTIES POSITION_INDEPENDENT_CODE ON) endif() -target_include_directories(AnySceneImporter PUBLIC - ${PROJECT_SOURCE_DIR}/src - ${PROJECT_BINARY_DIR}/src) target_link_libraries(AnySceneImporter PUBLIC Magnum) -install(FILES ${AnySceneImporter_HEADERS} DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/AnySceneImporter) -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/configure.h DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/AnySceneImporter) +install(FILES AnySceneImporter.h ${CMAKE_CURRENT_BINARY_DIR}/configure.h + DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/AnySceneImporter) # Automatic static plugin import if(BUILD_PLUGINS_STATIC) @@ -75,14 +54,6 @@ if(BUILD_PLUGINS_STATIC) endif() if(BUILD_TESTS) - add_library(MagnumAnySceneImporterTestLib STATIC - $ - ${PROJECT_SOURCE_DIR}/src/dummy.cpp) # XCode workaround, see file comment for details - target_include_directories(MagnumAnySceneImporterTestLib PUBLIC - ${PROJECT_SOURCE_DIR}/src - ${PROJECT_BINARY_DIR}/src) - set_target_properties(MagnumAnySceneImporterTestLib PROPERTIES FOLDER "MagnumPlugins/AnySceneImporter") - target_link_libraries(MagnumAnySceneImporterTestLib PUBLIC Magnum) add_subdirectory(Test) endif() diff --git a/src/MagnumPlugins/AnySceneImporter/Test/CMakeLists.txt b/src/MagnumPlugins/AnySceneImporter/Test/CMakeLists.txt index de908b8f4..92cf5dfef 100644 --- a/src/MagnumPlugins/AnySceneImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/AnySceneImporter/Test/CMakeLists.txt @@ -29,19 +29,37 @@ else() set(OBJ_FILE ${PROJECT_SOURCE_DIR}/src/MagnumPlugins/ObjImporter/Test/pointMesh.obj) endif() -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake - ${CMAKE_CURRENT_BINARY_DIR}/configure.h) +# CMake before 3.8 has broken $ expressions for iOS (see +# https://gitlab.kitware.com/cmake/cmake/merge_requests/404) and since Corrade +# doesn't support dynamic plugins on iOS, this sorta works around that. Should +# be revisited when updating Travis to newer Xcode (current has CMake 3.6). +if(NOT BUILD_PLUGINS_STATIC) + set(ANYSCENEIMPORTER_PLUGIN_FILENAME $) + if(WITH_OBJIMPORTER) + set(OBJIMPORTER_PLUGIN_FILENAME $) + endif() + + # First replace ${} variables, then $<> generator expressions + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h.in) + file(GENERATE OUTPUT $/configure.h + INPUT ${CMAKE_CURRENT_BINARY_DIR}/configure.h.in) +else() + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h) +endif() corrade_add_test(AnySceneImporterTest Test.cpp - LIBRARIES MagnumAnySceneImporterTestLib + LIBRARIES Magnum FILES ../../ObjImporter/Test/pointMesh.obj) -target_include_directories(AnySceneImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) -# On Win32 we need to avoid dllimporting AnySceneImporter symbols, because it -# would search for the symbols in some DLL even when they were linked -# statically. However it apparently doesn't matter that they were dllexported -# when building the static library. EH. -if(WIN32) - target_compile_definitions(AnySceneImporterTest PRIVATE "MAGNUM_ANYSCENEIMPORTER_BUILD_STATIC") +if(NOT BUILD_PLUGINS_STATIC) + target_include_directories(AnySceneImporterTest PRIVATE $) +else() + target_include_directories(AnySceneImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + target_link_libraries(AnySceneImporterTest PRIVATE AnySceneImporter) + if(WITH_OBJIMPORTER) + target_link_libraries(AnySceneImporterTest PRIVATE ObjImporter) + endif() endif() set_target_properties(AnySceneImporterTest PROPERTIES FOLDER "MagnumPlugins/AnySceneImporter/Test") diff --git a/src/MagnumPlugins/AnySceneImporter/Test/Test.cpp b/src/MagnumPlugins/AnySceneImporter/Test/Test.cpp index 714b46f5b..5cd5af89a 100644 --- a/src/MagnumPlugins/AnySceneImporter/Test/Test.cpp +++ b/src/MagnumPlugins/AnySceneImporter/Test/Test.cpp @@ -28,10 +28,9 @@ #include #include "Magnum/Math/Vector3.h" +#include "Magnum/Trade/AbstractImporter.h" #include "Magnum/Trade/MeshData3D.h" -#include "MagnumPlugins/AnySceneImporter/AnySceneImporter.h" - #include "configure.h" namespace Magnum { namespace Trade { namespace Test { @@ -43,25 +42,35 @@ struct AnySceneImporterTest: TestSuite::Tester { void unknown(); - private: - PluginManager::Manager _manager; + /* Explicitly forbid system-wide plugin dependencies */ + PluginManager::Manager _manager{"nonexistent"}; }; -AnySceneImporterTest::AnySceneImporterTest(): _manager{MAGNUM_PLUGINS_IMPORTER_DIR} { +AnySceneImporterTest::AnySceneImporterTest() { addTests({&AnySceneImporterTest::obj, &AnySceneImporterTest::unknown}); + + /* Load the plugin directly from the build tree. Otherwise it's static and + already loaded. */ + #ifdef ANYSCENEIMPORTER_PLUGIN_FILENAME + CORRADE_INTERNAL_ASSERT(_manager.load(ANYSCENEIMPORTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); + #endif + /* Optional plugins that don't have to be here */ + #ifdef OBJIMPORTER_PLUGIN_FILENAME + CORRADE_INTERNAL_ASSERT(_manager.load(OBJIMPORTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); + #endif } void AnySceneImporterTest::obj() { - if(_manager.loadState("ObjImporter") == PluginManager::LoadState::NotFound) - CORRADE_SKIP("ObjImporter plugin not found, cannot test"); + if(!(_manager.loadState("ObjImporter") & PluginManager::LoadState::Loaded)) + CORRADE_SKIP("ObjImporter plugin not enabled, cannot test"); - AnySceneImporter importer{_manager}; - CORRADE_VERIFY(importer.openFile(OBJ_FILE)); + std::unique_ptr importer = _manager.instantiate("AnySceneImporter"); + CORRADE_VERIFY(importer->openFile(OBJ_FILE)); /* Check only size, as it is good enough proof that it is working */ - Containers::Optional mesh = importer.mesh3D(0); + Containers::Optional mesh = importer->mesh3D(0); CORRADE_VERIFY(mesh); CORRADE_COMPARE(mesh->positions(0).size(), 3); } @@ -70,8 +79,8 @@ void AnySceneImporterTest::unknown() { std::ostringstream output; Error redirectError{&output}; - AnySceneImporter importer{_manager}; - CORRADE_VERIFY(!importer.openFile("mesh.wtf")); + std::unique_ptr importer = _manager.instantiate("AnySceneImporter"); + CORRADE_VERIFY(!importer->openFile("mesh.wtf")); CORRADE_COMPARE(output.str(), "Trade::AnySceneImporter::openFile(): cannot determine type of file mesh.wtf\n"); } diff --git a/src/MagnumPlugins/AnySceneImporter/Test/configure.h.cmake b/src/MagnumPlugins/AnySceneImporter/Test/configure.h.cmake index f44b93d8d..fc632a520 100644 --- a/src/MagnumPlugins/AnySceneImporter/Test/configure.h.cmake +++ b/src/MagnumPlugins/AnySceneImporter/Test/configure.h.cmake @@ -23,10 +23,6 @@ DEALINGS IN THE SOFTWARE. */ -#ifdef CORRADE_IS_DEBUG_BUILD -#define MAGNUM_PLUGINS_IMPORTER_DIR "${MAGNUM_PLUGINS_IMPORTER_DEBUG_DIR}" -#else -#define MAGNUM_PLUGINS_IMPORTER_DIR "${MAGNUM_PLUGINS_IMPORTER_DIR}" -#endif - +#cmakedefine ANYSCENEIMPORTER_PLUGIN_FILENAME "${ANYSCENEIMPORTER_PLUGIN_FILENAME}" +#cmakedefine OBJIMPORTER_PLUGIN_FILENAME "${OBJIMPORTER_PLUGIN_FILENAME}" #define OBJ_FILE "${OBJ_FILE}" diff --git a/src/MagnumPlugins/AnySceneImporter/pluginRegistration.cpp b/src/MagnumPlugins/AnySceneImporter/pluginRegistration.cpp deleted file mode 100644 index 444619567..000000000 --- a/src/MagnumPlugins/AnySceneImporter/pluginRegistration.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* - This file is part of Magnum. - - Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 - Vladimír Vondruš - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. -*/ - -#include "MagnumPlugins/AnySceneImporter/AnySceneImporter.h" - -CORRADE_PLUGIN_REGISTER(AnySceneImporter, Magnum::Trade::AnySceneImporter, - "cz.mosra.magnum.Trade.AbstractImporter/0.3") diff --git a/src/MagnumPlugins/MagnumFont/CMakeLists.txt b/src/MagnumPlugins/MagnumFont/CMakeLists.txt index fb699f133..f091b3811 100644 --- a/src/MagnumPlugins/MagnumFont/CMakeLists.txt +++ b/src/MagnumPlugins/MagnumFont/CMakeLists.txt @@ -30,44 +30,23 @@ endif() configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/configure.h) -set(MagnumFont_SRCS - MagnumFont.cpp) - -set(MagnumFont_HEADERS - MagnumFont.h) - -# Objects shared between plugin and test library -add_library(MagnumFontObjects OBJECT - ${MagnumFont_SRCS} - ${MagnumFont_HEADERS}) -target_include_directories(MagnumFontObjects PUBLIC - $ - $) -if(NOT BUILD_PLUGINS_STATIC) - target_compile_definitions(MagnumFontObjects PRIVATE "MagnumFontObjects_EXPORTS") -endif() -if(NOT BUILD_PLUGINS_STATIC OR BUILD_STATIC_PIC) - set_target_properties(MagnumFontObjects PROPERTIES POSITION_INDEPENDENT_CODE ON) -endif() -set_target_properties(MagnumFontObjects PROPERTIES FOLDER "MagnumPlugins/MagnumFont") - # MagnumFont plugin add_plugin(MagnumFont "${MAGNUM_PLUGINS_FONT_DEBUG_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_FONT_DEBUG_LIBRARY_INSTALL_DIR}" "${MAGNUM_PLUGINS_FONT_RELEASE_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_FONT_RELEASE_LIBRARY_INSTALL_DIR}" MagnumFont.conf - $ - pluginRegistration.cpp) -if(BUILD_STATIC_PIC) + MagnumFont.cpp + MagnumFont.h) +if(BUILD_PLUGINS_STATIC AND BUILD_STATIC_PIC) set_target_properties(MagnumFont PROPERTIES POSITION_INDEPENDENT_CODE ON) endif() -target_link_libraries(MagnumFont Magnum MagnumText) +target_link_libraries(MagnumFont PUBLIC Magnum MagnumText) if(CORRADE_TARGET_WINDOWS) - target_link_libraries(MagnumFont TgaImporter) + target_link_libraries(MagnumFont PUBLIC TgaImporter) endif() -install(FILES ${MagnumFont_HEADERS} DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/MagnumFont) -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/configure.h DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/MagnumFont) +install(FILES MagnumFont.h ${CMAKE_CURRENT_BINARY_DIR}/configure.h + DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/MagnumFont) # Automatic static plugin import if(BUILD_PLUGINS_STATIC) @@ -78,25 +57,6 @@ if(BUILD_PLUGINS_STATIC) endif() if(BUILD_GL_TESTS) - # On Win32 we need to avoid dllimporting TgaImporter symbols, because it - # would search for the symbols in some DLL even when they were linked - # statically. However it apparently doesn't matter that they were - # dllexported when building the static library. EH. - if(WIN32) - add_library(MagnumMagnumFontTestLib STATIC - ${MagnumFont_SRCS} - ${MagnumFont_HEADERS}) - target_compile_definitions(MagnumMagnumFontTestLib - PRIVATE "MAGNUM_TGAIMPORTER_BUILD_STATIC" - PUBLIC "MAGNUM_MAGNUMFONT_BUILD_STATIC") - else() - add_library(MagnumMagnumFontTestLib STATIC - $ - ${PROJECT_SOURCE_DIR}/src/dummy.cpp) # XCode workaround, see file comment for details - endif() - set_target_properties(MagnumMagnumFontTestLib PROPERTIES FOLDER "MagnumPlugins/MagnumFont") - target_link_libraries(MagnumMagnumFontTestLib Magnum MagnumText MagnumTgaImporterTestLib) - add_subdirectory(Test) endif() diff --git a/src/MagnumPlugins/MagnumFont/MagnumFont.cpp b/src/MagnumPlugins/MagnumFont/MagnumFont.cpp index b0fac553e..bde7900f2 100644 --- a/src/MagnumPlugins/MagnumFont/MagnumFont.cpp +++ b/src/MagnumPlugins/MagnumFont/MagnumFont.cpp @@ -239,3 +239,6 @@ std::tuple MagnumFontLayouter::doRenderGlyph(const Un } }} + +CORRADE_PLUGIN_REGISTER(MagnumFont, Magnum::Text::MagnumFont, + "cz.mosra.magnum.Text.AbstractFont/0.2.4") diff --git a/src/MagnumPlugins/MagnumFont/MagnumFont.h b/src/MagnumPlugins/MagnumFont/MagnumFont.h index a2ebb5e1e..a292aeba0 100644 --- a/src/MagnumPlugins/MagnumFont/MagnumFont.h +++ b/src/MagnumPlugins/MagnumFont/MagnumFont.h @@ -36,7 +36,7 @@ #ifndef DOXYGEN_GENERATING_OUTPUT #ifndef MAGNUM_MAGNUMFONT_BUILD_STATIC - #if defined(MagnumFont_EXPORTS) || defined(MagnumFontObjects_EXPORTS) + #ifdef MagnumFont_EXPORTS #define MAGNUM_MAGNUMFONT_EXPORT CORRADE_VISIBILITY_EXPORT #else #define MAGNUM_MAGNUMFONT_EXPORT CORRADE_VISIBILITY_IMPORT diff --git a/src/MagnumPlugins/MagnumFont/Test/CMakeLists.txt b/src/MagnumPlugins/MagnumFont/Test/CMakeLists.txt index 8e63e76e7..68e60e4a9 100644 --- a/src/MagnumPlugins/MagnumFont/Test/CMakeLists.txt +++ b/src/MagnumPlugins/MagnumFont/Test/CMakeLists.txt @@ -29,13 +29,33 @@ else() set(MAGNUMFONT_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}) endif() -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake - ${CMAKE_CURRENT_BINARY_DIR}/configure.h) +# CMake before 3.8 has broken $ expressions for iOS (see +# https://gitlab.kitware.com/cmake/cmake/merge_requests/404) and since Corrade +# doesn't support dynamic plugins on iOS, this sorta works around that. Should +# be revisited when updating Travis to newer Xcode (current has CMake 3.6). +if(NOT BUILD_PLUGINS_STATIC) + set(MAGNUMFONT_PLUGIN_FILENAME $) + set(TGAIMPORTER_PLUGIN_FILENAME $) + + # First replace ${} variables, then $<> generator expressions + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h.in) + file(GENERATE OUTPUT $/configure.h + INPUT ${CMAKE_CURRENT_BINARY_DIR}/configure.h.in) +else() + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h) +endif() corrade_add_test(MagnumFontGLTest MagnumFontGLTest.cpp - LIBRARIES MagnumMagnumFontTestLib MagnumOpenGLTester + LIBRARIES MagnumText MagnumOpenGLTester FILES font.conf font.tga) +if(NOT BUILD_PLUGINS_STATIC) + target_include_directories(MagnumFontGLTest PRIVATE $) +else() + target_include_directories(MagnumFontGLTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + target_link_libraries(MagnumFontGLTest PRIVATE MagnumFont TgaImporter) +endif() set_target_properties(MagnumFontGLTest PROPERTIES FOLDER "MagnumPlugins/MagnumFont/Test") -target_include_directories(MagnumFontGLTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/src/MagnumPlugins/MagnumFont/Test/MagnumFontGLTest.cpp b/src/MagnumPlugins/MagnumFont/Test/MagnumFontGLTest.cpp index c1af1ed7a..5201ba62a 100644 --- a/src/MagnumPlugins/MagnumFont/Test/MagnumFontGLTest.cpp +++ b/src/MagnumPlugins/MagnumFont/Test/MagnumFontGLTest.cpp @@ -27,8 +27,9 @@ #include #include "Magnum/OpenGLTester.h" +#include "Magnum/Text/AbstractFont.h" #include "Magnum/Text/GlyphCache.h" -#include "MagnumPlugins/MagnumFont/MagnumFont.h" +#include "Magnum/Trade/AbstractImporter.h" #include "configure.h" @@ -41,6 +42,10 @@ struct MagnumFontGLTest: OpenGLTester { void properties(); void layout(); void createGlyphCache(); + + /* Explicitly forbid system-wide plugin dependencies */ + PluginManager::Manager _importerManager{"nonexistent"}; + PluginManager::Manager _fontManager{"nonexistent"}; }; MagnumFontGLTest::MagnumFontGLTest() { @@ -48,37 +53,46 @@ MagnumFontGLTest::MagnumFontGLTest() { &MagnumFontGLTest::properties, &MagnumFontGLTest::layout, &MagnumFontGLTest::createGlyphCache}); + + /* Load the plugins directly from the build tree. Otherwise they're static + and already loaded. */ + #if defined(TGAIMPORTER_PLUGIN_FILENAME) && defined(MAGNUMFONT_PLUGIN_FILENAME) + CORRADE_INTERNAL_ASSERT(_importerManager.load(TGAIMPORTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); + CORRADE_INTERNAL_ASSERT(_fontManager.load(MAGNUMFONT_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); + #endif } void MagnumFontGLTest::nonexistent() { - MagnumFont font; + std::unique_ptr font = _fontManager.instantiate("MagnumFont"); std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!font.openFile("nonexistent.conf", 0.0f)); + CORRADE_VERIFY(!font->openFile("nonexistent.conf", 0.0f)); CORRADE_COMPARE(out.str(), "Text::MagnumFont::openFile(): cannot open file nonexistent.conf\n"); } void MagnumFontGLTest::properties() { - MagnumFont font; - CORRADE_VERIFY(font.openFile(Utility::Directory::join(MAGNUMFONT_TEST_DIR, "font.conf"), 0.0f)); - CORRADE_COMPARE(font.size(), 16.0f); - CORRADE_COMPARE(font.ascent(), 25.0f); - CORRADE_COMPARE(font.descent(), -10.0f); - CORRADE_COMPARE(font.lineHeight(), 39.7333f); - CORRADE_COMPARE(font.glyphAdvance(font.glyphId(U'W')), Vector2(23.0f, 0.0f)); + std::unique_ptr font = _fontManager.instantiate("MagnumFont"); + + CORRADE_VERIFY(font->openFile(Utility::Directory::join(MAGNUMFONT_TEST_DIR, "font.conf"), 0.0f)); + CORRADE_COMPARE(font->size(), 16.0f); + CORRADE_COMPARE(font->ascent(), 25.0f); + CORRADE_COMPARE(font->descent(), -10.0f); + CORRADE_COMPARE(font->lineHeight(), 39.7333f); + CORRADE_COMPARE(font->glyphAdvance(font->glyphId(U'W')), Vector2(23.0f, 0.0f)); } void MagnumFontGLTest::layout() { - MagnumFont font; - CORRADE_VERIFY(font.openFile(Utility::Directory::join(MAGNUMFONT_TEST_DIR, "font.conf"), 0.0f)); + std::unique_ptr font = _fontManager.instantiate("MagnumFont"); + + CORRADE_VERIFY(font->openFile(Utility::Directory::join(MAGNUMFONT_TEST_DIR, "font.conf"), 0.0f)); /* Fill the cache with some fake glyphs */ GlyphCache cache(Vector2i(256)); - cache.insert(font.glyphId(U'W'), {25, 34}, {{0, 8}, {16, 128}}); - cache.insert(font.glyphId(U'e'), {25, 12}, {{16, 4}, {64, 32}}); + cache.insert(font->glyphId(U'W'), {25, 34}, {{0, 8}, {16, 128}}); + cache.insert(font->glyphId(U'e'), {25, 12}, {{16, 4}, {64, 32}}); - auto layouter = font.layout(cache, 0.5f, "Wave"); + auto layouter = font->layout(cache, 0.5f, "Wave"); CORRADE_VERIFY(layouter); CORRADE_COMPARE(layouter->glyphCount(), 4); @@ -113,11 +127,12 @@ void MagnumFontGLTest::layout() { } void MagnumFontGLTest::createGlyphCache() { - MagnumFont font; - CORRADE_VERIFY(font.openFile(Utility::Directory::join(MAGNUMFONT_TEST_DIR, "font.conf"), 0.0f)); + std::unique_ptr font = _fontManager.instantiate("MagnumFont"); + + CORRADE_VERIFY(font->openFile(Utility::Directory::join(MAGNUMFONT_TEST_DIR, "font.conf"), 0.0f)); /* Just testing that nothing crashes, asserts or errors */ - std::unique_ptr cache = font.createGlyphCache(); + std::unique_ptr cache = font->createGlyphCache(); MAGNUM_VERIFY_NO_ERROR(); CORRADE_VERIFY(cache); diff --git a/src/MagnumPlugins/MagnumFont/Test/configure.h.cmake b/src/MagnumPlugins/MagnumFont/Test/configure.h.cmake index 50671345e..58846de31 100644 --- a/src/MagnumPlugins/MagnumFont/Test/configure.h.cmake +++ b/src/MagnumPlugins/MagnumFont/Test/configure.h.cmake @@ -23,4 +23,6 @@ DEALINGS IN THE SOFTWARE. */ +#cmakedefine MAGNUMFONT_PLUGIN_FILENAME "${MAGNUMFONT_PLUGIN_FILENAME}" +#cmakedefine TGAIMPORTER_PLUGIN_FILENAME "${TGAIMPORTER_PLUGIN_FILENAME}" #define MAGNUMFONT_TEST_DIR "${MAGNUMFONT_TEST_DIR}" diff --git a/src/MagnumPlugins/MagnumFontConverter/CMakeLists.txt b/src/MagnumPlugins/MagnumFontConverter/CMakeLists.txt index 040c385d1..1882bf1b9 100644 --- a/src/MagnumPlugins/MagnumFontConverter/CMakeLists.txt +++ b/src/MagnumPlugins/MagnumFontConverter/CMakeLists.txt @@ -30,44 +30,23 @@ endif() configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/configure.h) -set(MagnumFontConverter_SRCS - MagnumFontConverter.cpp) - -set(MagnumFontConverter_HEADERS - MagnumFontConverter.h) - -# Objects shared between plugin and test library -add_library(MagnumFontConverterObjects OBJECT - ${MagnumFontConverter_SRCS} - ${MagnumFontConverter_HEADERS}) -target_include_directories(MagnumFontConverterObjects PUBLIC - $ - $) -if(NOT BUILD_PLUGINS_STATIC) - target_compile_definitions(MagnumFontConverterObjects PRIVATE "MagnumFontConverterObjects_EXPORTS") -endif() -if(NOT BUILD_PLUGINS_STATIC OR BUILD_STATIC_PIC) - set_target_properties(MagnumFontConverterObjects PROPERTIES POSITION_INDEPENDENT_CODE ON) -endif() -set_target_properties(MagnumFontConverterObjects PROPERTIES FOLDER "MagnumPlugins/MagnumFontConverter") - # MagnumFontConverter plugin add_plugin(MagnumFontConverter "${MAGNUM_PLUGINS_FONTCONVERTER_DEBUG_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_FONTCONVERTER_DEBUG_LIBRARY_INSTALL_DIR}" "${MAGNUM_PLUGINS_FONTCONVERTER_RELEASE_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_FONTCONVERTER_RELEASE_LIBRARY_INSTALL_DIR}" MagnumFontConverter.conf - $ - pluginRegistration.cpp) -if(BUILD_STATIC_PIC) + MagnumFontConverter.cpp + MagnumFontConverter.h) +if(BUILD_PLUGINS_STATIC AND BUILD_STATIC_PIC) set_target_properties(MagnumFontConverter PROPERTIES POSITION_INDEPENDENT_CODE ON) endif() -target_link_libraries(MagnumFontConverter Magnum MagnumText) +target_link_libraries(MagnumFontConverter PUBLIC Magnum MagnumText) if(CORRADE_TARGET_WINDOWS) - target_link_libraries(MagnumFontConverter TgaImageConverter) + target_link_libraries(MagnumFontConverter PUBLIC TgaImageConverter) endif() -install(FILES ${MagnumFontConverter_HEADERS} DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/MagnumFontConverter) -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/configure.h DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/MagnumFontConverter) +install(FILES MagnumFontConverter.h ${CMAKE_CURRENT_BINARY_DIR}/configure.h + DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/MagnumFontConverter) # Automatic static plugin import if(BUILD_PLUGINS_STATIC) @@ -78,25 +57,6 @@ if(BUILD_PLUGINS_STATIC) endif() if(BUILD_GL_TESTS) - # On Win32 we need to avoid dllimporting TgaImageConverter symbols, because - # it would search for the symbols in some DLL even when they were linked - # statically. However it apparently doesn't matter that they were - # dllexported when building the static library. EH. - if(WIN32) - add_library(MagnumMagnumFontConverterTestLib STATIC - ${MagnumFontConverter_SRCS} - ${MagnumFontConverter_HEADERS}) - target_compile_definitions(MagnumMagnumFontConverterTestLib - PRIVATE "MAGNUM_TGAIMAGECONVERTER_BUILD_STATIC" - PUBLIC "MAGNUM_MAGNUMFONTCONVERTER_BUILD_STATIC") - else() - add_library(MagnumMagnumFontConverterTestLib STATIC - $ - ${PROJECT_SOURCE_DIR}/src/dummy.cpp) # XCode workaround, see file comment for details - endif() - set_target_properties(MagnumMagnumFontConverterTestLib PROPERTIES FOLDER "MagnumPlugins/MagnumFontConverter") - target_link_libraries(MagnumMagnumFontConverterTestLib Magnum MagnumText MagnumTgaImageConverterTestLib) - add_subdirectory(Test) endif() diff --git a/src/MagnumPlugins/MagnumFontConverter/MagnumFontConverter.cpp b/src/MagnumPlugins/MagnumFontConverter/MagnumFontConverter.cpp index 2fa67a815..479147b23 100644 --- a/src/MagnumPlugins/MagnumFontConverter/MagnumFontConverter.cpp +++ b/src/MagnumPlugins/MagnumFontConverter/MagnumFontConverter.cpp @@ -113,3 +113,6 @@ std::vector>> MagnumFontConverter } }} + +CORRADE_PLUGIN_REGISTER(MagnumFontConverter, Magnum::Text::MagnumFontConverter, + "cz.mosra.magnum.Text.AbstractFontConverter/0.1.2") diff --git a/src/MagnumPlugins/MagnumFontConverter/MagnumFontConverter.h b/src/MagnumPlugins/MagnumFontConverter/MagnumFontConverter.h index 59e615579..d8b9fd4c0 100644 --- a/src/MagnumPlugins/MagnumFontConverter/MagnumFontConverter.h +++ b/src/MagnumPlugins/MagnumFontConverter/MagnumFontConverter.h @@ -35,7 +35,7 @@ #ifndef DOXYGEN_GENERATING_OUTPUT #ifndef MAGNUM_MAGNUMFONTCONVERTER_BUILD_STATIC - #if defined(MagnumFontConverter_EXPORTS) || defined(MagnumFontConverterObjects_EXPORTS) + #ifdef MagnumFontConverter_EXPORTS #define MAGNUM_MAGNUMFONTCONVERTER_EXPORT CORRADE_VISIBILITY_EXPORT #else #define MAGNUM_MAGNUMFONTCONVERTER_EXPORT CORRADE_VISIBILITY_IMPORT diff --git a/src/MagnumPlugins/MagnumFontConverter/Test/CMakeLists.txt b/src/MagnumPlugins/MagnumFontConverter/Test/CMakeLists.txt index cb7f0d931..eab2b1d31 100644 --- a/src/MagnumPlugins/MagnumFontConverter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/MagnumFontConverter/Test/CMakeLists.txt @@ -23,19 +23,37 @@ # DEALINGS IN THE SOFTWARE. # -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake - ${CMAKE_CURRENT_BINARY_DIR}/configure.h) +# CMake before 3.8 has broken $ expressions for iOS (see +# https://gitlab.kitware.com/cmake/cmake/merge_requests/404) and since Corrade +# doesn't support dynamic plugins on iOS, this sorta works around that. Should +# be revisited when updating Travis to newer Xcode (current has CMake 3.6). +if(NOT BUILD_PLUGINS_STATIC) + set(MAGNUMFONTCONVERTER_PLUGIN_FILENAME $) + set(TGAIMAGECONVERTER_PLUGIN_FILENAME $) + if(WITH_TGAIMPORTER) + set(TGAIMPORTER_PLUGIN_FILENAME $) + endif() -corrade_add_test(MagnumFontConverterGLTest MagnumFontConverterGLTest.cpp LIBRARIES - MagnumMagnumFontConverterTestLib - MagnumTgaImporterTestLib - MagnumOpenGLTester) -set_target_properties(MagnumFontConverterGLTest PROPERTIES FOLDER "MagnumPlugins/MagnumFontConverter/Test") -target_include_directories(MagnumFontConverterGLTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) -# On Win32 we need to avoid dllimporting TgaImporter symbols, because it would -# search for the symbols in some DLL even though they were linked statically. -# However it apparently doesn't matter that they were dllexported when building -# the static library. EH. -if(WIN32) - target_compile_definitions(MagnumFontConverterGLTest PRIVATE "MAGNUM_TGAIMPORTER_BUILD_STATIC") + # First replace ${} variables, then $<> generator expressions + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h.in) + file(GENERATE OUTPUT $/configure.h + INPUT ${CMAKE_CURRENT_BINARY_DIR}/configure.h.in) +else() + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h) +endif() + +corrade_add_test(MagnumFontConverterGLTest MagnumFontConverterGLTest.cpp + LIBRARIES MagnumText MagnumOpenGLTester) +if(NOT BUILD_PLUGINS_STATIC) + target_include_directories(MagnumFontConverterGLTest PRIVATE $) +else() + target_include_directories(MagnumFontConverterGLTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + target_link_libraries(MagnumFontConverterGLTest PRIVATE + MagnumFontConverter) # TgaImageConverter should get linked transitively + if(WITH_TGAIMPORTER) + target_link_libraries(MagnumFontConverterGLTest PRIVATE TgaImporter) + endif() endif() +set_target_properties(MagnumFontConverterGLTest PROPERTIES FOLDER "MagnumPlugins/MagnumFontConverter/Test") diff --git a/src/MagnumPlugins/MagnumFontConverter/Test/MagnumFontConverterGLTest.cpp b/src/MagnumPlugins/MagnumFontConverter/Test/MagnumFontConverterGLTest.cpp index c163c888e..b70bca6fa 100644 --- a/src/MagnumPlugins/MagnumFontConverter/Test/MagnumFontConverterGLTest.cpp +++ b/src/MagnumPlugins/MagnumFontConverter/Test/MagnumFontConverterGLTest.cpp @@ -33,11 +33,11 @@ #include "Magnum/OpenGLTester.h" #include "Magnum/Text/GlyphCache.h" #include "Magnum/Text/AbstractFont.h" +#include "Magnum/Text/AbstractFontConverter.h" +#include "Magnum/Trade/AbstractImageConverter.h" +#include "Magnum/Trade/AbstractImporter.h" #include "Magnum/Trade/ImageData.h" -#include "MagnumPlugins/MagnumFontConverter/MagnumFontConverter.h" -#include "MagnumPlugins/TgaImporter/TgaImporter.h" -#include "../../MagnumFont/Test/configure.h" #include "configure.h" namespace Magnum { namespace Text { namespace Test { @@ -46,10 +46,26 @@ struct MagnumFontConverterGLTest: OpenGLTester { explicit MagnumFontConverterGLTest(); void exportFont(); + + /* Explicitly forbid system-wide plugin dependencies */ + PluginManager::Manager _imageConverterManager{"nonexistent"}; + PluginManager::Manager _fontConverterManager{"nonexistent"}; + PluginManager::Manager _importerManager{"nonexistent"}; }; MagnumFontConverterGLTest::MagnumFontConverterGLTest() { addTests({&MagnumFontConverterGLTest::exportFont}); + + /* Load the plugins directly from the build tree. Otherwise they are static + and already loaded. */ + #if defined(TGAIMAGECONVERTER_PLUGIN_FILENAME) && defined(MAGNUMFONTCONVERTER_PLUGIN_FILENAME) + CORRADE_INTERNAL_ASSERT(_imageConverterManager.load(TGAIMAGECONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); + CORRADE_INTERNAL_ASSERT(_fontConverterManager.load(MAGNUMFONTCONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); + #endif + /* Optional plugins that don't have to be here */ + #ifdef TGAIMPORTER_PLUGIN_FILENAME + CORRADE_INTERNAL_ASSERT(_importerManager.load(TGAIMPORTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); + #endif } void MagnumFontConverterGLTest::exportFont() { @@ -102,8 +118,8 @@ void MagnumFontConverterGLTest::exportFont() { cache.insert(font.glyphId(U'e'), {25, 12}, {{16, 4}, {64, 32}}); /* Convert the file */ - MagnumFontConverter converter; - converter.exportFontToFile(font, cache, Utility::Directory::join(MAGNUMFONTCONVERTER_TEST_WRITE_DIR, "font"), "Wave"); + std::unique_ptr converter = _fontConverterManager.instantiate("MagnumFontConverter"); + converter->exportFontToFile(font, cache, Utility::Directory::join(MAGNUMFONTCONVERTER_TEST_WRITE_DIR, "font"), "Wave"); /* Verify font parameters */ /** @todo This might behave differently elsewhere due to unspecified order of glyphs in cache */ @@ -111,10 +127,13 @@ void MagnumFontConverterGLTest::exportFont() { Utility::Directory::join(MAGNUMFONT_TEST_DIR, "font.conf"), TestSuite::Compare::File); + if(!(_importerManager.loadState("TgaImporter") & PluginManager::LoadState::Loaded)) + CORRADE_SKIP("TgaImporter plugin not enabled, not testing glyph cache contents"); + /* Verify font image, no need to test image contents, as the image is garbage anyway */ - Trade::TgaImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(MAGNUMFONTCONVERTER_TEST_WRITE_DIR, "font.tga"))); - Containers::Optional image = importer.image2D(0); + std::unique_ptr importer = _importerManager.instantiate("TgaImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(MAGNUMFONTCONVERTER_TEST_WRITE_DIR, "font.tga"))); + Containers::Optional image = importer->image2D(0); CORRADE_VERIFY(image); CORRADE_COMPARE(image->size(), Vector2i(256)); CORRADE_COMPARE(image->format(), PixelFormat::Red); diff --git a/src/MagnumPlugins/MagnumFontConverter/Test/configure.h.cmake b/src/MagnumPlugins/MagnumFontConverter/Test/configure.h.cmake index 135c0a100..6cd348124 100644 --- a/src/MagnumPlugins/MagnumFontConverter/Test/configure.h.cmake +++ b/src/MagnumPlugins/MagnumFontConverter/Test/configure.h.cmake @@ -23,4 +23,8 @@ DEALINGS IN THE SOFTWARE. */ +#cmakedefine MAGNUMFONTCONVERTER_PLUGIN_FILENAME "${MAGNUMFONTCONVERTER_PLUGIN_FILENAME}" +#cmakedefine TGAIMAGECONVERTER_PLUGIN_FILENAME "${TGAIMAGECONVERTER_PLUGIN_FILENAME}" +#cmakedefine TGAIMPORTER_PLUGIN_FILENAME "${TGAIMPORTER_PLUGIN_FILENAME}" #define MAGNUMFONTCONVERTER_TEST_WRITE_DIR "${CMAKE_CURRENT_BINARY_DIR}" +#define MAGNUMFONT_TEST_DIR "${PROJECT_SOURCE_DIR}/src/MagnumPlugins/MagnumFont/Test" diff --git a/src/MagnumPlugins/MagnumFontConverter/pluginRegistration.cpp b/src/MagnumPlugins/MagnumFontConverter/pluginRegistration.cpp deleted file mode 100644 index 1a89192ee..000000000 --- a/src/MagnumPlugins/MagnumFontConverter/pluginRegistration.cpp +++ /dev/null @@ -1,31 +0,0 @@ -/* - This file is part of Magnum. - - Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 - Vladimír Vondruš - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. -*/ - -#include - -#include "MagnumPlugins/MagnumFontConverter/MagnumFontConverter.h" - -CORRADE_PLUGIN_REGISTER(MagnumFontConverter, Magnum::Text::MagnumFontConverter, - "cz.mosra.magnum.Text.AbstractFontConverter/0.1.2") diff --git a/src/MagnumPlugins/ObjImporter/CMakeLists.txt b/src/MagnumPlugins/ObjImporter/CMakeLists.txt index 5f9340fea..5890b541b 100644 --- a/src/MagnumPlugins/ObjImporter/CMakeLists.txt +++ b/src/MagnumPlugins/ObjImporter/CMakeLists.txt @@ -30,39 +30,20 @@ endif() configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/configure.h) -set(ObjImporter_SRCS - ObjImporter.cpp) - -set(ObjImporter_HEADERS - ObjImporter.h) - -# Objects shared between plugin and test library -add_library(ObjImporterObjects OBJECT - ${ObjImporter_SRCS} - ${ObjImporter_HEADERS}) -target_include_directories(ObjImporterObjects PUBLIC $) -if(NOT BUILD_PLUGINS_STATIC) - target_compile_definitions(ObjImporterObjects PRIVATE "ObjImporterObjects_EXPORTS") -endif() -if(NOT BUILD_PLUGINS_STATIC OR BUILD_STATIC_PIC) - set_target_properties(ObjImporterObjects PROPERTIES POSITION_INDEPENDENT_CODE ON) -endif() -set_target_properties(ObjImporterObjects PROPERTIES FOLDER "MagnumPlugins/ObjImporter") - # ObjImporter plugin add_plugin(ObjImporter "${MAGNUM_PLUGINS_IMPORTER_DEBUG_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_IMPORTER_DEBUG_LIBRARY_INSTALL_DIR}" "${MAGNUM_PLUGINS_IMPORTER_RELEASE_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_IMPORTER_RELEASE_LIBRARY_INSTALL_DIR}" ObjImporter.conf - $ - pluginRegistration.cpp) -if(BUILD_STATIC_PIC) + ObjImporter.cpp + ObjImporter.h) +if(BUILD_PLUGINS_STATIC AND BUILD_STATIC_PIC) set_target_properties(ObjImporter PROPERTIES POSITION_INDEPENDENT_CODE ON) endif() -target_link_libraries(ObjImporter Magnum MagnumMeshTools) +target_link_libraries(ObjImporter PUBLIC Magnum MagnumMeshTools) -install(FILES ${ObjImporter_HEADERS} DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/ObjImporter) -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/configure.h DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/ObjImporter) +install(FILES ObjImporter.h ${CMAKE_CURRENT_BINARY_DIR}/configure.h + DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/ObjImporter) # Automatic static plugin import if(BUILD_PLUGINS_STATIC) @@ -73,12 +54,6 @@ if(BUILD_PLUGINS_STATIC) endif() if(BUILD_TESTS) - add_library(MagnumObjImporterTestLib STATIC - $ - ${PROJECT_SOURCE_DIR}/src/dummy.cpp) # XCode workaround, see file comment for details - set_target_properties(MagnumObjImporterTestLib PROPERTIES FOLDER "MagnumPlugins/ObjImporter") - target_link_libraries(MagnumObjImporterTestLib Magnum MagnumMeshTools) - add_subdirectory(Test) endif() diff --git a/src/MagnumPlugins/ObjImporter/ObjImporter.cpp b/src/MagnumPlugins/ObjImporter/ObjImporter.cpp index 9470ca177..7c9e5066d 100644 --- a/src/MagnumPlugins/ObjImporter/ObjImporter.cpp +++ b/src/MagnumPlugins/ObjImporter/ObjImporter.cpp @@ -444,3 +444,6 @@ Containers::Optional ObjImporter::doMesh3D(UnsignedInt id) { } }} + +CORRADE_PLUGIN_REGISTER(ObjImporter, Magnum::Trade::ObjImporter, + "cz.mosra.magnum.Trade.AbstractImporter/0.3") diff --git a/src/MagnumPlugins/ObjImporter/ObjImporter.h b/src/MagnumPlugins/ObjImporter/ObjImporter.h index 81ec77dce..aaee04f3a 100644 --- a/src/MagnumPlugins/ObjImporter/ObjImporter.h +++ b/src/MagnumPlugins/ObjImporter/ObjImporter.h @@ -35,7 +35,7 @@ #ifndef DOXYGEN_GENERATING_OUTPUT #ifndef MAGNUM_OBJIMPORTER_BUILD_STATIC - #if defined(ObjImporter_EXPORTS) || defined(ObjImporterObjects_EXPORTS) + #ifdef ObjImporter_EXPORTS #define MAGNUM_OBJIMPORTER_EXPORT CORRADE_VISIBILITY_EXPORT #else #define MAGNUM_OBJIMPORTER_EXPORT CORRADE_VISIBILITY_IMPORT diff --git a/src/MagnumPlugins/ObjImporter/Test/CMakeLists.txt b/src/MagnumPlugins/ObjImporter/Test/CMakeLists.txt index 4cdf4328f..18527b4ca 100644 --- a/src/MagnumPlugins/ObjImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/ObjImporter/Test/CMakeLists.txt @@ -29,11 +29,25 @@ else() set(OBJIMPORTER_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}) endif() -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake - ${CMAKE_CURRENT_BINARY_DIR}/configure.h) +# CMake before 3.8 has broken $ expressions for iOS (see +# https://gitlab.kitware.com/cmake/cmake/merge_requests/404) and since Corrade +# doesn't support dynamic plugins on iOS, this sorta works around that. Should +# be revisited when updating Travis to newer Xcode (current has CMake 3.6). +if(NOT BUILD_PLUGINS_STATIC) + set(OBJIMPORTER_PLUGIN_FILENAME $) + + # First replace ${} variables, then $<> generator expressions + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h.in) + file(GENERATE OUTPUT $/configure.h + INPUT ${CMAKE_CURRENT_BINARY_DIR}/configure.h.in) +else() + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h) +endif() corrade_add_test(ObjImporterTest Test.cpp - LIBRARIES MagnumObjImporterTestLib + LIBRARIES Magnum FILES emptyFile.obj keywords.obj @@ -52,12 +66,10 @@ corrade_add_test(ObjImporterTest Test.cpp wrongIndexCount.obj wrongNumberCount.obj wrongNumbers.obj) -target_include_directories(ObjImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) -set_target_properties(ObjImporterTest PROPERTIES FOLDER "MagnumPlugins/ObjImporter/Test") -# On Win32 we need to avoid dllimporting ObjImporter symbols, because it would -# search for the symbols in some DLL even though they were linked statically. -# However it apparently doesn't matter that they were dllexported when building -# the static library. EH. -if(WIN32) - target_compile_definitions(ObjImporterTest PRIVATE "MAGNUM_OBJIMPORTER_BUILD_STATIC") +if(NOT BUILD_PLUGINS_STATIC) + target_include_directories(ObjImporterTest PRIVATE $) +else() + target_include_directories(ObjImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + target_link_libraries(ObjImporterTest PRIVATE ObjImporter) endif() +set_target_properties(ObjImporterTest PROPERTIES FOLDER "MagnumPlugins/ObjImporter/Test") diff --git a/src/MagnumPlugins/ObjImporter/Test/Test.cpp b/src/MagnumPlugins/ObjImporter/Test/Test.cpp index ac39dec0d..7e38d7f94 100644 --- a/src/MagnumPlugins/ObjImporter/Test/Test.cpp +++ b/src/MagnumPlugins/ObjImporter/Test/Test.cpp @@ -29,8 +29,8 @@ #include "Magnum/Mesh.h" #include "Magnum/Math/Vector3.h" +#include "Magnum/Trade/AbstractImporter.h" #include "Magnum/Trade/MeshData3D.h" -#include "MagnumPlugins/ObjImporter/ObjImporter.h" #include "configure.h" @@ -88,6 +88,9 @@ struct ObjImporterTest: TestSuite::Tester { void unsupportedKeyword(); void unknownKeyword(); + + /* Explicitly forbid system-wide plugin dependencies */ + PluginManager::Manager _manager{"nonexistent"}; }; ObjImporterTest::ObjImporterTest() { @@ -139,14 +142,18 @@ ObjImporterTest::ObjImporterTest() { &ObjImporterTest::unsupportedKeyword, &ObjImporterTest::unknownKeyword}); + + #ifdef OBJIMPORTER_PLUGIN_FILENAME + CORRADE_INTERNAL_ASSERT(_manager.load(OBJIMPORTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); + #endif } void ObjImporterTest::pointMesh() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "pointMesh.obj"))); - CORRADE_COMPARE(importer.mesh3DCount(), 1); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "pointMesh.obj"))); + CORRADE_COMPARE(importer->mesh3DCount(), 1); - const Containers::Optional data = importer.mesh3D(0); + const Containers::Optional data = importer->mesh3D(0); CORRADE_VERIFY(data); CORRADE_COMPARE(data->primitive(), MeshPrimitive::Points); CORRADE_COMPARE(data->positionArrayCount(), 1); @@ -161,11 +168,11 @@ void ObjImporterTest::pointMesh() { } void ObjImporterTest::lineMesh() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "lineMesh.obj"))); - CORRADE_COMPARE(importer.mesh3DCount(), 1); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "lineMesh.obj"))); + CORRADE_COMPARE(importer->mesh3DCount(), 1); - const Containers::Optional data = importer.mesh3D(0); + const Containers::Optional data = importer->mesh3D(0); CORRADE_VERIFY(data); CORRADE_COMPARE(data->primitive(), MeshPrimitive::Lines); CORRADE_COMPARE(data->positionArrayCount(), 1); @@ -180,11 +187,11 @@ void ObjImporterTest::lineMesh() { } void ObjImporterTest::triangleMesh() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "triangleMesh.obj"))); - CORRADE_COMPARE(importer.mesh3DCount(), 1); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "triangleMesh.obj"))); + CORRADE_COMPARE(importer->mesh3DCount(), 1); - const Containers::Optional data = importer.mesh3D(0); + const Containers::Optional data = importer->mesh3D(0); CORRADE_VERIFY(data); CORRADE_COMPARE(data->primitive(), MeshPrimitive::Triangles); CORRADE_COMPARE(data->positionArrayCount(), 1); @@ -200,22 +207,22 @@ void ObjImporterTest::triangleMesh() { } void ObjImporterTest::mixedPrimitives() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "mixedPrimitives.obj"))); - CORRADE_COMPARE(importer.mesh3DCount(), 1); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "mixedPrimitives.obj"))); + CORRADE_COMPARE(importer->mesh3DCount(), 1); std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!importer.mesh3D(0)); + CORRADE_VERIFY(!importer->mesh3D(0)); CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): mixed primitive MeshPrimitive::Points and MeshPrimitive::Lines\n"); } void ObjImporterTest::positionsOnly() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "triangleMesh.obj"))); - CORRADE_COMPARE(importer.mesh3DCount(), 1); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "triangleMesh.obj"))); + CORRADE_COMPARE(importer->mesh3DCount(), 1); - const Containers::Optional data = importer.mesh3D(0); + const Containers::Optional data = importer->mesh3D(0); CORRADE_VERIFY(data); CORRADE_COMPARE(data->positionArrayCount(), 1); CORRADE_VERIFY(!data->hasNormals()); @@ -223,11 +230,11 @@ void ObjImporterTest::positionsOnly() { } void ObjImporterTest::textureCoordinates() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "textureCoordinates.obj"))); - CORRADE_COMPARE(importer.mesh3DCount(), 1); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "textureCoordinates.obj"))); + CORRADE_COMPARE(importer->mesh3DCount(), 1); - const Containers::Optional data = importer.mesh3D(0); + const Containers::Optional data = importer->mesh3D(0); CORRADE_VERIFY(data); CORRADE_COMPARE(data->primitive(), MeshPrimitive::Lines); CORRADE_COMPARE(data->positionArrayCount(), 1); @@ -251,11 +258,11 @@ void ObjImporterTest::textureCoordinates() { } void ObjImporterTest::normals() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "normals.obj"))); - CORRADE_COMPARE(importer.mesh3DCount(), 1); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "normals.obj"))); + CORRADE_COMPARE(importer->mesh3DCount(), 1); - const Containers::Optional data = importer.mesh3D(0); + const Containers::Optional data = importer->mesh3D(0); CORRADE_VERIFY(data); CORRADE_COMPARE(data->primitive(), MeshPrimitive::Lines); CORRADE_COMPARE(data->positionArrayCount(), 1); @@ -279,11 +286,11 @@ void ObjImporterTest::normals() { } void ObjImporterTest::textureCoordinatesNormals() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "textureCoordinatesNormals.obj"))); - CORRADE_COMPARE(importer.mesh3DCount(), 1); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "textureCoordinatesNormals.obj"))); + CORRADE_COMPARE(importer->mesh3DCount(), 1); - const Containers::Optional data = importer.mesh3D(0); + const Containers::Optional data = importer->mesh3D(0); CORRADE_VERIFY(data); CORRADE_COMPARE(data->primitive(), MeshPrimitive::Lines); CORRADE_COMPARE(data->positionArrayCount(), 1); @@ -316,35 +323,35 @@ void ObjImporterTest::textureCoordinatesNormals() { } void ObjImporterTest::emptyFile() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "emptyFile.obj"))); - CORRADE_COMPARE(importer.mesh3DCount(), 1); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "emptyFile.obj"))); + CORRADE_COMPARE(importer->mesh3DCount(), 1); } void ObjImporterTest::unnamedMesh() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "emptyFile.obj"))); - CORRADE_COMPARE(importer.mesh3DCount(), 1); - CORRADE_COMPARE(importer.mesh3DName(0), ""); - CORRADE_COMPARE(importer.mesh3DForName(""), -1); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "emptyFile.obj"))); + CORRADE_COMPARE(importer->mesh3DCount(), 1); + CORRADE_COMPARE(importer->mesh3DName(0), ""); + CORRADE_COMPARE(importer->mesh3DForName(""), -1); } void ObjImporterTest::namedMesh() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "namedMesh.obj"))); - CORRADE_COMPARE(importer.mesh3DCount(), 1); - CORRADE_COMPARE(importer.mesh3DName(0), "MyMesh"); - CORRADE_COMPARE(importer.mesh3DForName("MyMesh"), 0); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "namedMesh.obj"))); + CORRADE_COMPARE(importer->mesh3DCount(), 1); + CORRADE_COMPARE(importer->mesh3DName(0), "MyMesh"); + CORRADE_COMPARE(importer->mesh3DForName("MyMesh"), 0); } void ObjImporterTest::moreMeshes() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "moreMeshes.obj"))); - CORRADE_COMPARE(importer.mesh3DCount(), 3); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "moreMeshes.obj"))); + CORRADE_COMPARE(importer->mesh3DCount(), 3); - CORRADE_COMPARE(importer.mesh3DName(0), "PointMesh"); - CORRADE_COMPARE(importer.mesh3DForName("PointMesh"), 0); - const Containers::Optional data = importer.mesh3D(0); + CORRADE_COMPARE(importer->mesh3DName(0), "PointMesh"); + CORRADE_COMPARE(importer->mesh3DForName("PointMesh"), 0); + const Containers::Optional data = importer->mesh3D(0); CORRADE_VERIFY(data); CORRADE_COMPARE(data->primitive(), MeshPrimitive::Points); CORRADE_COMPARE(data->positionArrayCount(), 1); @@ -356,9 +363,9 @@ void ObjImporterTest::moreMeshes() { 0, 1 })); - CORRADE_COMPARE(importer.mesh3DName(1), "LineMesh"); - CORRADE_COMPARE(importer.mesh3DForName("LineMesh"), 1); - const Containers::Optional data1 = importer.mesh3D(1); + CORRADE_COMPARE(importer->mesh3DName(1), "LineMesh"); + CORRADE_COMPARE(importer->mesh3DForName("LineMesh"), 1); + const Containers::Optional data1 = importer->mesh3D(1); CORRADE_VERIFY(data1); CORRADE_COMPARE(data1->primitive(), MeshPrimitive::Lines); CORRADE_COMPARE(data1->positionArrayCount(), 1); @@ -370,9 +377,9 @@ void ObjImporterTest::moreMeshes() { 0, 1, 1, 0 })); - CORRADE_COMPARE(importer.mesh3DName(2), "TriangleMesh"); - CORRADE_COMPARE(importer.mesh3DForName("TriangleMesh"), 2); - const Containers::Optional data2 = importer.mesh3D(2); + CORRADE_COMPARE(importer->mesh3DName(2), "TriangleMesh"); + CORRADE_COMPARE(importer->mesh3DForName("TriangleMesh"), 2); + const Containers::Optional data2 = importer->mesh3D(2); CORRADE_VERIFY(data2); CORRADE_COMPARE(data2->primitive(), MeshPrimitive::Triangles); CORRADE_COMPARE(data2->positionArrayCount(), 1); @@ -387,84 +394,84 @@ void ObjImporterTest::moreMeshes() { } void ObjImporterTest::unnamedFirstMesh() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "unnamedFirstMesh.obj"))); - CORRADE_COMPARE(importer.mesh3DCount(), 2); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "unnamedFirstMesh.obj"))); + CORRADE_COMPARE(importer->mesh3DCount(), 2); - CORRADE_COMPARE(importer.mesh3DName(0), ""); - CORRADE_COMPARE(importer.mesh3DForName(""), -1); + CORRADE_COMPARE(importer->mesh3DName(0), ""); + CORRADE_COMPARE(importer->mesh3DForName(""), -1); - CORRADE_COMPARE(importer.mesh3DName(1), "SecondMesh"); - CORRADE_COMPARE(importer.mesh3DForName("SecondMesh"), 1); + CORRADE_COMPARE(importer->mesh3DName(1), "SecondMesh"); + CORRADE_COMPARE(importer->mesh3DForName("SecondMesh"), 1); } void ObjImporterTest::wrongFloat() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumbers.obj"))); - const Int id = importer.mesh3DForName("WrongFloat"); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumbers.obj"))); + const Int id = importer->mesh3DForName("WrongFloat"); CORRADE_VERIFY(id > -1); std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!importer.mesh3D(id)); + CORRADE_VERIFY(!importer->mesh3D(id)); CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): error while converting numeric data\n"); } void ObjImporterTest::wrongInteger() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumbers.obj"))); - const Int id = importer.mesh3DForName("WrongInteger"); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumbers.obj"))); + const Int id = importer->mesh3DForName("WrongInteger"); CORRADE_VERIFY(id > -1); std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!importer.mesh3D(id)); + CORRADE_VERIFY(!importer->mesh3D(id)); CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): error while converting numeric data\n"); } void ObjImporterTest::unmergedIndexOutOfRange() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumbers.obj"))); - const Int id = importer.mesh3DForName("PositionIndexOutOfRange"); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumbers.obj"))); + const Int id = importer->mesh3DForName("PositionIndexOutOfRange"); CORRADE_VERIFY(id > -1); std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!importer.mesh3D(id)); + CORRADE_VERIFY(!importer->mesh3D(id)); CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): index out of range\n"); } void ObjImporterTest::mergedIndexOutOfRange() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumbers.obj"))); - const Int id = importer.mesh3DForName("TextureIndexOutOfRange"); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumbers.obj"))); + const Int id = importer->mesh3DForName("TextureIndexOutOfRange"); CORRADE_VERIFY(id > -1); std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!importer.mesh3D(id)); + CORRADE_VERIFY(!importer->mesh3D(id)); CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): index out of range\n"); } void ObjImporterTest::zeroIndex() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumbers.obj"))); - const Int id = importer.mesh3DForName("ZeroIndex"); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumbers.obj"))); + const Int id = importer->mesh3DForName("ZeroIndex"); CORRADE_VERIFY(id > -1); std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!importer.mesh3D(id)); + CORRADE_VERIFY(!importer->mesh3D(id)); CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): index out of range\n"); } void ObjImporterTest::explicitOptionalPositionCoordinate() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "optionalCoordinates.obj"))); - const Int id = importer.mesh3DForName("SupportedPositionW"); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "optionalCoordinates.obj"))); + const Int id = importer->mesh3DForName("SupportedPositionW"); CORRADE_VERIFY(id > -1); - const Containers::Optional data = importer.mesh3D(id); + const Containers::Optional data = importer->mesh3D(id); CORRADE_VERIFY(data); CORRADE_COMPARE(data->positionArrayCount(), 1); CORRADE_COMPARE(data->positions(0), (std::vector{ @@ -473,12 +480,12 @@ void ObjImporterTest::explicitOptionalPositionCoordinate() { } void ObjImporterTest::explicitOptionalTextureCoordinate() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "optionalCoordinates.obj"))); - const Int id = importer.mesh3DForName("SupportedTextureW"); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "optionalCoordinates.obj"))); + const Int id = importer->mesh3DForName("SupportedTextureW"); CORRADE_VERIFY(id > -1); - const Containers::Optional data = importer.mesh3D(id); + const Containers::Optional data = importer->mesh3D(id); CORRADE_VERIFY(data); CORRADE_COMPARE(data->textureCoords2DArrayCount(), 1); CORRADE_COMPARE(data->textureCoords2D(0), (std::vector{ @@ -487,229 +494,229 @@ void ObjImporterTest::explicitOptionalTextureCoordinate() { } void ObjImporterTest::unsupportedOptionalPositionCoordinate() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "optionalCoordinates.obj"))); - const Int id = importer.mesh3DForName("UnsupportedPositionW"); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "optionalCoordinates.obj"))); + const Int id = importer->mesh3DForName("UnsupportedPositionW"); CORRADE_VERIFY(id > -1); std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!importer.mesh3D(id)); + CORRADE_VERIFY(!importer->mesh3D(id)); CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): homogeneous coordinates are not supported\n"); } void ObjImporterTest::unsupportedOptionalTextureCoordinate() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "optionalCoordinates.obj"))); - const Int id = importer.mesh3DForName("UnsupportedTextureW"); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "optionalCoordinates.obj"))); + const Int id = importer->mesh3DForName("UnsupportedTextureW"); CORRADE_VERIFY(id > -1); std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!importer.mesh3D(id)); + CORRADE_VERIFY(!importer->mesh3D(id)); CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): 3D texture coordinates are not supported\n"); } void ObjImporterTest::shortFloatData() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumberCount.obj"))); - const Int id = importer.mesh3DForName("ShortFloat"); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumberCount.obj"))); + const Int id = importer->mesh3DForName("ShortFloat"); CORRADE_VERIFY(id > -1); std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!importer.mesh3D(id)); + CORRADE_VERIFY(!importer->mesh3D(id)); CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): invalid float array size\n"); } void ObjImporterTest::longFloatData() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumberCount.obj"))); - const Int id = importer.mesh3DForName("LongFloat"); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumberCount.obj"))); + const Int id = importer->mesh3DForName("LongFloat"); CORRADE_VERIFY(id > -1); std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!importer.mesh3D(id)); + CORRADE_VERIFY(!importer->mesh3D(id)); CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): invalid float array size\n"); } void ObjImporterTest::longOptionalFloatData() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumberCount.obj"))); - const Int id = importer.mesh3DForName("LongOptionalFloat"); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumberCount.obj"))); + const Int id = importer->mesh3DForName("LongOptionalFloat"); CORRADE_VERIFY(id > -1); std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!importer.mesh3D(id)); + CORRADE_VERIFY(!importer->mesh3D(id)); CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): invalid float array size\n"); } void ObjImporterTest::longIndexData() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumberCount.obj"))); - const Int id = importer.mesh3DForName("InvalidIndices"); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumberCount.obj"))); + const Int id = importer->mesh3DForName("InvalidIndices"); CORRADE_VERIFY(id > -1); std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!importer.mesh3D(id)); + CORRADE_VERIFY(!importer->mesh3D(id)); CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): invalid index data\n"); } void ObjImporterTest::wrongPointIndexData() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumberCount.obj"))); - const Int id = importer.mesh3DForName("WrongPointIndices"); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumberCount.obj"))); + const Int id = importer->mesh3DForName("WrongPointIndices"); CORRADE_VERIFY(id > -1); std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!importer.mesh3D(id)); + CORRADE_VERIFY(!importer->mesh3D(id)); CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): wrong index count for point\n"); } void ObjImporterTest::wrongLineIndexData() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumberCount.obj"))); - const Int id = importer.mesh3DForName("WrongLineIndices"); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumberCount.obj"))); + const Int id = importer->mesh3DForName("WrongLineIndices"); CORRADE_VERIFY(id > -1); std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!importer.mesh3D(id)); + CORRADE_VERIFY(!importer->mesh3D(id)); CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): wrong index count for line\n"); } void ObjImporterTest::wrongTriangleIndexData() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumberCount.obj"))); - const Int id = importer.mesh3DForName("WrongTriangleIndices"); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumberCount.obj"))); + const Int id = importer->mesh3DForName("WrongTriangleIndices"); CORRADE_VERIFY(id > -1); std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!importer.mesh3D(id)); + CORRADE_VERIFY(!importer->mesh3D(id)); CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): wrong index count for triangle\n"); } void ObjImporterTest::polygonIndexData() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumberCount.obj"))); - const Int id = importer.mesh3DForName("PolygonIndices"); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumberCount.obj"))); + const Int id = importer->mesh3DForName("PolygonIndices"); CORRADE_VERIFY(id > -1); std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!importer.mesh3D(id)); + CORRADE_VERIFY(!importer->mesh3D(id)); CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): polygons are not supported\n"); } void ObjImporterTest::missingPositionData() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "missingData.obj"))); - const Int id = importer.mesh3DForName("MissingPositionData"); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "missingData.obj"))); + const Int id = importer->mesh3DForName("MissingPositionData"); CORRADE_VERIFY(id > -1); std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!importer.mesh3D(id)); + CORRADE_VERIFY(!importer->mesh3D(id)); CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): incomplete position data\n"); } void ObjImporterTest::missingPositionIndices() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "missingData.obj"))); - const Int id = importer.mesh3DForName("MissingPositionIndices"); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "missingData.obj"))); + const Int id = importer->mesh3DForName("MissingPositionIndices"); CORRADE_VERIFY(id > -1); std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!importer.mesh3D(id)); + CORRADE_VERIFY(!importer->mesh3D(id)); CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): incomplete position data\n"); } void ObjImporterTest::missingNormalData() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "missingData.obj"))); - const Int id = importer.mesh3DForName("MissingNormalData"); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "missingData.obj"))); + const Int id = importer->mesh3DForName("MissingNormalData"); CORRADE_VERIFY(id > -1); std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!importer.mesh3D(id)); + CORRADE_VERIFY(!importer->mesh3D(id)); CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): incomplete normal data\n"); } void ObjImporterTest::missingNormalIndices() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "missingData.obj"))); - const Int id = importer.mesh3DForName("MissingNormalIndices"); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "missingData.obj"))); + const Int id = importer->mesh3DForName("MissingNormalIndices"); CORRADE_VERIFY(id > -1); std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!importer.mesh3D(id)); + CORRADE_VERIFY(!importer->mesh3D(id)); CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): incomplete normal data\n"); } void ObjImporterTest::missingTextureCoordinateData() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "missingData.obj"))); - const Int id = importer.mesh3DForName("MissingTextureData"); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "missingData.obj"))); + const Int id = importer->mesh3DForName("MissingTextureData"); CORRADE_VERIFY(id > -1); std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!importer.mesh3D(id)); + CORRADE_VERIFY(!importer->mesh3D(id)); CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): incomplete texture coordinate data\n"); } void ObjImporterTest::missingTextureCoordinateIndices() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "missingData.obj"))); - const Int id = importer.mesh3DForName("MissingTextureIndices"); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "missingData.obj"))); + const Int id = importer->mesh3DForName("MissingTextureIndices"); CORRADE_VERIFY(id > -1); std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!importer.mesh3D(id)); + CORRADE_VERIFY(!importer->mesh3D(id)); CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): incomplete texture coordinate data\n"); } void ObjImporterTest::wrongNormalIndexCount() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongIndexCount.obj"))); - const Int id = importer.mesh3DForName("ShortNormalIndices"); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongIndexCount.obj"))); + const Int id = importer->mesh3DForName("ShortNormalIndices"); CORRADE_VERIFY(id > -1); std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!importer.mesh3D(id)); + CORRADE_VERIFY(!importer->mesh3D(id)); CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): some normal indices are missing\n"); } void ObjImporterTest::wrongTextureCoordinateIndexCount() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongIndexCount.obj"))); - const Int id = importer.mesh3DForName("ShortTextureIndices"); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongIndexCount.obj"))); + const Int id = importer->mesh3DForName("ShortTextureIndices"); CORRADE_VERIFY(id > -1); std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!importer.mesh3D(id)); + CORRADE_VERIFY(!importer->mesh3D(id)); CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): some texture coordinate indices are missing\n"); } void ObjImporterTest::unsupportedKeyword() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "keywords.obj"))); - const Int id = importer.mesh3DForName("UnsupportedKeyword"); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "keywords.obj"))); + const Int id = importer->mesh3DForName("UnsupportedKeyword"); CORRADE_VERIFY(id > -1); /* Everything should be parsed properly */ - const Containers::Optional data = importer.mesh3D(id); + const Containers::Optional data = importer->mesh3D(id); CORRADE_VERIFY(data); CORRADE_COMPARE(data->primitive(), MeshPrimitive::Points); CORRADE_COMPARE(data->positionArrayCount(), 1); @@ -720,14 +727,14 @@ void ObjImporterTest::unsupportedKeyword() { } void ObjImporterTest::unknownKeyword() { - ObjImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "keywords.obj"))); - const Int id = importer.mesh3DForName("UnknownKeyword"); + std::unique_ptr importer = _manager.instantiate("ObjImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "keywords.obj"))); + const Int id = importer->mesh3DForName("UnknownKeyword"); CORRADE_VERIFY(id > -1); std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!importer.mesh3D(id)); + CORRADE_VERIFY(!importer->mesh3D(id)); CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): unknown keyword bleh\n"); } diff --git a/src/MagnumPlugins/ObjImporter/Test/configure.h.cmake b/src/MagnumPlugins/ObjImporter/Test/configure.h.cmake index 3fd48ce57..01295a422 100644 --- a/src/MagnumPlugins/ObjImporter/Test/configure.h.cmake +++ b/src/MagnumPlugins/ObjImporter/Test/configure.h.cmake @@ -23,4 +23,5 @@ DEALINGS IN THE SOFTWARE. */ +#cmakedefine OBJIMPORTER_PLUGIN_FILENAME "${OBJIMPORTER_PLUGIN_FILENAME}" #define OBJIMPORTER_TEST_DIR "${OBJIMPORTER_TEST_DIR}" diff --git a/src/MagnumPlugins/TgaImageConverter/CMakeLists.txt b/src/MagnumPlugins/TgaImageConverter/CMakeLists.txt index e14f453ab..8750d947c 100644 --- a/src/MagnumPlugins/TgaImageConverter/CMakeLists.txt +++ b/src/MagnumPlugins/TgaImageConverter/CMakeLists.txt @@ -30,38 +30,19 @@ endif() configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/configure.h) -set(TgaImageConverter_SRCS - TgaImageConverter.cpp) - -set(TgaImageConverter_HEADERS - TgaImageConverter.h) - -# Objects shared between plugin and test library -add_library(TgaImageConverterObjects OBJECT - ${TgaImageConverter_SRCS} - ${TgaImageConverter_HEADERS}) -target_include_directories(TgaImageConverterObjects PUBLIC $) -if(NOT BUILD_PLUGINS_STATIC) - target_compile_definitions(TgaImageConverterObjects PRIVATE "TgaImageConverterObjects_EXPORTS") -endif() -if(NOT BUILD_PLUGINS_STATIC OR BUILD_STATIC_PIC) - set_target_properties(TgaImageConverterObjects PROPERTIES POSITION_INDEPENDENT_CODE ON) -endif() -set_target_properties(TgaImageConverterObjects PROPERTIES FOLDER "MagnumPlugins/TgaImageConverter") - # TgaImageConverter plugin add_plugin(TgaImageConverter "${MAGNUM_PLUGINS_IMAGECONVERTER_DEBUG_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_IMAGECONVERTER_DEBUG_LIBRARY_INSTALL_DIR}" "${MAGNUM_PLUGINS_IMAGECONVERTER_RELEASE_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_IMAGECONVERTER_RELEASE_LIBRARY_INSTALL_DIR}" TgaImageConverter.conf - $ - pluginRegistration.cpp) -if(BUILD_STATIC_PIC) + TgaImageConverter.cpp + TgaImageConverter.h) +if(BUILD_PLUGINS_STATIC AND BUILD_STATIC_PIC) set_target_properties(TgaImageConverter PROPERTIES POSITION_INDEPENDENT_CODE ON) endif() -target_link_libraries(TgaImageConverter Magnum) +target_link_libraries(TgaImageConverter PUBLIC Magnum) -install(FILES ${TgaImageConverter_HEADERS} DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/TgaImageConverter) +install(FILES TgaImageConverter.h DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/TgaImageConverter) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/configure.h DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/TgaImageConverter) # Automatic static plugin import @@ -73,12 +54,6 @@ if(BUILD_PLUGINS_STATIC) endif() if(BUILD_TESTS) - add_library(MagnumTgaImageConverterTestLib STATIC - $ - ${PROJECT_SOURCE_DIR}/src/dummy.cpp) # XCode workaround, see file comment for details - set_target_properties(MagnumTgaImageConverterTestLib PROPERTIES FOLDER "MagnumPlugins/TgaImageConverter") - target_link_libraries(MagnumTgaImageConverterTestLib Magnum) - add_subdirectory(Test) endif() diff --git a/src/MagnumPlugins/TgaImageConverter/Test/CMakeLists.txt b/src/MagnumPlugins/TgaImageConverter/Test/CMakeLists.txt index a3b54d2f8..221d2086f 100644 --- a/src/MagnumPlugins/TgaImageConverter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/TgaImageConverter/Test/CMakeLists.txt @@ -23,14 +23,34 @@ # DEALINGS IN THE SOFTWARE. # -corrade_add_test(TgaImageConverterTest TgaImageConverterTest.cpp LIBRARIES MagnumTgaImageConverterTestLib MagnumTgaImporterTestLib) -set_target_properties(TgaImageConverterTest PROPERTIES FOLDER "MagnumPlugins/TgaImageConverter/Test") -# On Win32 we need to avoid dllimporting TgaImporter and TgaImageConverterTest -# symbols, because it would search for the symbols in some DLL even though they -# were linked statically. However it apparently doesn't matter that they were -# dllexported when building the static library. EH. -if(WIN32) - target_compile_definitions(TgaImageConverterTest PRIVATE - "MAGNUM_TGAIMAGECONVERTER_BUILD_STATIC" - "MAGNUM_TGAIMPORTER_BUILD_STATIC") +# CMake before 3.8 has broken $ expressions for iOS (see +# https://gitlab.kitware.com/cmake/cmake/merge_requests/404) and since Corrade +# doesn't support dynamic plugins on iOS, this sorta works around that. Should +# be revisited when updating Travis to newer Xcode (current has CMake 3.6). +if(NOT BUILD_PLUGINS_STATIC) + set(TGAIMAGECONVERTER_PLUGIN_FILENAME $) + if(WITH_TGAIMPORTER) + set(TGAIMPORTER_PLUGIN_FILENAME $) + endif() + + # First replace ${} variables, then $<> generator expressions + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h.in) + file(GENERATE OUTPUT $/configure.h + INPUT ${CMAKE_CURRENT_BINARY_DIR}/configure.h.in) +else() + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h) endif() + +corrade_add_test(TgaImageConverterTest TgaImageConverterTest.cpp LIBRARIES Magnum) +if(NOT BUILD_PLUGINS_STATIC) + target_include_directories(TgaImageConverterTest PRIVATE $) +else() + target_include_directories(TgaImageConverterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + target_link_libraries(TgaImageConverterTest PRIVATE TgaImageConverter) + if(WITH_TGAIMPORTER) + target_link_libraries(TgaImageConverterTest PRIVATE TgaImporter) + endif() +endif() +set_target_properties(TgaImageConverterTest PROPERTIES FOLDER "MagnumPlugins/TgaImageConverter/Test") diff --git a/src/MagnumPlugins/TgaImageConverter/Test/TgaImageConverterTest.cpp b/src/MagnumPlugins/TgaImageConverter/Test/TgaImageConverterTest.cpp index 68436f645..a840404e4 100644 --- a/src/MagnumPlugins/TgaImageConverter/Test/TgaImageConverterTest.cpp +++ b/src/MagnumPlugins/TgaImageConverter/Test/TgaImageConverterTest.cpp @@ -33,8 +33,10 @@ #include "Magnum/Image.h" #include "Magnum/PixelFormat.h" #include "Magnum/Trade/ImageData.h" -#include "MagnumPlugins/TgaImageConverter/TgaImageConverter.h" -#include "MagnumPlugins/TgaImporter/TgaImporter.h" +#include "Magnum/Trade/AbstractImageConverter.h" +#include "Magnum/Trade/AbstractImporter.h" + +#include "configure.h" namespace Magnum { namespace Trade { namespace Test { @@ -46,6 +48,10 @@ struct TgaImageConverterTest: TestSuite::Tester { void rgb(); void rgba(); + + /* Explicitly forbid system-wide plugin dependencies */ + PluginManager::Manager _converterManager{"nonexistent"}; + PluginManager::Manager _importerManager{"nonexistent"}; }; namespace { @@ -81,6 +87,16 @@ TgaImageConverterTest::TgaImageConverterTest() { &TgaImageConverterTest::rgb, &TgaImageConverterTest::rgba}); + + /* Load the plugin directly from the build tree. Otherwise it's static and + already loaded. */ + #ifdef TGAIMAGECONVERTER_PLUGIN_FILENAME + CORRADE_INTERNAL_ASSERT(_converterManager.load(TGAIMAGECONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); + #endif + /* Optional plugins that don't have to be here */ + #ifdef TGAIMPORTER_PLUGIN_FILENAME + CORRADE_INTERNAL_ASSERT(_importerManager.load(TGAIMPORTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); + #endif } void TgaImageConverterTest::wrongFormat() { @@ -95,7 +111,8 @@ void TgaImageConverterTest::wrongFormat() { std::ostringstream out; Error redirectError{&out}; - const auto data = TgaImageConverter().exportToData(image); + std::unique_ptr converter = _converterManager.instantiate("TgaImageConverter"); + const auto data = converter->exportToData(image); CORRADE_VERIFY(!data); #if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) CORRADE_COMPARE(out.str(), "Trade::TgaImageConverter::exportToData(): unsupported color format PixelFormat::RG\n"); @@ -116,17 +133,23 @@ void TgaImageConverterTest::wrongType() { std::ostringstream out; Error redirectError{&out}; - const auto data = TgaImageConverter().exportToData(image); + std::unique_ptr converter = _converterManager.instantiate("TgaImageConverter"); + const auto data = converter->exportToData(image); CORRADE_VERIFY(!data); CORRADE_COMPARE(out.str(), "Trade::TgaImageConverter::exportToData(): unsupported color type PixelType::Float\n"); } void TgaImageConverterTest::rgb() { - const auto data = TgaImageConverter().exportToData(OriginalRGB); + std::unique_ptr converter = _converterManager.instantiate("TgaImageConverter"); + const auto data = converter->exportToData(OriginalRGB); + CORRADE_VERIFY(data); + + if(!(_importerManager.loadState("TgaImporter") & PluginManager::LoadState::Loaded)) + CORRADE_SKIP("TgaImporter plugin not enabled, can't test the result"); - TgaImporter importer; - CORRADE_VERIFY(importer.openData(data)); - Containers::Optional converted = importer.image2D(0); + std::unique_ptr importer = _importerManager.instantiate("TgaImporter"); + CORRADE_VERIFY(importer->openData(data)); + Containers::Optional converted = importer->image2D(0); CORRADE_VERIFY(converted); CORRADE_COMPARE(converted->storage().alignment(), 1); @@ -138,11 +161,16 @@ void TgaImageConverterTest::rgb() { } void TgaImageConverterTest::rgba() { - const auto data = TgaImageConverter().exportToData(OriginalRGBA); + std::unique_ptr converter = _converterManager.instantiate("TgaImageConverter"); + const auto data = converter->exportToData(OriginalRGBA); + CORRADE_VERIFY(data); + + if(!(_importerManager.loadState("TgaImporter") & PluginManager::LoadState::Loaded)) + CORRADE_SKIP("TgaImporter plugin not enabled, can't test the result"); - TgaImporter importer; - CORRADE_VERIFY(importer.openData(data)); - Containers::Optional converted = importer.image2D(0); + std::unique_ptr importer = _importerManager.instantiate("TgaImporter"); + CORRADE_VERIFY(importer->openData(data)); + Containers::Optional converted = importer->image2D(0); CORRADE_VERIFY(converted); CORRADE_COMPARE(converted->storage().alignment(), 4); diff --git a/src/MagnumPlugins/ObjImporter/pluginRegistration.cpp b/src/MagnumPlugins/TgaImageConverter/Test/configure.h.cmake similarity index 88% rename from src/MagnumPlugins/ObjImporter/pluginRegistration.cpp rename to src/MagnumPlugins/TgaImageConverter/Test/configure.h.cmake index ff20b43c9..a2885623c 100644 --- a/src/MagnumPlugins/ObjImporter/pluginRegistration.cpp +++ b/src/MagnumPlugins/TgaImageConverter/Test/configure.h.cmake @@ -23,7 +23,5 @@ DEALINGS IN THE SOFTWARE. */ -#include "MagnumPlugins/ObjImporter/ObjImporter.h" - -CORRADE_PLUGIN_REGISTER(ObjImporter, Magnum::Trade::ObjImporter, - "cz.mosra.magnum.Trade.AbstractImporter/0.3") +#cmakedefine TGAIMAGECONVERTER_PLUGIN_FILENAME "${TGAIMAGECONVERTER_PLUGIN_FILENAME}" +#cmakedefine TGAIMPORTER_PLUGIN_FILENAME "${TGAIMPORTER_PLUGIN_FILENAME}" diff --git a/src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp b/src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp index 799b2ac29..e31386323 100644 --- a/src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp +++ b/src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp @@ -115,3 +115,6 @@ Containers::Array TgaImageConverter::doExportToData(const ImageView2D& ima } }} + +CORRADE_PLUGIN_REGISTER(TgaImageConverter, Magnum::Trade::TgaImageConverter, + "cz.mosra.magnum.Trade.AbstractImageConverter/0.2.1") diff --git a/src/MagnumPlugins/TgaImageConverter/pluginRegistration.cpp b/src/MagnumPlugins/TgaImageConverter/pluginRegistration.cpp deleted file mode 100644 index c0020f69c..000000000 --- a/src/MagnumPlugins/TgaImageConverter/pluginRegistration.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* - This file is part of Magnum. - - Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 - Vladimír Vondruš - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. -*/ - -#include "MagnumPlugins/TgaImageConverter/TgaImageConverter.h" - -CORRADE_PLUGIN_REGISTER(TgaImageConverter, Magnum::Trade::TgaImageConverter, - "cz.mosra.magnum.Trade.AbstractImageConverter/0.2.1") diff --git a/src/MagnumPlugins/TgaImporter/CMakeLists.txt b/src/MagnumPlugins/TgaImporter/CMakeLists.txt index 9f9092f23..ac4f3cebb 100644 --- a/src/MagnumPlugins/TgaImporter/CMakeLists.txt +++ b/src/MagnumPlugins/TgaImporter/CMakeLists.txt @@ -30,43 +30,21 @@ endif() configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/configure.h) -set(TgaImporter_SRCS - TgaImporter.cpp) - -set(TgaImporter_HEADERS - TgaImporter.h) - -set(TgaImporter_PRIVATE_HEADERS - TgaHeader.h) - -# Objects shared between plugin and test library -add_library(TgaImporterObjects OBJECT - ${TgaImporter_SRCS} - ${TgaImporter_HEADERS} - ${TgaImporter_PRIVATE_HEADERS}) -target_include_directories(TgaImporterObjects PUBLIC $) -if(NOT BUILD_PLUGINS_STATIC) - target_compile_definitions(TgaImporterObjects PRIVATE "TgaImporterObjects_EXPORTS") -endif() -if(NOT BUILD_PLUGINS_STATIC OR BUILD_STATIC_PIC) - set_target_properties(TgaImporterObjects PROPERTIES POSITION_INDEPENDENT_CODE ON) -endif() -set_target_properties(TgaImporterObjects PROPERTIES FOLDER "MagnumPlugins/TgaImporter") - # TgaImporter plugin add_plugin(TgaImporter "${MAGNUM_PLUGINS_IMPORTER_DEBUG_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_IMPORTER_DEBUG_LIBRARY_INSTALL_DIR}" "${MAGNUM_PLUGINS_IMPORTER_RELEASE_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_IMPORTER_RELEASE_LIBRARY_INSTALL_DIR}" TgaImporter.conf - $ - pluginRegistration.cpp) -if(BUILD_STATIC_PIC) + TgaImporter.cpp + TgaImporter.h + TgaHeader.h) +if(BUILD_PLUGINS_STATIC AND BUILD_STATIC_PIC) set_target_properties(TgaImporter PROPERTIES POSITION_INDEPENDENT_CODE ON) endif() -target_link_libraries(TgaImporter Magnum) +target_link_libraries(TgaImporter PUBLIC Magnum) -install(FILES ${TgaImporter_HEADERS} DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/TgaImporter) -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/configure.h DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/TgaImporter) +install(FILES TgaImporter.h ${CMAKE_CURRENT_BINARY_DIR}/configure.h + DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/TgaImporter) # Automatic static plugin import if(BUILD_PLUGINS_STATIC) @@ -77,12 +55,6 @@ if(BUILD_PLUGINS_STATIC) endif() if(BUILD_TESTS) - add_library(MagnumTgaImporterTestLib STATIC - $ - ${PROJECT_SOURCE_DIR}/src/dummy.cpp) # XCode workaround, see file comment for details - set_target_properties(MagnumTgaImporterTestLib PROPERTIES FOLDER "MagnumPlugins/TgaImporter") - target_link_libraries(MagnumTgaImporterTestLib Magnum) - add_subdirectory(Test) endif() diff --git a/src/MagnumPlugins/TgaImporter/Test/CMakeLists.txt b/src/MagnumPlugins/TgaImporter/Test/CMakeLists.txt index 4cbbc070a..c3772798c 100644 --- a/src/MagnumPlugins/TgaImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/TgaImporter/Test/CMakeLists.txt @@ -29,18 +29,30 @@ else() set(TGAIMPORTER_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}) endif() -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake - ${CMAKE_CURRENT_BINARY_DIR}/configure.h) +# CMake before 3.8 has broken $ expressions for iOS (see +# https://gitlab.kitware.com/cmake/cmake/merge_requests/404) and since Corrade +# doesn't support dynamic plugins on iOS, this sorta works around that. Should +# be revisited when updating Travis to newer Xcode (current has CMake 3.6). +if(NOT BUILD_PLUGINS_STATIC) + set(TGAIMPORTER_PLUGIN_FILENAME $) + + # First replace ${} variables, then $<> generator expressions + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h.in) + file(GENERATE OUTPUT $/configure.h + INPUT ${CMAKE_CURRENT_BINARY_DIR}/configure.h.in) +else() + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h) +endif() corrade_add_test(TgaImporterTest TgaImporterTest.cpp - LIBRARIES MagnumTgaImporterTestLib + LIBRARIES Magnum FILES file.tga) -target_include_directories(TgaImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) -set_target_properties(TgaImporterTest PROPERTIES FOLDER "MagnumPlugins/TgaImporter/Test") -# On Win32 we need to avoid dllimporting TgaImporter symbols, because it would -# search for the symbols in some DLL even though they were linked statically. -# However it apparently doesn't matter that they were dllexported when building -# the static library. EH. -if(WIN32) - target_compile_definitions(TgaImporterTest PRIVATE "MAGNUM_TGAIMPORTER_BUILD_STATIC") +if(NOT BUILD_PLUGINS_STATIC) + target_include_directories(TgaImporterTest PRIVATE $) +else() + target_include_directories(TgaImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + target_link_libraries(TgaImporterTest PRIVATE TgaImporter) endif() +set_target_properties(TgaImporterTest PROPERTIES FOLDER "MagnumPlugins/TgaImporter/Test") diff --git a/src/MagnumPlugins/TgaImporter/Test/TgaImporterTest.cpp b/src/MagnumPlugins/TgaImporter/Test/TgaImporterTest.cpp index 617257ade..cd3f8f963 100644 --- a/src/MagnumPlugins/TgaImporter/Test/TgaImporterTest.cpp +++ b/src/MagnumPlugins/TgaImporter/Test/TgaImporterTest.cpp @@ -30,8 +30,8 @@ #include #include "Magnum/PixelFormat.h" +#include "Magnum/Trade/AbstractImporter.h" #include "Magnum/Trade/ImageData.h" -#include "MagnumPlugins/TgaImporter/TgaImporter.h" #include "configure.h" @@ -53,6 +53,9 @@ struct TgaImporterTest: TestSuite::Tester { void grayscaleBits16(); void useTwice(); + + /* Explicitly forbid system-wide plugin dependencies */ + PluginManager::Manager _manager{"nonexistent"}; }; TgaImporterTest::TgaImporterTest() { @@ -68,54 +71,60 @@ TgaImporterTest::TgaImporterTest() { &TgaImporterTest::grayscaleBits16, &TgaImporterTest::useTwice}); + + /* Load the plugin directly from the build tree. Otherwise it's static and + already loaded. */ + #ifdef TGAIMPORTER_PLUGIN_FILENAME + CORRADE_INTERNAL_ASSERT(_manager.load(TGAIMPORTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); + #endif } void TgaImporterTest::openShort() { - TgaImporter importer; + std::unique_ptr importer = _manager.instantiate("TgaImporter"); const char data[] = { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - CORRADE_VERIFY(importer.openData(data)); + CORRADE_VERIFY(importer->openData(data)); std::ostringstream debug; Error redirectError{&debug}; - CORRADE_VERIFY(!importer.image2D(0)); + CORRADE_VERIFY(!importer->image2D(0)); CORRADE_COMPARE(debug.str(), "Trade::TgaImporter::image2D(): the file is too short: 17 bytes\n"); } void TgaImporterTest::paletted() { - TgaImporter importer; + std::unique_ptr importer = _manager.instantiate("TgaImporter"); const char data[] = { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - CORRADE_VERIFY(importer.openData(data)); + CORRADE_VERIFY(importer->openData(data)); std::ostringstream debug; Error redirectError{&debug}; - CORRADE_VERIFY(!importer.image2D(0)); + CORRADE_VERIFY(!importer->image2D(0)); CORRADE_COMPARE(debug.str(), "Trade::TgaImporter::image2D(): paletted files are not supported\n"); } void TgaImporterTest::compressed() { - TgaImporter importer; + std::unique_ptr importer = _manager.instantiate("TgaImporter"); const char data[] = { 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - CORRADE_VERIFY(importer.openData(data)); + CORRADE_VERIFY(importer->openData(data)); std::ostringstream debug; Error redirectError{&debug}; - CORRADE_VERIFY(!importer.image2D(0)); + CORRADE_VERIFY(!importer->image2D(0)); CORRADE_COMPARE(debug.str(), "Trade::TgaImporter::image2D(): unsupported (compressed?) image type: 9\n"); } void TgaImporterTest::colorBits16() { - TgaImporter importer; + std::unique_ptr importer = _manager.instantiate("TgaImporter"); const char data[] = { 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0 }; - CORRADE_VERIFY(importer.openData(data)); + CORRADE_VERIFY(importer->openData(data)); std::ostringstream debug; Error redirectError{&debug}; - CORRADE_VERIFY(!importer.image2D(0)); + CORRADE_VERIFY(!importer->image2D(0)); CORRADE_COMPARE(debug.str(), "Trade::TgaImporter::image2D(): unsupported color bits-per-pixel: 16\n"); } void TgaImporterTest::colorBits24() { - TgaImporter importer; + std::unique_ptr importer = _manager.instantiate("TgaImporter"); const char data[] = { 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 24, 0, 1, 2, 3, 2, 3, 4, @@ -127,9 +136,9 @@ void TgaImporterTest::colorBits24() { 5, 4, 3, 6, 5, 4, 7, 6, 5, 8, 7, 6 }; - CORRADE_VERIFY(importer.openData(data)); + CORRADE_VERIFY(importer->openData(data)); - Containers::Optional image = importer.image2D(0); + Containers::Optional image = importer->image2D(0); CORRADE_VERIFY(image); CORRADE_COMPARE(image->storage().alignment(), 1); CORRADE_COMPARE(image->format(), PixelFormat::RGB); @@ -140,7 +149,7 @@ void TgaImporterTest::colorBits24() { } void TgaImporterTest::colorBits32() { - TgaImporter importer; + std::unique_ptr importer = _manager.instantiate("TgaImporter"); const char data[] = { 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 32, 0, 1, 2, 3, 1, 2, 3, 4, 1, @@ -152,9 +161,9 @@ void TgaImporterTest::colorBits32() { 5, 4, 3, 1, 6, 5, 4, 1, 7, 6, 5, 1, 8, 7, 6, 1 }; - CORRADE_VERIFY(importer.openData(data)); + CORRADE_VERIFY(importer->openData(data)); - Containers::Optional image = importer.image2D(0); + Containers::Optional image = importer->image2D(0); CORRADE_VERIFY(image); CORRADE_COMPARE(image->storage().alignment(), 4); CORRADE_COMPARE(image->format(), PixelFormat::RGBA); @@ -165,16 +174,16 @@ void TgaImporterTest::colorBits32() { } void TgaImporterTest::grayscaleBits8() { - TgaImporter importer; + std::unique_ptr importer = _manager.instantiate("TgaImporter"); const char data[] = { 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 8, 0, 1, 2, 3, 4, 5, 6 }; - CORRADE_VERIFY(importer.openData(data)); + CORRADE_VERIFY(importer->openData(data)); - Containers::Optional image = importer.image2D(0); + Containers::Optional image = importer->image2D(0); CORRADE_VERIFY(image); CORRADE_COMPARE(image->storage().alignment(), 1); #ifndef MAGNUM_TARGET_GLES2 @@ -189,27 +198,27 @@ void TgaImporterTest::grayscaleBits8() { } void TgaImporterTest::grayscaleBits16() { - TgaImporter importer; + std::unique_ptr importer = _manager.instantiate("TgaImporter"); const char data[] = { 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0 }; - CORRADE_VERIFY(importer.openData(data)); + CORRADE_VERIFY(importer->openData(data)); std::ostringstream debug; Error redirectError{&debug}; - CORRADE_VERIFY(!importer.image2D(0)); + CORRADE_VERIFY(!importer->image2D(0)); CORRADE_COMPARE(debug.str(), "Trade::TgaImporter::image2D(): unsupported grayscale bits-per-pixel: 16\n"); } void TgaImporterTest::useTwice() { - TgaImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(TGAIMPORTER_TEST_DIR, "file.tga"))); + std::unique_ptr importer = _manager.instantiate("TgaImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(TGAIMPORTER_TEST_DIR, "file.tga"))); /* Verify that the file is rewinded for second use */ { - Containers::Optional image = importer.image2D(0); + Containers::Optional image = importer->image2D(0); CORRADE_VERIFY(image); CORRADE_COMPARE(image->size(), (Vector2i{2, 3})); } { - Containers::Optional image = importer.image2D(0); + Containers::Optional image = importer->image2D(0); CORRADE_VERIFY(image); CORRADE_COMPARE(image->size(), (Vector2i{2, 3})); } diff --git a/src/MagnumPlugins/TgaImporter/Test/configure.h.cmake b/src/MagnumPlugins/TgaImporter/Test/configure.h.cmake index c3d0c3e53..965b6cb8b 100644 --- a/src/MagnumPlugins/TgaImporter/Test/configure.h.cmake +++ b/src/MagnumPlugins/TgaImporter/Test/configure.h.cmake @@ -23,4 +23,5 @@ DEALINGS IN THE SOFTWARE. */ +#cmakedefine TGAIMPORTER_PLUGIN_FILENAME "${TGAIMPORTER_PLUGIN_FILENAME}" #define TGAIMPORTER_TEST_DIR "${TGAIMPORTER_TEST_DIR}" diff --git a/src/MagnumPlugins/TgaImporter/TgaImporter.cpp b/src/MagnumPlugins/TgaImporter/TgaImporter.cpp index c143e30fa..5d61b4621 100644 --- a/src/MagnumPlugins/TgaImporter/TgaImporter.cpp +++ b/src/MagnumPlugins/TgaImporter/TgaImporter.cpp @@ -140,3 +140,6 @@ Containers::Optional TgaImporter::doImage2D(UnsignedInt) { } }} + +CORRADE_PLUGIN_REGISTER(TgaImporter, Magnum::Trade::TgaImporter, + "cz.mosra.magnum.Trade.AbstractImporter/0.3") diff --git a/src/MagnumPlugins/TgaImporter/TgaImporter.h b/src/MagnumPlugins/TgaImporter/TgaImporter.h index a1d3e384d..01ca8e715 100644 --- a/src/MagnumPlugins/TgaImporter/TgaImporter.h +++ b/src/MagnumPlugins/TgaImporter/TgaImporter.h @@ -38,7 +38,7 @@ #ifndef DOXYGEN_GENERATING_OUTPUT #ifndef MAGNUM_TGAIMPORTER_BUILD_STATIC - #if defined(TgaImporter_EXPORTS) || defined(TgaImporterObjects_EXPORTS) + #ifdef TgaImporter_EXPORTS #define MAGNUM_TGAIMPORTER_EXPORT CORRADE_VISIBILITY_EXPORT #else #define MAGNUM_TGAIMPORTER_EXPORT CORRADE_VISIBILITY_IMPORT diff --git a/src/MagnumPlugins/TgaImporter/pluginRegistration.cpp b/src/MagnumPlugins/TgaImporter/pluginRegistration.cpp deleted file mode 100644 index 8b0a4d526..000000000 --- a/src/MagnumPlugins/TgaImporter/pluginRegistration.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* - This file is part of Magnum. - - Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 - Vladimír Vondruš - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. -*/ - -#include "MagnumPlugins/TgaImporter/TgaImporter.h" - -CORRADE_PLUGIN_REGISTER(TgaImporter, Magnum::Trade::TgaImporter, - "cz.mosra.magnum.Trade.AbstractImporter/0.3") diff --git a/src/MagnumPlugins/WavAudioImporter/CMakeLists.txt b/src/MagnumPlugins/WavAudioImporter/CMakeLists.txt index d4d8ece1b..a46fdf960 100644 --- a/src/MagnumPlugins/WavAudioImporter/CMakeLists.txt +++ b/src/MagnumPlugins/WavAudioImporter/CMakeLists.txt @@ -30,21 +30,10 @@ endif() configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/configure.h) -set(WavAudioImporter_SRCS - WavHeader.cpp - WavImporter.cpp) - -set(WavAudioImporter_HEADERS - WavImporter.h) - -set(WavAudioImporter_PRIVATE_HEADERS - WavHeader.h) - # Objects shared between plugin and test library add_library(WavAudioImporterObjects OBJECT - ${WavAudioImporter_SRCS} - ${WavAudioImporter_HEADERS} - ${WavAudioImporter_PRIVATE_HEADERS}) + WavHeader.cpp + WavHeader.h) target_include_directories(WavAudioImporterObjects PUBLIC $ $) @@ -61,15 +50,16 @@ add_plugin(WavAudioImporter "${MAGNUM_PLUGINS_AUDIOIMPORTER_DEBUG_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_AUDIOIMPORTER_DEBUG_LIBRARY_INSTALL_DIR}" "${MAGNUM_PLUGINS_AUDIOIMPORTER_RELEASE_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_AUDIOIMPORTER_RELEASE_LIBRARY_INSTALL_DIR}" WavAudioImporter.conf - $ - pluginRegistration.cpp) -if(BUILD_STATIC_PIC) + WavImporter.cpp + WavImporter.h + $) +if(BUILD_PLUGINS_STATIC AND BUILD_STATIC_PIC) set_target_properties(WavAudioImporter PROPERTIES POSITION_INDEPENDENT_CODE ON) endif() -target_link_libraries(WavAudioImporter Magnum MagnumAudio) +target_link_libraries(WavAudioImporter PUBLIC Magnum MagnumAudio) -install(FILES ${WavAudioImporter_HEADERS} DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/WavAudioImporter) -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/configure.h DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/WavAudioImporter) +install(FILES WavImporter.h ${CMAKE_CURRENT_BINARY_DIR}/configure.h + DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/WavAudioImporter) # Automatic static plugin import if(BUILD_PLUGINS_STATIC) @@ -80,12 +70,6 @@ if(BUILD_PLUGINS_STATIC) endif() if(BUILD_TESTS) - add_library(MagnumWavAudioImporterTestLib STATIC - $ - ${PROJECT_SOURCE_DIR}/src/dummy.cpp) # XCode workaround, see file comment for details - set_target_properties(MagnumWavAudioImporterTestLib PROPERTIES FOLDER "MagnumPlugins/WavAudioImporter") - target_link_libraries(MagnumWavAudioImporterTestLib Magnum MagnumAudio) - add_subdirectory(Test) endif() diff --git a/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt b/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt index 223fcceb1..6034ec806 100644 --- a/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt @@ -29,11 +29,25 @@ else() set(WAVAUDIOIMPORTER_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}) endif() -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake - ${CMAKE_CURRENT_BINARY_DIR}/configure.h) +# CMake before 3.8 has broken $ expressions for iOS (see +# https://gitlab.kitware.com/cmake/cmake/merge_requests/404) and since Corrade +# doesn't support dynamic plugins on iOS, this sorta works around that. Should +# be revisited when updating Travis to newer Xcode (current has CMake 3.6). +if(NOT BUILD_PLUGINS_STATIC) + set(WAVAUDIOIMPORTER_PLUGIN_FILENAME $) + + # First replace ${} variables, then $<> generator expressions + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h.in) + file(GENERATE OUTPUT $/configure.h + INPUT ${CMAKE_CURRENT_BINARY_DIR}/configure.h.in) +else() + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h) +endif() corrade_add_test(WavAudioImporterTest WavImporterTest.cpp - LIBRARIES MagnumWavAudioImporterTestLib + LIBRARIES MagnumAudio FILES unsupportedChannelCount.wav unsupportedFormat.wav @@ -67,12 +81,19 @@ corrade_add_test(WavAudioImporterTest WavImporterTest.cpp surround51Channel16.wav surround71Channel24.wav) -target_include_directories(WavAudioImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) -set_target_properties(WavAudioImporterTest PROPERTIES FOLDER "MagnumPlugins/WavAudioImporter/Test") -# On Win32 we need to avoid dllimporting WavAudioImporter symbols, because it -# would search for the symbols in some DLL even though they were linked -# statically. However it apparently doesn't matter that they were dllexported -# when building the static library. EH. -if(WIN32) - target_compile_definitions(WavAudioImporterTest PRIVATE "MAGNUM_WAVAUDIOIMPORTER_BUILD_STATIC") +if(NOT BUILD_PLUGINS_STATIC) + target_include_directories(WavAudioImporterTest PRIVATE $) +else() + target_include_directories(WavAudioImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + target_link_libraries(WavAudioImporterTest PRIVATE WavAudioImporter) endif() + +corrade_add_test(WavAudioImporterWavHeaderTest + WavHeaderTest.cpp + $ + LIBRARIES MagnumAudio) + +set_target_properties( + WavAudioImporterTest + WavAudioImporterWavHeaderTest + PROPERTIES FOLDER "MagnumPlugins/WavAudioImporter/Test") diff --git a/src/MagnumPlugins/MagnumFont/pluginRegistration.cpp b/src/MagnumPlugins/WavAudioImporter/Test/WavHeaderTest.cpp similarity index 61% rename from src/MagnumPlugins/MagnumFont/pluginRegistration.cpp rename to src/MagnumPlugins/WavAudioImporter/Test/WavHeaderTest.cpp index 4b61aeb7f..3970e9352 100644 --- a/src/MagnumPlugins/MagnumFont/pluginRegistration.cpp +++ b/src/MagnumPlugins/WavAudioImporter/Test/WavHeaderTest.cpp @@ -3,6 +3,7 @@ Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 Vladimír Vondruš + Copyright © 2016 Alice Margatroid Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -23,9 +24,32 @@ DEALINGS IN THE SOFTWARE. */ -#include +#include +#include -#include "MagnumPlugins/MagnumFont/MagnumFont.h" +#include "Magnum/Magnum.h" +#include "MagnumPlugins/WavAudioImporter/WavHeader.h" + +namespace Magnum { namespace Audio { namespace Test { + +struct WavHeaderTest: TestSuite::Tester { + explicit WavHeaderTest(); + + void debugAudioFormat(); +}; + +WavHeaderTest::WavHeaderTest() { + addTests({&WavHeaderTest::debugAudioFormat}); +} + +void WavHeaderTest::debugAudioFormat() { + std::ostringstream out; + + Debug{&out} << Implementation::WavAudioFormat::IeeeFloat << Implementation::WavAudioFormat(0xdead); + CORRADE_COMPARE(out.str(), "Audio::WavAudioFormat::IeeeFloat Audio::WavAudioFormat(0xdead)\n"); +} + +}}} + +CORRADE_TEST_MAIN(Magnum::Audio::Test::WavHeaderTest) -CORRADE_PLUGIN_REGISTER(MagnumFont, Magnum::Text::MagnumFont, - "cz.mosra.magnum.Text.AbstractFont/0.2.4") diff --git a/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp b/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp index 73e546a2e..5cb13ac2e 100644 --- a/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp +++ b/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp @@ -25,13 +25,12 @@ */ #include -#include +#include #include #include #include -#include "MagnumPlugins/WavAudioImporter/WavImporter.h" -#include "MagnumPlugins/WavAudioImporter/WavHeader.h" +#include "Magnum/Audio/AbstractImporter.h" #include "configure.h" @@ -73,7 +72,8 @@ struct WavImporterTest: TestSuite::Tester { void surround51Channel16(); void surround71Channel24(); - void debugAudioFormat(); + /* Explicitly forbid system-wide plugin dependencies */ + PluginManager::Manager _manager{"nonexistent"}; }; WavImporterTest::WavImporterTest() { @@ -108,17 +108,21 @@ WavImporterTest::WavImporterTest() { &WavImporterTest::stereo64f, &WavImporterTest::surround51Channel16, - &WavImporterTest::surround71Channel24, + &WavImporterTest::surround71Channel24}); - &WavImporterTest::debugAudioFormat}); + /* Load the plugin directly from the build tree. Otherwise it's static and + already loaded. */ + #ifdef WAVAUDIOIMPORTER_PLUGIN_FILENAME + CORRADE_INTERNAL_ASSERT(_manager.load(WAVAUDIOIMPORTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); + #endif } void WavImporterTest::wrongSize() { std::ostringstream out; Error redirectError{&out}; - WavImporter importer; - CORRADE_VERIFY(!importer.openData(Containers::Array(43))); + std::unique_ptr importer = _manager.instantiate("WavAudioImporter"); + CORRADE_VERIFY(!importer->openData(Containers::Array(43))); CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): the file is too short: 43 bytes\n"); } @@ -126,8 +130,8 @@ void WavImporterTest::wrongSignature() { std::ostringstream out; Error redirectError{&out}; - WavImporter importer; - CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "wrongSignature.wav"))); + std::unique_ptr importer = _manager.instantiate("WavAudioImporter"); + CORRADE_VERIFY(!importer->openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "wrongSignature.wav"))); CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): the file signature is invalid\n"); } @@ -135,8 +139,8 @@ void WavImporterTest::unsupportedFormat() { std::ostringstream out; Error redirectError{&out}; - WavImporter importer; - CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "unsupportedFormat.wav"))); + std::unique_ptr importer = _manager.instantiate("WavAudioImporter"); + CORRADE_VERIFY(!importer->openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "unsupportedFormat.wav"))); CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported format Audio::WavAudioFormat::AdPcm\n"); } @@ -144,8 +148,8 @@ void WavImporterTest::unsupportedChannelCount() { std::ostringstream out; Error redirectError{&out}; - WavImporter importer; - CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "unsupportedChannelCount.wav"))); + std::unique_ptr importer = _manager.instantiate("WavAudioImporter"); + CORRADE_VERIFY(!importer->openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "unsupportedChannelCount.wav"))); CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): PCM with unsupported channel count 6 with 8 bits per sample\n"); } @@ -153,8 +157,8 @@ void WavImporterTest::invalidPadding() { std::ostringstream out; Error redirectError{&out}; - WavImporter importer; - CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "invalidPadding.wav"))); + std::unique_ptr importer = _manager.instantiate("WavAudioImporter"); + CORRADE_VERIFY(!importer->openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "invalidPadding.wav"))); CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): the file has improper size, expected 66 but got 73\n"); } @@ -162,8 +166,8 @@ void WavImporterTest::invalidLength() { std::ostringstream out; Error redirectError{&out}; - WavImporter importer; - CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "invalidLength.wav"))); + std::unique_ptr importer = _manager.instantiate("WavAudioImporter"); + CORRADE_VERIFY(!importer->openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "invalidLength.wav"))); CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): the file has improper size, expected 160844 but got 80444\n"); } @@ -171,20 +175,20 @@ void WavImporterTest::invalidDataChunk() { std::ostringstream out; Error redirectError{&out}; - WavImporter importer; - CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "invalidDataChunk.wav"))); + std::unique_ptr importer = _manager.instantiate("WavAudioImporter"); + CORRADE_VERIFY(!importer->openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "invalidDataChunk.wav"))); CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): the file contains no data chunk\n"); } void WavImporterTest::invalidFactChunk() { - WavImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "invalidFactChunk.wav"))); + std::unique_ptr importer = _manager.instantiate("WavAudioImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "invalidFactChunk.wav"))); - CORRADE_COMPARE(importer.format(), Buffer::Format::Mono16); - CORRADE_COMPARE(importer.frequency(), 22050); + CORRADE_COMPARE(importer->format(), Buffer::Format::Mono16); + CORRADE_COMPARE(importer->frequency(), 22050); - CORRADE_COMPARE(importer.data().size(), 3724); - CORRADE_COMPARE_AS(importer.data().prefix(8), + CORRADE_COMPARE(importer->data().size(), 3724); + CORRADE_COMPARE_AS(importer->data().prefix(8), (Containers::Array{Containers::InPlaceInit, { -27, -11, -1, -9, 24, -6, 127, -5}}), TestSuite::Compare::Container>); @@ -194,72 +198,72 @@ void WavImporterTest::mono4() { std::ostringstream out; Error redirectError{&out}; - WavImporter importer; - CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "mono4.wav"))); + std::unique_ptr importer = _manager.instantiate("WavAudioImporter"); + CORRADE_VERIFY(!importer->openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "mono4.wav"))); CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported format Audio::WavAudioFormat::AdPcm\n"); } void WavImporterTest::mono8() { - WavImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "mono8.wav"))); + std::unique_ptr importer = _manager.instantiate("WavAudioImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "mono8.wav"))); - CORRADE_COMPARE(importer.format(), Buffer::Format::Mono8); - CORRADE_COMPARE(importer.frequency(), 22050); + CORRADE_COMPARE(importer->format(), Buffer::Format::Mono8); + CORRADE_COMPARE(importer->frequency(), 22050); - CORRADE_COMPARE(importer.data().size(), 2136); - CORRADE_COMPARE_AS(importer.data().prefix(4), + CORRADE_COMPARE(importer->data().size(), 2136); + CORRADE_COMPARE_AS(importer->data().prefix(4), (Containers::Array{Containers::InPlaceInit, {127, 127, 127, 127}}), TestSuite::Compare::Container>); } void WavImporterTest::mono8junk() { - WavImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "mono8junk.wav"))); + std::unique_ptr importer = _manager.instantiate("WavAudioImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "mono8junk.wav"))); - CORRADE_COMPARE(importer.format(), Buffer::Format::Mono8); - CORRADE_COMPARE(importer.frequency(), 22050); + CORRADE_COMPARE(importer->format(), Buffer::Format::Mono8); + CORRADE_COMPARE(importer->frequency(), 22050); - CORRADE_COMPARE_AS(importer.data().prefix(4), + CORRADE_COMPARE_AS(importer->data().prefix(4), (Containers::Array{Containers::InPlaceInit, {127, 127, 127, 127}}), TestSuite::Compare::Container>); } void WavImporterTest::mono8ALaw() { - WavImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "mono8ALaw.wav"))); + std::unique_ptr importer = _manager.instantiate("WavAudioImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "mono8ALaw.wav"))); - CORRADE_COMPARE(importer.format(), Buffer::Format::MonoALaw); - CORRADE_COMPARE(importer.frequency(), 8000); + CORRADE_COMPARE(importer->format(), Buffer::Format::MonoALaw); + CORRADE_COMPARE(importer->frequency(), 8000); - CORRADE_COMPARE(importer.data().size(), 4096); - CORRADE_COMPARE_AS(importer.data().prefix(8), + CORRADE_COMPARE(importer->data().size(), 4096); + CORRADE_COMPARE_AS(importer->data().prefix(8), (Containers::Array{Containers::InPlaceInit, { 87, 84, 85, 85, 85, -43, -43, -43}}), TestSuite::Compare::Container>); } void WavImporterTest::mono8MuLaw() { - WavImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "mono8MuLaw.wav"))); + std::unique_ptr importer = _manager.instantiate("WavAudioImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "mono8MuLaw.wav"))); - CORRADE_COMPARE(importer.format(), Buffer::Format::MonoMuLaw); - CORRADE_COMPARE(importer.frequency(), 8000); + CORRADE_COMPARE(importer->format(), Buffer::Format::MonoMuLaw); + CORRADE_COMPARE(importer->frequency(), 8000); - CORRADE_COMPARE(importer.data().size(), 4096); - CORRADE_COMPARE_AS(importer.data().prefix(8), + CORRADE_COMPARE(importer->data().size(), 4096); + CORRADE_COMPARE_AS(importer->data().prefix(8), (Containers::Array{Containers::InPlaceInit, { -5, -3, -1, -2, -1, 127, 127, 126}}), TestSuite::Compare::Container>); } void WavImporterTest::mono16() { - WavImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "mono16.wav"))); + std::unique_ptr importer = _manager.instantiate("WavAudioImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "mono16.wav"))); - CORRADE_COMPARE(importer.format(), Buffer::Format::Mono16); - CORRADE_COMPARE(importer.frequency(), 44000); + CORRADE_COMPARE(importer->format(), Buffer::Format::Mono16); + CORRADE_COMPARE(importer->frequency(), 44000); - CORRADE_COMPARE_AS(importer.data(), + CORRADE_COMPARE_AS(importer->data(), (Containers::Array{Containers::InPlaceInit, { '\x1d', '\x10', '\x71', '\xc5'}}), TestSuite::Compare::Container>); @@ -269,47 +273,47 @@ void WavImporterTest::stereo4() { std::ostringstream out; Error redirectError{&out}; - WavImporter importer; - CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo4.wav"))); + std::unique_ptr importer = _manager.instantiate("WavAudioImporter"); + CORRADE_VERIFY(!importer->openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo4.wav"))); CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported format Audio::WavAudioFormat::AdPcm\n"); } void WavImporterTest::stereo8() { - WavImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo8.wav"))); + std::unique_ptr importer = _manager.instantiate("WavAudioImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo8.wav"))); - CORRADE_COMPARE(importer.format(), Buffer::Format::Stereo8); - CORRADE_COMPARE(importer.frequency(), 96000); + CORRADE_COMPARE(importer->format(), Buffer::Format::Stereo8); + CORRADE_COMPARE(importer->frequency(), 96000); - CORRADE_COMPARE_AS(importer.data(), + CORRADE_COMPARE_AS(importer->data(), (Containers::Array{Containers::InPlaceInit, { '\xde', '\xfe', '\xca', '\x7e'}}), TestSuite::Compare::Container>); } void WavImporterTest::stereo8ALaw() { - WavImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo8ALaw.wav"))); + std::unique_ptr importer = _manager.instantiate("WavAudioImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo8ALaw.wav"))); - CORRADE_COMPARE(importer.format(), Buffer::Format::StereoALaw); - CORRADE_COMPARE(importer.frequency(), 8000); + CORRADE_COMPARE(importer->format(), Buffer::Format::StereoALaw); + CORRADE_COMPARE(importer->frequency(), 8000); - CORRADE_COMPARE(importer.data().size(), 4096); - CORRADE_COMPARE_AS(importer.data().prefix(8), + CORRADE_COMPARE(importer->data().size(), 4096); + CORRADE_COMPARE_AS(importer->data().prefix(8), (Containers::Array{Containers::InPlaceInit, { -43, -43, -43, -43, -43, -43, 85, -43}}), TestSuite::Compare::Container>); } void WavImporterTest::stereo8MuLaw() { - WavImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo8MuLaw.wav"))); + std::unique_ptr importer = _manager.instantiate("WavAudioImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo8MuLaw.wav"))); - CORRADE_COMPARE(importer.format(), Buffer::Format::StereoMuLaw); - CORRADE_COMPARE(importer.frequency(), 8000); + CORRADE_COMPARE(importer->format(), Buffer::Format::StereoMuLaw); + CORRADE_COMPARE(importer->frequency(), 8000); - CORRADE_COMPARE(importer.data().size(), 4096); - CORRADE_COMPARE_AS(importer.data().prefix(8), + CORRADE_COMPARE(importer->data().size(), 4096); + CORRADE_COMPARE_AS(importer->data().prefix(8), (Containers::Array{Containers::InPlaceInit, { -1, -1, -1, -1, -1, -1, 127, -1}}), TestSuite::Compare::Container>); @@ -319,20 +323,19 @@ void WavImporterTest::stereo12() { std::ostringstream out; Error redirectError{&out}; - WavImporter importer; - - CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo12.wav"))); + std::unique_ptr importer = _manager.instantiate("WavAudioImporter"); + CORRADE_VERIFY(!importer->openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo12.wav"))); CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): PCM with unsupported channel count 2 with 12 bits per sample\n"); } void WavImporterTest::stereo16() { - WavImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo16.wav"))); + std::unique_ptr importer = _manager.instantiate("WavAudioImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo16.wav"))); - CORRADE_COMPARE(importer.format(), Buffer::Format::Stereo16); - CORRADE_COMPARE(importer.frequency(), 44100); + CORRADE_COMPARE(importer->format(), Buffer::Format::Stereo16); + CORRADE_COMPARE(importer->frequency(), 44100); - CORRADE_COMPARE_AS(importer.data(), + CORRADE_COMPARE_AS(importer->data(), (Containers::Array{Containers::InPlaceInit, {39, 79, 39, 79}}), TestSuite::Compare::Container>); } @@ -341,9 +344,8 @@ void WavImporterTest::stereo24() { std::ostringstream out; Error redirectError{&out}; - WavImporter importer; - - CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo24.wav"))); + std::unique_ptr importer = _manager.instantiate("WavAudioImporter"); + CORRADE_VERIFY(!importer->openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo24.wav"))); CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): PCM with unsupported channel count 2 with 24 bits per sample\n"); } @@ -351,49 +353,48 @@ void WavImporterTest::stereo32() { std::ostringstream out; Error redirectError{&out}; - WavImporter importer; - - CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo32.wav"))); + std::unique_ptr importer = _manager.instantiate("WavAudioImporter"); + CORRADE_VERIFY(!importer->openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo32.wav"))); CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): PCM with unsupported channel count 2 with 32 bits per sample\n"); } void WavImporterTest::mono32f() { - WavImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "mono32f.wav"))); + std::unique_ptr importer = _manager.instantiate("WavAudioImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "mono32f.wav"))); - CORRADE_COMPARE(importer.format(), Buffer::Format::MonoFloat); - CORRADE_COMPARE(importer.frequency(), 48000); + CORRADE_COMPARE(importer->format(), Buffer::Format::MonoFloat); + CORRADE_COMPARE(importer->frequency(), 48000); - CORRADE_COMPARE(importer.data().size(), 3920); - CORRADE_COMPARE_AS(importer.data().prefix(16), + CORRADE_COMPARE(importer->data().size(), 3920); + CORRADE_COMPARE_AS(importer->data().prefix(16), (Containers::Array{Containers::InPlaceInit, { 0, 0, 0, 0, 108, 57, -103, 59, 3, 63, 42, 60, -33, -81, -120, 60}}), TestSuite::Compare::Container>); } void WavImporterTest::stereo32f() { - WavImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo32f.wav"))); + std::unique_ptr importer = _manager.instantiate("WavAudioImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo32f.wav"))); - CORRADE_COMPARE(importer.format(), Buffer::Format::StereoFloat); - CORRADE_COMPARE(importer.frequency(), 44100); + CORRADE_COMPARE(importer->format(), Buffer::Format::StereoFloat); + CORRADE_COMPARE(importer->frequency(), 44100); - CORRADE_COMPARE(importer.data().size(), 1352); - CORRADE_COMPARE_AS(importer.data().prefix(8), + CORRADE_COMPARE(importer->data().size(), 1352); + CORRADE_COMPARE_AS(importer->data().prefix(8), (Containers::Array{Containers::InPlaceInit, { 17, -77, -103, 56, 5, 50, 72, 56}}), TestSuite::Compare::Container>); } void WavImporterTest::stereo64f() { - WavImporter importer; - CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo64f.wav"))); + std::unique_ptr importer = _manager.instantiate("WavAudioImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo64f.wav"))); - CORRADE_COMPARE(importer.format(), Buffer::Format::StereoDouble); - CORRADE_COMPARE(importer.frequency(), 8000); + CORRADE_COMPARE(importer->format(), Buffer::Format::StereoDouble); + CORRADE_COMPARE(importer->frequency(), 8000); - CORRADE_COMPARE(importer.data().size(), 375888); - CORRADE_COMPARE_AS(importer.data().prefix(64), + CORRADE_COMPARE(importer->data().size(), 375888); + CORRADE_COMPARE_AS(importer->data().prefix(64), (Containers::Array{Containers::InPlaceInit, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -406,9 +407,8 @@ void WavImporterTest::surround51Channel16() { std::ostringstream out; Error redirectError{&out}; - WavImporter importer; - - CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "surround51Channel16.wav"))); + std::unique_ptr importer = _manager.instantiate("WavAudioImporter"); + CORRADE_VERIFY(!importer->openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "surround51Channel16.wav"))); CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported format Audio::WavAudioFormat::Extensible\n"); } @@ -416,19 +416,11 @@ void WavImporterTest::surround71Channel24() { std::ostringstream out; Error redirectError{&out}; - WavImporter importer; - - CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "surround71Channel24.wav"))); + std::unique_ptr importer = _manager.instantiate("WavAudioImporter"); + CORRADE_VERIFY(!importer->openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "surround71Channel24.wav"))); CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported format Audio::WavAudioFormat::Extensible\n"); } -void WavImporterTest::debugAudioFormat() { - std::ostringstream out; - - Debug{&out} << Implementation::WavAudioFormat::IeeeFloat << Implementation::WavAudioFormat(0xdead); - CORRADE_COMPARE(out.str(), "Audio::WavAudioFormat::IeeeFloat Audio::WavAudioFormat(0xdead)\n"); -} - }}} CORRADE_TEST_MAIN(Magnum::Audio::Test::WavImporterTest) diff --git a/src/MagnumPlugins/WavAudioImporter/Test/configure.h.cmake b/src/MagnumPlugins/WavAudioImporter/Test/configure.h.cmake index 1190fda12..5a17fbfde 100644 --- a/src/MagnumPlugins/WavAudioImporter/Test/configure.h.cmake +++ b/src/MagnumPlugins/WavAudioImporter/Test/configure.h.cmake @@ -23,4 +23,5 @@ DEALINGS IN THE SOFTWARE. */ +#cmakedefine WAVAUDIOIMPORTER_PLUGIN_FILENAME "${WAVAUDIOIMPORTER_PLUGIN_FILENAME}" #define WAVAUDIOIMPORTER_TEST_DIR "${WAVAUDIOIMPORTER_TEST_DIR}" diff --git a/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp b/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp index 45cc2383a..8ec40a6b4 100644 --- a/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp +++ b/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp @@ -230,3 +230,6 @@ Containers::Array WavImporter::doData() { } }} + +CORRADE_PLUGIN_REGISTER(WavAudioImporter, Magnum::Audio::WavImporter, + "cz.mosra.magnum.Audio.AbstractImporter/0.1") diff --git a/src/MagnumPlugins/WavAudioImporter/pluginRegistration.cpp b/src/MagnumPlugins/WavAudioImporter/pluginRegistration.cpp deleted file mode 100644 index cabf0746c..000000000 --- a/src/MagnumPlugins/WavAudioImporter/pluginRegistration.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* - This file is part of Magnum. - - Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 - Vladimír Vondruš - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. -*/ - -#include "MagnumPlugins/WavAudioImporter/WavImporter.h" - -CORRADE_PLUGIN_REGISTER(WavAudioImporter, Magnum::Audio::WavImporter, - "cz.mosra.magnum.Audio.AbstractImporter/0.1")