89 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include <assets/shader.hpp>
 | |
| #include <ranges>
 | |
| #include <test/test.hpp>
 | |
| 
 | |
| using ::lt::assets::AssetMetadata;
 | |
| using ::lt::assets::BlobMetadata;
 | |
| using ::lt::assets::ShaderAsset;
 | |
| using ::lt::test::Case;
 | |
| using ::lt::test::expect_eq;
 | |
| using ::lt::test::expect_throw;
 | |
| using ::lt::test::expect_true;
 | |
| using ::lt::test::Suite;
 | |
| 
 | |
| const auto test_data_path = std::filesystem::path { "./data/test_assets" };
 | |
| const auto tmp_path = std::filesystem::path { "/tmp/lt_assets_tests/" };
 | |
| 
 | |
| Suite raii = "shader_raii"_suite = [] {
 | |
| 	std::filesystem::current_path(test_data_path);
 | |
| 	std::filesystem::create_directories(tmp_path);
 | |
| 
 | |
| 	Case { "happy path won't throw" } = [] {
 | |
| 
 | |
| 	};
 | |
| 
 | |
| 	Case { "many won't freeze/throw" } = [] {
 | |
| 	};
 | |
| 
 | |
| 	Case { "unhappy path throws" } = [] {
 | |
| 		expect_throw([] { ShaderAsset { "random_path" }; });
 | |
| 	};
 | |
| };
 | |
| 
 | |
| // NOLINTNEXTLINE(cppcoreguidelines-interfaces-global-init)
 | |
| Suite packing = "shader_pack"_suite = [] {
 | |
| 	Case { "" } = [] {
 | |
| 		const auto out_path = tmp_path / "shader_packing";
 | |
| 		auto dummy_blob = lt::assets::Blob {};
 | |
| 		for (auto idx : std::views::iota(0, 255))
 | |
| 		{
 | |
| 			dummy_blob.emplace_back(static_cast<std::byte>(idx));
 | |
| 		}
 | |
| 
 | |
| 		const auto expected_size =          //
 | |
| 		    sizeof(AssetMetadata)           //
 | |
| 		    + sizeof(ShaderAsset::Metadata) //
 | |
| 		    + sizeof(BlobMetadata)          //
 | |
| 		    + dummy_blob.size();
 | |
| 
 | |
| 		ShaderAsset::pack(
 | |
| 		    out_path,
 | |
| 		    lt::assets::AssetMetadata {
 | |
| 		        .version = lt::assets::current_version,
 | |
| 		        .type = ShaderAsset::asset_type_identifier,
 | |
| 		    },
 | |
| 		    ShaderAsset::Metadata {
 | |
| 		        .type = ShaderAsset::Type::vertex,
 | |
| 		    },
 | |
| 		    std::move(dummy_blob)
 | |
| 		);
 | |
| 
 | |
| 		auto stream = std::ifstream {
 | |
| 			out_path,
 | |
| 			std::ios::binary,
 | |
| 		};
 | |
| 		expect_true(stream.is_open());
 | |
| 
 | |
| 		stream.seekg(0, std::ios::end);
 | |
| 		const auto file_size = static_cast<size_t>(stream.tellg());
 | |
| 		expect_eq(file_size, expected_size);
 | |
| 		stream.close();
 | |
| 
 | |
| 		auto shader_asset = ShaderAsset { out_path };
 | |
| 
 | |
| 		const auto &asset_metadata = shader_asset.get_asset_metadata();
 | |
| 		expect_eq(asset_metadata.type, ShaderAsset::asset_type_identifier);
 | |
| 		expect_eq(asset_metadata.version, lt::assets::current_version);
 | |
| 
 | |
| 		const auto &metadata = shader_asset.get_metadata();
 | |
| 		expect_eq(metadata.type, ShaderAsset::Type::vertex);
 | |
| 
 | |
| 		auto blob = shader_asset.unpack(ShaderAsset::BlobTag::code);
 | |
| 		expect_eq(blob.size(), 255);
 | |
| 
 | |
| 		for (auto idx : std::views::iota(0, 255))
 | |
| 		{
 | |
| 			expect_eq(blob[idx], static_cast<std::byte>(idx));
 | |
| 		}
 | |
| 	};
 | |
| };
 |