From 0abd1c7e7fd1972a8156a656f07d28c619ddd40d Mon Sep 17 00:00:00 2001 From: light7734 Date: Mon, 12 Jan 2026 14:41:41 +0330 Subject: [PATCH] fix(assets/shader): opening the file in non-binary mode --- modules/assets/shader.cppm | 7 ++++--- modules/assets/shader.test.cpp | 23 ++++++++++++++++++++--- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/modules/assets/shader.cppm b/modules/assets/shader.cppm index 877f244..3a16fb4 100644 --- a/modules/assets/shader.cppm +++ b/modules/assets/shader.cppm @@ -89,7 +89,8 @@ constexpr auto total_metadata_size = // + sizeof(BlobMetadata::compressed_size) // + sizeof(BlobMetadata::uncompressed_size); -ShaderAsset::ShaderAsset(const std::filesystem::path &path): m_stream(path) +ShaderAsset::ShaderAsset(const std::filesystem::path &path) + : m_stream(path, std::ios::beg | std::ios::binary) { debug::ensure(m_stream.is_open(), "Failed to open shader asset at: {}", path.string()); const auto read = [this](auto &field) { @@ -210,10 +211,10 @@ void ShaderAsset::unpack_to(BlobTag tag, std::span destination) const m_code_blob_metadata.uncompressed_size ); - m_stream.seekg(static_cast(m_code_blob_metadata.offset)); + m_stream.seekg(static_cast(m_code_blob_metadata.offset), std::ifstream::beg); m_stream.read( std::bit_cast(destination.data()), - static_cast(m_code_blob_metadata.uncompressed_size) + m_code_blob_metadata.uncompressed_size ); } diff --git a/modules/assets/shader.test.cpp b/modules/assets/shader.test.cpp index 96bc856..d66bbf7 100644 --- a/modules/assets/shader.test.cpp +++ b/modules/assets/shader.test.cpp @@ -1,6 +1,7 @@ import assets.metadata; import assets.shader; import logger; +import logger; import test.test; import test.expects; import std; @@ -23,18 +24,34 @@ Suite raii = "shader_raii"_suite = [] { std::filesystem::create_directories(tmp_path); Case { "happy path won't throw" } = [] { - + auto shader_asset = ShaderAsset { "triangle.frag.asset" }; }; Case { "many won't freeze/throw" } = [] { + for (auto idx : std::views::iota(0u, 1'000u)) + { + std::ignore = idx; + auto shader_asset = ShaderAsset { "triangle.frag.asset" }; + } }; Case { "unhappy path throws" } = [] { - expect_throw([] { ShaderAsset { "random_path" }; }); + // non-existent file + expect_throw([] { ShaderAsset { "path" }; }); + + // incompatible type + expect_throw([] { ShaderAsset { "dummytext" }; }); + + // random stressing + expect_throw([] { + for (auto idx : std::views::iota(0u, 1'000u)) + { + auto shader_asset = ShaderAsset { std::to_string(idx) }; + } + }); }; }; -// NOLINTNEXTLINE(cppcoreguidelines-interfaces-global-init) Suite packing = "shader_pack"_suite = [] { Case { "" } = [] { const auto out_path = tmp_path / "shader_packing";