from pathlib import Path ROOT = Path(__file__).resolve().parents[1] FILES = { "AgrarianInventoryComponent.h": ROOT / "Source" / "AgrarianGame" / "AgrarianInventoryComponent.h", "AgrarianInventoryComponent.cpp": ROOT / "Source" / "AgrarianGame" / "AgrarianInventoryComponent.cpp", "AgrarianGamePlayerController.h": ROOT / "Source" / "AgrarianGame" / "AgrarianGamePlayerController.h", "AgrarianGamePlayerController.cpp": ROOT / "Source" / "AgrarianGame" / "AgrarianGamePlayerController.cpp", "TechnicalDesignDocument.md": ROOT / "Docs" / "TechnicalDesignDocument.md", "InventoryDataModel.md": ROOT / "Docs" / "InventoryDataModel.md", "AGRARIAN_DEVELOPMENT_ROADMAP.md": ROOT / "AGRARIAN_DEVELOPMENT_ROADMAP.md", } EXPECTED = { "AgrarianInventoryComponent.h": [ "bool SplitStackByIndex(int32 StackIndex, int32 SplitQuantity);", "void ServerSplitStackByIndex(int32 StackIndex, int32 SplitQuantity);", ], "AgrarianInventoryComponent.cpp": [ "bool UAgrarianInventoryComponent::SplitStackByIndex", "Items.IsValidIndex(StackIndex)", "Items.Num() >= MaxSlots", "SplitQuantity >= SourceStack.Quantity", "FAgrarianItemStack SplitStack = SourceStack;", "SplitStack.Quantity = SplitQuantity;", "SourceStack.Quantity -= SplitQuantity;", "Items.Add(SplitStack);", "BroadcastInventoryChanged();", "void UAgrarianInventoryComponent::ServerSplitStackByIndex_Implementation", ], "AgrarianGamePlayerController.h": [ "void AgrarianSplitStack(int32 StackIndex, int32 SplitQuantity);", "void ServerAgrarianSplitStack(int32 StackIndex, int32 SplitQuantity);", ], "AgrarianGamePlayerController.cpp": [ "void AAgrarianGamePlayerController::AgrarianSplitStack(int32 StackIndex, int32 SplitQuantity)", "Usage: AgrarianSplitStack ", "ServerAgrarianSplitStack(StackIndex, SplitQuantity);", "void AAgrarianGamePlayerController::ServerAgrarianSplitStack_Implementation", "InventoryComponent->SplitStackByIndex(StackIndex, SplitQuantity)", "Split %d items from stack %d.", ], "TechnicalDesignDocument.md": [ "`AgrarianSplitStack StackIndex SplitQuantity`", "creates a separate inventory slot", "does not re-merge", ], "InventoryDataModel.md": [ "Stack splitting:", "server moves a requested quantity into a new stack when slots", ], "AGRARIAN_DEVELOPMENT_ROADMAP.md": [ "[x] Add stack splitting.", ], } def main(): missing = [] for label, path in FILES.items(): text = path.read_text(encoding="utf-8") for snippet in EXPECTED[label]: if snippet not in text: missing.append(f"{label}: {snippet}") if missing: raise RuntimeError("Stack splitting verification failed: " + "; ".join(missing)) print("Agrarian stack splitting verification complete.") if __name__ == "__main__": main()