diff --git a/src/MagnumPlugins/AnySceneConverter/Test/AnySceneConverterTest.cpp b/src/MagnumPlugins/AnySceneConverter/Test/AnySceneConverterTest.cpp index 5653a5be7..73c52eae1 100644 --- a/src/MagnumPlugins/AnySceneConverter/Test/AnySceneConverterTest.cpp +++ b/src/MagnumPlugins/AnySceneConverter/Test/AnySceneConverterTest.cpp @@ -25,12 +25,15 @@ #include #include +#include #include #include +#include #include #include #include +#include "Magnum/Math/Vector3.h" #include "Magnum/Trade/AbstractSceneConverter.h" #include "Magnum/Trade/MeshData.h" @@ -82,7 +85,33 @@ AnySceneConverterTest::AnySceneConverterTest() { } void AnySceneConverterTest::convert() { - CORRADE_SKIP("No scene converter plugin available to test."); + PluginManager::Manager manager{MAGNUM_PLUGINS_SCENECONVERTER_INSTALL_DIR}; + #ifdef ANYSCENECONVERTER_PLUGIN_FILENAME + CORRADE_VERIFY(manager.load(ANYSCENECONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); + #endif + + if(manager.loadState("StanfordSceneConverter") < PluginManager::LoadState::Loaded) + CORRADE_SKIP("StanfordSceneConverter plugin can't be loaded."); + + const std::string filename = Utility::Directory::join(ANYSCENECONVERTER_TEST_OUTPUT_DIR, "file.ply"); + + if(Utility::Directory::exists(filename)) + CORRADE_VERIFY(Utility::Directory::rm(filename)); + + const Vector3 positions[] { + {-0.5f, -0.5f, 0.0f}, + { 0.5f, -0.5f, 0.0f}, + { 0.0f, 0.5f, 0.0f} + }; + const Trade::MeshData mesh{MeshPrimitive::Triangles, {}, positions, { + Trade::MeshAttributeData{Trade::MeshAttribute::Position, Containers::arrayView(positions)} + }}; + + Containers::Pointer converter = manager.instantiate("AnySceneConverter"); + CORRADE_VERIFY(converter->convertToFile(mesh, filename)); + /* This file is reused in AnySceneImporter tests, so it's worth to save it + here */ + CORRADE_COMPARE_AS(filename, PLY_FILE, TestSuite::Compare::File); } void AnySceneConverterTest::detect() { @@ -115,7 +144,40 @@ void AnySceneConverterTest::unknown() { } void AnySceneConverterTest::propagateFlags() { - CORRADE_SKIP("No plugin available to test."); + PluginManager::Manager manager{MAGNUM_PLUGINS_SCENECONVERTER_INSTALL_DIR}; + #ifdef ANYSCENECONVERTER_PLUGIN_FILENAME + CORRADE_VERIFY(manager.load(ANYSCENECONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); + #endif + + if(manager.loadState("StanfordSceneConverter") < PluginManager::LoadState::Loaded) + CORRADE_SKIP("StanfordSceneConverter plugin can't be loaded."); + + const std::string filename = Utility::Directory::join(ANYSCENECONVERTER_TEST_OUTPUT_DIR, "file.ply"); + + const Vector3 positions[] { + {-0.5f, -0.5f, 0.0f}, + { 0.5f, -0.5f, 0.0f}, + { 0.0f, 0.5f, 0.0f} + }; + const Trade::MeshData mesh{MeshPrimitive::Triangles, {}, positions, { + Trade::MeshAttributeData{Trade::MeshAttribute::Position, Containers::arrayView(positions)} + }}; + + Containers::Pointer converter = manager.instantiate("AnySceneConverter"); + converter->setFlags(SceneConverterFlag::Verbose); + + std::ostringstream out; + { + Debug redirectOutput{&out}; + CORRADE_VERIFY(converter->convertToFile(mesh, filename)); + CORRADE_VERIFY(Utility::Directory::exists(filename)); + } + CORRADE_COMPARE(out.str(), + "Trade::AnySceneConverter::convertToFile(): using StanfordSceneConverter\n"); + + /* We tested AnySceneConverter's verbose output, but can't actually test + the flag propagation in any way yet */ + CORRADE_SKIP("No plugin with verbose output available to test flag propagation."); } }}}} diff --git a/src/MagnumPlugins/AnySceneConverter/Test/CMakeLists.txt b/src/MagnumPlugins/AnySceneConverter/Test/CMakeLists.txt index 3b411839d..2672a88ca 100644 --- a/src/MagnumPlugins/AnySceneConverter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/AnySceneConverter/Test/CMakeLists.txt @@ -25,8 +25,10 @@ if(CORRADE_TARGET_EMSCRIPTEN OR CORRADE_TARGET_ANDROID) set(ANYSCENECONVERTER_TEST_OUTPUT_DIR "write") + set(PLY_FILE triangle.ply) else() set(ANYSCENECONVERTER_TEST_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}) + set(PLY_FILE ${PROJECT_SOURCE_DIR}/src/MagnumPlugins/AnySceneImporter/Test/triangle.ply) endif() # CMake before 3.8 has broken $ expressions for iOS (see @@ -47,7 +49,9 @@ file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/$/configure.h INPUT ${CMAKE_CURRENT_BINARY_DIR}/configure.h.in) corrade_add_test(AnySceneConverterTest AnySceneConverterTest.cpp - LIBRARIES MagnumTrade) + LIBRARIES MagnumTrade + FILES + ../../AnySceneImporter/Test/triangle.ply) target_include_directories(AnySceneConverterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/$) if(MAGNUM_ANYSCENECONVERTER_BUILD_STATIC) target_link_libraries(AnySceneConverterTest PRIVATE AnySceneConverter) diff --git a/src/MagnumPlugins/AnySceneConverter/Test/configure.h.cmake b/src/MagnumPlugins/AnySceneConverter/Test/configure.h.cmake index 89af33ff4..2d8e8e8de 100644 --- a/src/MagnumPlugins/AnySceneConverter/Test/configure.h.cmake +++ b/src/MagnumPlugins/AnySceneConverter/Test/configure.h.cmake @@ -25,3 +25,18 @@ #cmakedefine ANYSCENECONVERTER_PLUGIN_FILENAME "${ANYSCENECONVERTER_PLUGIN_FILENAME}" #define ANYSCENECONVERTER_TEST_OUTPUT_DIR "${ANYSCENECONVERTER_TEST_OUTPUT_DIR}" +#define PLY_FILE "${PLY_FILE}" + +#ifdef CORRADE_TARGET_WINDOWS +#ifdef CORRADE_IS_DEBUG_BUILD +#define MAGNUM_PLUGINS_SCENECONVERTER_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${MAGNUM_PLUGINS_SCENECONVERTER_DEBUG_BINARY_INSTALL_DIR}" +#else +#define MAGNUM_PLUGINS_SCENECONVERTER_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${MAGNUM_PLUGINS_SCENECONVERTER_RELEASE_BINARY_INSTALL_DIR}" +#endif +#else +#ifdef CORRADE_IS_DEBUG_BUILD +#define MAGNUM_PLUGINS_SCENECONVERTER_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${MAGNUM_PLUGINS_SCENECONVERTER_DEBUG_LIBRARY_INSTALL_DIR}" +#else +#define MAGNUM_PLUGINS_SCENECONVERTER_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${MAGNUM_PLUGINS_SCENECONVERTER_RELEASE_LIBRARY_INSTALL_DIR}" +#endif +#endif diff --git a/src/MagnumPlugins/AnySceneImporter/Test/AnySceneImporterTest.cpp b/src/MagnumPlugins/AnySceneImporter/Test/AnySceneImporterTest.cpp index 0aef4c5c9..62c1898aa 100644 --- a/src/MagnumPlugins/AnySceneImporter/Test/AnySceneImporterTest.cpp +++ b/src/MagnumPlugins/AnySceneImporter/Test/AnySceneImporterTest.cpp @@ -182,24 +182,31 @@ void AnySceneImporterTest::unknown() { } void AnySceneImporterTest::propagateFlags() { - if(!(_manager.loadState("ObjImporter") & PluginManager::LoadState::Loaded)) - CORRADE_SKIP("ObjImporter plugin not enabled, cannot test"); + PluginManager::Manager manager{MAGNUM_PLUGINS_IMPORTER_INSTALL_DIR}; + #ifdef ANYSCENEIMPORTER_PLUGIN_FILENAME + CORRADE_VERIFY(manager.load(ANYSCENEIMPORTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); + #endif - Containers::Pointer importer = _manager.instantiate("AnySceneImporter"); + if(manager.load("AssimpImporter") < PluginManager::LoadState::Loaded) + CORRADE_SKIP("AssimpImporter plugin can't be loaded."); + /* Ensure Assimp is used for PLY files and not our StanfordImporter */ + manager.setPreferredPlugins("StanfordImporter", {"AssimpImporter"}); + + Containers::Pointer importer = manager.instantiate("AnySceneImporter"); importer->setFlags(ImporterFlag::Verbose); std::ostringstream out; { Debug redirectOutput{&out}; - CORRADE_VERIFY(importer->openFile(OBJ_FILE)); + CORRADE_VERIFY(importer->openFile(PLY_FILE)); CORRADE_VERIFY(importer->mesh(0)); } - CORRADE_COMPARE(out.str(), - "Trade::AnySceneImporter::openFile(): using ObjImporter\n"); - /* We tested AnySceneImporter's verbose output, but can't actually test - the flag propagation in any way yet */ - CORRADE_SKIP("No plugin with verbose output available to test flag propagation."); + Containers::StringView expected = + "Trade::AnySceneImporter::openFile(): using StanfordImporter (provided by AssimpImporter)\n" + "Trade::AssimpImporter: Info, T0: Load " PLY_FILE "\n"; + /** @todo use Compare::StringPrefix(?) when it exists */ + CORRADE_COMPARE(out.str().substr(0, expected.size()), expected); } }}}} diff --git a/src/MagnumPlugins/AnySceneImporter/Test/CMakeLists.txt b/src/MagnumPlugins/AnySceneImporter/Test/CMakeLists.txt index fded7df55..e03f55098 100644 --- a/src/MagnumPlugins/AnySceneImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/AnySceneImporter/Test/CMakeLists.txt @@ -25,8 +25,10 @@ if(CORRADE_TARGET_EMSCRIPTEN OR CORRADE_TARGET_ANDROID) set(OBJ_FILE pointMesh.obj) + set(PLY_FILE triangle.ply) else() set(OBJ_FILE ${PROJECT_SOURCE_DIR}/src/MagnumPlugins/ObjImporter/Test/pointMesh.obj) + set(PLY_FILE ${CMAKE_CURRENT_SOURCE_DIR}/triangle.ply) endif() # CMake before 3.8 has broken $ expressions for iOS (see @@ -49,7 +51,8 @@ file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/$/configure.h corrade_add_test(AnySceneImporterTest AnySceneImporterTest.cpp LIBRARIES MagnumTrade FILES - ../../ObjImporter/Test/pointMesh.obj) + ../../ObjImporter/Test/pointMesh.obj + triangle.ply) target_include_directories(AnySceneImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/$) if(MAGNUM_ANYSCENEIMPORTER_BUILD_STATIC) target_link_libraries(AnySceneImporterTest PRIVATE AnySceneImporter) diff --git a/src/MagnumPlugins/AnySceneImporter/Test/configure.h.cmake b/src/MagnumPlugins/AnySceneImporter/Test/configure.h.cmake index 121acdf97..2b40b2f65 100644 --- a/src/MagnumPlugins/AnySceneImporter/Test/configure.h.cmake +++ b/src/MagnumPlugins/AnySceneImporter/Test/configure.h.cmake @@ -26,3 +26,18 @@ #cmakedefine ANYSCENEIMPORTER_PLUGIN_FILENAME "${ANYSCENEIMPORTER_PLUGIN_FILENAME}" #cmakedefine OBJIMPORTER_PLUGIN_FILENAME "${OBJIMPORTER_PLUGIN_FILENAME}" #define OBJ_FILE "${OBJ_FILE}" +#define PLY_FILE "${PLY_FILE}" + +#ifdef CORRADE_TARGET_WINDOWS +#ifdef CORRADE_IS_DEBUG_BUILD +#define MAGNUM_PLUGINS_IMPORTER_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${MAGNUM_PLUGINS_IMPORTER_DEBUG_BINARY_INSTALL_DIR}" +#else +#define MAGNUM_PLUGINS_IMPORTER_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${MAGNUM_PLUGINS_IMPORTER_RELEASE_BINARY_INSTALL_DIR}" +#endif +#else +#ifdef CORRADE_IS_DEBUG_BUILD +#define MAGNUM_PLUGINS_IMPORTER_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${MAGNUM_PLUGINS_IMPORTER_DEBUG_LIBRARY_INSTALL_DIR}" +#else +#define MAGNUM_PLUGINS_IMPORTER_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${MAGNUM_PLUGINS_IMPORTER_RELEASE_LIBRARY_INSTALL_DIR}" +#endif +#endif diff --git a/src/MagnumPlugins/AnySceneImporter/Test/triangle.ply b/src/MagnumPlugins/AnySceneImporter/Test/triangle.ply new file mode 100644 index 000000000..36ce77768 Binary files /dev/null and b/src/MagnumPlugins/AnySceneImporter/Test/triangle.ply differ