From fb972b262b8eeba98948456bf119afff6db10a66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 4 Oct 2020 19:28:23 +0200 Subject: [PATCH] Trade: explicitly test a case with failed conversion written to a file. Too easy to forget this check, write an empty file and return true. --- .../Trade/Test/AbstractImageConverterTest.cpp | 52 +++++++++++++++++++ .../Trade/Test/AbstractSceneConverterTest.cpp | 26 ++++++++++ 2 files changed, 78 insertions(+) diff --git a/src/Magnum/Trade/Test/AbstractImageConverterTest.cpp b/src/Magnum/Trade/Test/AbstractImageConverterTest.cpp index a1c73d4fe..0ab85eaf4 100644 --- a/src/Magnum/Trade/Test/AbstractImageConverterTest.cpp +++ b/src/Magnum/Trade/Test/AbstractImageConverterTest.cpp @@ -73,11 +73,13 @@ struct AbstractImageConverterTest: TestSuite::Tester { void exportToFile(); void exportToFileThroughData(); + void exportToFileThroughDataFailed(); void exportToFileThroughDataNotWritable(); void exportToFileNotImplemented(); void exportCompressedToFile(); void exportCompressedToFileThroughData(); + void exportCompressedToFileThroughDataFailed(); void exportCompressedToFileThroughDataNotWritable(); void exportCompressedToFileNotImplemented(); @@ -118,11 +120,13 @@ AbstractImageConverterTest::AbstractImageConverterTest() { &AbstractImageConverterTest::exportToFile, &AbstractImageConverterTest::exportToFileThroughData, + &AbstractImageConverterTest::exportToFileThroughDataFailed, &AbstractImageConverterTest::exportToFileThroughDataNotWritable, &AbstractImageConverterTest::exportToFileNotImplemented, &AbstractImageConverterTest::exportCompressedToFile, &AbstractImageConverterTest::exportCompressedToFileThroughData, + &AbstractImageConverterTest::exportCompressedToFileThroughDataFailed, &AbstractImageConverterTest::exportCompressedToFileThroughDataNotWritable, &AbstractImageConverterTest::exportCompressedToFileNotImplemented, @@ -469,6 +473,30 @@ void AbstractImageConverterTest::exportToFileThroughData() { "\xfe\xed", TestSuite::Compare::FileToString); } +void AbstractImageConverterTest::exportToFileThroughDataFailed() { + struct: AbstractImageConverter { + ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertData; } + + Containers::Array doExportToData(const ImageView2D&) override { + return {}; + }; + } converter; + + const std::string filename = Utility::Directory::join(TRADE_TEST_OUTPUT_DIR, "image.out"); + + /* Remove previous file, if any */ + Utility::Directory::rm(filename); + CORRADE_VERIFY(!Utility::Directory::exists(filename)); + + /* Function should fail, no file should get written and no error output + should be printed (the base implementation assumes the plugin does it) */ + std::ostringstream out; + Error redirectError{&out}; + CORRADE_VERIFY(!converter.exportToFile(ImageView2D(PixelFormat::RGBA8Unorm, {0xfe, 0xed}, {nullptr, 0xfe*0xed*4}), filename)); + CORRADE_VERIFY(!Utility::Directory::exists(filename)); + CORRADE_COMPARE(out.str(), ""); +} + void AbstractImageConverterTest::exportToFileThroughDataNotWritable() { struct: AbstractImageConverter { ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertData; } @@ -542,6 +570,30 @@ void AbstractImageConverterTest::exportCompressedToFileThroughData() { "\xb0\xd9", TestSuite::Compare::FileToString); } +void AbstractImageConverterTest::exportCompressedToFileThroughDataFailed() { + struct: AbstractImageConverter { + ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedData; } + + Containers::Array doExportToData(const CompressedImageView2D&) override { + return {}; + }; + } converter; + + const std::string filename = Utility::Directory::join(TRADE_TEST_OUTPUT_DIR, "image.out"); + + /* Remove previous file, if any */ + Utility::Directory::rm(filename); + CORRADE_VERIFY(!Utility::Directory::exists(filename)); + + /* Function should fail, no file should get written and no error output + should be printed (the base implementation assumes the plugin does it) */ + std::ostringstream out; + Error redirectError{&out}; + CORRADE_VERIFY(!converter.exportToFile(CompressedImageView2D{CompressedPixelFormat::Bc1RGBAUnorm, {0xb0, 0xd9}, {nullptr, 64}}, filename)); + CORRADE_VERIFY(!Utility::Directory::exists(filename)); + CORRADE_COMPARE(out.str(), ""); +} + void AbstractImageConverterTest::exportCompressedToFileThroughDataNotWritable() { struct: AbstractImageConverter { ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedData; } diff --git a/src/Magnum/Trade/Test/AbstractSceneConverterTest.cpp b/src/Magnum/Trade/Test/AbstractSceneConverterTest.cpp index a93878f16..d133e0f75 100644 --- a/src/Magnum/Trade/Test/AbstractSceneConverterTest.cpp +++ b/src/Magnum/Trade/Test/AbstractSceneConverterTest.cpp @@ -67,6 +67,7 @@ struct AbstractSceneConverterTest: TestSuite::Tester { void convertMeshToFile(); void convertMeshToFileThroughData(); + void convertMeshToFileThroughDataFailed(); void convertMeshToFileThroughDataNotWritable(); void convertMeshToFileNotImplemented(); @@ -101,6 +102,7 @@ AbstractSceneConverterTest::AbstractSceneConverterTest() { &AbstractSceneConverterTest::convertMeshToFile, &AbstractSceneConverterTest::convertMeshToFileThroughData, + &AbstractSceneConverterTest::convertMeshToFileThroughDataFailed, &AbstractSceneConverterTest::convertMeshToFileThroughDataNotWritable, &AbstractSceneConverterTest::convertMeshToFileNotImplemented, @@ -466,6 +468,30 @@ void AbstractSceneConverterTest::convertMeshToFileThroughData() { "\xef", TestSuite::Compare::FileToString); } +void AbstractSceneConverterTest::convertMeshToFileThroughDataFailed() { + struct: AbstractSceneConverter { + SceneConverterFeatures doFeatures() const override { return SceneConverterFeature::ConvertMeshToData; } + + Containers::Array doConvertToData(const MeshData&) override { + return {}; + } + } converter; + + const std::string filename = Utility::Directory::join(TRADE_TEST_OUTPUT_DIR, "mesh.out"); + + /* Remove previous file, if any */ + Utility::Directory::rm(filename); + CORRADE_VERIFY(!Utility::Directory::exists(filename)); + + /* Function should fail, no file should get written and no error output + should be printed (the base implementation assumes the plugin does it) */ + std::ostringstream out; + Error redirectError{&out}; + CORRADE_VERIFY(!converter.convertToFile(filename, MeshData{MeshPrimitive::Triangles, 0xef})); + CORRADE_VERIFY(!Utility::Directory::exists(filename)); + CORRADE_COMPARE(out.str(), ""); +} + void AbstractSceneConverterTest::convertMeshToFileThroughDataNotWritable() { struct: AbstractSceneConverter { SceneConverterFeatures doFeatures() const override { return SceneConverterFeature::ConvertMeshToData; }