namespace MBN_STOCK_WEBVIEW.LegacyWeb.Tests; public sealed class LegacyPlayoutNativeContractTests { private static readonly string RepositoryRoot = FindRepositoryRoot(); private static readonly string AppRoot = Path.Combine( RepositoryRoot, "src", "MBN_STOCK_WEBVIEW.LegacyParityApp"); private static readonly string Playout = File.ReadAllText( Path.Combine(AppRoot, "MainWindow.Playout.cs")); private static readonly string Window = File.ReadAllText( Path.Combine(AppRoot, "MainWindow.xaml.cs")); private static readonly string Project = File.ReadAllText( Path.Combine(AppRoot, "MBN_STOCK_WEBVIEW.LegacyParityApp.csproj")); [Fact] public void ParityAppComposesTheVerifiedThirtyFiveSceneRuntime() { Assert.Contains("LegacySceneRuntimeFactory.cs", Project, StringComparison.Ordinal); Assert.Contains("LegacySceneRuntimeFactory.Create(", Playout, StringComparison.Ordinal); Assert.Contains("trustedManualSource: _manualNetSellStore", Playout, StringComparison.Ordinal); Assert.Contains("trustedViSource: _manualViStore", Playout, StringComparison.Ordinal); } [Fact] public void StartupDefaultBackgroundDependsOnAbsentLocalConfigAndSurfacesWarning() { Assert.Contains("File.Exists(", Playout, StringComparison.Ordinal); Assert.Contains("PlayoutOptionsLoader.DefaultPath", Playout, StringComparison.Ordinal); Assert.Contains("LegacyParityStartupCompositionResolver.Resolve(", Playout, StringComparison.Ordinal); Assert.Contains("_playoutInitializationWarning ?? status?.Message", Playout, StringComparison.Ordinal); } [Fact] public void OperatorCommandsUseTheNativeWorkflowAndCSharpPlaylist() { Assert.Contains("_controller.CreatePlayoutRequest()", Playout, StringComparison.Ordinal); Assert.Contains("workflow.PrepareAsync(", Playout, StringComparison.Ordinal); Assert.Contains("workflow.PrepareAndTakeInAsync(", Playout, StringComparison.Ordinal); Assert.Contains("workflow.TakeInAsync(", Playout, StringComparison.Ordinal); Assert.Contains("workflow.NextAsync(", Playout, StringComparison.Ordinal); Assert.Contains("workflow.TakeOutAsync(", Playout, StringComparison.Ordinal); Assert.Contains("LegacyWorkflowNextKind.PlaylistNext", Playout, StringComparison.Ordinal); Assert.Contains("LegacySceneRefreshPolicy.TryGetInterval", Playout, StringComparison.Ordinal); Assert.Contains("WaitForPlayCompletionAsync", Playout, StringComparison.Ordinal); } [Fact] public void UnknownOutcomeQuarantinesWithoutAutomaticCommandRetry() { Assert.Contains("PlayoutResultCode.OutcomeUnknown", Playout, StringComparison.Ordinal); Assert.Contains("PlayoutResultCode.TimedOut", Playout, StringComparison.Ordinal); Assert.Contains("QuarantinePlayoutAsync", Playout, StringComparison.Ordinal); Assert.DoesNotContain("MaximumReconnectAttempts", Playout, StringComparison.Ordinal); Assert.DoesNotContain("ReconnectAsync", Playout, StringComparison.Ordinal); } [Fact] public void PreparedProgramAndUnknownWriteOutcomesBlockOperatorMutations() { Assert.Contains("CanAcceptOperatorMutation()", Window, StringComparison.Ordinal); Assert.Contains("IsOperatorMutationQuarantined()", Window, StringComparison.Ordinal); Assert.Contains("ObserveOperatorMutationQuarantine(state)", Window, StringComparison.Ordinal); Assert.Contains("ManualFinancial?.WritesQuarantined", Playout, StringComparison.Ordinal); Assert.Contains("NamedPlaylist?.IsWriteQuarantined", Playout, StringComparison.Ordinal); Assert.Contains("ManualLists?.WritesQuarantined", Playout, StringComparison.Ordinal); Assert.Contains("OperatorCatalog?.WritesQuarantined", Playout, StringComparison.Ordinal); Assert.Contains("LegacyConfirmManualListIntent", Playout, StringComparison.Ordinal); } private static string FindRepositoryRoot() { var current = new DirectoryInfo(AppContext.BaseDirectory); while (current is not null) { if (File.Exists(Path.Combine(current.FullName, "MBN_STOCK_WEBVIEW.sln"))) { return current.FullName; } current = current.Parent; } throw new DirectoryNotFoundException("Repository root was not found."); } }