From fcc4d60756699736fbe461804fd728a8e409399e Mon Sep 17 00:00:00 2001 From: Jan Laupetin Date: Sun, 4 Jan 2026 23:50:38 +0100 Subject: [PATCH] chore: add tests for templated image loader --- test/ObjLoadingTests.lua | 1 + .../IW3/Image/ImageLoaderEmbeddedIW3Test.cpp | 57 +++++++++++++++++ .../IW3/Image/ImageLoaderExternalIW3Test.cpp | 54 ++++++++++++++++ .../Game/IW3/Image/TestImage.dds | Bin 0 -> 2176 bytes .../Game/IW3/Image/TestImage.iwi | Bin 0 -> 2076 bytes .../IW4/Image/ImageLoaderEmbeddedIW4Test.cpp | 57 +++++++++++++++++ .../IW4/Image/ImageLoaderExternalIW4Test.cpp | 54 ++++++++++++++++ .../Game/IW4/Image/TestImage.dds | Bin 0 -> 2176 bytes .../Game/IW4/Image/TestImage.iwi | Bin 0 -> 2080 bytes .../IW5/Image/ImageLoaderEmbeddedIW5Test.cpp | 57 +++++++++++++++++ .../IW5/Image/ImageLoaderExternalIW5Test.cpp | 54 ++++++++++++++++ .../Game/IW5/Image/TestImage.dds | Bin 0 -> 2176 bytes .../Game/IW5/Image/TestImage.iwi | Bin 0 -> 2080 bytes .../T5/Image/ImageLoaderEmbeddedT5Test.cpp | 57 +++++++++++++++++ .../T5/Image/ImageLoaderExternalT5Test.cpp | 54 ++++++++++++++++ .../Game/T5/Image/TestImage.dds | Bin 0 -> 2176 bytes .../Game/T5/Image/TestImage.iwi | Bin 0 -> 2096 bytes .../T6/Image/ImageLoaderEmbeddedT6Test.cpp | 58 ++++++++++++++++++ .../T6/Image/ImageLoaderExternalT6Test.cpp | 57 +++++++++++++++++ .../Game/T6/Image/TestImage.dds | Bin 0 -> 2176 bytes .../Game/T6/Image/TestImage.iwi | Bin 0 -> 2112 bytes 21 files changed, 560 insertions(+) create mode 100644 test/ObjLoadingTests/Game/IW3/Image/ImageLoaderEmbeddedIW3Test.cpp create mode 100644 test/ObjLoadingTests/Game/IW3/Image/ImageLoaderExternalIW3Test.cpp create mode 100644 test/ObjLoadingTests/Game/IW3/Image/TestImage.dds create mode 100644 test/ObjLoadingTests/Game/IW3/Image/TestImage.iwi create mode 100644 test/ObjLoadingTests/Game/IW4/Image/ImageLoaderEmbeddedIW4Test.cpp create mode 100644 test/ObjLoadingTests/Game/IW4/Image/ImageLoaderExternalIW4Test.cpp create mode 100644 test/ObjLoadingTests/Game/IW4/Image/TestImage.dds create mode 100644 test/ObjLoadingTests/Game/IW4/Image/TestImage.iwi create mode 100644 test/ObjLoadingTests/Game/IW5/Image/ImageLoaderEmbeddedIW5Test.cpp create mode 100644 test/ObjLoadingTests/Game/IW5/Image/ImageLoaderExternalIW5Test.cpp create mode 100644 test/ObjLoadingTests/Game/IW5/Image/TestImage.dds create mode 100644 test/ObjLoadingTests/Game/IW5/Image/TestImage.iwi create mode 100644 test/ObjLoadingTests/Game/T5/Image/ImageLoaderEmbeddedT5Test.cpp create mode 100644 test/ObjLoadingTests/Game/T5/Image/ImageLoaderExternalT5Test.cpp create mode 100644 test/ObjLoadingTests/Game/T5/Image/TestImage.dds create mode 100644 test/ObjLoadingTests/Game/T5/Image/TestImage.iwi create mode 100644 test/ObjLoadingTests/Game/T6/Image/ImageLoaderEmbeddedT6Test.cpp create mode 100644 test/ObjLoadingTests/Game/T6/Image/ImageLoaderExternalT6Test.cpp create mode 100644 test/ObjLoadingTests/Game/T6/Image/TestImage.dds create mode 100644 test/ObjLoadingTests/Game/T6/Image/TestImage.iwi diff --git a/test/ObjLoadingTests.lua b/test/ObjLoadingTests.lua index 339ca606..3d315f41 100644 --- a/test/ObjLoadingTests.lua +++ b/test/ObjLoadingTests.lua @@ -3,6 +3,7 @@ ObjLoadingTests = {} function ObjLoadingTests:include(includes) if includes:handle(self:name()) then includedirs { + "%{wks.location}/src/ObjLoading", path.join(TestFolder(), "ObjLoadingTests") } end diff --git a/test/ObjLoadingTests/Game/IW3/Image/ImageLoaderEmbeddedIW3Test.cpp b/test/ObjLoadingTests/Game/IW3/Image/ImageLoaderEmbeddedIW3Test.cpp new file mode 100644 index 00000000..b2622a73 --- /dev/null +++ b/test/ObjLoadingTests/Game/IW3/Image/ImageLoaderEmbeddedIW3Test.cpp @@ -0,0 +1,57 @@ +#include "Game/IW3/Image/ImageLoaderEmbeddedIW3.h" + +#include "Game/IW3/GameIW3.h" +#include "OatTestPaths.h" +#include "SearchPath/MockSearchPath.h" +#include "Utils/MemoryManager.h" + +#include +#include +#include +#include +#include + +namespace fs = std::filesystem; +using namespace IW3; +using namespace std::literals; + +namespace +{ + TEST_CASE("ImageLoaderEmbeddedIW3: Can parse dds", "[iw3][image]") + { + MockSearchPath searchPath; + + const auto filePath = oat::paths::GetTestDirectory() / "ObjLoadingTests/Game/IW3/Image/TestImage.dds"; + const auto fileSize = fs::file_size(filePath); + + std::ifstream file(filePath, std::ios::binary); + REQUIRE(file.is_open()); + + const auto data = std::make_unique(fileSize); + file.read(data.get(), fileSize); + + searchPath.AddFileData("images/_testimage.dds", std::string(data.get(), fileSize)); + + Zone zone("MockZone", 0, GameId::IW3, GamePlatform::PC); + + MemoryManager memory; + AssetCreatorCollection creatorCollection(zone); + IgnoredAssetLookup ignoredAssetLookup; + AssetCreationContext context(zone, &creatorCollection, &ignoredAssetLookup); + + auto loader = image::CreateLoaderEmbeddedIW3(memory, searchPath); + auto result = loader->CreateAsset("*testimage", context); + REQUIRE(result.HasBeenSuccessful()); + + const auto* assetInfo = reinterpret_cast*>(result.GetAssetInfo()); + const auto* image = assetInfo->Asset(); + + REQUIRE(image->name == "*testimage"s); + REQUIRE(image->width == 64); + REQUIRE(image->height == 64); + REQUIRE(image->depth == 1); + + REQUIRE(image->texture.loadDef); + REQUIRE(image->texture.loadDef->resourceSize > 0); + } +} // namespace diff --git a/test/ObjLoadingTests/Game/IW3/Image/ImageLoaderExternalIW3Test.cpp b/test/ObjLoadingTests/Game/IW3/Image/ImageLoaderExternalIW3Test.cpp new file mode 100644 index 00000000..8673f594 --- /dev/null +++ b/test/ObjLoadingTests/Game/IW3/Image/ImageLoaderExternalIW3Test.cpp @@ -0,0 +1,54 @@ +#include "Game/IW3/Image/ImageLoaderExternalIW3.h" + +#include "Game/IW3/GameIW3.h" +#include "OatTestPaths.h" +#include "SearchPath/MockSearchPath.h" +#include "Utils/MemoryManager.h" + +#include +#include +#include +#include +#include + +namespace fs = std::filesystem; +using namespace IW3; +using namespace std::literals; + +namespace +{ + TEST_CASE("ImageLoaderExternalIW3: Can parse iwi", "[iw3][image]") + { + MockSearchPath searchPath; + + const auto filePath = oat::paths::GetTestDirectory() / "ObjLoadingTests/Game/IW3/Image/TestImage.iwi"; + const auto fileSize = fs::file_size(filePath); + + std::ifstream file(filePath, std::ios::binary); + REQUIRE(file.is_open()); + + const auto data = std::make_unique(fileSize); + file.read(data.get(), fileSize); + + searchPath.AddFileData("images/testimage.iwi", std::string(data.get(), fileSize)); + + Zone zone("MockZone", 0, GameId::IW3, GamePlatform::PC); + + MemoryManager memory; + AssetCreatorCollection creatorCollection(zone); + IgnoredAssetLookup ignoredAssetLookup; + AssetCreationContext context(zone, &creatorCollection, &ignoredAssetLookup); + + auto loader = image::CreateLoaderExternalIW3(memory, searchPath); + auto result = loader->CreateAsset("testimage", context); + REQUIRE(result.HasBeenSuccessful()); + + const auto* assetInfo = reinterpret_cast*>(result.GetAssetInfo()); + const auto* image = assetInfo->Asset(); + + REQUIRE(image->name == "testimage"s); + REQUIRE(image->width == 64); + REQUIRE(image->height == 64); + REQUIRE(image->depth == 1); + } +} // namespace diff --git a/test/ObjLoadingTests/Game/IW3/Image/TestImage.dds b/test/ObjLoadingTests/Game/IW3/Image/TestImage.dds new file mode 100644 index 0000000000000000000000000000000000000000..8705ec9d32facb000f43cc9228952ee8fd07bc1d GIT binary patch literal 2176 zcmc&#L1^1%6#i|mtez_Hp`+Jc3~3WX3N{{ccQ5mX>x~nBeCF z{nC5id++=He`x5dvuQ%er=F99L!>K%%dx)@KKMC{Uw(pXXmsSlkw1C<{uc0|Z~t#J z?O=RS5`>Dq6e7LNU4U2fgfIrc7h6cras2#F#iR!9!_Bw>o8-y-*z0Y`n+XX_L8h~jZC$ArKbD=$RWY4s3#+%=}TmZv4UPxx{Xk|q!-tPn8RhOG( z{`nI{>YyIlyz3s-)>Li0FW&Mtk-ROPl_Hca=i=w>RXb5Z$?Syl{9^S`^k(C(fU$YKkcujcd0^TckC zU(GAf1i~XOPfu@)TV;h=HINVLg}B&v^FQpnHh*rWx)c(n8vehYV%-j$`+7>3#qe_o;zahm$c=kvZNKjlY85BSZ6bWYD) zEIk^i)z;1fJb3DG5^_sh3Z*4Us-O;EI2=CH&MW+QBg3op)VXKoVnX#~7ZQmQ#mLwg zGh45xcw>#B-!XqC#WR(Oz;9p}7W&!gcDrd@+RsZ5Cjxt6K{&|≶4&ocS+G<`ACD7gix)g2m3dX;CO^5|$g%@69-1XG1 z#vpE(v|j-Alq}29v3fA>|GbF2I(1Ct_1+*z}IG;OBvt*spu_A1++=7ma-%;~YD6eb{+pL0?QtFJL{WPaY5_+h{>B z?q!|Cw3j2vq$tw+#mBN;b@peYIw9$;?Js#jN?I@xU{PNd;5`Hw3BD;1#^*cW)8X}T zXkuP5+1R{?ePP?t@(Nk7vEEJ`Pd1AE0IY*=QCtdP8Hg(dA49S8-9N?JDu?l@FNJTn LF%?U}#Ka6{9EyvqLZqN`)5(JDUq; zhhPjVcA=1tT+Bj(JP2qVWpQ+B4+ZB?R1ZR>uuHZWTj`;-%j%(LNq8)8mi1 zn%eQpmhC$h-^}DqA*Q~xE1G2(fp_aWUB>nbKvGA2TsMGsn=wHX)O>4 z_yHW655a*)QL^1sEHDU$Nz7pIiCmjzL_>vIWm^NG9pJJ?fXwggF0ul0M?2uVfZ)s5CCo) zxEIXNUUX8HXK9{z-v6Hdlpncv$ZsKR3TF0v`QdQAzHtuV{u2*F$T!AHIHM>^6@B=Z z$HUuhK@%sNSy6AK&px%6lX_onDVZ!&j806j^NmJYv^H4!9{Wd1{=7OB{1q(A!8|iQ zpO4n1^Stn2DtHi)q{IF{x&j^moG;(&;OqG~n8!$Fo6OZh2^8G~=*zMDqB!3ej4v@D z&DAQ}xqjUMxKr~IFWwWVD{IE;>jh0#z@YoISnA)T?!~_J9Q`%FWlw98)$6a#G$Atb z>Ff=89^KFBa;(EEl=$uiAr4eDQF?)OH`DtDi@0Uec>y%is;b5&8lgnsvl8;^>X^x^ zS5hrhoI?8jch-)PE^}XnZ zW228z7hV*v^I;02{`Fb84edL%lOwvmihRfNSXZF;9^za4(wCFR$I&N4Iqt-X_w+Al z%k4>=-?T=U7Vf8iB$HAm0dvFoFJ7cPFxFQm8n_Rm6ac8Y9&G5qPs7h}UUwVce{nfb zvfktv_t@3-&+Z!s2IER*3H6{qML?YHpaY?VpJRyau0~TSS*G6?p5uCS4&`DdA(@@s zuS7{nIWQIE&|ePVcL=Z&+$a*3=MVXGdHp-Iv9FwJZr{bZaGh!ejV!sSw_B$#7sGh~ m>JZx$SHdU*ajnR+6ua;JSFEoKSfA!n`gRxV6*SA*Ag=)DXbyY; literal 0 HcmV?d00001 diff --git a/test/ObjLoadingTests/Game/IW4/Image/ImageLoaderEmbeddedIW4Test.cpp b/test/ObjLoadingTests/Game/IW4/Image/ImageLoaderEmbeddedIW4Test.cpp new file mode 100644 index 00000000..cc7c3f46 --- /dev/null +++ b/test/ObjLoadingTests/Game/IW4/Image/ImageLoaderEmbeddedIW4Test.cpp @@ -0,0 +1,57 @@ +#include "Game/IW4/Image/ImageLoaderEmbeddedIW4.h" + +#include "Game/IW4/GameIW4.h" +#include "OatTestPaths.h" +#include "SearchPath/MockSearchPath.h" +#include "Utils/MemoryManager.h" + +#include +#include +#include +#include +#include + +namespace fs = std::filesystem; +using namespace IW4; +using namespace std::literals; + +namespace +{ + TEST_CASE("ImageLoaderEmbeddedIW4: Can parse dds", "[iw4][image]") + { + MockSearchPath searchPath; + + const auto filePath = oat::paths::GetTestDirectory() / "ObjLoadingTests/Game/IW4/Image/TestImage.dds"; + const auto fileSize = fs::file_size(filePath); + + std::ifstream file(filePath, std::ios::binary); + REQUIRE(file.is_open()); + + const auto data = std::make_unique(fileSize); + file.read(data.get(), fileSize); + + searchPath.AddFileData("images/_testimage.dds", std::string(data.get(), fileSize)); + + Zone zone("MockZone", 0, GameId::IW4, GamePlatform::PC); + + MemoryManager memory; + AssetCreatorCollection creatorCollection(zone); + IgnoredAssetLookup ignoredAssetLookup; + AssetCreationContext context(zone, &creatorCollection, &ignoredAssetLookup); + + auto loader = image::CreateLoaderEmbeddedIW4(memory, searchPath); + auto result = loader->CreateAsset("*testimage", context); + REQUIRE(result.HasBeenSuccessful()); + + const auto* assetInfo = reinterpret_cast*>(result.GetAssetInfo()); + const auto* image = assetInfo->Asset(); + + REQUIRE(image->name == "*testimage"s); + REQUIRE(image->width == 64); + REQUIRE(image->height == 64); + REQUIRE(image->depth == 1); + + REQUIRE(image->texture.loadDef); + REQUIRE(image->texture.loadDef->resourceSize > 0); + } +} // namespace diff --git a/test/ObjLoadingTests/Game/IW4/Image/ImageLoaderExternalIW4Test.cpp b/test/ObjLoadingTests/Game/IW4/Image/ImageLoaderExternalIW4Test.cpp new file mode 100644 index 00000000..fcedfe5f --- /dev/null +++ b/test/ObjLoadingTests/Game/IW4/Image/ImageLoaderExternalIW4Test.cpp @@ -0,0 +1,54 @@ +#include "Game/IW4/Image/ImageLoaderExternalIW4.h" + +#include "Game/IW4/GameIW4.h" +#include "OatTestPaths.h" +#include "SearchPath/MockSearchPath.h" +#include "Utils/MemoryManager.h" + +#include +#include +#include +#include +#include + +namespace fs = std::filesystem; +using namespace IW4; +using namespace std::literals; + +namespace +{ + TEST_CASE("ImageLoaderExternalIW4: Can parse iwi", "[iw4][image]") + { + MockSearchPath searchPath; + + const auto filePath = oat::paths::GetTestDirectory() / "ObjLoadingTests/Game/IW4/Image/TestImage.iwi"; + const auto fileSize = fs::file_size(filePath); + + std::ifstream file(filePath, std::ios::binary); + REQUIRE(file.is_open()); + + const auto data = std::make_unique(fileSize); + file.read(data.get(), fileSize); + + searchPath.AddFileData("images/testimage.iwi", std::string(data.get(), fileSize)); + + Zone zone("MockZone", 0, GameId::IW4, GamePlatform::PC); + + MemoryManager memory; + AssetCreatorCollection creatorCollection(zone); + IgnoredAssetLookup ignoredAssetLookup; + AssetCreationContext context(zone, &creatorCollection, &ignoredAssetLookup); + + auto loader = image::CreateLoaderExternalIW4(memory, searchPath); + auto result = loader->CreateAsset("testimage", context); + REQUIRE(result.HasBeenSuccessful()); + + const auto* assetInfo = reinterpret_cast*>(result.GetAssetInfo()); + const auto* image = assetInfo->Asset(); + + REQUIRE(image->name == "testimage"s); + REQUIRE(image->width == 64); + REQUIRE(image->height == 64); + REQUIRE(image->depth == 1); + } +} // namespace diff --git a/test/ObjLoadingTests/Game/IW4/Image/TestImage.dds b/test/ObjLoadingTests/Game/IW4/Image/TestImage.dds new file mode 100644 index 0000000000000000000000000000000000000000..8705ec9d32facb000f43cc9228952ee8fd07bc1d GIT binary patch literal 2176 zcmc&#L1^1%6#i|mtez_Hp`+Jc3~3WX3N{{ccQ5mX>x~nBeCF z{nC5id++=He`x5dvuQ%er=F99L!>K%%dx)@KKMC{Uw(pXXmsSlkw1C<{uc0|Z~t#J z?O=RS5`>Dq6e7LNU4U2fgfIrc7h6cras2#F#iR!9!_Bw>o8-y-*z0Y`n+XX_L8h~jZC$ArKbD=$RWY4s3#+%=}TmZv4UPxx{Xk|q!-tPn8RhOG( z{`nI{>YyIlyz3s-)>Li0FW&Mtk-ROPl_Hca=i=w>RXb5Z$?Syl{9^S`^k(C(fU$YKkcujcd0^TckC zU(GAf1i~XOPfu@)TV;h=HINVLg}B&v^FQpnHh*rWx)c(n8vehYV%-j$`+7>3#qe_o;zahm$c=kvZNKjlY85BSZ6bWYD) zEIk^i)z;1fJb3DG5^_sh3Z*4Us-O;EI2=CH&MW+QBg3op)VXKoVnX#~7ZQmQ#mLwg zGh45xcw>#B-!XqC#WR(Oz;9p}7W&!gcDrd@+RsZ5Cjxt6K{&|≶4&ocS+G<`ACD7gix)g2m3dX;CO^5|$g%@69-1XG1 z#vpE(v|j-Alq}29v3fA>|GbF2I(1Ct_1+*z}IG;OBvt*spu_A1++=7ma-%;~YD6eb{+pL0?QtFJL{WPaY5_+h{>B z?q!|Cw3j2vq$tw+#mBN;b@peYIw9$;?Js#jN?I@xU{PNd;5`Hw3BD;1#^*cW)8X}T zXkuP5+1R{?ePP?t@(Nk7vEEJ`Pd1AE0IY*=QCtdP8Hg(dA49S8-9N?JDu?l@FNJTn LF^ny8XAg<|H{rBK8D}S zd*6HS``(O*lRa)i2t#H}?ZcJ030vgJ!sE#C`Ly)f8i@4+G;J8nlKy7`!1V$lZXLjKj*{1(x%tq( zHMVa#SK`g99uL51P7srs8+uvQi}wcr1kK}RnQz~hCkrHF@Yf5$c;Wot=V>07$K9om z*{agk%ckW$65UMa3_hy7w#urh>;4bdcd~@(Wq^c+h;zB8Bbr}37aLB*UMQC(fGO4Q z_xk{B>JQ$A#}TsCkk3BcjV!gG`EntzK2PlR`L(9OwH;e#(zrKHxVWGI%3%ru1m2R$D&}@ZhNn7sqe|9ie|UIHd2I0 z$frFw|a~PMWdk^tFdg;wdV`He3!7O|1*hli` z)uq-1_HRlh?k3KsZ#bQlCjfoJ`p%uBJkZvc#_Ko_z32z1I4(?R!=0fQ*sojlYd>D_ z7tMD*#yNKC`m}vx!$3?G1kIv@oxfY;4`azOe0Rd6g_WSZ^mzZ#Ihk n0IWl3QCtpT8HlR|j-l9j?@O_^#$$ZyOY!#|jF(qUbDg{a96Jtz literal 0 HcmV?d00001 diff --git a/test/ObjLoadingTests/Game/IW5/Image/ImageLoaderEmbeddedIW5Test.cpp b/test/ObjLoadingTests/Game/IW5/Image/ImageLoaderEmbeddedIW5Test.cpp new file mode 100644 index 00000000..859478cb --- /dev/null +++ b/test/ObjLoadingTests/Game/IW5/Image/ImageLoaderEmbeddedIW5Test.cpp @@ -0,0 +1,57 @@ +#include "Game/IW5/Image/ImageLoaderEmbeddedIW5.h" + +#include "Game/IW5/GameIW5.h" +#include "OatTestPaths.h" +#include "SearchPath/MockSearchPath.h" +#include "Utils/MemoryManager.h" + +#include +#include +#include +#include +#include + +namespace fs = std::filesystem; +using namespace IW5; +using namespace std::literals; + +namespace +{ + TEST_CASE("ImageLoaderEmbeddedIW5: Can parse dds", "[iw5][image]") + { + MockSearchPath searchPath; + + const auto filePath = oat::paths::GetTestDirectory() / "ObjLoadingTests/Game/IW5/Image/TestImage.dds"; + const auto fileSize = fs::file_size(filePath); + + std::ifstream file(filePath, std::ios::binary); + REQUIRE(file.is_open()); + + const auto data = std::make_unique(fileSize); + file.read(data.get(), fileSize); + + searchPath.AddFileData("images/_testimage.dds", std::string(data.get(), fileSize)); + + Zone zone("MockZone", 0, GameId::IW5, GamePlatform::PC); + + MemoryManager memory; + AssetCreatorCollection creatorCollection(zone); + IgnoredAssetLookup ignoredAssetLookup; + AssetCreationContext context(zone, &creatorCollection, &ignoredAssetLookup); + + auto loader = image::CreateLoaderEmbeddedIW5(memory, searchPath); + auto result = loader->CreateAsset("*testimage", context); + REQUIRE(result.HasBeenSuccessful()); + + const auto* assetInfo = reinterpret_cast*>(result.GetAssetInfo()); + const auto* image = assetInfo->Asset(); + + REQUIRE(image->name == "*testimage"s); + REQUIRE(image->width == 64); + REQUIRE(image->height == 64); + REQUIRE(image->depth == 1); + + REQUIRE(image->texture.loadDef); + REQUIRE(image->texture.loadDef->resourceSize > 0); + } +} // namespace diff --git a/test/ObjLoadingTests/Game/IW5/Image/ImageLoaderExternalIW5Test.cpp b/test/ObjLoadingTests/Game/IW5/Image/ImageLoaderExternalIW5Test.cpp new file mode 100644 index 00000000..02fd3256 --- /dev/null +++ b/test/ObjLoadingTests/Game/IW5/Image/ImageLoaderExternalIW5Test.cpp @@ -0,0 +1,54 @@ +#include "Game/IW5/Image/ImageLoaderExternalIW5.h" + +#include "Game/IW5/GameIW5.h" +#include "OatTestPaths.h" +#include "SearchPath/MockSearchPath.h" +#include "Utils/MemoryManager.h" + +#include +#include +#include +#include +#include + +namespace fs = std::filesystem; +using namespace IW5; +using namespace std::literals; + +namespace +{ + TEST_CASE("ImageLoaderExternalIW5: Can parse iwi", "[iw5][image]") + { + MockSearchPath searchPath; + + const auto filePath = oat::paths::GetTestDirectory() / "ObjLoadingTests/Game/IW5/Image/TestImage.iwi"; + const auto fileSize = fs::file_size(filePath); + + std::ifstream file(filePath, std::ios::binary); + REQUIRE(file.is_open()); + + const auto data = std::make_unique(fileSize); + file.read(data.get(), fileSize); + + searchPath.AddFileData("images/testimage.iwi", std::string(data.get(), fileSize)); + + Zone zone("MockZone", 0, GameId::IW5, GamePlatform::PC); + + MemoryManager memory; + AssetCreatorCollection creatorCollection(zone); + IgnoredAssetLookup ignoredAssetLookup; + AssetCreationContext context(zone, &creatorCollection, &ignoredAssetLookup); + + auto loader = image::CreateLoaderExternalIW5(memory, searchPath); + auto result = loader->CreateAsset("testimage", context); + REQUIRE(result.HasBeenSuccessful()); + + const auto* assetInfo = reinterpret_cast*>(result.GetAssetInfo()); + const auto* image = assetInfo->Asset(); + + REQUIRE(image->name == "testimage"s); + REQUIRE(image->width == 64); + REQUIRE(image->height == 64); + REQUIRE(image->depth == 1); + } +} // namespace diff --git a/test/ObjLoadingTests/Game/IW5/Image/TestImage.dds b/test/ObjLoadingTests/Game/IW5/Image/TestImage.dds new file mode 100644 index 0000000000000000000000000000000000000000..8705ec9d32facb000f43cc9228952ee8fd07bc1d GIT binary patch literal 2176 zcmc&#L1^1%6#i|mtez_Hp`+Jc3~3WX3N{{ccQ5mX>x~nBeCF z{nC5id++=He`x5dvuQ%er=F99L!>K%%dx)@KKMC{Uw(pXXmsSlkw1C<{uc0|Z~t#J z?O=RS5`>Dq6e7LNU4U2fgfIrc7h6cras2#F#iR!9!_Bw>o8-y-*z0Y`n+XX_L8h~jZC$ArKbD=$RWY4s3#+%=}TmZv4UPxx{Xk|q!-tPn8RhOG( z{`nI{>YyIlyz3s-)>Li0FW&Mtk-ROPl_Hca=i=w>RXb5Z$?Syl{9^S`^k(C(fU$YKkcujcd0^TckC zU(GAf1i~XOPfu@)TV;h=HINVLg}B&v^FQpnHh*rWx)c(n8vehYV%-j$`+7>3#qe_o;zahm$c=kvZNKjlY85BSZ6bWYD) zEIk^i)z;1fJb3DG5^_sh3Z*4Us-O;EI2=CH&MW+QBg3op)VXKoVnX#~7ZQmQ#mLwg zGh45xcw>#B-!XqC#WR(Oz;9p}7W&!gcDrd@+RsZ5Cjxt6K{&|≶4&ocS+G<`ACD7gix)g2m3dX;CO^5|$g%@69-1XG1 z#vpE(v|j-Alq}29v3fA>|GbF2I(1Ct_1+*z}IG;OBvt*spu_A1++=7ma-%;~YD6eb{+pL0?QtFJL{WPaY5_+h{>B z?q!|Cw3j2vq$tw+#mBN;b@peYIw9$;?Js#jN?I@xU{PNd;5`Hw3BD;1#^*cW)8X}T zXkuP5+1R{?ePP?t@(Nk7vEEJ`Pd1AE0IY*=QCtdP8Hg(dA49S8-9N?JDu?l@FNJTn LF^ny8XAg<|H{rBK8D}S zd*6HS``(O*lRa)i2t#H}?ZcJ030vgJ!sE#C`Ly)f8i@4+G;J8nlKy7`!1V$lZXLjKj*{1(x%tq( zHMVa#SK`g99uL51P7srs8+uvQi}wcr1kK}RnQz~hCkrHF@Yf5$c;Wot=V>07$K9om z*{agk%ckW$65UMa3_hy7w#urh>;4bdcd~@(Wq^c+h;zB8Bbr}37aLB*UMQC(fGO4Q z_xk{B>JQ$A#}TsCkk3BcjV!gG`EntzK2PlR`L(9OwH;e#(zrKHxVWGI%3%ru1m2R$D&}@ZhNn7sqe|9ie|UIHd2I0 z$frFw|a~PMWdk^tFdg;wdV`He3!7O|1*hli` z)uq-1_HRlh?k3KsZ#bQlCjfoJ`p%uBJkZvc#_Ko_z32z1I4(?R!=0fQ*sojlYd>D_ z7tMD*#yNKC`m}vx!$3?G1kIv@oxfY;4`azOe0Rd6g_WSZ^mzZ#Ihk n0IWl3QCtpT8HlR|j-l9j?@O_^#$$ZyOY!#|jF(qUbDg{a96Jtz literal 0 HcmV?d00001 diff --git a/test/ObjLoadingTests/Game/T5/Image/ImageLoaderEmbeddedT5Test.cpp b/test/ObjLoadingTests/Game/T5/Image/ImageLoaderEmbeddedT5Test.cpp new file mode 100644 index 00000000..2a7a9e77 --- /dev/null +++ b/test/ObjLoadingTests/Game/T5/Image/ImageLoaderEmbeddedT5Test.cpp @@ -0,0 +1,57 @@ +#include "Game/T5/Image/ImageLoaderEmbeddedT5.h" + +#include "Game/T5/GameT5.h" +#include "OatTestPaths.h" +#include "SearchPath/MockSearchPath.h" +#include "Utils/MemoryManager.h" + +#include +#include +#include +#include +#include + +namespace fs = std::filesystem; +using namespace T5; +using namespace std::literals; + +namespace +{ + TEST_CASE("ImageLoaderEmbeddedT5: Can parse dds", "[t5][image]") + { + MockSearchPath searchPath; + + const auto filePath = oat::paths::GetTestDirectory() / "ObjLoadingTests/Game/T5/Image/TestImage.dds"; + const auto fileSize = fs::file_size(filePath); + + std::ifstream file(filePath, std::ios::binary); + REQUIRE(file.is_open()); + + const auto data = std::make_unique(fileSize); + file.read(data.get(), fileSize); + + searchPath.AddFileData("images/_testimage.dds", std::string(data.get(), fileSize)); + + Zone zone("MockZone", 0, GameId::T5, GamePlatform::PC); + + MemoryManager memory; + AssetCreatorCollection creatorCollection(zone); + IgnoredAssetLookup ignoredAssetLookup; + AssetCreationContext context(zone, &creatorCollection, &ignoredAssetLookup); + + auto loader = image::CreateLoaderEmbeddedT5(memory, searchPath); + auto result = loader->CreateAsset("*testimage", context); + REQUIRE(result.HasBeenSuccessful()); + + const auto* assetInfo = reinterpret_cast*>(result.GetAssetInfo()); + const auto* image = assetInfo->Asset(); + + REQUIRE(image->name == "*testimage"s); + REQUIRE(image->width == 64); + REQUIRE(image->height == 64); + REQUIRE(image->depth == 1); + + REQUIRE(image->texture.loadDef); + REQUIRE(image->texture.loadDef->resourceSize > 0); + } +} // namespace diff --git a/test/ObjLoadingTests/Game/T5/Image/ImageLoaderExternalT5Test.cpp b/test/ObjLoadingTests/Game/T5/Image/ImageLoaderExternalT5Test.cpp new file mode 100644 index 00000000..dea4c70a --- /dev/null +++ b/test/ObjLoadingTests/Game/T5/Image/ImageLoaderExternalT5Test.cpp @@ -0,0 +1,54 @@ +#include "Game/T5/Image/ImageLoaderExternalT5.h" + +#include "Game/T5/GameT5.h" +#include "OatTestPaths.h" +#include "SearchPath/MockSearchPath.h" +#include "Utils/MemoryManager.h" + +#include +#include +#include +#include +#include + +namespace fs = std::filesystem; +using namespace T5; +using namespace std::literals; + +namespace +{ + TEST_CASE("ImageLoaderExternalT5: Can parse iwi", "[t5][image]") + { + MockSearchPath searchPath; + + const auto filePath = oat::paths::GetTestDirectory() / "ObjLoadingTests/Game/T5/Image/TestImage.iwi"; + const auto fileSize = fs::file_size(filePath); + + std::ifstream file(filePath, std::ios::binary); + REQUIRE(file.is_open()); + + const auto data = std::make_unique(fileSize); + file.read(data.get(), fileSize); + + searchPath.AddFileData("images/testimage.iwi", std::string(data.get(), fileSize)); + + Zone zone("MockZone", 0, GameId::T5, GamePlatform::PC); + + MemoryManager memory; + AssetCreatorCollection creatorCollection(zone); + IgnoredAssetLookup ignoredAssetLookup; + AssetCreationContext context(zone, &creatorCollection, &ignoredAssetLookup); + + auto loader = image::CreateLoaderExternalT5(memory, searchPath); + auto result = loader->CreateAsset("testimage", context); + REQUIRE(result.HasBeenSuccessful()); + + const auto* assetInfo = reinterpret_cast*>(result.GetAssetInfo()); + const auto* image = assetInfo->Asset(); + + REQUIRE(image->name == "testimage"s); + REQUIRE(image->width == 64); + REQUIRE(image->height == 64); + REQUIRE(image->depth == 1); + } +} // namespace diff --git a/test/ObjLoadingTests/Game/T5/Image/TestImage.dds b/test/ObjLoadingTests/Game/T5/Image/TestImage.dds new file mode 100644 index 0000000000000000000000000000000000000000..8705ec9d32facb000f43cc9228952ee8fd07bc1d GIT binary patch literal 2176 zcmc&#L1^1%6#i|mtez_Hp`+Jc3~3WX3N{{ccQ5mX>x~nBeCF z{nC5id++=He`x5dvuQ%er=F99L!>K%%dx)@KKMC{Uw(pXXmsSlkw1C<{uc0|Z~t#J z?O=RS5`>Dq6e7LNU4U2fgfIrc7h6cras2#F#iR!9!_Bw>o8-y-*z0Y`n+XX_L8h~jZC$ArKbD=$RWY4s3#+%=}TmZv4UPxx{Xk|q!-tPn8RhOG( z{`nI{>YyIlyz3s-)>Li0FW&Mtk-ROPl_Hca=i=w>RXb5Z$?Syl{9^S`^k(C(fU$YKkcujcd0^TckC zU(GAf1i~XOPfu@)TV;h=HINVLg}B&v^FQpnHh*rWx)c(n8vehYV%-j$`+7>3#qe_o;zahm$c=kvZNKjlY85BSZ6bWYD) zEIk^i)z;1fJb3DG5^_sh3Z*4Us-O;EI2=CH&MW+QBg3op)VXKoVnX#~7ZQmQ#mLwg zGh45xcw>#B-!XqC#WR(Oz;9p}7W&!gcDrd@+RsZ5Cjxt6K{&|≶4&ocS+G<`ACD7gix)g2m3dX;CO^5|$g%@69-1XG1 z#vpE(v|j-Alq}29v3fA>|GbF2I(1Ct_1+*z}IG;OBvt*spu_A1++=7ma-%;~YD6eb{+pL0?QtFJL{WPaY5_+h{>B z?q!|Cw3j2vq$tw+#mBN;b@peYIw9$;?Js#jN?I@xU{PNd;5`Hw3BD;1#^*cW)8X}T zXkuP5+1R{?ePP?t@(Nk7vEEJ`Pd1AE0IY*=QCtdP8Hg(dA49S8-9N?JDu?l@FNJTn LF>-#2Wx|Vtoy`Ta zhhPjXcA=1tyqJXqc@WS#%Hrs$eJD5&MfD(53VTUd7%r3`)5gBLpIZ|XnzH@~)q~H& zC*OO{z2|%ym8LkB5r{xMgg!&3J8IT zV2>Zz?u|t2rq>HFmKUW|_Ks1}jMDu<08#h)IQG-e<;fz+n!@d3C{eup=VjW*<7ImM zF;`PNe%Z2pC*qr#yeY)gS9V3S3?p#7zO!X)uK*-5WC_E+$%g=N z$H2W{e)gi1vOG)k#Pj}l^r!sD^+SFOVN)=(7s`)@>-CNE01uve7(#w9R>B!YQL5;} ze?1=Fb_<#~+02T1BYp0fy`0qha!bi%nPPNef}L+P(xSD&()ZZEQ}S2Uso)=ASq|oz z@%enTE}iGahf~3Wh$J2M|HT#X0N_ITeg|LA$H6>CGTUUX7D}M#CO}_~-516A#$bGj z0coyQ(a!hl2Eg5#mw54>KwVigR$nh@vH}L(r^QnLCUr0NrRV6c`7L`|ldN8UZKes4 zkxyrD$n)ra&X!{xUZKQKF9~s=qKVQ=th<@sH(10io6ZZMkyceTHqi(r0$-MpS69bO zUcIK8GxW&7l@cy3j-_nvKW8H%0^Y!M9-Zw-AC{drkh1XG@Yeifmsju%v zHyj&%jJoimc%2VZ5cTiQ$!%!gt(_jx^;P6MmdCmRz4s8`;+MXhJU)&-8Om{|PQ9al zL0fK5;{2vH!nANd{Ue!_G6|R)&VT6=<$CHx#iY +#include +#include +#include +#include + +namespace fs = std::filesystem; +using namespace T6; +using namespace std::literals; + +namespace +{ + TEST_CASE("ImageLoaderEmbeddedT6: Can parse dds", "[t6][image]") + { + MockSearchPath searchPath; + + const auto filePath = oat::paths::GetTestDirectory() / "ObjLoadingTests/Game/T6/Image/TestImage.dds"; + const auto fileSize = fs::file_size(filePath); + + std::ifstream file(filePath, std::ios::binary); + REQUIRE(file.is_open()); + + const auto data = std::make_unique(fileSize); + file.read(data.get(), fileSize); + + searchPath.AddFileData("images/_testimage.dds", std::string(data.get(), fileSize)); + + Zone zone("MockZone", 0, GameId::T6, GamePlatform::PC); + + MemoryManager memory; + AssetCreatorCollection creatorCollection(zone); + IgnoredAssetLookup ignoredAssetLookup; + AssetCreationContext context(zone, &creatorCollection, &ignoredAssetLookup); + + auto loader = image::CreateLoaderEmbeddedT6(memory, searchPath); + auto result = loader->CreateAsset("*testimage", context); + REQUIRE(result.HasBeenSuccessful()); + + const auto* assetInfo = reinterpret_cast*>(result.GetAssetInfo()); + const auto* image = assetInfo->Asset(); + + REQUIRE(image->name == "*testimage"s); + REQUIRE(image->width == 64); + REQUIRE(image->height == 64); + REQUIRE(image->depth == 1); + REQUIRE(image->streamedPartCount == 0); + + REQUIRE(image->texture.loadDef); + REQUIRE(image->texture.loadDef->resourceSize > 0); + } +} // namespace diff --git a/test/ObjLoadingTests/Game/T6/Image/ImageLoaderExternalT6Test.cpp b/test/ObjLoadingTests/Game/T6/Image/ImageLoaderExternalT6Test.cpp new file mode 100644 index 00000000..077aecbe --- /dev/null +++ b/test/ObjLoadingTests/Game/T6/Image/ImageLoaderExternalT6Test.cpp @@ -0,0 +1,57 @@ +#include "Game/T6/Image/ImageLoaderExternalT6.h" + +#include "Game/T6/GameT6.h" +#include "OatTestPaths.h" +#include "SearchPath/MockSearchPath.h" +#include "Utils/MemoryManager.h" + +#include +#include +#include +#include +#include + +namespace fs = std::filesystem; +using namespace T6; +using namespace std::literals; + +namespace +{ + TEST_CASE("ImageLoaderExternalT6: Can parse iwi", "[t6][image]") + { + MockSearchPath searchPath; + + const auto filePath = oat::paths::GetTestDirectory() / "ObjLoadingTests/Game/T6/Image/TestImage.iwi"; + const auto fileSize = fs::file_size(filePath); + + std::ifstream file(filePath, std::ios::binary); + REQUIRE(file.is_open()); + + const auto data = std::make_unique(fileSize); + file.read(data.get(), fileSize); + + searchPath.AddFileData("images/testimage.iwi", std::string(data.get(), fileSize)); + + Zone zone("MockZone", 0, GameId::T6, GamePlatform::PC); + + MemoryManager memory; + AssetCreatorCollection creatorCollection(zone); + IgnoredAssetLookup ignoredAssetLookup; + AssetCreationContext context(zone, &creatorCollection, &ignoredAssetLookup); + + auto loader = image::CreateLoaderExternalT6(memory, searchPath); + auto result = loader->CreateAsset("testimage", context); + REQUIRE(result.HasBeenSuccessful()); + + const auto* assetInfo = reinterpret_cast*>(result.GetAssetInfo()); + const auto* image = assetInfo->Asset(); + + REQUIRE(image->name == "testimage"s); + REQUIRE(image->width == 64); + REQUIRE(image->height == 64); + REQUIRE(image->depth == 1); + REQUIRE(image->streamedPartCount == 1); + REQUIRE(image->streamedParts[0].levelSize == 2112); + REQUIRE(image->streamedParts[0].hash == (0x386422F2 & 0x1FFFFFFF)); + } +} // namespace diff --git a/test/ObjLoadingTests/Game/T6/Image/TestImage.dds b/test/ObjLoadingTests/Game/T6/Image/TestImage.dds new file mode 100644 index 0000000000000000000000000000000000000000..8705ec9d32facb000f43cc9228952ee8fd07bc1d GIT binary patch literal 2176 zcmc&#L1^1%6#i|mtez_Hp`+Jc3~3WX3N{{ccQ5mX>x~nBeCF z{nC5id++=He`x5dvuQ%er=F99L!>K%%dx)@KKMC{Uw(pXXmsSlkw1C<{uc0|Z~t#J z?O=RS5`>Dq6e7LNU4U2fgfIrc7h6cras2#F#iR!9!_Bw>o8-y-*z0Y`n+XX_L8h~jZC$ArKbD=$RWY4s3#+%=}TmZv4UPxx{Xk|q!-tPn8RhOG( z{`nI{>YyIlyz3s-)>Li0FW&Mtk-ROPl_Hca=i=w>RXb5Z$?Syl{9^S`^k(C(fU$YKkcujcd0^TckC zU(GAf1i~XOPfu@)TV;h=HINVLg}B&v^FQpnHh*rWx)c(n8vehYV%-j$`+7>3#qe_o;zahm$c=kvZNKjlY85BSZ6bWYD) zEIk^i)z;1fJb3DG5^_sh3Z*4Us-O;EI2=CH&MW+QBg3op)VXKoVnX#~7ZQmQ#mLwg zGh45xcw>#B-!XqC#WR(Oz;9p}7W&!gcDrd@+RsZ5Cjxt6K{&|≶4&ocS+G<`ACD7gix)g2m3dX;CO^5|$g%@69-1XG1 z#vpE(v|j-Alq}29v3fA>|GbF2I(1Ct_1+*z}IG;OBvt*spu_A1++=7ma-%;~YD6eb{+pL0?QtFJL{WPaY5_+h{>B z?q!|Cw3j2vq$tw+#mBN;b@peYIw9$;?Js#jN?I@xU{PNd;5`Hw3BD;1#^*cW)8X}T zXkuP5+1R{?ePP?t@(Nk7vEEJ`Pd1AE0IY*=QCtdP8Hg(dA49S8-9N?JDu?l@FNJTn LF5r{xMhN!mhqv8=CQdf9qTWcKe`YTy^}gIvGFhe=otR+f8;!JRZLst^_OF!ud37rIJ6M*3 zer9|=AB{`Iz$4Khy zd(jQYMjc~axG3KG!xTjQoAYuT+IMTGM|6D^`Htl=u0Z!5;xT&Z%gN*8sFR@_ck0v! z@)xw__9XUiS|dyg=hHuuNhy+2H@oQF{g090LiV>$54@C)qMy~dAU zUJaD2cRt2BcI*0Q`^JI6xRP1IdQhJtAWnDCfl$KFF~oLPqp6fE)BAJF9+}*0*nOT775GqhkUxc{vFzwS57sz?_poKPPBqXmRzj28>cT9 p!+rqPA+{;5gs}|7wIa__?0)xOvA!-~eCkW-`(2Dz&@5|%yaDxp4z&OP literal 0 HcmV?d00001