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("_compositionOptions!.Current.FadeDuration", Playout, StringComparison.Ordinal); Assert.Contains("workflow.PrepareAsync(", Playout, StringComparison.Ordinal); Assert.Contains("workflow.TakeSelectedAsync(", Playout, StringComparison.Ordinal); Assert.DoesNotContain("workflow.TakeInAsync(", Playout, StringComparison.Ordinal); Assert.DoesNotContain( "string.IsNullOrWhiteSpace(workflow.State.PreparedCutCode)", Playout, StringComparison.Ordinal); Assert.Contains("workflow.NextAsync(", Playout, StringComparison.Ordinal); Assert.Contains("workflow.TakeOutAsync(", Playout, StringComparison.Ordinal); Assert.Contains("_controller.ReflectSuccessfulPlayout(", Playout, StringComparison.Ordinal); Assert.Contains("workflow.State.CurrentEntryId", Playout, StringComparison.Ordinal); Assert.Contains("LegacyOperatorPlayoutCommand.Prepare or", Playout, StringComparison.Ordinal); Assert.Contains( "command != LegacyOperatorPlayoutCommand.TakeOut", 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 OriginalDissolveComboAcceptsOnlyItsZeroBasedTwentyItemIndex() { Assert.Contains("fadeDuration is < 0 or > 19", Playout, StringComparison.Ordinal); Assert.DoesNotContain("fadeDuration is < 0 or > 60", Playout, StringComparison.Ordinal); } [Fact] public void HomeAndEndStopAutomaticRefreshBeforeChangingTheCandidateRow() { Assert.Contains( "LegacySelectPlaylistBoundaryIntent boundary =>\n" + " SelectPlaylistBoundaryAndStopRefresh(boundary.Last)", Window.Replace("\r\n", "\n", StringComparison.Ordinal), StringComparison.Ordinal); Assert.Contains( "private LegacyOperatorSnapshot SelectPlaylistBoundaryAndStopRefresh(bool last)", Playout, StringComparison.Ordinal); var helperStart = Playout.IndexOf( "private LegacyOperatorSnapshot SelectPlaylistBoundaryAndStopRefresh(bool last)", StringComparison.Ordinal); var helperEnd = Playout.IndexOf( "private async Task ToggleBackgroundAsync", helperStart, StringComparison.Ordinal); Assert.True(helperStart >= 0 && helperEnd > helperStart); var helper = Playout[helperStart..helperEnd]; Assert.True( helper.IndexOf("StopRefreshLoop();", StringComparison.Ordinal) < helper.IndexOf("_controller.SelectPlaylistBoundary(last)", 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); Assert.Contains("LegacyCutPointerDownIntent", Playout, StringComparison.Ordinal); Assert.Contains("LegacyClearCutSelectionIntent", 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."); } }