From 1b03e20e3ec2b278ca4defdd63d22d8c81c62887 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 23 Apr 2020 18:22:08 +0200 Subject: [PATCH] Any*{Importer,Converter}: propagate flags to the actual plugins. --- .../AnyImageConverter/AnyImageConverter.cpp | 6 +++- .../Test/AnyImageConverterTest.cpp | 27 +++++++++++++++- .../AnyImageImporter/AnyImageImporter.cpp | 10 ++++-- .../Test/AnyImageImporterTest.cpp | 30 +++++++++++++++++- .../AnyImageImporter/Test/CMakeLists.txt | 8 ++--- .../AnyImageImporter/Test/rgb.tga | Bin 0 -> 36 bytes .../AnySceneImporter/AnySceneImporter.cpp | 5 ++- .../Test/AnySceneImporterTest.cpp | 10 +++++- 8 files changed, 85 insertions(+), 11 deletions(-) create mode 100644 src/MagnumPlugins/AnyImageImporter/Test/rgb.tga diff --git a/src/MagnumPlugins/AnyImageConverter/AnyImageConverter.cpp b/src/MagnumPlugins/AnyImageConverter/AnyImageConverter.cpp index ad11cb3d6..e5932d49f 100644 --- a/src/MagnumPlugins/AnyImageConverter/AnyImageConverter.cpp +++ b/src/MagnumPlugins/AnyImageConverter/AnyImageConverter.cpp @@ -82,9 +82,13 @@ bool AnyImageConverter::doExportToFile(const ImageView2D& image, const std::stri return false; } + /* Instantiate the plugin, propagate flags */ + Containers::Pointer converter = static_cast*>(manager())->instantiate(plugin); + converter->setFlags(flags()); + /* Try to convert the file (error output should be printed by the plugin itself) */ - return static_cast*>(manager())->instantiate(plugin)->exportToFile(image, filename); + return converter->exportToFile(image, filename); } bool AnyImageConverter::doExportToFile(const CompressedImageView2D&, const std::string& filename) { diff --git a/src/MagnumPlugins/AnyImageConverter/Test/AnyImageConverterTest.cpp b/src/MagnumPlugins/AnyImageConverter/Test/AnyImageConverterTest.cpp index 91450f49f..f1b5e2408 100644 --- a/src/MagnumPlugins/AnyImageConverter/Test/AnyImageConverterTest.cpp +++ b/src/MagnumPlugins/AnyImageConverter/Test/AnyImageConverterTest.cpp @@ -47,6 +47,8 @@ struct AnyImageConverterTest: TestSuite::Tester { void unknown(); + void propagateFlags(); + /* Explicitly forbid system-wide plugin dependencies */ PluginManager::Manager _manager{"nonexistent"}; }; @@ -79,7 +81,9 @@ AnyImageConverterTest::AnyImageConverterTest() { addInstancedTests({&AnyImageConverterTest::detect}, Containers::arraySize(DetectData)); - addTests({&AnyImageConverterTest::unknown}); + addTests({&AnyImageConverterTest::unknown, + + &AnyImageConverterTest::propagateFlags}); /* Load the plugin directly from the build tree. Otherwise it's static and already loaded. */ @@ -150,6 +154,27 @@ void AnyImageConverterTest::unknown() { CORRADE_COMPARE(output.str(), "Trade::AnyImageConverter::exportToFile(): cannot determine the format of image.xcf\n"); } +void AnyImageConverterTest::propagateFlags() { + 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"); + + if(Utility::Directory::exists(filename)) + CORRADE_VERIFY(Utility::Directory::rm(filename)); + + /* Just test that the exported file exists */ + Containers::Pointer converter = _manager.instantiate("AnyImageConverter"); + converter->setFlags(ImageConverterFlag::Verbose); + std::ostringstream out; + { + Debug redirectOutput{&out}; + CORRADE_VERIFY(converter->exportToFile(Image, filename)); + } + CORRADE_VERIFY(Utility::Directory::exists(filename)); + CORRADE_COMPARE(out.str(), "Trade::TgaImageConverter::exportToData(): converting from RGB to BGR\n"); +} + }}}} CORRADE_TEST_MAIN(Magnum::Trade::Test::AnyImageConverterTest) diff --git a/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.cpp b/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.cpp index b5886d22e..5e51b1fc9 100644 --- a/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.cpp +++ b/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.cpp @@ -119,9 +119,12 @@ void AnyImageImporter::doOpenFile(const std::string& filename) { return; } + /* Instantiate the plugin, propagate flags */ + Containers::Pointer importer = static_cast*>(manager())->instantiate(plugin); + importer->setFlags(flags()); + /* Try to open the file (error output should be printed by the plugin itself) */ - Containers::Pointer importer = static_cast*>(manager())->instantiate(plugin); if(!importer->openFile(filename)) return; /* Success, save the instance */ @@ -190,9 +193,12 @@ void AnyImageImporter::doOpenData(Containers::ArrayView data) { return; } + /* Instantiate the plugin, propagate flags */ + Containers::Pointer importer = static_cast*>(manager())->instantiate(plugin); + importer->setFlags(flags()); + /* Try to open the file (error output should be printed by the plugin itself) */ - Containers::Pointer importer = static_cast*>(manager())->instantiate(plugin); if(!importer->openData(data)) return; /* Success, save the instance */ diff --git a/src/MagnumPlugins/AnyImageImporter/Test/AnyImageImporterTest.cpp b/src/MagnumPlugins/AnyImageImporter/Test/AnyImageImporterTest.cpp index 822da25b5..22d4662cc 100644 --- a/src/MagnumPlugins/AnyImageImporter/Test/AnyImageImporterTest.cpp +++ b/src/MagnumPlugins/AnyImageImporter/Test/AnyImageImporterTest.cpp @@ -48,6 +48,8 @@ struct AnyImageImporterTest: TestSuite::Tester { void unknownSignature(); void emptyData(); + void propagateFlags(); + /* Explicitly forbid system-wide plugin dependencies */ PluginManager::Manager _manager{"nonexistent"}; }; @@ -103,6 +105,9 @@ AnyImageImporterTest::AnyImageImporterTest() { &AnyImageImporterTest::unknownSignature, &AnyImageImporterTest::emptyData}); + addInstancedTests({&AnyImageImporterTest::propagateFlags}, + Containers::arraySize(LoadData)); + /* Load the plugin directly from the build tree. Otherwise it's static and already loaded. */ #ifdef ANYIMAGEIMPORTER_PLUGIN_FILENAME @@ -131,7 +136,7 @@ void AnyImageImporterTest::load() { /* Check only size, as it is good enough proof that it is working */ Containers::Optional image = importer->image2D(0); CORRADE_VERIFY(image); - CORRADE_COMPARE(image->size(), Vector2i(2, 3)); + CORRADE_COMPARE(image->size(), Vector2i(3, 2)); importer->close(); CORRADE_VERIFY(!importer->isOpened()); @@ -191,6 +196,29 @@ void AnyImageImporterTest::emptyData() { CORRADE_COMPARE(output.str(), "Trade::AnyImageImporter::openData(): file is empty\n"); } +void AnyImageImporterTest::propagateFlags() { + auto&& data = LoadData[testCaseInstanceId()]; + setTestCaseDescription(data.name); + + if(!(_manager.loadState("TgaImporter") & PluginManager::LoadState::Loaded)) + CORRADE_SKIP("TgaImporter plugin not enabled, cannot test"); + + Containers::Pointer importer = _manager.instantiate("AnyImageImporter"); + importer->setFlags(ImporterFlag::Verbose); + + Containers::Array storage; + importer->setFileCallback(data.callback, storage); + + CORRADE_VERIFY(importer->openFile(data.filename)); + + std::ostringstream out; + { + Debug redirectOutput{&out}; + CORRADE_VERIFY(importer->image2D(0)); + } + CORRADE_COMPARE(out.str(), "Trade::TgaImporter::image2D(): converting from BGR to RGB\n"); +} + }}}} CORRADE_TEST_MAIN(Magnum::Trade::Test::AnyImageImporterTest) diff --git a/src/MagnumPlugins/AnyImageImporter/Test/CMakeLists.txt b/src/MagnumPlugins/AnyImageImporter/Test/CMakeLists.txt index 807e1a1cb..e11de6a81 100644 --- a/src/MagnumPlugins/AnyImageImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/AnyImageImporter/Test/CMakeLists.txt @@ -25,10 +25,10 @@ if(CORRADE_TARGET_EMSCRIPTEN OR CORRADE_TARGET_ANDROID) set(TEST_FILE_DIR .) - set(TGA_FILE file.tga) + set(TGA_FILE rgb.tga) else() set(TEST_FILE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) - set(TGA_FILE ${PROJECT_SOURCE_DIR}/src/MagnumPlugins/TgaImporter/Test/file.tga) + set(TGA_FILE ${CMAKE_CURRENT_SOURCE_DIR}/rgb.tga) endif() # CMake before 3.8 has broken $ expressions for iOS (see @@ -56,8 +56,8 @@ corrade_add_test(AnyImageImporterTest AnyImageImporterTest.cpp rgb.basis rgb.hdr rgb.png - rgba_dxt1.dds - ../../TgaImporter/Test/file.tga) + rgb.tga + rgba_dxt1.dds) target_include_directories(AnyImageImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/$) if(BUILD_PLUGINS_STATIC) target_link_libraries(AnyImageImporterTest PRIVATE AnyImageImporter) diff --git a/src/MagnumPlugins/AnyImageImporter/Test/rgb.tga b/src/MagnumPlugins/AnyImageImporter/Test/rgb.tga new file mode 100644 index 0000000000000000000000000000000000000000..ee7545acffb3588cece6658ed7c187bf7c28041f GIT binary patch literal 36 ZcmZQzU}As)W*}RFq5R*et!wWglK_Ed4V?f0 literal 0 HcmV?d00001 diff --git a/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.cpp b/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.cpp index f0a562a57..a6c6859c7 100644 --- a/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.cpp +++ b/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.cpp @@ -139,9 +139,12 @@ void AnySceneImporter::doOpenFile(const std::string& filename) { return; } + /* Instantiate the plugin, propagate flags */ + Containers::Pointer importer = static_cast*>(manager())->instantiate(plugin); + importer->setFlags(flags()); + /* Try to open the file (error output should be printed by the plugin itself) */ - Containers::Pointer importer = static_cast*>(manager())->instantiate(plugin); if(!importer->openFile(filename)) return; /* Success, save the instance */ diff --git a/src/MagnumPlugins/AnySceneImporter/Test/AnySceneImporterTest.cpp b/src/MagnumPlugins/AnySceneImporter/Test/AnySceneImporterTest.cpp index c3d498104..9ab10472f 100644 --- a/src/MagnumPlugins/AnySceneImporter/Test/AnySceneImporterTest.cpp +++ b/src/MagnumPlugins/AnySceneImporter/Test/AnySceneImporterTest.cpp @@ -56,6 +56,8 @@ struct AnySceneImporterTest: TestSuite::Tester { void unknown(); + void propagateFlags(); + /* Explicitly forbid system-wide plugin dependencies */ PluginManager::Manager _manager{"nonexistent"}; }; @@ -94,7 +96,9 @@ AnySceneImporterTest::AnySceneImporterTest() { addInstancedTests({&AnySceneImporterTest::detect}, Containers::arraySize(DetectData)); - addTests({&AnySceneImporterTest::unknown}); + addTests({&AnySceneImporterTest::unknown, + + &AnySceneImporterTest::propagateFlags}); /* Load the plugin directly from the build tree. Otherwise it's static and already loaded. */ @@ -177,6 +181,10 @@ void AnySceneImporterTest::unknown() { CORRADE_COMPARE(output.str(), "Trade::AnySceneImporter::openFile(): cannot determine the format of mesh.wtf\n"); } +void AnySceneImporterTest::propagateFlags() { + CORRADE_SKIP("No plugin with verbose output available to test."); +} + }}}} CORRADE_TEST_MAIN(Magnum::Trade::Test::AnySceneImporterTest)