diff --git a/doc/snippets/MagnumShaderTools.cpp b/doc/snippets/MagnumShaderTools.cpp index d3ee6227b..0cc574ae1 100644 --- a/doc/snippets/MagnumShaderTools.cpp +++ b/doc/snippets/MagnumShaderTools.cpp @@ -101,7 +101,8 @@ Containers::Pointer converter; Containers::Array extract(const std::string&, const std::string&); /* [AbstractConverter-usage-callbacks] */ struct Data { - std::unordered_map> files; + std::unordered_map>> files; } data; converter->setInputFileCallback([](const std::string& filename, @@ -116,16 +117,14 @@ converter->setInputFileCallback([](const std::string& filename, return {}; } - /* Extract from an archive if not there yet; fail if not extraction - failed */ - if(found == data.files.end()) { - Containers::Array file = extract("shaders.zip", filename); - if(!file) return {}; + /* Extract from an archive if not there yet. If the extraction fails, + remember that to not attempt to extract the same file again next + time. */ + if(found == data.files.end()) found = data.files.emplace( + filename, extract("shaders.zip", filename)).first; - found = data.files.emplace(filename, std::move(file)).first; - } - - return Containers::ArrayView{found->second}; + if(!found->second) return {}; + return Containers::ArrayView{*found->second}; }, data); /* extracted from a ZIP */ diff --git a/src/Magnum/ShaderTools/AbstractConverter.cpp b/src/Magnum/ShaderTools/AbstractConverter.cpp index 1d314fbdc..45c741f77 100644 --- a/src/Magnum/ShaderTools/AbstractConverter.cpp +++ b/src/Magnum/ShaderTools/AbstractConverter.cpp @@ -29,9 +29,8 @@ #include #include #include -#include -#include -#include +#include /** @todo remove once file callbacks are -free */ +#include #include "Magnum/FileCallback.h" @@ -51,9 +50,10 @@ std::string AbstractConverter::pluginInterface() { #ifndef CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT std::vector AbstractConverter::pluginSearchPaths() { + const Containers::Optional libraryLocation = Utility::Path::libraryLocation(&pluginInterface); return PluginManager::implicitPluginSearchPaths( #ifndef MAGNUM_BUILD_STATIC - Utility::Directory::libraryLocation(&pluginInterface), + libraryLocation ? *libraryLocation : Containers::String{}, #else {}, #endif @@ -244,12 +244,13 @@ std::pair AbstractConverter::doValidateFile(const Stag /* Otherwise open the file directly */ } else { - if(!Utility::Directory::exists(filename)) { + const Containers::Optional> data = Utility::Path::read(filename); + if(!data) { Error() << "ShaderTools::AbstractConverter::validateFile(): cannot open file" << filename; return {}; } - return doValidateData(stage, Utility::Directory::read(filename)); + return doValidateData(stage, *data); } } @@ -278,7 +279,7 @@ bool AbstractConverter::convertDataToFile(const Stage stage, const Containers::A const Containers::Array out = doConvertDataToData(stage, Containers::arrayCast(data)); if(!out) return false; - if(!Utility::Directory::write(filename, out)) { + if(!Utility::Path::write(filename, out)) { Error{} << "ShaderTools::AbstractConverter::convertDataToFile(): cannot write to file" << filename; return false; } @@ -325,7 +326,7 @@ bool AbstractConverter::convertFileToFile(const Stage stage, const Containers::S const Containers::Array out = convertDataToDataUsingInputFileCallbacks("ShaderTools::AbstractConverter::convertFileToFile():", stage, from); if(!out) return false; - if(!Utility::Directory::write(to, out)) { + if(!Utility::Path::write(to, out)) { Error{} << "ShaderTools::AbstractConverter::convertFileToFile(): cannot write to file" << to; return false; } @@ -349,17 +350,18 @@ bool AbstractConverter::doConvertFileToFile(const Stage stage, const Containers: /* Otherwise open the file directly */ } else { - if(!Utility::Directory::exists(from)) { + const Containers::Optional> data = Utility::Path::read(from); + if(!data) { Error() << "ShaderTools::AbstractConverter::convertFileToFile(): cannot open file" << from; return {}; } - out = doConvertDataToData(stage, Utility::Directory::read(from)); + out = doConvertDataToData(stage, *data); } if(!out) return false; - if(!Utility::Directory::write(to, out)) { + if(!Utility::Path::write(to, out)) { Error{} << "ShaderTools::AbstractConverter::convertFileToFile(): cannot write to file" << to; return false; } @@ -408,12 +410,13 @@ Containers::Array AbstractConverter::doConvertFileToData(const Stage stage /* Otherwise open the file directly */ } else { - if(!Utility::Directory::exists(filename)) { + const Containers::Optional> data = Utility::Path::read(filename); + if(!data) { Error() << "ShaderTools::AbstractConverter::convertFileToData(): cannot open file" << filename; return {}; } - return doConvertDataToData(stage, Utility::Directory::read(filename)); + return doConvertDataToData(stage, *data); } } @@ -454,7 +457,7 @@ bool AbstractConverter::linkDataToFile(const Containers::ArrayView out = doLinkDataToData(Containers::arrayCast>>(data)); if(!out) return false; - if(!Utility::Directory::write(filename, out)) { + if(!Utility::Path::write(filename, out)) { Error{} << "ShaderTools::AbstractConverter::linkDataToFile(): cannot write to file" << filename; return false; } @@ -533,7 +536,7 @@ bool AbstractConverter::linkFilesToFile(const Containers::ArrayView out = linkDataToDataUsingInputFileCallbacks("ShaderTools::AbstractConverter::linkFilesToFile():", from); if(!out) return false; - if(!Utility::Directory::write(to, out)) { + if(!Utility::Path::write(to, out)) { Error{} << "ShaderTools::AbstractConverter::linkFilesToFile(): cannot write to file" << to; return false; } @@ -563,12 +566,13 @@ bool AbstractConverter::doLinkFilesToFile(const Containers::ArrayView> fileData{from.size()}; for(std::size_t i = 0; i != from.size(); ++i) { - if(!Utility::Directory::exists(from[i].second)) { + Containers::Optional> data = Utility::Path::read(from[i].second); + if(!data) { Error() << "ShaderTools::AbstractConverter::linkFilesToFile(): cannot open file" << from[i].second; return {}; } - fileData[i] = Utility::Directory::read(from[i].second); + fileData[i] = *std::move(data); } /** @todo merge the allocations once we have an ArrayTuple (actually, @@ -584,7 +588,7 @@ bool AbstractConverter::doLinkFilesToFile(const Containers::ArrayView AbstractConverter::doLinkFilesToData(const Containers::A } else { Containers::Array> fileData{filenames.size()}; for(std::size_t i = 0; i != filenames.size(); ++i) { - if(!Utility::Directory::exists(filenames[i].second)) { + Containers::Optional> data = Utility::Path::read(filenames[i].second); + if(!data) { Error() << "ShaderTools::AbstractConverter::linkFilesToData(): cannot open file" << filenames[i].second; return {}; } - fileData[i] = Utility::Directory::read(filenames[i].second); + fileData[i] = *std::move(data); } /** @todo merge the allocations once we have an ArrayTuple */ diff --git a/src/Magnum/ShaderTools/Test/AbstractConverterTest.cpp b/src/Magnum/ShaderTools/Test/AbstractConverterTest.cpp index f7438cbc1..8a58c1836 100644 --- a/src/Magnum/ShaderTools/Test/AbstractConverterTest.cpp +++ b/src/Magnum/ShaderTools/Test/AbstractConverterTest.cpp @@ -27,13 +27,13 @@ #include #include #include -#include +#include /** @todo remove once Debug is stream-free */ #include #include #include #include #include -#include +#include #include "Magnum/FileCallback.h" #include "Magnum/ShaderTools/AbstractConverter.h" @@ -325,7 +325,7 @@ AbstractConverterTest::AbstractConverterTest() { &AbstractConverterTest::debugFormat}); /* Create testing dir */ - Utility::Directory::mkpath(SHADERTOOLS_TEST_OUTPUT_DIR); + Utility::Path::make(SHADERTOOLS_TEST_OUTPUT_DIR); } void AbstractConverterTest::featuresNone() { @@ -808,7 +808,7 @@ void AbstractConverterTest::validateFileAsData() { } } converter; - std::pair out = converter.validateFile(Stage::Compute, Utility::Directory::join(SHADERTOOLS_TEST_DIR, "file.dat")); + std::pair out = converter.validateFile(Stage::Compute, Utility::Path::join(SHADERTOOLS_TEST_DIR, "file.dat")); CORRADE_VERIFY(out.first); CORRADE_COMPARE(out.second, "Yes, this is valid"); } @@ -832,7 +832,10 @@ void AbstractConverterTest::validateFileAsDataNotFound() { std::pair out2 = converter.validateFile({}, "nonexistent.bin"); CORRADE_VERIFY(!out2.first); CORRADE_COMPARE(out2.second, ""); - CORRADE_COMPARE(out.str(), "ShaderTools::AbstractConverter::validateFile(): cannot open file nonexistent.bin\n"); + /* There's an error message from Path::read() before */ + CORRADE_COMPARE_AS(out.str(), + "\nShaderTools::AbstractConverter::validateFile(): cannot open file nonexistent.bin\n", + TestSuite::Compare::StringHasSuffix); } void AbstractConverterTest::validateFileNotSupported() { @@ -1017,11 +1020,10 @@ void AbstractConverterTest::convertDataToFileThroughData() { } } converter; - const std::string filename = Utility::Directory::join(SHADERTOOLS_TEST_OUTPUT_DIR, "file.dat"); - /* Remove previous file, if any */ - if(Utility::Directory::exists(filename)) - CORRADE_VERIFY(Utility::Directory::rm(filename)); + Containers::String filename = Utility::Path::join(SHADERTOOLS_TEST_OUTPUT_DIR, "file.dat"); + if(Utility::Path::exists(filename)) + CORRADE_VERIFY(Utility::Path::remove(filename)); const char data[] = {'S', 'P', 'I', 'R', 'V'}; CORRADE_VERIFY(converter.convertDataToFile({}, data, filename)); @@ -1042,18 +1044,17 @@ void AbstractConverterTest::convertDataToFileThroughDataFailed() { } } converter; - const std::string filename = Utility::Directory::join(SHADERTOOLS_TEST_OUTPUT_DIR, "file.dat"); - /* Remove previous file, if any */ - if(Utility::Directory::exists(filename)) - CORRADE_VERIFY(Utility::Directory::rm(filename)); + Containers::String filename = Utility::Path::join(SHADERTOOLS_TEST_OUTPUT_DIR, "file.dat"); + if(Utility::Path::exists(filename)) + CORRADE_VERIFY(Utility::Path::remove(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.convertDataToFile({}, {}, filename)); - CORRADE_VERIFY(!Utility::Directory::exists(filename)); + CORRADE_VERIFY(!Utility::Path::exists(filename)); CORRADE_COMPARE(out.str(), ""); } @@ -1125,18 +1126,20 @@ void AbstractConverterTest::convertFileToFile() { void doSetOutputFormat(Format, Containers::StringView) override {} bool doConvertFileToFile(Stage, const Containers::StringView from, const Containers::StringView to) override { - Containers::Array data = Utility::Directory::read(from); - return Utility::Directory::write(to, Containers::array({data.back(), data.front()})); + Containers::Optional> data = Utility::Path::read(from); + CORRADE_VERIFY(data); + return Utility::Path::write(to, Containers::array({data->back(), data->front()})); } } converter; - const std::string filename = Utility::Directory::join(SHADERTOOLS_TEST_OUTPUT_DIR, "file.dat"); + CORRADE_VERIFY(true); /* Capture correct function name first */ /* Remove previous file, if any */ - if(Utility::Directory::exists(filename)) - CORRADE_VERIFY(Utility::Directory::rm(filename)); + Containers::String filename = Utility::Path::join(SHADERTOOLS_TEST_OUTPUT_DIR, "file.dat"); + if(Utility::Path::exists(filename)) + CORRADE_VERIFY(Utility::Path::remove(filename)); - CORRADE_VERIFY(converter.convertFileToFile({}, Utility::Directory::join(SHADERTOOLS_TEST_DIR, "file.dat"), filename)); + CORRADE_VERIFY(converter.convertFileToFile({}, Utility::Path::join(SHADERTOOLS_TEST_DIR, "file.dat"), filename)); CORRADE_COMPARE_AS(filename, "VS", TestSuite::Compare::FileToString); } @@ -1154,13 +1157,12 @@ void AbstractConverterTest::convertFileToFileThroughData() { } } converter; - const std::string filename = Utility::Directory::join(SHADERTOOLS_TEST_OUTPUT_DIR, "file.dat"); - /* Remove previous file, if any */ - if(Utility::Directory::exists(filename)) - CORRADE_VERIFY(Utility::Directory::rm(filename)); + Containers::String filename = Utility::Path::join(SHADERTOOLS_TEST_OUTPUT_DIR, "file.dat"); + if(Utility::Path::exists(filename)) + CORRADE_VERIFY(Utility::Path::remove(filename)); - CORRADE_VERIFY(converter.convertFileToFile({}, Utility::Directory::join(SHADERTOOLS_TEST_DIR, "file.dat"), filename)); + CORRADE_VERIFY(converter.convertFileToFile({}, Utility::Path::join(SHADERTOOLS_TEST_DIR, "file.dat"), filename)); CORRADE_COMPARE_AS(filename, "VS", TestSuite::Compare::FileToString); } @@ -1182,7 +1184,10 @@ void AbstractConverterTest::convertFileToFileThroughDataNotFound() { std::ostringstream out; Error redirectError{&out}; CORRADE_VERIFY(!converter.convertFileToFile({}, "nonexistent.bin", "file.dat")); - CORRADE_COMPARE(out.str(), "ShaderTools::AbstractConverter::convertFileToFile(): cannot open file nonexistent.bin\n"); + /* There's an error message from Path::read() before */ + CORRADE_COMPARE_AS(out.str(), + "\nShaderTools::AbstractConverter::convertFileToFile(): cannot open file nonexistent.bin\n", + TestSuite::Compare::StringHasSuffix); } void AbstractConverterTest::convertFileToFileThroughDataFailed() { @@ -1198,18 +1203,17 @@ void AbstractConverterTest::convertFileToFileThroughDataFailed() { } } converter; - const std::string filename = Utility::Directory::join(SHADERTOOLS_TEST_OUTPUT_DIR, "file.dat"); - /* Remove previous file, if any */ - if(Utility::Directory::exists(filename)) - CORRADE_VERIFY(Utility::Directory::rm(filename)); + Containers::String filename = Utility::Path::join(SHADERTOOLS_TEST_OUTPUT_DIR, "file.dat"); + if(Utility::Path::exists(filename)) + CORRADE_VERIFY(Utility::Path::remove(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.convertFileToFile({}, Utility::Directory::join(SHADERTOOLS_TEST_DIR, "file.dat"), filename)); - CORRADE_VERIFY(!Utility::Directory::exists(filename)); + CORRADE_VERIFY(!converter.convertFileToFile({}, Utility::Path::join(SHADERTOOLS_TEST_DIR, "file.dat"), filename)); + CORRADE_VERIFY(!Utility::Path::exists(filename)); CORRADE_COMPARE(out.str(), ""); } @@ -1228,7 +1232,7 @@ void AbstractConverterTest::convertFileToFileThroughDataNotWritable() { std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!converter.convertFileToFile({}, Utility::Directory::join(SHADERTOOLS_TEST_DIR, "file.dat"), "/some/path/that/does/not/exist")); + CORRADE_VERIFY(!converter.convertFileToFile({}, Utility::Path::join(SHADERTOOLS_TEST_DIR, "file.dat"), "/some/path/that/does/not/exist")); CORRADE_COMPARE_AS(out.str(), "ShaderTools::AbstractConverter::convertFileToFile(): cannot write to file /some/path/that/does/not/exist\n", TestSuite::Compare::StringHasSuffix); @@ -1281,12 +1285,15 @@ void AbstractConverterTest::convertFileToData() { void doSetOutputFormat(Format, Containers::StringView) override {} Containers::Array doConvertFileToData(Stage, const Containers::StringView from) override { - Containers::Array data = Utility::Directory::read(from); - return Containers::array({data.back(), data.front()}); + Containers::Optional> data = Utility::Path::read(from); + CORRADE_VERIFY(data); + return Containers::array({data->back(), data->front()}); } } converter; - Containers::Array out = converter.convertFileToData({}, Utility::Directory::join(SHADERTOOLS_TEST_DIR, "file.dat")); + CORRADE_VERIFY(true); /* Capture correct function name first */ + + Containers::Array out = converter.convertFileToData({}, Utility::Path::join(SHADERTOOLS_TEST_DIR, "file.dat")); CORRADE_COMPARE_AS(out, Containers::arrayView({'V', 'S'}), TestSuite::Compare::Container); } @@ -1304,7 +1311,7 @@ void AbstractConverterTest::convertFileToDataAsData() { } } converter; - Containers::Array out = converter.convertFileToData({}, Utility::Directory::join(SHADERTOOLS_TEST_DIR, "file.dat")); + Containers::Array out = converter.convertFileToData({}, Utility::Path::join(SHADERTOOLS_TEST_DIR, "file.dat")); CORRADE_COMPARE_AS(out, Containers::arrayView({'V', 'S'}), TestSuite::Compare::Container); } @@ -1326,7 +1333,10 @@ void AbstractConverterTest::convertFileToDataAsDataNotFound() { std::ostringstream out; Error redirectError{&out}; CORRADE_VERIFY(!converter.convertFileToData({}, "nonexistent.bin")); - CORRADE_COMPARE(out.str(), "ShaderTools::AbstractConverter::convertFileToData(): cannot open file nonexistent.bin\n"); + /* There's an error message from Path::read() before */ + CORRADE_COMPARE_AS(out.str(), + "\nShaderTools::AbstractConverter::convertFileToData(): cannot open file nonexistent.bin\n", + TestSuite::Compare::StringHasSuffix); } void AbstractConverterTest::convertFileToDataNotSupported() { @@ -1364,7 +1374,7 @@ void AbstractConverterTest::convertFileToDataNotImplemented() { std::ostringstream out; Error redirectError{&out}; - converter.convertFileToData({}, Utility::Directory::join(SHADERTOOLS_TEST_DIR, "file.dat")); + converter.convertFileToData({}, Utility::Path::join(SHADERTOOLS_TEST_DIR, "file.dat")); CORRADE_COMPARE(out.str(), "ShaderTools::AbstractConverter::convertDataToData(): feature advertised but not implemented\n"); } @@ -1537,11 +1547,10 @@ void AbstractConverterTest::linkDataToFileThroughData() { } } converter; - const std::string filename = Utility::Directory::join(SHADERTOOLS_TEST_OUTPUT_DIR, "file.dat"); - /* Remove previous file, if any */ - if(Utility::Directory::exists(filename)) - CORRADE_VERIFY(Utility::Directory::rm(filename)); + Containers::String filename = Utility::Path::join(SHADERTOOLS_TEST_OUTPUT_DIR, "file.dat"); + if(Utility::Path::exists(filename)) + CORRADE_VERIFY(Utility::Path::remove(filename)); CORRADE_VERIFY(converter.linkDataToFile({ {Stage::Vertex, Containers::arrayView({'V', 'E'})}, @@ -1564,11 +1573,10 @@ void AbstractConverterTest::linkDataToFileThroughDataFailed() { } } converter; - const std::string filename = Utility::Directory::join(SHADERTOOLS_TEST_OUTPUT_DIR, "file.dat"); - /* Remove previous file, if any */ - if(Utility::Directory::exists(filename)) - CORRADE_VERIFY(Utility::Directory::rm(filename)); + Containers::String filename = Utility::Path::join(SHADERTOOLS_TEST_OUTPUT_DIR, "file.dat"); + if(Utility::Path::exists(filename)) + CORRADE_VERIFY(Utility::Path::remove(filename)); /* Function should fail, no file should get written and no error output should be printed (the base implementation assumes the plugin does it) */ @@ -1576,7 +1584,7 @@ void AbstractConverterTest::linkDataToFileThroughDataFailed() { Error redirectError{&out}; /* {{}} makes GCC 4.8 warn about zero as null pointer constant */ CORRADE_VERIFY(!converter.linkDataToFile({std::pair>{}}, filename)); - CORRADE_VERIFY(!Utility::Directory::exists(filename)); + CORRADE_VERIFY(!Utility::Path::exists(filename)); CORRADE_COMPARE(out.str(), ""); } @@ -1690,26 +1698,27 @@ void AbstractConverterTest::linkFilesToFile() { bool doLinkFilesToFile(Containers::ArrayView> from, Containers::StringView to) override { CORRADE_COMPARE(from.size(), 2); - Containers::Array first = Utility::Directory::read(from[0].second); - Containers::Array second = Utility::Directory::read(from[1].second); + Containers::Optional> first = Utility::Path::read(from[0].second); + Containers::Optional> second = Utility::Path::read(from[1].second); CORRADE_VERIFY(first); CORRADE_VERIFY(second); - return Utility::Directory::write(to, Containers::array({ - from[0].first == Stage::Vertex ? first[0] : ' ', - from[1].first == Stage::Fragment ? second[0] : ' ' + return Utility::Path::write(to, Containers::array({ + from[0].first == Stage::Vertex ? (*first)[0] : ' ', + from[1].first == Stage::Fragment ? (*second)[0] : ' ' })); } } converter; - const std::string filename = Utility::Directory::join(SHADERTOOLS_TEST_OUTPUT_DIR, "file.dat"); - /* Remove previous file, if any */ - if(Utility::Directory::exists(filename)) - CORRADE_VERIFY(Utility::Directory::rm(filename)); + Containers::String filename = Utility::Path::join(SHADERTOOLS_TEST_OUTPUT_DIR, "file.dat"); + if(Utility::Path::exists(filename)) + CORRADE_VERIFY(Utility::Path::remove(filename)); + + CORRADE_VERIFY(true); /* Capture correct function name first */ CORRADE_VERIFY(converter.linkFilesToFile({ - {Stage::Vertex, Utility::Directory::join(SHADERTOOLS_TEST_DIR, "another.dat")}, - {Stage::Fragment, Utility::Directory::join(SHADERTOOLS_TEST_DIR, "file.dat")} + {Stage::Vertex, Utility::Path::join(SHADERTOOLS_TEST_DIR, "another.dat")}, + {Stage::Fragment, Utility::Path::join(SHADERTOOLS_TEST_DIR, "file.dat")} }, filename)); CORRADE_COMPARE_AS(filename, "VS", TestSuite::Compare::FileToString); @@ -1732,15 +1741,14 @@ void AbstractConverterTest::linkFilesToFileThroughData() { } } converter; - const std::string filename = Utility::Directory::join(SHADERTOOLS_TEST_OUTPUT_DIR, "file.dat"); - /* Remove previous file, if any */ - if(Utility::Directory::exists(filename)) - CORRADE_VERIFY(Utility::Directory::rm(filename)); + Containers::String filename = Utility::Path::join(SHADERTOOLS_TEST_OUTPUT_DIR, "file.dat"); + if(Utility::Path::exists(filename)) + CORRADE_VERIFY(Utility::Path::remove(filename)); CORRADE_VERIFY(converter.linkFilesToFile({ - {Stage::Vertex, Utility::Directory::join(SHADERTOOLS_TEST_DIR, "another.dat")}, - {Stage::Fragment, Utility::Directory::join(SHADERTOOLS_TEST_DIR, "file.dat")} + {Stage::Vertex, Utility::Path::join(SHADERTOOLS_TEST_DIR, "another.dat")}, + {Stage::Fragment, Utility::Path::join(SHADERTOOLS_TEST_DIR, "file.dat")} }, filename)); CORRADE_COMPARE_AS(filename, "VS", TestSuite::Compare::FileToString); @@ -1763,10 +1771,13 @@ void AbstractConverterTest::linkFilesToFileThroughDataNotFound() { std::ostringstream out; Error redirectError{&out}; CORRADE_VERIFY(!converter.linkFilesToFile({ - {{}, Utility::Directory::join(SHADERTOOLS_TEST_DIR, "another.dat")}, + {{}, Utility::Path::join(SHADERTOOLS_TEST_DIR, "another.dat")}, {{}, "nonexistent.bin"} }, "file.dat")); - CORRADE_COMPARE(out.str(), "ShaderTools::AbstractConverter::linkFilesToFile(): cannot open file nonexistent.bin\n"); + /* There's an error message from Path::read() before */ + CORRADE_COMPARE_AS(out.str(), + "\nShaderTools::AbstractConverter::linkFilesToFile(): cannot open file nonexistent.bin\n", + TestSuite::Compare::StringHasSuffix); } void AbstractConverterTest::linkFilesToFileThroughDataFailed() { @@ -1782,20 +1793,19 @@ void AbstractConverterTest::linkFilesToFileThroughDataFailed() { } } converter; - const std::string filename = Utility::Directory::join(SHADERTOOLS_TEST_OUTPUT_DIR, "file.dat"); - /* Remove previous file, if any */ - if(Utility::Directory::exists(filename)) - CORRADE_VERIFY(Utility::Directory::rm(filename)); + Containers::String filename = Utility::Path::join(SHADERTOOLS_TEST_OUTPUT_DIR, "file.dat"); + if(Utility::Path::exists(filename)) + CORRADE_VERIFY(Utility::Path::remove(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.linkFilesToFile({ - {{}, Utility::Directory::join(SHADERTOOLS_TEST_DIR, "file.dat")} + {{}, Utility::Path::join(SHADERTOOLS_TEST_DIR, "file.dat")} }, filename)); - CORRADE_VERIFY(!Utility::Directory::exists(filename)); + CORRADE_VERIFY(!Utility::Path::exists(filename)); CORRADE_COMPARE(out.str(), ""); } @@ -1815,7 +1825,7 @@ void AbstractConverterTest::linkFilesToFileThroughDataNotWritable() { std::ostringstream out; Error redirectError{&out}; CORRADE_VERIFY(!converter.linkFilesToFile({ - {{}, Utility::Directory::join(SHADERTOOLS_TEST_DIR, "file.dat")} + {{}, Utility::Path::join(SHADERTOOLS_TEST_DIR, "file.dat")} }, "/some/path/that/does/not/exist")); CORRADE_COMPARE_AS(out.str(), "ShaderTools::AbstractConverter::linkFilesToFile(): cannot write to file /some/path/that/does/not/exist\n", @@ -1910,22 +1920,22 @@ void AbstractConverterTest::linkFilesToData() { Containers::Array doLinkFilesToData(Containers::ArrayView> from) override { CORRADE_COMPARE(from.size(), 2); - Containers::Array first = Utility::Directory::read(from[0].second); - Containers::Array second = Utility::Directory::read(from[1].second); + Containers::Optional> first = Utility::Path::read(from[0].second); + Containers::Optional> second = Utility::Path::read(from[1].second); CORRADE_VERIFY(first); CORRADE_VERIFY(second); return Containers::array({ - from[0].first == Stage::Vertex ? first[0] : ' ', - from[1].first == Stage::Fragment ? second[0] : ' ' + from[0].first == Stage::Vertex ? (*first)[0] : ' ', + from[1].first == Stage::Fragment ? (*second)[0] : ' ' }); } } converter; - CORRADE_VERIFY(true); /* so it picks up correct test case name */ + CORRADE_VERIFY(true); /* Capture correct function name first */ Containers::Array out = converter.linkFilesToData({ - {Stage::Vertex, Utility::Directory::join(SHADERTOOLS_TEST_DIR, "another.dat")}, - {Stage::Fragment, Utility::Directory::join(SHADERTOOLS_TEST_DIR, "file.dat")} + {Stage::Vertex, Utility::Path::join(SHADERTOOLS_TEST_DIR, "another.dat")}, + {Stage::Fragment, Utility::Path::join(SHADERTOOLS_TEST_DIR, "file.dat")} }); CORRADE_COMPARE_AS(out, Containers::arrayView({'V', 'S'}), TestSuite::Compare::Container); @@ -1948,9 +1958,11 @@ void AbstractConverterTest::linkFilesToDataAsData() { } } converter; + CORRADE_VERIFY(true); /* Capture correct function name first */ + Containers::Array out = converter.linkFilesToData({ - {Stage::Vertex, Utility::Directory::join(SHADERTOOLS_TEST_DIR, "another.dat")}, - {Stage::Fragment, Utility::Directory::join(SHADERTOOLS_TEST_DIR, "file.dat")} + {Stage::Vertex, Utility::Path::join(SHADERTOOLS_TEST_DIR, "another.dat")}, + {Stage::Fragment, Utility::Path::join(SHADERTOOLS_TEST_DIR, "file.dat")} }); CORRADE_COMPARE_AS(out, Containers::arrayView({'V', 'S'}), TestSuite::Compare::Container); @@ -1970,12 +1982,17 @@ void AbstractConverterTest::linkFilesToDataAsDataNotFound() { } } converter; + CORRADE_VERIFY(true); /* Capture correct function name first */ + std::ostringstream out; Error redirectError{&out}; CORRADE_VERIFY(!converter.linkFilesToData({ {{}, "nonexistent.bin"} })); - CORRADE_COMPARE(out.str(), "ShaderTools::AbstractConverter::linkFilesToData(): cannot open file nonexistent.bin\n"); + /* There's an error message from Path::read() before */ + CORRADE_COMPARE_AS(out.str(), + "\nShaderTools::AbstractConverter::linkFilesToData(): cannot open file nonexistent.bin\n", + TestSuite::Compare::StringHasSuffix); } void AbstractConverterTest::linkFilesToDataNotSupported() { @@ -2013,7 +2030,7 @@ void AbstractConverterTest::linkFilesToDataNotImplemented() { std::ostringstream out; Error redirectError{&out}; converter.linkFilesToData({ - {{}, Utility::Directory::join(SHADERTOOLS_TEST_DIR, "file.dat")} + {{}, Utility::Path::join(SHADERTOOLS_TEST_DIR, "file.dat")} }); CORRADE_COMPARE(out.str(), "ShaderTools::AbstractConverter::linkDataToData(): feature advertised but not implemented\n"); } @@ -2474,9 +2491,9 @@ void AbstractConverterTest::setInputFileCallbackConvertFileToFileThroughBaseImpl }, state); /* Remove previous file, if any */ - const std::string filename = Utility::Directory::join(SHADERTOOLS_TEST_OUTPUT_DIR, "file.out"); - if(Utility::Directory::exists(filename)) - CORRADE_VERIFY(Utility::Directory::rm(filename)); + Containers::String filename = Utility::Path::join(SHADERTOOLS_TEST_OUTPUT_DIR, "file.out"); + if(Utility::Path::exists(filename)) + CORRADE_VERIFY(Utility::Path::remove(filename)); CORRADE_VERIFY(converter.convertFileToFile(Stage::Geometry, "file.dat", filename)); CORRADE_VERIFY(converter.convertFileToFileCalled); @@ -2555,9 +2572,9 @@ void AbstractConverterTest::setInputFileCallbackConvertFileToFileAsData() { }, state); /* Remove previous file, if any */ - const std::string filename = Utility::Directory::join(SHADERTOOLS_TEST_OUTPUT_DIR, "file.out"); - if(Utility::Directory::exists(filename)) - CORRADE_VERIFY(Utility::Directory::rm(filename)); + Containers::String filename = Utility::Path::join(SHADERTOOLS_TEST_OUTPUT_DIR, "file.out"); + if(Utility::Path::exists(filename)) + CORRADE_VERIFY(Utility::Path::remove(filename)); CORRADE_VERIFY(converter.convertFileToFile(Stage::RayAnyHit, "file.dat", filename)); CORRADE_VERIFY(state.loaded); @@ -2909,9 +2926,9 @@ void AbstractConverterTest::setInputFileCallbackLinkFilesToFileThroughBaseImplem }, state); /* Remove previous file, if any */ - const std::string filename = Utility::Directory::join(SHADERTOOLS_TEST_OUTPUT_DIR, "file.out"); - if(Utility::Directory::exists(filename)) - CORRADE_VERIFY(Utility::Directory::rm(filename)); + Containers::String filename = Utility::Path::join(SHADERTOOLS_TEST_OUTPUT_DIR, "file.out"); + if(Utility::Path::exists(filename)) + CORRADE_VERIFY(Utility::Path::remove(filename)); CORRADE_VERIFY(converter.linkFilesToFile({ {Stage::Vertex, "another.dat"}, @@ -3032,9 +3049,9 @@ void AbstractConverterTest::setInputFileCallbackLinkFilesToFileAsData() { }, state); /* Remove previous file, if any */ - const std::string filename = Utility::Directory::join(SHADERTOOLS_TEST_OUTPUT_DIR, "file.out"); - if(Utility::Directory::exists(filename)) - CORRADE_VERIFY(Utility::Directory::rm(filename)); + Containers::String filename = Utility::Path::join(SHADERTOOLS_TEST_OUTPUT_DIR, "file.out"); + if(Utility::Path::exists(filename)) + CORRADE_VERIFY(Utility::Path::remove(filename)); CORRADE_VERIFY(converter.linkFilesToFile({ {Stage::Vertex, "another.dat"}, diff --git a/src/Magnum/ShaderTools/Test/SpirvTest.cpp b/src/Magnum/ShaderTools/Test/SpirvTest.cpp index a53673153..2384e604f 100644 --- a/src/Magnum/ShaderTools/Test/SpirvTest.cpp +++ b/src/Magnum/ShaderTools/Test/SpirvTest.cpp @@ -23,10 +23,10 @@ DEALINGS IN THE SOFTWARE. */ -#include #include +#include #include -#include +#include #include "Magnum/ShaderTools/Implementation/spirv.h" #include "MagnumExternal/Vulkan/spirv.h" @@ -150,10 +150,11 @@ void SpirvTest::findInstructionNotEnoughData() { } void SpirvTest::nextEntrypoint() { - Containers::Array data = Utility::Directory::read(Utility::Directory::join(SHADERTOOLS_TEST_DIR, "SpirvTestFiles/entrypoint-interface.spv")); + Containers::Optional> data = Utility::Path::read(Utility::Path::join(SHADERTOOLS_TEST_DIR, "SpirvTestFiles/entrypoint-interface.spv")); + CORRADE_VERIFY(data); /* The file is a full SPIR-V, strip the header first */ - Containers::ArrayView view = Implementation::spirvData(data, data.size()); + Containers::ArrayView view = Implementation::spirvData(*data, data->size()); CORRADE_VERIFY(view); Containers::Optional vert = Implementation::spirvNextEntrypoint(view); @@ -188,10 +189,11 @@ void SpirvTest::nextEntrypointInvalidInstruction() { } void SpirvTest::entrypointInterface() { - Containers::Array data = Utility::Directory::read(Utility::Directory::join(SHADERTOOLS_TEST_DIR, "SpirvTestFiles/entrypoint-interface.spv")); + Containers::Optional> data = Utility::Path::read(Utility::Path::join(SHADERTOOLS_TEST_DIR, "SpirvTestFiles/entrypoint-interface.spv")); + CORRADE_VERIFY(data); /* The file is a full SPIR-V, strip the header first */ - Containers::ArrayView view = Implementation::spirvData(data, data.size()); + Containers::ArrayView view = Implementation::spirvData(*data, data->size()); CORRADE_VERIFY(view); Containers::Optional vert = Implementation::spirvNextEntrypoint(view); diff --git a/src/MagnumPlugins/AnyShaderConverter/Test/AnyConverterTest.cpp b/src/MagnumPlugins/AnyShaderConverter/Test/AnyConverterTest.cpp index b1881cda6..6d79cff4d 100644 --- a/src/MagnumPlugins/AnyShaderConverter/Test/AnyConverterTest.cpp +++ b/src/MagnumPlugins/AnyShaderConverter/Test/AnyConverterTest.cpp @@ -25,14 +25,15 @@ #include #include +#include #include #include #include #include #include #include -#include #include +#include #include "Magnum/ShaderTools/AbstractConverter.h" #include "Magnum/ShaderTools/Stage.h" @@ -245,7 +246,7 @@ AnyConverterTest::AnyConverterTest() { #endif /* Create the output directory if it doesn't exist yet */ - CORRADE_INTERNAL_ASSERT_OUTPUT(Utility::Directory::mkpath(ANYSHADERCONVERTER_TEST_OUTPUT_DIR)); + CORRADE_INTERNAL_ASSERT_OUTPUT(Utility::Path::make(ANYSHADERCONVERTER_TEST_OUTPUT_DIR)); } void AnyConverterTest::validateFile() { @@ -259,7 +260,7 @@ void AnyConverterTest::validateFile() { Containers::Pointer converter = manager.instantiate("AnyShaderConverter"); - const std::string filename = Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"); + Containers::String filename = Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"); /* Make it print a warning so we know it's doing something */ CORRADE_COMPARE(converter->validateFile(Stage::Fragment, filename), @@ -315,7 +316,7 @@ void AnyConverterTest::validateFilePreprocessNotSupported() { std::ostringstream out; Error redirectError{&out}; - CORRADE_COMPARE(converter->validateFile({}, Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv")), + CORRADE_COMPARE(converter->validateFile({}, Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv")), std::make_pair(false, "")); CORRADE_COMPARE(out.str(), "ShaderTools::AnyConverter::validateFile(): SpirvToolsShaderConverter does not support preprocessing\n"); @@ -332,7 +333,7 @@ void AnyConverterTest::validateFilePropagateFlags() { Containers::Pointer converter = manager.instantiate("AnyShaderConverter"); - const std::string filename = Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"); + Containers::String filename = Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"); /* With this, the warning should turn into an error. The converter should also print the verbose info. */ @@ -364,7 +365,7 @@ void AnyConverterTest::validateFilePropagateInputVersion() { std::ostringstream out; Error redirectError{&out}; - CORRADE_COMPARE(converter->validateFile(Stage::Fragment, Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl")), + CORRADE_COMPARE(converter->validateFile(Stage::Fragment, Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl")), std::make_pair(false, "")); CORRADE_COMPARE(out.str(), "ShaderTools::GlslangConverter::validateData(): input format version should be one of supported GLSL #version strings but got 100\n"); @@ -388,7 +389,7 @@ void AnyConverterTest::validateFilePropagateOutputVersion() { std::ostringstream out; Error redirectError{&out}; - CORRADE_COMPARE(converter->validateFile(Stage::Fragment, Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl")), + CORRADE_COMPARE(converter->validateFile(Stage::Fragment, Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl")), std::make_pair(false, "")); CORRADE_COMPARE(out.str(), "ShaderTools::GlslangConverter::validateData(): output format should be Spirv or Unspecified but got ShaderTools::Format::Glsl\n"); @@ -405,7 +406,7 @@ void AnyConverterTest::validateFilePropagatePreprocess() { Containers::Pointer converter = manager.instantiate("AnyShaderConverter"); - const std::string filename = Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"); + Containers::String filename = Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"); /* Check that undefining works properly -- if it stays defined, the source won't compile */ @@ -430,7 +431,7 @@ void AnyConverterTest::validateFilePropagateConfiguration() { Containers::Pointer converter = manager.instantiate("AnyShaderConverter"); - const std::string filename = Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "version-not-first.glsl"); + Containers::String filename = Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "version-not-first.glsl"); { CORRADE_COMPARE(converter->validateFile(Stage::Fragment, filename), @@ -460,7 +461,7 @@ void AnyConverterTest::validateFilePropagateConfigurationUnknown() { std::ostringstream out; Warning redirectWarning{&out}; - CORRADE_COMPARE(converter->validateFile(Stage::Fragment, Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl")), + CORRADE_COMPARE(converter->validateFile(Stage::Fragment, Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl")), std::make_pair(true, "")); CORRADE_COMPARE(out.str(), "ShaderTools::AnyConverter::validateFile(): option noSuchOption not recognized by GlslangShaderConverter\n"); @@ -480,7 +481,9 @@ void AnyConverterTest::validateData() { converter->setInputFormat(Format::Glsl); /* Make it print a warning so we know it's doing something */ - CORRADE_COMPARE(converter->validateData(Stage::Fragment, Utility::Directory::read(Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"))), + Containers::Optional> data = Utility::Path::read(Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl")); + CORRADE_VERIFY(data); + CORRADE_COMPARE(converter->validateData(Stage::Fragment, *data), std::make_pair(true, "WARNING: 0:10: 'reserved__identifier' : identifiers containing consecutive underscores (\"__\") are reserved")); } @@ -535,9 +538,12 @@ void AnyConverterTest::validateDataPreprocessNotSupported() { {"DEFINE", "hahahahah"} }); + Containers::Optional> data = Utility::Path::read(Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv")); + CORRADE_VERIFY(data); + std::ostringstream out; Error redirectError{&out}; - CORRADE_COMPARE(converter->validateData({}, Utility::Directory::read(Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv"))), + CORRADE_COMPARE(converter->validateData({}, *data), std::make_pair(false, "")); CORRADE_COMPARE(out.str(), "ShaderTools::AnyConverter::validateData(): SpirvToolsShaderConverter does not support preprocessing\n"); @@ -560,9 +566,12 @@ void AnyConverterTest::validateDataPropagateFlags() { also print the verbose info. */ converter->setFlags(ConverterFlag::Verbose|ConverterFlag::WarningAsError); + Containers::Optional> data = Utility::Path::read(Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl")); + CORRADE_VERIFY(data); + std::ostringstream out; Debug redirectDebug{&out}; - CORRADE_COMPARE(converter->validateData(Stage::Fragment, Utility::Directory::read(Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"))), + CORRADE_COMPARE(converter->validateData(Stage::Fragment, *data), std::make_pair(false, "WARNING: 0:10: 'reserved__identifier' : identifiers containing consecutive underscores (\"__\") are reserved")); CORRADE_COMPARE(out.str(), "ShaderTools::AnyConverter::validateData(): using GlslShaderConverter (provided by GlslangShaderConverter)\n"); @@ -586,9 +595,12 @@ void AnyConverterTest::validateDataPropagateInputVersion() { AbstractConverter::doValidateFile() with the file contents. */ converter->setInputFormat(Format::Glsl, "100"); + Containers::Optional> data = Utility::Path::read(Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl")); + CORRADE_VERIFY(data); + std::ostringstream out; Error redirectError{&out}; - CORRADE_COMPARE(converter->validateData(Stage::Fragment, Utility::Directory::read(Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"))), + CORRADE_COMPARE(converter->validateData(Stage::Fragment, *data), std::make_pair(false, "")); CORRADE_COMPARE(out.str(), "ShaderTools::GlslangConverter::validateData(): input format version should be one of supported GLSL #version strings but got 100\n"); @@ -612,9 +624,12 @@ void AnyConverterTest::validateDataPropagateOutputVersion() { AbstractConverter::doValidateFile() with the file contents. */ converter->setOutputFormat(Format::Glsl, "opengl4.0"); + Containers::Optional> data = Utility::Path::read(Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl")); + CORRADE_VERIFY(data); + std::ostringstream out; Error redirectError{&out}; - CORRADE_COMPARE(converter->validateData(Stage::Fragment, Utility::Directory::read(Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"))), + CORRADE_COMPARE(converter->validateData(Stage::Fragment, *data), std::make_pair(false, "")); CORRADE_COMPARE(out.str(), "ShaderTools::GlslangConverter::validateData(): output format should be Spirv or Unspecified but got ShaderTools::Format::Glsl\n"); @@ -641,7 +656,10 @@ void AnyConverterTest::validateDataPropagatePreprocess() { {"reserved__identifier", "different__but_also_wrong"} }); - CORRADE_COMPARE(converter->validateData(Stage::Fragment, Utility::Directory::read(Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"))), + Containers::Optional> data = Utility::Path::read(Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl")); + CORRADE_VERIFY(data); + + CORRADE_COMPARE(converter->validateData(Stage::Fragment, *data), std::make_pair(true, "WARNING: 0:10: 'different__but_also_wrong' : identifiers containing consecutive underscores (\"__\") are reserved")); } @@ -657,16 +675,17 @@ void AnyConverterTest::validateDataPropagateConfiguration() { Containers::Pointer converter = manager.instantiate("AnyShaderConverter"); converter->setInputFormat(Format::Glsl); - const std::string filename = Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "version-not-first.glsl"); + Containers::Optional> data = Utility::Path::read(Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "version-not-first.glsl")); + CORRADE_VERIFY(data); { - CORRADE_COMPARE(converter->validateData(Stage::Fragment, Utility::Directory::read(filename)), + CORRADE_COMPARE(converter->validateData(Stage::Fragment, *data), std::make_pair(false, "ERROR: 0:2: '#version' : must occur first in shader \nERROR: 1 compilation errors. No code generated.")); } { converter->configuration().setValue("permissive", true); /* Lol stupid thing, apparently it has two differently worded messages for the same thing? Dumpster fire. */ - CORRADE_COMPARE(converter->validateData(Stage::Fragment, Utility::Directory::read(filename)), + CORRADE_COMPARE(converter->validateData(Stage::Fragment, *data), std::make_pair(true, Utility::format("WARNING: 0:0: '#version' : Illegal to have non-comment, non-whitespace tokens before #version"))); } } @@ -686,9 +705,12 @@ void AnyConverterTest::validateDataPropagateConfigurationUnknown() { /* So it doesn't warn about anything */ converter->setDefinitions({{"reserved__identifier", "sorry"}}); + Containers::Optional> data = Utility::Path::read(Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl")); + CORRADE_VERIFY(data); + std::ostringstream out; Warning redirectWarning{&out}; - CORRADE_COMPARE(converter->validateData(Stage::Fragment, Utility::Directory::read(Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"))), + CORRADE_COMPARE(converter->validateData(Stage::Fragment, *data), std::make_pair(true, "")); CORRADE_COMPARE(out.str(), "ShaderTools::AnyConverter::validateData(): option noSuchOption not recognized by GlslangShaderConverter\n"); @@ -705,16 +727,16 @@ void AnyConverterTest::convertFileToFile() { Containers::Pointer converter = manager.instantiate("AnyShaderConverter"); - const std::string inputFilename = Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"); - const std::string outputFilename = Utility::Directory::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.spv"); - if(Utility::Directory::exists(outputFilename)) - CORRADE_VERIFY(Utility::Directory::rm(outputFilename)); + Containers::String inputFilename = Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"); + Containers::String outputFilename = Utility::Path::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.spv"); + if(Utility::Path::exists(outputFilename)) + CORRADE_VERIFY(Utility::Path::remove(outputFilename)); /* Make it print a warning so we know it's doing something */ std::ostringstream out; Warning redirectWarning{&out}; CORRADE_VERIFY(converter->convertFileToFile(Stage::Fragment, inputFilename, outputFilename)); - CORRADE_VERIFY(Utility::Directory::exists(outputFilename)); + CORRADE_VERIFY(Utility::Path::exists(outputFilename)); CORRADE_COMPARE(out.str(), Utility::formatString( "ShaderTools::GlslangConverter::convertDataToData(): compilation succeeded with the following message:\n" "WARNING: {}:10: 'reserved__identifier' : identifiers containing consecutive underscores (\"__\") are reserved\n", inputFilename)); @@ -776,8 +798,8 @@ void AnyConverterTest::convertFileToFilePreprocessNotSupported() { std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!converter->convertFileToFile({}, Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv"), - Utility::Directory::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.spvasm"))); + CORRADE_VERIFY(!converter->convertFileToFile({}, Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv"), + Utility::Path::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.spvasm"))); CORRADE_COMPARE(out.str(), "ShaderTools::AnyConverter::convertFileToFile(): SpirvToolsShaderConverter does not support preprocessing\n"); @@ -785,8 +807,8 @@ void AnyConverterTest::convertFileToFilePreprocessNotSupported() { out.str({}); converter->setDefinitions({}); converter->setFlags(ConverterFlag::PreprocessOnly); - CORRADE_VERIFY(!converter->convertFileToFile({}, Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv"), - Utility::Directory::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.spvasm"))); + CORRADE_VERIFY(!converter->convertFileToFile({}, Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv"), + Utility::Path::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.spvasm"))); CORRADE_COMPARE(out.str(), "ShaderTools::AnyConverter::convertFileToFile(): SpirvToolsShaderConverter does not support preprocessing\n"); } @@ -806,8 +828,8 @@ void AnyConverterTest::convertFileToFileDebugInfoNotSupported() { std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!converter->convertFileToFile({}, Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv"), - Utility::Directory::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.spvasm"))); + CORRADE_VERIFY(!converter->convertFileToFile({}, Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv"), + Utility::Path::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.spvasm"))); /** @todo it once may support that, in which case we need to find another victim */ CORRADE_COMPARE(out.str(), @@ -829,8 +851,8 @@ void AnyConverterTest::convertFileToFileOptimizationNotSupported() { std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!converter->convertFileToFile({}, Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"), - Utility::Directory::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.spv"))); + CORRADE_VERIFY(!converter->convertFileToFile({}, Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"), + Utility::Path::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.spv"))); /** @todo it once may support that, in which case we need to find another victim */ CORRADE_COMPARE(out.str(), @@ -848,7 +870,7 @@ void AnyConverterTest::convertFileToFilePropagateFlags() { Containers::Pointer converter = manager.instantiate("AnyShaderConverter"); - const std::string filename = Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"); + Containers::String filename = Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"); /* With this, the warning should turn into an error. The converter should also print the verbose info. */ @@ -860,7 +882,7 @@ void AnyConverterTest::convertFileToFilePropagateFlags() { std::ostringstream out; Debug redirectDebug{&out}; Error redirectError{&out}; - CORRADE_VERIFY(!converter->convertFileToFile(Stage::Fragment, filename, Utility::Directory::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.spv"))); + CORRADE_VERIFY(!converter->convertFileToFile(Stage::Fragment, filename, Utility::Path::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.spv"))); CORRADE_COMPARE(out.str(), Utility::formatString( "ShaderTools::AnyConverter::convertFileToFile(): using GlslToSpirvShaderConverter (provided by GlslangShaderConverter)\n" "ShaderTools::GlslangConverter::convertDataToData(): compilation failed:\n" @@ -886,7 +908,7 @@ void AnyConverterTest::convertFileToFilePropagateInputVersion() { with the file contents. */ std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!converter->convertFileToFile(Stage::Fragment, Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"), Utility::Directory::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.spv"))); + CORRADE_VERIFY(!converter->convertFileToFile(Stage::Fragment, Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"), Utility::Path::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.spv"))); CORRADE_COMPARE(out.str(), "ShaderTools::GlslangConverter::convertDataToData(): input format version should be one of supported GLSL #version strings but got 100\n"); } @@ -910,7 +932,7 @@ void AnyConverterTest::convertFileToFilePropagateOutputVersion() { with the file contents. */ std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!converter->convertFileToFile(Stage::Fragment, Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"), Utility::Directory::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.spv"))); + CORRADE_VERIFY(!converter->convertFileToFile(Stage::Fragment, Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"), Utility::Path::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.spv"))); CORRADE_COMPARE(out.str(), "ShaderTools::GlslangConverter::convertDataToData(): output format version target should be opengl4.5 or vulkanX.Y but got opengl4.0\n"); } @@ -934,16 +956,16 @@ void AnyConverterTest::convertFileToFilePropagatePreprocess() { {"reserved__identifier", "different__but_also_wrong"} }); - const std::string inputFilename = Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"); - const std::string outputFilename = Utility::Directory::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.spv"); - if(Utility::Directory::exists(outputFilename)) - CORRADE_VERIFY(Utility::Directory::rm(outputFilename)); + Containers::String inputFilename = Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"); + Containers::String outputFilename = Utility::Path::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.spv"); + if(Utility::Path::exists(outputFilename)) + CORRADE_VERIFY(Utility::Path::remove(outputFilename)); /* Make it print a warning so we know it's doing something */ std::ostringstream out; Warning redirectWarning{&out}; CORRADE_VERIFY(converter->convertFileToFile(Stage::Fragment, inputFilename, outputFilename)); - CORRADE_VERIFY(Utility::Directory::exists(outputFilename)); + CORRADE_VERIFY(Utility::Path::exists(outputFilename)); CORRADE_COMPARE(out.str(), Utility::formatString( "ShaderTools::GlslangConverter::convertDataToData(): compilation succeeded with the following message:\n" "WARNING: {}:10: 'different__but_also_wrong' : identifiers containing consecutive underscores (\"__\") are reserved\n", inputFilename)); @@ -968,7 +990,7 @@ void AnyConverterTest::convertFileToFilePropagateDebugInfo() { with the file contents. */ std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!converter->convertFileToFile(Stage::Fragment, Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"), Utility::Directory::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.spv"))); + CORRADE_VERIFY(!converter->convertFileToFile(Stage::Fragment, Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"), Utility::Path::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.spv"))); CORRADE_COMPARE(out.str(), "ShaderTools::GlslangConverter::convertDataToData(): debug info level should be 0, 1 or empty but got 2\n"); } @@ -992,7 +1014,7 @@ void AnyConverterTest::convertFileToFilePropagateOptimization() { with the file contents. */ std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!converter->convertFileToFile(Stage::Fragment, Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv"), Utility::Directory::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.spv"))); + CORRADE_VERIFY(!converter->convertFileToFile(Stage::Fragment, Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv"), Utility::Path::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.spv"))); CORRADE_COMPARE(out.str(), "ShaderTools::SpirvToolsConverter::convertDataToData(): optimization level should be 0, 1, s, legalizeHlsl or empty but got 2\n"); } @@ -1008,8 +1030,8 @@ void AnyConverterTest::convertFileToFilePropagateConfiguration() { Containers::Pointer converter = manager.instantiate("AnyShaderConverter"); - const std::string input = Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "version-not-first.glsl"); - const std::string output = Utility::Directory::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.spv"); + Containers::String input = Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "version-not-first.glsl"); + Containers::String output = Utility::Path::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.spv"); { std::ostringstream out; @@ -1045,7 +1067,7 @@ void AnyConverterTest::convertFileToFilePropagateConfigurationUnknown() { std::ostringstream out; Warning redirectWarning{&out}; - CORRADE_VERIFY(converter->convertFileToFile(Stage::Fragment, Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"), Utility::Directory::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.glsl"))); + CORRADE_VERIFY(converter->convertFileToFile(Stage::Fragment, Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"), Utility::Path::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.glsl"))); CORRADE_COMPARE(out.str(), "ShaderTools::AnyConverter::convertFileToFile(): option noSuchOption not recognized by GlslangShaderConverter\n"); } @@ -1063,7 +1085,7 @@ void AnyConverterTest::convertFileToData() { converter->setOutputFormat(Format::Spirv); - const std::string inputFilename = Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"); + Containers::String inputFilename = Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"); /* Make it print a warning so we know it's doing something */ std::ostringstream out; @@ -1134,7 +1156,7 @@ void AnyConverterTest::convertFileToDataPreprocessNotSupported() { std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!converter->convertFileToData({}, Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv"))); + CORRADE_VERIFY(!converter->convertFileToData({}, Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv"))); CORRADE_COMPARE(out.str(), "ShaderTools::AnyConverter::convertFileToData(): SpirvToolsShaderConverter does not support preprocessing\n"); @@ -1142,7 +1164,7 @@ void AnyConverterTest::convertFileToDataPreprocessNotSupported() { out.str({}); converter->setDefinitions({}); converter->setFlags(ConverterFlag::PreprocessOnly); - CORRADE_VERIFY(!converter->convertFileToData({}, Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv"))); + CORRADE_VERIFY(!converter->convertFileToData({}, Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv"))); CORRADE_COMPARE(out.str(), "ShaderTools::AnyConverter::convertFileToData(): SpirvToolsShaderConverter does not support preprocessing\n"); } @@ -1164,7 +1186,7 @@ void AnyConverterTest::convertFileToDataDebugInfoNotSupported() { std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!converter->convertFileToData({}, Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv"))); + CORRADE_VERIFY(!converter->convertFileToData({}, Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv"))); /** @todo it once may support that, in which case we need to find another victim */ CORRADE_COMPARE(out.str(), @@ -1188,7 +1210,7 @@ void AnyConverterTest::convertFileToDataOptimizationNotSupported() { std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!converter->convertFileToData({}, Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"))); + CORRADE_VERIFY(!converter->convertFileToData({}, Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"))); /** @todo it once may support that, in which case we need to find another victim */ CORRADE_COMPARE(out.str(), @@ -1206,7 +1228,7 @@ void AnyConverterTest::convertFileToDataPropagateFlags() { Containers::Pointer converter = manager.instantiate("AnyShaderConverter"); - const std::string filename = Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"); + Containers::String filename = Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"); converter->setOutputFormat(Format::Spirv); @@ -1248,7 +1270,7 @@ void AnyConverterTest::convertFileToDataPropagateInputVersion() { with the file contents. */ std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!converter->convertFileToData(Stage::Fragment, Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"))); + CORRADE_VERIFY(!converter->convertFileToData(Stage::Fragment, Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"))); CORRADE_COMPARE(out.str(), "ShaderTools::GlslangConverter::convertDataToData(): input format version should be one of supported GLSL #version strings but got 100\n"); } @@ -1272,7 +1294,7 @@ void AnyConverterTest::convertFileToDataPropagateOutputVersion() { with the file contents. */ std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!converter->convertFileToData(Stage::Fragment, Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"))); + CORRADE_VERIFY(!converter->convertFileToData(Stage::Fragment, Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"))); CORRADE_COMPARE(out.str(), "ShaderTools::GlslangConverter::convertDataToData(): output format version target should be opengl4.5 or vulkanX.Y but got opengl4.0\n"); } @@ -1298,7 +1320,7 @@ void AnyConverterTest::convertFileToDataPropagatePreprocess() { {"reserved__identifier", "different__but_also_wrong"} }); - const std::string inputFilename = Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"); + Containers::String inputFilename = Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"); /* Make it print a warning so we know it's doing something */ std::ostringstream out; @@ -1330,7 +1352,7 @@ void AnyConverterTest::convertFileToDataPropagateDebugInfo() { with the file contents. */ std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!converter->convertFileToData(Stage::Fragment, Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"))); + CORRADE_VERIFY(!converter->convertFileToData(Stage::Fragment, Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"))); CORRADE_COMPARE(out.str(), "ShaderTools::GlslangConverter::convertDataToData(): debug info level should be 0, 1 or empty but got 2\n"); } @@ -1356,7 +1378,7 @@ void AnyConverterTest::convertFileToDataPropagateOptimization() { with the file contents. */ std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!converter->convertFileToData(Stage::Fragment, Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv"))); + CORRADE_VERIFY(!converter->convertFileToData(Stage::Fragment, Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv"))); CORRADE_COMPARE(out.str(), "ShaderTools::SpirvToolsConverter::convertDataToData(): optimization level should be 0, 1, s, legalizeHlsl or empty but got 2\n"); } @@ -1374,7 +1396,7 @@ void AnyConverterTest::convertFileToDataPropagateConfiguration() { converter->setOutputFormat(Format::Spirv); - const std::string input = Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "version-not-first.glsl"); + Containers::String input = Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "version-not-first.glsl"); { std::ostringstream out; @@ -1411,7 +1433,7 @@ void AnyConverterTest::convertFileToDataPropagateConfigurationUnknown() { std::ostringstream out; Warning redirectWarning{&out}; - CORRADE_VERIFY(converter->convertFileToData(Stage::Fragment, Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"))); + CORRADE_VERIFY(converter->convertFileToData(Stage::Fragment, Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"))); CORRADE_COMPARE(out.str(), "ShaderTools::AnyConverter::convertFileToData(): option noSuchOption not recognized by GlslangShaderConverter\n"); } @@ -1430,10 +1452,13 @@ void AnyConverterTest::convertDataToData() { converter->setInputFormat(Format::Glsl); converter->setOutputFormat(Format::Spirv); + Containers::Optional> data = Utility::Path::read(Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl")); + CORRADE_VERIFY(data); + /* Make it print a warning so we know it's doing something */ std::ostringstream out; Warning redirectWarning{&out}; - CORRADE_VERIFY(converter->convertDataToData(Stage::Fragment, Utility::Directory::read(Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl")))); + CORRADE_VERIFY(converter->convertDataToData(Stage::Fragment, *data)); CORRADE_COMPARE(out.str(), "ShaderTools::GlslangConverter::convertDataToData(): compilation succeeded with the following message:\n" "WARNING: 0:10: 'reserved__identifier' : identifiers containing consecutive underscores (\"__\") are reserved\n"); @@ -1501,9 +1526,12 @@ void AnyConverterTest::convertDataToDataPreprocessNotSupported() { {"DEFINE", "hahahahah"} }); + Containers::Optional> data = Utility::Path::read(Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv")); + CORRADE_VERIFY(data); + std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!converter->convertDataToData({}, Utility::Directory::read(Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv")))); + CORRADE_VERIFY(!converter->convertDataToData({}, *data)); CORRADE_COMPARE(out.str(), "ShaderTools::AnyConverter::convertDataToData(): SpirvToolsShaderConverter does not support preprocessing\n"); @@ -1511,7 +1539,7 @@ void AnyConverterTest::convertDataToDataPreprocessNotSupported() { out.str({}); converter->setDefinitions({}); converter->setFlags(ConverterFlag::PreprocessOnly); - CORRADE_VERIFY(!converter->convertDataToData({}, Utility::Directory::read(Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv")))); + CORRADE_VERIFY(!converter->convertDataToData({}, *data)); CORRADE_COMPARE(out.str(), "ShaderTools::AnyConverter::convertDataToData(): SpirvToolsShaderConverter does not support preprocessing\n"); } @@ -1532,9 +1560,12 @@ void AnyConverterTest::convertDataToDataDebugInfoNotSupported() { converter->setDebugInfoLevel("1"); + Containers::Optional> data = Utility::Path::read(Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv")); + CORRADE_VERIFY(data); + std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!converter->convertDataToData({}, Utility::Directory::read(Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv")))); + CORRADE_VERIFY(!converter->convertDataToData({}, *data)); /** @todo it once may support that, in which case we need to find another victim */ CORRADE_COMPARE(out.str(), @@ -1557,9 +1588,12 @@ void AnyConverterTest::convertDataToDataOptimizationNotSupported() { converter->setOptimizationLevel("1"); + Containers::Optional> data = Utility::Path::read(Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl")); + CORRADE_VERIFY(data); + std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!converter->convertDataToData({}, Utility::Directory::read(Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl")))); + CORRADE_VERIFY(!converter->convertDataToData({}, *data)); /** @todo it once may support that, in which case we need to find another victim */ CORRADE_COMPARE(out.str(), @@ -1584,13 +1618,16 @@ void AnyConverterTest::convertDataToDataPropagateFlags() { also print the verbose info. */ converter->setFlags(ConverterFlag::Verbose|ConverterFlag::WarningAsError); + Containers::Optional> data = Utility::Path::read(Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl")); + CORRADE_VERIFY(data); + /* We have to supply a valid file path because the version gets checked in doConvertDataToData(), called from AbstractConverter::doConvertFileToFile() with the file contents. */ std::ostringstream out; Debug redirectDebug{&out}; Error redirectError{&out}; - CORRADE_VERIFY(!converter->convertDataToData(Stage::Fragment, Utility::Directory::read(Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl")))); + CORRADE_VERIFY(!converter->convertDataToData(Stage::Fragment, *data)); CORRADE_COMPARE(out.str(), "ShaderTools::AnyConverter::convertDataToData(): using GlslToSpirvShaderConverter (provided by GlslangShaderConverter)\n" "ShaderTools::GlslangConverter::convertDataToData(): compilation failed:\n" @@ -1613,12 +1650,15 @@ void AnyConverterTest::convertDataToDataPropagateInputVersion() { converter->setOutputFormat(Format::Spirv); + Containers::Optional> data = Utility::Path::read(Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl")); + CORRADE_VERIFY(data); + /* We have to supply a valid file path because the version gets checked in doConvertDataToData(), called from AbstractConverter::doConvertFileToFile() with the file contents. */ std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!converter->convertDataToData(Stage::Fragment, Utility::Directory::read(Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl")))); + CORRADE_VERIFY(!converter->convertDataToData(Stage::Fragment, *data)); CORRADE_COMPARE(out.str(), "ShaderTools::GlslangConverter::convertDataToData(): input format version should be one of supported GLSL #version strings but got 100\n"); } @@ -1639,12 +1679,15 @@ void AnyConverterTest::convertDataToDataPropagateOutputVersion() { /* This is an invalid version */ converter->setOutputFormat(Format::Spirv, "opengl4.0"); + Containers::Optional> data = Utility::Path::read(Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl")); + CORRADE_VERIFY(data); + /* We have to supply a valid file path because the version gets checked in doConvertDataToData(), called from AbstractConverter::doConvertFileToFile() with the file contents. */ std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!converter->convertDataToData(Stage::Fragment, Utility::Directory::read(Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl")))); + CORRADE_VERIFY(!converter->convertDataToData(Stage::Fragment, *data)); CORRADE_COMPARE(out.str(), "ShaderTools::GlslangConverter::convertDataToData(): output format version target should be opengl4.5 or vulkanX.Y but got opengl4.0\n"); } @@ -1671,10 +1714,13 @@ void AnyConverterTest::convertDataToDataPropagatePreprocess() { {"reserved__identifier", "different__but_also_wrong"} }); + Containers::Optional> data = Utility::Path::read(Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl")); + CORRADE_VERIFY(data); + /* Make it print a warning so we know it's doing something */ std::ostringstream out; Warning redirectWarning{&out}; - CORRADE_VERIFY(converter->convertDataToData(Stage::Fragment, Utility::Directory::read(Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl")))); + CORRADE_VERIFY(converter->convertDataToData(Stage::Fragment, *data)); CORRADE_COMPARE(out.str(), "ShaderTools::GlslangConverter::convertDataToData(): compilation succeeded with the following message:\n" "WARNING: 0:10: 'different__but_also_wrong' : identifiers containing consecutive underscores (\"__\") are reserved\n"); @@ -1697,12 +1743,15 @@ void AnyConverterTest::convertDataToDataPropagateDebugInfo() { /* This is an invalid level */ converter->setDebugInfoLevel("2"); + Containers::Optional> data = Utility::Path::read(Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl")); + CORRADE_VERIFY(data); + /* We have to supply a valid file path because the version gets checked in doConvertDataToData(), called from AbstractConverter::doConvertFileToFile() with the file contents. */ std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!converter->convertDataToData(Stage::Fragment, Utility::Directory::read(Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl")))); + CORRADE_VERIFY(!converter->convertDataToData(Stage::Fragment, *data)); CORRADE_COMPARE(out.str(), "ShaderTools::GlslangConverter::convertDataToData(): debug info level should be 0, 1 or empty but got 2\n"); } @@ -1724,12 +1773,15 @@ void AnyConverterTest::convertDataToDataPropagateOptimization() { /* This is an invalid level */ converter->setOptimizationLevel("2"); + Containers::Optional> data = Utility::Path::read(Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv")); + CORRADE_VERIFY(data); + /* We have to supply a valid file path because the version gets checked in doConvertDataToData(), called from AbstractConverter::doConvertFileToFile() with the file contents. */ std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!converter->convertDataToData(Stage::Fragment, Utility::Directory::read(Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv")))); + CORRADE_VERIFY(!converter->convertDataToData(Stage::Fragment, *data)); CORRADE_COMPARE(out.str(), "ShaderTools::SpirvToolsConverter::convertDataToData(): optimization level should be 0, 1, s, legalizeHlsl or empty but got 2\n"); } @@ -1748,12 +1800,13 @@ void AnyConverterTest::convertDataToDataPropagateConfiguration() { converter->setInputFormat(Format::Glsl); converter->setOutputFormat(Format::Spirv); - const std::string input = Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "version-not-first.glsl"); + Containers::Optional> data = Utility::Path::read(Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "version-not-first.glsl")); + CORRADE_VERIFY(data); { std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!converter->convertDataToData(Stage::Fragment, Utility::Directory::read(input))); + CORRADE_VERIFY(!converter->convertDataToData(Stage::Fragment, *data)); CORRADE_COMPARE(out.str(), "ShaderTools::GlslangConverter::convertDataToData(): compilation failed:\nERROR: 0:2: '#version' : must occur first in shader \nERROR: 1 compilation errors. No code generated.\n"); } { @@ -1762,7 +1815,7 @@ void AnyConverterTest::convertDataToDataPropagateConfiguration() { for the same thing? Dumpster fire. */ std::ostringstream out; Warning redirectWarning{&out}; - CORRADE_VERIFY(converter->convertDataToData(Stage::Fragment, Utility::Directory::read(input))); + CORRADE_VERIFY(converter->convertDataToData(Stage::Fragment, *data)); CORRADE_COMPARE(out.str(), "ShaderTools::GlslangConverter::convertDataToData(): compilation succeeded with the following message:\nWARNING: 0:0: '#version' : Illegal to have non-comment, non-whitespace tokens before #version\n"); } @@ -1784,9 +1837,12 @@ void AnyConverterTest::convertDataToDataPropagateConfigurationUnknown() { /* So it doesn't warn about anything */ converter->setDefinitions({{"reserved__identifier", "sorry"}}); + Containers::Optional> data = Utility::Path::read(Utility::Path::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl")); + CORRADE_VERIFY(data); + std::ostringstream out; Warning redirectWarning{&out}; - CORRADE_VERIFY(converter->convertDataToData(Stage::Fragment, Utility::Directory::read(Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl")))); + CORRADE_VERIFY(converter->convertDataToData(Stage::Fragment, *data)); CORRADE_COMPARE(out.str(), "ShaderTools::AnyConverter::convertDataToData(): option noSuchOption not recognized by GlslangShaderConverter\n"); } @@ -1841,7 +1897,7 @@ void AnyConverterTest::detectConvert() { std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!converter->convertFileToFile({}, data.from, Utility::Directory::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, data.to))); + CORRADE_VERIFY(!converter->convertFileToFile({}, data.from, Utility::Path::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, data.to))); #ifndef CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT CORRADE_COMPARE(out.str(), Utility::formatString( "PluginManager::Manager::load(): plugin {0} is not static and was not found in nonexistent\n" @@ -1862,7 +1918,7 @@ void AnyConverterTest::detectConvertExplicitFormat() { std::ostringstream out; Error redirectError{&out}; - CORRADE_VERIFY(!converter->convertFileToFile({}, "file.spv", Utility::Directory::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.glsl"))); + CORRADE_VERIFY(!converter->convertFileToFile({}, "file.spv", Utility::Path::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.glsl"))); #ifndef CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT CORRADE_COMPARE(out.str(), "PluginManager::Manager::load(): plugin HlslToWgslShaderConverter is not static and was not found in nonexistent\n"