diff --git a/test/SystemTests/Game/T6/ExtendAndDereference/CombinedZoneT6.zone b/test/SystemTests/Game/T6/ExtendAndDereference/CombinedZoneT6.zone new file mode 100644 index 00000000..eb46c78d --- /dev/null +++ b/test/SystemTests/Game/T6/ExtendAndDereference/CombinedZoneT6.zone @@ -0,0 +1,4 @@ +>game,T6 + +techniqueset,trivial_floatz_2992w610 +material,test diff --git a/test/SystemTests/Game/T6/ExtendAndDereference/README.md b/test/SystemTests/Game/T6/ExtendAndDereference/README.md new file mode 100644 index 00000000..545ba1de --- /dev/null +++ b/test/SystemTests/Game/T6/ExtendAndDereference/README.md @@ -0,0 +1,9 @@ +# Extend and dereference system test + +This makes sure that when reusing assets from an existing zone, asset dependencies that are references can be overwritten to be non-references. + +In this case: + +- The zone `ZoneWithTechsetT6` contains the techniqueset `trivial_floatz_2992w610` +- The zone `ZoneWithMaterialT6` contains the material `test` and with a reference to its techniqueset `,trivial_floatz_2992w610` +- The final zone `CombinedZoneT6` is built while loading both of the other fastfile and is expected to contain both the material `test` with a reference to a (actual asset, not a reference) techniqueset `trivial_floatz_2992w610` diff --git a/test/SystemTests/Game/T6/ExtendAndDereference/ZoneWithMaterialT6.zone b/test/SystemTests/Game/T6/ExtendAndDereference/ZoneWithMaterialT6.zone new file mode 100644 index 00000000..f29d47a8 --- /dev/null +++ b/test/SystemTests/Game/T6/ExtendAndDereference/ZoneWithMaterialT6.zone @@ -0,0 +1,4 @@ +>game,T6 + +ignore,ZoneWithTechsetT6 +material,test diff --git a/test/SystemTests/Game/T6/ExtendAndDereference/ZoneWithTechsetT6.ff b/test/SystemTests/Game/T6/ExtendAndDereference/ZoneWithTechsetT6.ff new file mode 100644 index 00000000..096666cc Binary files /dev/null and b/test/SystemTests/Game/T6/ExtendAndDereference/ZoneWithTechsetT6.ff differ diff --git a/test/SystemTests/Game/T6/ExtendAndDereference/ZoneWithTechsetT6.zone b/test/SystemTests/Game/T6/ExtendAndDereference/ZoneWithTechsetT6.zone new file mode 100644 index 00000000..dfd78e4e --- /dev/null +++ b/test/SystemTests/Game/T6/ExtendAndDereference/ZoneWithTechsetT6.zone @@ -0,0 +1,3 @@ +>game,T6 + +techniqueset,trivial_floatz_2992w610 diff --git a/test/SystemTests/Game/T6/ExtendAndDereference/materials/test.json b/test/SystemTests/Game/T6/ExtendAndDereference/materials/test.json new file mode 100644 index 00000000..4ec3e470 --- /dev/null +++ b/test/SystemTests/Game/T6/ExtendAndDereference/materials/test.json @@ -0,0 +1,77 @@ +{ + "$schema": "http://openassettools.dev/schema/material.v1.json", + "_game": "t6", + "_type": "material", + "_version": 1, + "cameraRegion": "none", + "constants": [], + "contents": 1, + "gameFlags": [], + "layeredSurfaceTypes": 536870912, + "sortKey": 4, + "stateBits": [ + { + "alphaTest": "disabled", + "blendOpAlpha": "disabled", + "blendOpRgb": "disabled", + "colorWriteAlpha": true, + "colorWriteRgb": true, + "cullFace": "back", + "depthTest": "disabled", + "depthWrite": false, + "dstBlendAlpha": "zero", + "dstBlendRgb": "zero", + "polygonOffset": "offset0", + "polymodeLine": false, + "srcBlendAlpha": "one", + "srcBlendRgb": "one" + } + ], + "stateBitsEntry": [ + -1, + -1, + 0, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1 + ], + "stateFlags": 0, + "surfaceFlags": 0, + "surfaceTypeBits": 0, + "techniqueSet": "trivial_floatz_2992w610", + "textureAtlas": { + "columns": 1, + "rows": 1 + }, + "textures": [] +} diff --git a/test/SystemTests/Game/T6/ExtendAndDereferenceT6.cpp b/test/SystemTests/Game/T6/ExtendAndDereferenceT6.cpp new file mode 100644 index 00000000..22eb208b --- /dev/null +++ b/test/SystemTests/Game/T6/ExtendAndDereferenceT6.cpp @@ -0,0 +1,119 @@ +#include "Game/T6/GameAssetPoolT6.h" +#include "Linker.h" +#include "OatTestPaths.h" +#include "SystemTestsPaths.h" +#include "ZoneLoading.h" + +#include +#include +#include +#include +#include + +namespace fs = std::filesystem; +using namespace std::literals; + +namespace +{ + void BuildZoneWithMaterial(const fs::path& testDir, const fs::path& outputPath) + { + const auto testDirStr = testDir.string(); + const auto outputPathStr = outputPath.string(); + + const char* argStrings[]{ + "SystemTests", // bin + "--verbose", + "--asset-search-path", + testDirStr.c_str(), + "--source-search-path", + testDirStr.c_str(), + "--output-folder", + outputPathStr.c_str(), + "ZoneWithMaterialT6", + }; + + LinkerArgs args; + + bool shouldContinue = true; + const auto couldParseArgs = args.ParseArgs(std::extent_v, argStrings, shouldContinue); + + REQUIRE(couldParseArgs); + REQUIRE(shouldContinue); + + const auto linker = Linker::Create(std::move(args)); + const auto linkerResult = linker->Start(); + + REQUIRE(linkerResult); + } + + void BuildCombinedZone(const fs::path& testDir, const fs::path& outputPath) + { + const auto testDirStr = testDir.string(); + const auto outputPathStr = outputPath.string(); + + const auto zoneWithTechsetPathStr = (testDir / "ZoneWithTechsetT6.ff").string(); + const auto zoneWithMaterialPathStr = (outputPath / "ZoneWithMaterialT6.ff").string(); + + const char* argStrings[]{ + "SystemTests", // bin + "--verbose", + "--load", + zoneWithTechsetPathStr.c_str(), + "--load", + zoneWithMaterialPathStr.c_str(), + "--source-search-path", + testDirStr.c_str(), + "--output-folder", + outputPathStr.c_str(), + "CombinedZoneT6", + }; + + LinkerArgs args; + + bool shouldContinue = true; + const auto couldParseArgs = args.ParseArgs(std::extent_v, argStrings, shouldContinue); + + REQUIRE(couldParseArgs); + REQUIRE(shouldContinue); + + const auto linker = Linker::Create(std::move(args)); + const auto linkerResult = linker->Start(); + + REQUIRE(linkerResult); + } + + void CheckCombinedZoneContent(const fs::path& outputPath) + { + const auto expectedZonePath = (fs::path(outputPath) / "CombinedZoneT6.ff").string(); + auto maybeZone = ZoneLoading::LoadZone(expectedZonePath, std::nullopt); + REQUIRE(maybeZone); + + auto zone = std::move(*maybeZone); + auto pools = dynamic_cast(zone->m_pools.get()); + + REQUIRE(zone->m_game_id == GameId::T6); + REQUIRE(zone->m_platform == GamePlatform::PC); + REQUIRE(zone->m_name == "CombinedZoneT6"); + REQUIRE(pools->GetTotalAssetCount() == 2); + REQUIRE(pools->m_technique_set->GetAsset("trivial_floatz_2992w610")); + + const auto* material = pools->m_material->GetAsset("test"); + REQUIRE(material); + REQUIRE(material->Asset()->techniqueSet); + REQUIRE(material->Asset()->techniqueSet->name == "trivial_floatz_2992w610"s); + REQUIRE(material->Asset()->techniqueSet->techniques[T6::TECHNIQUE_UNLIT]); + } + + // x64 for now produces invalid zones, don't try to load them yet +#ifdef ARCH_x86 + TEST_CASE("Extend and dereference(T6)", "[t6][system][simple]") + { + const auto testDir = oat::paths::GetSystemTestsDirectory() / "Game/T6/ExtendAndDereference"; + const auto outputPath = oat::paths::GetTempDirectory("ExtendAndDereferenceT6"); + + BuildZoneWithMaterial(testDir, outputPath); + BuildCombinedZone(testDir, outputPath); + CheckCombinedZoneContent(outputPath); + } +#endif +} // namespace