From 4ac635b3a18730991f99d9b388568fdf9f2b8f4e Mon Sep 17 00:00:00 2001 From: "[DEV]PolyakovDanil" Date: Mon, 7 Sep 2026 18:39:39 +0700 Subject: [PATCH] docs: anonymise project asset names in source comments Measured figures are kept; only the studio-specific level and asset names are generalised, and the Perforce rationale is reworded to describe the class of setups rather than this one project. Co-Authored-By: Claude Code --- .../Private/AssetDependencyClosure.cpp | 4 +-- .../Private/AssetImporter.cpp | 2 +- .../Private/AssetUsageExporter.cpp | 2 +- .../Private/LevelUsageResolver.cpp | 4 +-- .../Public/AssetDependencyClosure.h | 4 +-- .../Public/AssetUsageAuditTypes.h | 6 ++--- .../Public/AssetUsagePaths.h | 2 +- .../Public/IndirectReferenceScanner.h | 4 +-- .../Public/LevelUsageResolver.h | 6 ++--- .../Private/AssetUsageAuditSettings.cpp | 4 +-- .../Private/SAssetDeleteDialog.cpp | 2 +- .../Private/SAssetUsageAuditPanel.cpp | 2 +- .../Public/AssetUsageAuditLibrary.h | 2 +- .../Public/AssetUsageAuditSettings.h | 2 +- .../Private/AssetDeletionScan.spec.cpp | 2 +- .../Private/AssetDependencyClosure.spec.cpp | 4 +-- .../Private/AssetUsageExporterLive.spec.cpp | 4 +-- .../Private/AssetUsagePaths.spec.cpp | 22 ++++++++-------- .../Private/AssetUsageReportWriter.spec.cpp | 14 +++++----- .../Private/AssetUsageVerdict.spec.cpp | 6 ++--- .../Private/IndirectReferenceScanner.spec.cpp | 26 +++++++++---------- 21 files changed, 62 insertions(+), 62 deletions(-) diff --git a/Source/AssetUsageAuditCore/Private/AssetDependencyClosure.cpp b/Source/AssetUsageAuditCore/Private/AssetDependencyClosure.cpp index c2ea1a3..7563f46 100644 --- a/Source/AssetUsageAuditCore/Private/AssetDependencyClosure.cpp +++ b/Source/AssetUsageAuditCore/Private/AssetDependencyClosure.cpp @@ -252,8 +252,8 @@ namespace AssetDependencyClosure // comes from a level or from one of its external actor packages - the shape a // streaming sublevel or a Level Instance actually has. A World named by an ordinary // asset is a different location that happens to be mentioned, and following it - // exports someone else's map: measured on WP_Main, the chain - // BP_FirstPersonGameMode -> PDA_MenuSystemConfig -> L_MainLevel accounts for 9994 + // exports someone else's map: measured on WP_Example, the chain + // BP_GameMode -> PDA_MenuConfig -> L_Other accounts for 9994 // packages. FLevelUsageResolver applies the same rule; the two must not disagree // about the same graph. if (IsLevelPackage(Dependency)) diff --git a/Source/AssetUsageAuditCore/Private/AssetImporter.cpp b/Source/AssetUsageAuditCore/Private/AssetImporter.cpp index 27288a5..5ba5d9e 100644 --- a/Source/AssetUsageAuditCore/Private/AssetImporter.cpp +++ b/Source/AssetUsageAuditCore/Private/AssetImporter.cpp @@ -146,7 +146,7 @@ namespace AssetImporter continue; } - // This project is Perforce-primary, so an existing target is very likely read-only. + // Perforce-primary projects keep unopened files read-only, so an existing target is very likely read-only. // Without clearing the flag the copy fails with an error that reads like a permissions // problem rather than "the file is not checked out". if (bTargetOnDisk && FileManager.IsReadOnly(*DestinationPath)) diff --git a/Source/AssetUsageAuditCore/Private/AssetUsageExporter.cpp b/Source/AssetUsageAuditCore/Private/AssetUsageExporter.cpp index b10f871..a477963 100644 --- a/Source/AssetUsageAuditCore/Private/AssetUsageExporter.cpp +++ b/Source/AssetUsageAuditCore/Private/AssetUsageExporter.cpp @@ -536,7 +536,7 @@ FAssetUsageExporter::FResult FAssetUsageExporter::CopyExpandedPackages(const TAr const bool bWasPresent = FileManager.FileExists(*DestinationPath); - // This repository is Perforce-primary, so the source .uasset is very often read-only on + // Perforce-primary repositories keep unopened files read-only, so the source .uasset is very often read-only on // disk. Windows CopyFile carries that attribute across, which would make the export folder // read-only too - and then an Overwrite-policy re-export fails on its own previous output. // Clear the flag on both ends of the problem: before writing over an existing file, and diff --git a/Source/AssetUsageAuditCore/Private/LevelUsageResolver.cpp b/Source/AssetUsageAuditCore/Private/LevelUsageResolver.cpp index cf39d2f..1a4c14f 100644 --- a/Source/AssetUsageAuditCore/Private/LevelUsageResolver.cpp +++ b/Source/AssetUsageAuditCore/Private/LevelUsageResolver.cpp @@ -243,8 +243,8 @@ void FLevelUsageResolver::TraverseLevel(int32 LevelIndex, const FLevelUsageResol } // Reaching another World is NOT automatically a sublevel. An earlier version assumed it - // was, and on WP_Main that assumption pulled the whole of L_MainLevel in through - // BP_FirstPersonGameMode -> PDA_MenuSystemConfig: 9994 of 18136 rows belonged to a + // was, and on WP_Example that assumption pulled the whole of L_Other in through + // BP_GameMode -> PDA_MenuConfig: 9994 of 18136 rows belonged to a // different map. A crossing only counts when the reference comes from the level package // itself or from one of its external actor packages, which is the shape a streaming // sublevel or a Level Instance actually has. diff --git a/Source/AssetUsageAuditCore/Public/AssetDependencyClosure.h b/Source/AssetUsageAuditCore/Public/AssetDependencyClosure.h index b91830f..f25ad4c 100644 --- a/Source/AssetUsageAuditCore/Public/AssetDependencyClosure.h +++ b/Source/AssetUsageAuditCore/Public/AssetDependencyClosure.h @@ -73,8 +73,8 @@ namespace AssetDependencyClosure * Maps reached through an ordinary asset rather than through a level, and therefore not * followed - nor included. * - * The same rule FLevelUsageResolver applies, and for the same measured reason: on WP_Main - * the chain BP_FirstPersonGameMode -> PDA_MenuSystemConfig -> L_MainLevel drags in 9994 + * The same rule FLevelUsageResolver applies, and for the same measured reason: on WP_Example + * the chain BP_GameMode -> PDA_MenuConfig -> L_Other drags in 9994 * packages belonging to a different map. Without this the export dialog would quote an * honest number for a wrong set. * diff --git a/Source/AssetUsageAuditCore/Public/AssetUsageAuditTypes.h b/Source/AssetUsageAuditCore/Public/AssetUsageAuditTypes.h index 733b258..b296656 100644 --- a/Source/AssetUsageAuditCore/Public/AssetUsageAuditTypes.h +++ b/Source/AssetUsageAuditCore/Public/AssetUsageAuditTypes.h @@ -139,7 +139,7 @@ enum class EExportCollisionPolicy : uint8 */ struct ASSETUSAGEAUDITCORE_API FAssetUsageRow { - /** Package name, e.g. /Game/Space/Art/SM_Rock. */ + /** Package name, e.g. /Game/Art/SM_Rock. */ FName PackageName; /** Asset name without path. */ @@ -154,7 +154,7 @@ struct ASSETUSAGEAUDITCORE_API FAssetUsageRow */ FTopLevelAssetPath GeneratedClassPath; - /** Path relative to the project root, e.g. Content/Space/Art/SM_Rock.uasset. */ + /** Path relative to the project root, e.g. Content/Art/SM_Rock.uasset. */ FString PathFromProjectRoot; EAssetUsageVerdict Verdict = EAssetUsageVerdict::Unknown; @@ -172,7 +172,7 @@ struct ASSETUSAGEAUDITCORE_API FAssetUsageRow /** * Human-readable chain explaining the verdict, e.g. - * "WP_Main -> __ExternalActors__/.../A2B -> BP_Rock -> SM_Rock". + * "WP_Example -> __ExternalActors__/.../A2B -> BP_Rock -> SM_Rock". * A verdict without a route is unactionable for an artist. */ FString Route; diff --git a/Source/AssetUsageAuditCore/Public/AssetUsagePaths.h b/Source/AssetUsageAuditCore/Public/AssetUsagePaths.h index b47fc2c..d0353fc 100644 --- a/Source/AssetUsageAuditCore/Public/AssetUsagePaths.h +++ b/Source/AssetUsageAuditCore/Public/AssetUsagePaths.h @@ -51,7 +51,7 @@ namespace AssetUsagePaths /** * Package name to a path relative to the project root, as the report requires. - * "/Game/Space/Art/SM_Rock" -> "Content/Space/Art/SM_Rock.uasset" + * "/Game/Art/SM_Rock" -> "Content/Art/SM_Rock.uasset" * * @param bIsLevel Chooses the .umap extension over .uasset. * @return Empty for packages with no project-relative form, e.g. /Script or /Engine. diff --git a/Source/AssetUsageAuditCore/Public/IndirectReferenceScanner.h b/Source/AssetUsageAuditCore/Public/IndirectReferenceScanner.h index a7bf58a..d2a350c 100644 --- a/Source/AssetUsageAuditCore/Public/IndirectReferenceScanner.h +++ b/Source/AssetUsageAuditCore/Public/IndirectReferenceScanner.h @@ -9,7 +9,7 @@ */ struct FIndirectReference { - /** Package name the literal resolved to, e.g. /Game/Space/Core/GameModes/BP_FirstPersonGameMode. */ + /** Package name the literal resolved to, e.g. /Game/Core/GameModes/BP_GameMode. */ FName PackageName; /** Absolute path of the file the literal was found in. */ @@ -28,7 +28,7 @@ struct FIndirectReference * Finds asset paths referenced from text rather than from a package. * * This exists because of a concrete, measured failure mode on this project: Config/DefaultEngine.ini - * names BP_FirstPersonGameMode, BP_MenuSystemGameInstance, RefinedMenuMap and Gyms_Geoda as plain + * names BP_GameMode, BP_MenuGameInstance, RefinedMenuMap and Gyms_Geoda as plain * strings. No asset references them, so the Asset Registry reports zero referencers and a naive * audit calls the project's GameMode unused. * diff --git a/Source/AssetUsageAuditCore/Public/LevelUsageResolver.h b/Source/AssetUsageAuditCore/Public/LevelUsageResolver.h index 543def5..eca710f 100644 --- a/Source/AssetUsageAuditCore/Public/LevelUsageResolver.h +++ b/Source/AssetUsageAuditCore/Public/LevelUsageResolver.h @@ -37,8 +37,8 @@ struct FLevelUsageResolveOptions * * Off by default, and that default is load-bearing. A map does not only reference its own * sublevels: anything it can reach may name an unrelated map, and on this project it does. - * WP_Main -> BP_FirstPersonGameMode -> PDA_MenuSystemConfig -> L_MainLevel drags in the whole - * of L_MainLevel, which measured at 9994 of WP_Main's 18136 rows - two thirds of the answer + * WP_Example -> BP_GameMode -> PDA_MenuConfig -> L_Other drags in the whole + * of L_Other, which measured at 9994 of WP_Example's 18136 rows - two thirds of the answer * was another level's content. * * With this off, a foreign map is still reported as referenced, but its contents are attributed @@ -72,7 +72,7 @@ struct FLevelUsageStats * Foreign maps referenced but deliberately not expanded into. * * A non-zero value here is the amount of another level's content that would otherwise have - * been attributed to this one. Worth surfacing: on WP_Main it was two thirds of the report. + * been attributed to this one. Worth surfacing: on WP_Example it was two thirds of the report. */ int32 ForeignLevelsNotExpanded = 0; double ScanLevelAssetsSeconds = 0.0; diff --git a/Source/AssetUsageAuditEditor/Private/AssetUsageAuditSettings.cpp b/Source/AssetUsageAuditEditor/Private/AssetUsageAuditSettings.cpp index bb918c3..beee221 100644 --- a/Source/AssetUsageAuditEditor/Private/AssetUsageAuditSettings.cpp +++ b/Source/AssetUsageAuditEditor/Private/AssetUsageAuditSettings.cpp @@ -11,8 +11,8 @@ UAssetUsageAuditSettings::UAssetUsageAuditSettings() // third-party, so leaving these in makes the first run unreadable for an artist looking for // their own content. // - // Deliberately NOT excluded, despite being a bought pack: Content/MenuSystemPro. It supplies - // BP_MenuSystemGameInstance, which DefaultEngine.ini names as the project's GameInstance. + // Deliberately NOT excluded, despite being a bought pack: Content/a purchased UI pack. It supplies + // BP_MenuGameInstance, which DefaultEngine.ini names as the project's GameInstance. // Excluding it would hide a load-bearing asset from every report. ExcludedPackagePaths = { TEXT("Content/3rdParty"), diff --git a/Source/AssetUsageAuditEditor/Private/SAssetDeleteDialog.cpp b/Source/AssetUsageAuditEditor/Private/SAssetDeleteDialog.cpp index 54b6253..569e573 100644 --- a/Source/AssetUsageAuditEditor/Private/SAssetDeleteDialog.cpp +++ b/Source/AssetUsageAuditEditor/Private/SAssetDeleteDialog.cpp @@ -178,7 +178,7 @@ public: return SNew(STextBlock) .Text(LOCTEXT("ReadOnly", "read-only on disk")) .ColorAndOpacity(FSlateColor(CautionColor)) - .ToolTipText(LOCTEXT("ReadOnlyTip", "The file is not writable. This project is Perforce-primary, so an unopened file is read-only and the delete will fail on it. Check it out first.")); + .ToolTipText(LOCTEXT("ReadOnlyTip", "The file is not writable. Perforce-primary projects keep unopened files read-only, so an unopened file is read-only and the delete will fail on it. Check it out first.")); } return SNew(STextBlock) diff --git a/Source/AssetUsageAuditEditor/Private/SAssetUsageAuditPanel.cpp b/Source/AssetUsageAuditEditor/Private/SAssetUsageAuditPanel.cpp index e2d78e2..23ce8e4 100644 --- a/Source/AssetUsageAuditEditor/Private/SAssetUsageAuditPanel.cpp +++ b/Source/AssetUsageAuditEditor/Private/SAssetUsageAuditPanel.cpp @@ -375,7 +375,7 @@ void SAssetUsageAuditPanel::Construct(const FArguments& InArgs) } // Name the level when there is one, count them when there are several: - // a button reading "WP_Main" is worth more than one reading "1 level". + // a button reading "WP_Example" is worth more than one reading "1 level". if (LevelFilters.Num() == 1) { return FText::FromString(FPackageName::GetShortName(*LevelFilters.CreateConstIterator())); diff --git a/Source/AssetUsageAuditEditor/Public/AssetUsageAuditLibrary.h b/Source/AssetUsageAuditEditor/Public/AssetUsageAuditLibrary.h index a2b31ba..8c250c7 100644 --- a/Source/AssetUsageAuditEditor/Public/AssetUsageAuditLibrary.h +++ b/Source/AssetUsageAuditEditor/Public/AssetUsageAuditLibrary.h @@ -25,7 +25,7 @@ public: /** * Run a full audit and write JSON + CSV reports. * - * @param LevelPackageNames Levels to analyse, e.g. "/Game/Space/Maps/WP_Main". Empty means all. + * @param LevelPackageNames Levels to analyse, e.g. "/Game/Maps/WP_Example". Empty means all. * @param OutputDirectory Destination. Empty uses the configured default. * @param OutReportPath Absolute path of the JSON report on success. * @return true when both reports were written. diff --git a/Source/AssetUsageAuditEditor/Public/AssetUsageAuditSettings.h b/Source/AssetUsageAuditEditor/Public/AssetUsageAuditSettings.h index 495ea88..33e347c 100644 --- a/Source/AssetUsageAuditEditor/Public/AssetUsageAuditSettings.h +++ b/Source/AssetUsageAuditEditor/Public/AssetUsageAuditSettings.h @@ -10,7 +10,7 @@ /** * Team-shared configuration, written to Config/DefaultEditor.ini. * - * That file is Perforce-tracked (only Plugins/** is p4-ignored), so the exclusion list and the + * That file is normally under version control, so the exclusion list and the * type presets are reviewable and shared. Per-user state - last filter, column layout - belongs * in UAssetUsageAuditUserSettings instead, which stays in Saved/Config. */ diff --git a/Source/AssetUsageAuditTests/Private/AssetDeletionScan.spec.cpp b/Source/AssetUsageAuditTests/Private/AssetDeletionScan.spec.cpp index 2e862af..40b6e7a 100644 --- a/Source/AssetUsageAuditTests/Private/AssetDeletionScan.spec.cpp +++ b/Source/AssetUsageAuditTests/Private/AssetDeletionScan.spec.cpp @@ -399,7 +399,7 @@ void AssetDeletionScanSpec::Define() return; } - // This project is Perforce-primary, so read-only is the normal state of an unopened + // Perforce-primary projects keep unopened files read-only, so read-only is the normal state of an unopened // file. Reporting it up front is the difference between a warning and a delete that // fails halfway through the selection. TestEqual(TEXT("matches the filesystem"), diff --git a/Source/AssetUsageAuditTests/Private/AssetDependencyClosure.spec.cpp b/Source/AssetUsageAuditTests/Private/AssetDependencyClosure.spec.cpp index b88158c..ce1255a 100644 --- a/Source/AssetUsageAuditTests/Private/AssetDependencyClosure.spec.cpp +++ b/Source/AssetUsageAuditTests/Private/AssetDependencyClosure.spec.cpp @@ -232,8 +232,8 @@ void AssetDependencyClosureSpec::Define() It("does not follow a map that an ordinary asset merely mentions", [this]() { - // The defect this guards against: exporting WP_Main pulled in the whole of L_MainLevel - // through BP_FirstPersonGameMode -> PDA_MenuSystemConfig, 9994 packages belonging to a + // The defect this guards against: exporting WP_Example pulled in the whole of L_Other + // through BP_GameMode -> PDA_MenuConfig, 9994 packages belonging to a // different location. FLevelUsageResolver already refused that crossing; the closure // did not, so the two disagreed about the same graph. IAssetRegistry& Registry = ReadyRegistry(); diff --git a/Source/AssetUsageAuditTests/Private/AssetUsageExporterLive.spec.cpp b/Source/AssetUsageAuditTests/Private/AssetUsageExporterLive.spec.cpp index 550d540..9430a84 100644 --- a/Source/AssetUsageAuditTests/Private/AssetUsageExporterLive.spec.cpp +++ b/Source/AssetUsageAuditTests/Private/AssetUsageExporterLive.spec.cpp @@ -176,7 +176,7 @@ BEGIN_DEFINE_SPEC(AssetUsageExporterLiveSpec, /** * The OFPA level with the fewest external actors. * - * Smallest on purpose: WP_Main owns roughly 16000 external packages and copying those in a test + * Smallest on purpose: WP_Example owns roughly 16000 external packages and copying those in a test * would move gigabytes. Search stops as soon as something small enough turns up. */ static FName FindSmallestOfpaLevel(int32& OutExternalCount) @@ -254,7 +254,7 @@ void AssetUsageExporterLiveSpec::Define() It("leaves the exported file writable even when the source is read-only", [this]() { - // This project is Perforce-primary, so unopened files are read-only on disk and Windows + // Perforce-primary projects keep unopened files read-only, so unopened files are read-only on disk and Windows // CopyFile carries the attribute across. A read-only export folder is useless to an // artist and breaks the exporter's own Overwrite policy on the next run. const FName Package = FindOrdinaryAssetPackage(); diff --git a/Source/AssetUsageAuditTests/Private/AssetUsagePaths.spec.cpp b/Source/AssetUsageAuditTests/Private/AssetUsagePaths.spec.cpp index f265246..2d893d8 100644 --- a/Source/AssetUsageAuditTests/Private/AssetUsagePaths.spec.cpp +++ b/Source/AssetUsageAuditTests/Private/AssetUsagePaths.spec.cpp @@ -16,9 +16,9 @@ void AssetUsagePathsSpec::Define() { It("detects an OFPA external actor package", [this]() { - // Real shape from this project: /Game/__ExternalActors__/Space/Maps/WP_Main/8/AB/<22 chars> + // Real shape from this project: /Game/__ExternalActors__/Space/Maps/WP_Example/8/AB/<22 chars> TestTrue(TEXT("external actor"), - AssetUsagePaths::IsExternalPackage(FName(TEXT("/Game/__ExternalActors__/Space/Maps/WP_Main/8/AB/QWERTYUIOPASDFGHJKLZXC")))); + AssetUsagePaths::IsExternalPackage(FName(TEXT("/Game/__ExternalActors__/Space/Maps/WP_Example/8/AB/QWERTYUIOPASDFGHJKLZXC")))); }); It("detects an external objects package", [this]() @@ -30,13 +30,13 @@ void AssetUsagePathsSpec::Define() It("does not flag an ordinary content package", [this]() { TestFalse(TEXT("ordinary asset"), - AssetUsagePaths::IsExternalPackage(FName(TEXT("/Game/Space/Art/SM_Rock")))); + AssetUsagePaths::IsExternalPackage(FName(TEXT("/Game/Art/SM_Rock")))); }); It("does not flag a level that merely lives next to external actors", [this]() { TestFalse(TEXT("the level itself is not external"), - AssetUsagePaths::IsExternalPackage(FName(TEXT("/Game/Space/Maps/WP_Main")))); + AssetUsagePaths::IsExternalPackage(FName(TEXT("/Game/Maps/WP_Example")))); }); }); @@ -123,7 +123,7 @@ void AssetUsagePathsSpec::Define() { const TArray Excluded; TestFalse(TEXT("nothing excluded"), - AssetUsagePaths::IsPathExcluded(FName(TEXT("/Game/Space/Art/SM_Rock")), Excluded)); + AssetUsagePaths::IsPathExcluded(FName(TEXT("/Game/Art/SM_Rock")), Excluded)); }); }); @@ -132,15 +132,15 @@ void AssetUsagePathsSpec::Define() It("converts an asset package", [this]() { TestEqual(TEXT("asset"), - AssetUsagePaths::ToProjectRelativePath(FName(TEXT("/Game/Space/Art/SM_Rock")), false), - FString(TEXT("Content/Space/Art/SM_Rock.uasset"))); + AssetUsagePaths::ToProjectRelativePath(FName(TEXT("/Game/Art/SM_Rock")), false), + FString(TEXT("Content/Art/SM_Rock.uasset"))); }); It("uses the umap extension for levels", [this]() { TestEqual(TEXT("level"), - AssetUsagePaths::ToProjectRelativePath(FName(TEXT("/Game/Space/Maps/WP_Main")), true), - FString(TEXT("Content/Space/Maps/WP_Main.umap"))); + AssetUsagePaths::ToProjectRelativePath(FName(TEXT("/Game/Maps/WP_Example")), true), + FString(TEXT("Content/Maps/WP_Example.umap"))); }); It("returns empty for script and engine packages rather than inventing a path", [this]() @@ -154,8 +154,8 @@ void AssetUsagePathsSpec::Define() It("converts an external actor package, which is still under /Game", [this]() { TestEqual(TEXT("external actor"), - AssetUsagePaths::ToProjectRelativePath(FName(TEXT("/Game/__ExternalActors__/Space/Maps/WP_Main/8/AB/ABC")), false), - FString(TEXT("Content/__ExternalActors__/Space/Maps/WP_Main/8/AB/ABC.uasset"))); + AssetUsagePaths::ToProjectRelativePath(FName(TEXT("/Game/__ExternalActors__/Space/Maps/WP_Example/8/AB/ABC")), false), + FString(TEXT("Content/__ExternalActors__/Space/Maps/WP_Example/8/AB/ABC.uasset"))); }); }); } diff --git a/Source/AssetUsageAuditTests/Private/AssetUsageReportWriter.spec.cpp b/Source/AssetUsageAuditTests/Private/AssetUsageReportWriter.spec.cpp index bb15f1c..55f64ac 100644 --- a/Source/AssetUsageAuditTests/Private/AssetUsageReportWriter.spec.cpp +++ b/Source/AssetUsageAuditTests/Private/AssetUsageReportWriter.spec.cpp @@ -25,22 +25,22 @@ namespace Result.Header.AppliedFilters.Add(TEXT("Types: StaticMesh")); FAssetUsageRow& Used = Result.Rows.AddDefaulted_GetRef(); - Used.PackageName = FName(TEXT("/Game/Space/Art/SM_Rock")); + Used.PackageName = FName(TEXT("/Game/Art/SM_Rock")); Used.AssetName = FName(TEXT("SM_Rock")); Used.ClassPath = FTopLevelAssetPath(TEXT("/Script/Engine.StaticMesh")); - Used.PathFromProjectRoot = TEXT("Content/Space/Art/SM_Rock.uasset"); + Used.PathFromProjectRoot = TEXT("Content/Art/SM_Rock.uasset"); Used.Verdict = EAssetUsageVerdict::UsedOnLevel; - Used.Levels = { FName(TEXT("/Game/Space/Maps/WP_Main")), FName(TEXT("/Game/Space/Maps/L_3i_Hub")) }; + Used.Levels = { FName(TEXT("/Game/Maps/WP_Example")), FName(TEXT("/Game/Maps/L_3i_Hub")) }; Used.HardReferenceCount = 3; Used.SoftReferenceCount = 1; Used.Provenance = EAssetUsageProvenance::HardReference | EAssetUsageProvenance::ExternalActor; - Used.Route = TEXT("WP_Main -> BP_Rock -> SM_Rock"); + Used.Route = TEXT("WP_Example -> BP_Rock -> SM_Rock"); FAssetUsageRow& Unused = Result.Rows.AddDefaulted_GetRef(); - Unused.PackageName = FName(TEXT("/Game/Space/Art/SM_Orphan")); + Unused.PackageName = FName(TEXT("/Game/Art/SM_Orphan")); Unused.AssetName = FName(TEXT("SM_Orphan")); Unused.ClassPath = FTopLevelAssetPath(TEXT("/Script/Engine.StaticMesh")); - Unused.PathFromProjectRoot = TEXT("Content/Space/Art/SM_Orphan.uasset"); + Unused.PathFromProjectRoot = TEXT("Content/Art/SM_Orphan.uasset"); Unused.Verdict = EAssetUsageVerdict::Unreferenced; return Result; @@ -123,7 +123,7 @@ void AssetUsageReportWriterSpec::Define() const FString Csv = FAssetUsageReportWriter::BuildCsv(Sample, Options); TestTrue(TEXT("levels joined"), - Csv.Contains(TEXT("/Game/Space/Maps/WP_Main|/Game/Space/Maps/L_3i_Hub"))); + Csv.Contains(TEXT("/Game/Maps/WP_Example|/Game/Maps/L_3i_Hub"))); }); It("carries the verdict verbatim", [this]() diff --git a/Source/AssetUsageAuditTests/Private/AssetUsageVerdict.spec.cpp b/Source/AssetUsageAuditTests/Private/AssetUsageVerdict.spec.cpp index d337c2c..b03d917 100644 --- a/Source/AssetUsageAuditTests/Private/AssetUsageVerdict.spec.cpp +++ b/Source/AssetUsageAuditTests/Private/AssetUsageVerdict.spec.cpp @@ -45,7 +45,7 @@ void AssetUsageVerdictSpec::Define() It("reports ReferencedFromConfigOrSource when only a text literal names it", [this]() { - // This is the BP_FirstPersonGameMode case: no asset references it, only + // This is the BP_GameMode case: no asset references it, only // Config/DefaultEngine.ini does. Reporting it Unreferenced would be a real defect. const EAssetUsageVerdict Verdict = FAssetUsageAuditor::ClassifyVerdict(false, false, true, false); @@ -126,7 +126,7 @@ void AssetUsageVerdictSpec::Define() { // A level depends on the whole table, so every row looks used even when none is. FAssetUsageNode Node; - Node.PackageName = FName(TEXT("/Game/Space/Data/DT_Weapons")); + Node.PackageName = FName(TEXT("/Game/Data/DT_Weapons")); Node.ClassPath = FTopLevelAssetPath(TEXT("/Script/Engine.DataTable")); TestTrue(TEXT("DataTable is a blind spot"), FAssetUsageAuditor::IsRegistryBlindSpot(Node)); @@ -135,7 +135,7 @@ void AssetUsageVerdictSpec::Define() It("does not flag an ordinary static mesh", [this]() { FAssetUsageNode Node; - Node.PackageName = FName(TEXT("/Game/Space/Art/SM_Rock")); + Node.PackageName = FName(TEXT("/Game/Art/SM_Rock")); Node.ClassPath = FTopLevelAssetPath(TEXT("/Script/Engine.StaticMesh")); TestFalse(TEXT("StaticMesh is not a blind spot"), FAssetUsageAuditor::IsRegistryBlindSpot(Node)); diff --git a/Source/AssetUsageAuditTests/Private/IndirectReferenceScanner.spec.cpp b/Source/AssetUsageAuditTests/Private/IndirectReferenceScanner.spec.cpp index 30d785c..5b01bdd 100644 --- a/Source/AssetUsageAuditTests/Private/IndirectReferenceScanner.spec.cpp +++ b/Source/AssetUsageAuditTests/Private/IndirectReferenceScanner.spec.cpp @@ -28,70 +28,70 @@ void IndirectReferenceScannerSpec::Define() It("finds the GameMode from DefaultEngine.ini and strips the _C class suffix", [this]() { const TArray Found = Extract( - TEXT("GlobalDefaultGameMode=/Game/Space/Core/GameModes/BP_FirstPersonGameMode.BP_FirstPersonGameMode_C")); + TEXT("GlobalDefaultGameMode=/Game/Core/GameModes/BP_GameMode.BP_GameMode_C")); TestEqual(TEXT("one hit"), Found.Num(), 1); if (Found.Num() == 1) { - TestEqual(TEXT("package"), Found[0], FString(TEXT("/Game/Space/Core/GameModes/BP_FirstPersonGameMode"))); + TestEqual(TEXT("package"), Found[0], FString(TEXT("/Game/Core/GameModes/BP_GameMode"))); } }); - It("finds the GameInstance from MenuSystemPro", [this]() + It("finds the GameInstance from a purchased UI pack", [this]() { const TArray Found = Extract( - TEXT("GameInstanceClass=/Game/MenuSystemPro/Blueprints/GameFramework/BP_MenuSystemGameInstance.BP_MenuSystemGameInstance_C")); + TEXT("GameInstanceClass=/Game/a purchased UI pack/Blueprints/GameFramework/BP_MenuGameInstance.BP_MenuGameInstance_C")); TestEqual(TEXT("one hit"), Found.Num(), 1); if (Found.Num() == 1) { TestEqual(TEXT("package"), Found[0], - FString(TEXT("/Game/MenuSystemPro/Blueprints/GameFramework/BP_MenuSystemGameInstance"))); + FString(TEXT("/Game/a purchased UI pack/Blueprints/GameFramework/BP_MenuGameInstance"))); } }); It("finds a map reference with an object suffix", [this]() { - const TArray Found = Extract(TEXT("EditorStartupMap=/Game/Space/Maps/Gyms/Gyms_Geoda.Gyms_Geoda")); + const TArray Found = Extract(TEXT("EditorStartupMap=/Game/Maps/Gyms/Gyms_Geoda.Gyms_Geoda")); TestEqual(TEXT("one hit"), Found.Num(), 1); if (Found.Num() == 1) { - TestEqual(TEXT("package"), Found[0], FString(TEXT("/Game/Space/Maps/Gyms/Gyms_Geoda"))); + TestEqual(TEXT("package"), Found[0], FString(TEXT("/Game/Maps/Gyms/Gyms_Geoda"))); } }); It("finds a bare package path with no object suffix", [this]() { - const TArray Found = Extract(TEXT("GameDefaultMap=/Game/Space/Maps/RefinedMenuMap")); + const TArray Found = Extract(TEXT("GameDefaultMap=/Game/Maps/RefinedMenuMap")); TestEqual(TEXT("one hit"), Found.Num(), 1); if (Found.Num() == 1) { - TestEqual(TEXT("package"), Found[0], FString(TEXT("/Game/Space/Maps/RefinedMenuMap"))); + TestEqual(TEXT("package"), Found[0], FString(TEXT("/Game/Maps/RefinedMenuMap"))); } }); It("strips surrounding quotes and parentheses from an ini struct value", [this]() { - const TArray Found = Extract(TEXT("+DirectoriesToAlwaysCook=(Path=\"/Game/Space/Art\")")); + const TArray Found = Extract(TEXT("+DirectoriesToAlwaysCook=(Path=\"/Game/Art\")")); TestEqual(TEXT("one hit"), Found.Num(), 1); if (Found.Num() == 1) { - TestEqual(TEXT("package"), Found[0], FString(TEXT("/Game/Space/Art"))); + TestEqual(TEXT("package"), Found[0], FString(TEXT("/Game/Art"))); } }); It("handles a C++ literal wrapped in TEXT()", [this]() { const TArray Found = Extract( - TEXT("static const FSoftObjectPath Path(TEXT(\"/Game/Space/Art/SM_Rock\"));")); + TEXT("static const FSoftObjectPath Path(TEXT(\"/Game/Art/SM_Rock\"));")); TestEqual(TEXT("one hit"), Found.Num(), 1); if (Found.Num() == 1) { - TestEqual(TEXT("package"), Found[0], FString(TEXT("/Game/Space/Art/SM_Rock"))); + TestEqual(TEXT("package"), Found[0], FString(TEXT("/Game/Art/SM_Rock"))); } });