fix: apply direct runtime paths and respect taskbar

This commit is contained in:
2026-07-28 00:35:47 +09:00
parent e3b174eec7
commit 347900701b
16 changed files with 522 additions and 401 deletions

View File

@@ -12,13 +12,29 @@ public sealed class LegacyRuntimeAssetDeploymentContractTests
"MBN_STOCK_WEBVIEW.LegacyParityApp.csproj");
[Fact]
public void LegacyParityProjectLinksCutsAndResIntoOutputPublishAndMsix()
public void LegacyParityProjectUsesCutsInPlaceAndLinksOnlyAllowlistedRes()
{
var project = XDocument.Load(ProjectPath);
var contents = project.Descendants("Content").ToArray();
AssertLinkedRuntimeTree(contents, "$(LegacyCutsSourceRoot)\\**\\*", "Cuts\\");
Assert.DoesNotContain(
contents,
element => string.Equals(
element.Attribute("Include")?.Value,
"$(LegacyCutsSourceRoot)\\**\\*",
StringComparison.Ordinal));
AssertLinkedRuntimeTree(contents, "@(LegacyPackagedResAsset)", "Res\\");
var cutsScrub = Assert.Single(
project.Descendants("Target"),
target => string.Equals(
target.Attribute("Name")?.Value,
"ScrubCopiedCutsFromBuildOutput",
StringComparison.Ordinal));
Assert.Contains(
"$(TargetDir)Cuts",
Assert.Single(cutsScrub.Elements("RemoveDir"))
.Attribute("Directories")?.Value,
StringComparison.Ordinal);
var packagedResNames = project.Descendants("LegacyPackagedResAsset")
.Select(element => Path.GetFileName(element.Attribute("Include")?.Value))
@@ -354,10 +370,10 @@ public sealed class LegacyRuntimeAssetDeploymentContractTests
validationTarget.Elements("Message"),
message => (message.Attribute("Text")?.Value ?? string.Empty)
.Contains(
"Verified full legacy runtime assets are enabled",
"External legacy runtime paths are enabled",
StringComparison.Ordinal));
Assert.Contains(
"Verified full legacy runtime assets are enabled",
"Cuts files remain in the selected folder",
fullRuntimeMessage.Attribute("Text")?.Value,
StringComparison.Ordinal);
@@ -379,7 +395,6 @@ public sealed class LegacyRuntimeAssetDeploymentContractTests
string[] externalContentIncludes =
[
@"$(LegacyCutsSourceRoot)\**\*",
"@(LegacyPackagedResAsset)",
"@(LegacyFinancialPreviewAsset)",
"@(LegacyBrandAsset)"
@@ -397,6 +412,12 @@ public sealed class LegacyRuntimeAssetDeploymentContractTests
content.Attribute("Condition")?.Value,
StringComparison.Ordinal);
});
Assert.DoesNotContain(
project.Descendants("Content"),
element => string.Equals(
element.Attribute("Include")?.Value,
@"$(LegacyCutsSourceRoot)\**\*",
StringComparison.Ordinal));
Assert.DoesNotContain(
project.Descendants("Target"),
@@ -454,8 +475,6 @@ public sealed class LegacyRuntimeAssetDeploymentContractTests
"$(LegacyRuntimeSourceRoot)",
"$(LegacyCutsSourceRoot)",
"$(LegacyResSourceRoot)",
"$(LegacyCutsSourceRoot)\\%(LegacyRequiredScene.Identity).t2s",
"$(LegacyCutsSourceRoot)\\%(LegacyRequiredBuiltInAsset.Identity)",
"$(LegacyResSourceRoot)\\logo.png",
"$(LegacyResSourceRoot)\\종목.ini",
"$(LegacyResSourceRoot)\\업종_코스피.ini",
@@ -673,42 +692,52 @@ public sealed class LegacyRuntimeAssetDeploymentContractTests
"must be outside and must not overlap this repository",
initializer,
StringComparison.Ordinal);
Assert.Contains("Assert-NoReparsePointInTree", initializer,
StringComparison.Ordinal);
Assert.Contains("'New-LegacyRuntimeBundle.ps1'", initializer,
StringComparison.Ordinal);
Assert.Contains("'Initialize-LegacyRuntimeBundle.ps1'", initializer,
Assert.Contains("Assert-NoReparsePointInExistingAncestry", initializer,
StringComparison.Ordinal);
Assert.Contains(
"$existingRuntime.ManifestSha256.Equals(",
"Legacy runtime source root contains characters reserved by MSBuild.",
initializer,
StringComparison.Ordinal);
Assert.DoesNotContain("$bundleCreatorPath =", initializer,
StringComparison.Ordinal);
Assert.DoesNotContain("$bundleInitializerPath =", initializer,
StringComparison.Ordinal);
Assert.DoesNotContain("& $bundleCreatorPath", initializer,
StringComparison.Ordinal);
Assert.DoesNotContain("& $bundleInitializerPath", initializer,
StringComparison.Ordinal);
Assert.Contains(
"function New-DirectRuntimeBindingFile",
initializer,
StringComparison.Ordinal);
Assert.Contains(
"Assert-InstalledRuntimeMatchesManifest",
"function Get-RuntimeFoldersPreflight",
initializer,
StringComparison.Ordinal);
Assert.Contains(
"Installed runtime bundle contains an unexpected file",
"runtime-folders.local.json",
initializer,
StringComparison.Ordinal);
Assert.Contains("[switch] $ReplaceRuntimeBinding", initializer,
StringComparison.Ordinal);
Assert.Contains(
"The selected Cuts/Res path differs from the existing runtime binding.",
initializer,
StringComparison.Ordinal);
Assert.Contains("Set-RuntimeBindingAtomically", initializer,
StringComparison.Ordinal);
Assert.Contains(
"[IO.File]::Replace($temporary, $destination, $backup)",
initializer,
StringComparison.Ordinal);
var shadowInstall = initializer.IndexOf(
"-RepositoryRoot $shadowRepositoryRoot",
var directBinding = initializer.LastIndexOf(
"New-DirectRuntimeBindingFile",
StringComparison.Ordinal);
var bindingReplace = initializer.IndexOf(
var bindingReplace = initializer.LastIndexOf(
"Set-RuntimeBindingAtomically",
shadowInstall,
StringComparison.Ordinal);
Assert.True(shadowInstall >= 0);
Assert.True(bindingReplace > shadowInstall);
Assert.True(directBinding >= 0);
Assert.True(bindingReplace > directBinding);
Assert.Contains("[string] $DatabaseIniPath", initializer,
StringComparison.Ordinal);
@@ -790,6 +819,7 @@ public sealed class LegacyRuntimeAssetDeploymentContractTests
Assert.Contains("& $DotNetPath build $ProjectPath",
initializer,
StringComparison.Ordinal);
Assert.Contains("'--no-restore'", initializer, StringComparison.Ordinal);
Assert.Contains(
"'-p:LegacyRuntimeAssetsMode=Required'",
initializer,
@@ -810,7 +840,9 @@ public sealed class LegacyRuntimeAssetDeploymentContractTests
"unexpectedly resolved as SourceOnly",
initializer,
StringComparison.Ordinal);
Assert.Contains("Debug x64 payload count mismatch", initializer,
Assert.Contains(
"Debug x64 copied Cuts instead of using the selected external path.",
initializer,
StringComparison.Ordinal);
Assert.Contains(
"Credential-bearing MmoneyCoder.ini entered the Debug build output.",
@@ -820,12 +852,15 @@ public sealed class LegacyRuntimeAssetDeploymentContractTests
var runtimeWrite = initializer.LastIndexOf(
"Set-RuntimeBindingAtomically",
StringComparison.Ordinal);
var pinWrite = initializer.LastIndexOf(
"Write-ProtectedUtf8TextAtomically",
var pinWrite = initializer.IndexOf(
"-Description 'K3D persistent pin'",
StringComparison.Ordinal);
var databaseWrite = initializer.LastIndexOf(
"Copy-DatabaseProfileAtomically",
StringComparison.Ordinal);
var runtimeFoldersWrite = initializer.LastIndexOf(
"-Description 'runtime folder configuration'",
StringComparison.Ordinal);
var build = initializer.LastIndexOf(
"Invoke-DebugBuildAndVerify",
StringComparison.Ordinal);
@@ -841,7 +876,8 @@ public sealed class LegacyRuntimeAssetDeploymentContractTests
Assert.True(pinWrite >= 0);
Assert.True(build > pinWrite);
Assert.True(databaseWrite > build);
Assert.True(finalK3dVerification > databaseWrite);
Assert.True(runtimeFoldersWrite > databaseWrite);
Assert.True(finalK3dVerification > runtimeFoldersWrite);
Assert.True(liveWrite > finalK3dVerification);
Assert.True(runtimeWrite > liveWrite);
Assert.True(cleanup > runtimeWrite);
@@ -910,6 +946,12 @@ public sealed class LegacyRuntimeAssetDeploymentContractTests
var databaseRollback = initializer.LastIndexOf(
"-Snapshot $databaseSnapshot",
StringComparison.Ordinal);
var runtimeFoldersMutation = initializer.LastIndexOf(
"$runtimeFoldersMutationStarted = $true",
StringComparison.Ordinal);
var runtimeFoldersRollback = initializer.LastIndexOf(
"-Snapshot $runtimeFoldersSnapshot",
StringComparison.Ordinal);
var runtimeMutation = initializer.LastIndexOf(
"$runtimeBindingMutationStarted = $true",
StringComparison.Ordinal);
@@ -920,8 +962,10 @@ public sealed class LegacyRuntimeAssetDeploymentContractTests
"-Snapshot $propsSnapshot",
StringComparison.Ordinal);
Assert.True(databaseMutation >= 0 && databaseMutation < databaseWrite);
Assert.True(runtimeFoldersMutation >= 0);
Assert.True(runtimeMutation >= 0 && runtimeMutation < runtimeWrite);
Assert.True(databaseRollback > databaseWrite);
Assert.True(runtimeFoldersRollback > runtimeFoldersMutation);
Assert.True(runtimeRollback > runtimeWrite);
Assert.Contains("Original failure:", initializer, StringComparison.Ordinal);
Assert.Contains("Secondary recovery failure(s):", initializer,
@@ -929,51 +973,16 @@ public sealed class LegacyRuntimeAssetDeploymentContractTests
Assert.Contains("function Assert-ExactObjectProperties", initializer,
StringComparison.Ordinal);
Assert.Contains(
"-Description 'Runtime bundle creation result'",
initializer,
StringComparison.Ordinal);
Assert.Contains(
"-Description 'Runtime bundle initialization result'",
initializer,
StringComparison.Ordinal);
Assert.Contains(
"-Description 'K3D registration inspection result'",
initializer,
StringComparison.Ordinal);
Assert.Contains(
"Runtime bundle creation result paths escaped or changed the exact output contract.",
"function New-DirectRuntimeBindingFile",
initializer,
StringComparison.Ordinal);
Assert.Contains(
"Runtime bundle initialization result paths or hashes violate containment.",
initializer,
StringComparison.Ordinal);
Assert.Contains("function Get-VerifiedRuntimeManifest", initializer,
StringComparison.Ordinal);
Assert.Contains(
"duplicate/extra/case/type/format changes are rejected.",
initializer,
StringComparison.Ordinal);
Assert.Contains(
"function Assert-DebugRuntimePayloadMatchesManifest",
initializer,
StringComparison.Ordinal);
Assert.Contains(
"Debug x64 runtime payload differs from the manifest:",
initializer,
StringComparison.Ordinal);
Assert.Contains(
"Debug x64 runtime output contains an unexpected file:",
initializer,
StringComparison.Ordinal);
Assert.Contains(
"Debug x64 runtime output does not match the exact manifest file set.",
initializer,
StringComparison.Ordinal);
Assert.Contains(
"-Root $targetRoot",
"Runtime folder configuration rollback failed:",
initializer,
StringComparison.Ordinal);
@@ -1008,8 +1017,8 @@ public sealed class LegacyRuntimeAssetDeploymentContractTests
var buildVerification = initializer.LastIndexOf(
"Invoke-DebugBuildAndVerify",
StringComparison.Ordinal);
var pinIssue = initializer.LastIndexOf(
"Write-ProtectedUtf8TextAtomically",
var pinIssue = initializer.IndexOf(
"-Description 'K3D persistent pin'",
StringComparison.Ordinal);
var finalK3dVerification = initializer.LastIndexOf(
"$finalNativeHash = (",