feat: align legacy operator and playout behavior
This commit is contained in:
@@ -22,9 +22,11 @@ public sealed class LegacyCloseConfirmationNativeContractTests
|
||||
Assert.Contains("args.Cancel = true", Confirmation, StringComparison.Ordinal);
|
||||
Assert.Contains("DefaultButton = ContentDialogButton.Close", Confirmation,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("PrimaryButtonText = \"종료\"", Confirmation,
|
||||
Assert.Contains("Title = \"매일경제TV\"", Confirmation,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("CloseButtonText = \"취소\"", Confirmation,
|
||||
Assert.Contains("PrimaryButtonText = \"예\"", Confirmation,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("CloseButtonText = \"아니요\"", Confirmation,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("Interlocked.Exchange(ref _closeConfirmed, 1);", Confirmation,
|
||||
StringComparison.Ordinal);
|
||||
|
||||
@@ -17,7 +17,7 @@ public sealed class LegacyHiddenNonOriginalControlsTests
|
||||
"styles.css"));
|
||||
|
||||
[Fact]
|
||||
public void Non_original_shortcuts_prepare_and_fade_are_hidden_but_remain_native_wired()
|
||||
public void Non_original_shortcuts_are_hidden_but_original_dissolve_control_is_visible()
|
||||
{
|
||||
Assert.Contains("class=\"manual-list-actions\" aria-label=\"수동 송출 목록\" hidden",
|
||||
Markup,
|
||||
@@ -25,10 +25,13 @@ public sealed class LegacyHiddenNonOriginalControlsTests
|
||||
Assert.Contains("id=\"playout-prepare\" class=\"prepare\" type=\"button\" disabled hidden",
|
||||
Markup,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("class=\"fade-control\" for=\"playout-fade-duration\" hidden",
|
||||
Assert.Contains("class=\"fade-control\" for=\"playout-fade-duration\">DissolveTime</label>",
|
||||
Markup,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("id=\"playout-fade-duration\" disabled aria-label=\"장면 효과 시간\" hidden",
|
||||
Assert.Contains("id=\"playout-fade-duration\" disabled aria-label=\"DissolveTime\"",
|
||||
Markup,
|
||||
StringComparison.Ordinal);
|
||||
Assert.DoesNotContain("id=\"playout-fade-duration\" disabled aria-label=\"DissolveTime\" hidden",
|
||||
Markup,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("*[hidden] { display: none !important; }", Styles,
|
||||
|
||||
@@ -41,14 +41,30 @@ public sealed class LegacyPlayoutNativeContractTests
|
||||
[Fact]
|
||||
public void OperatorCommandsUseTheNativeWorkflowAndCSharpPlaylist()
|
||||
{
|
||||
Assert.Contains("_controller.CreatePlayoutRequest()", Playout,
|
||||
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.PrepareAndTakeInAsync(", Playout,
|
||||
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.TakeInAsync(", 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,
|
||||
@@ -68,6 +84,41 @@ public sealed class LegacyPlayoutNativeContractTests
|
||||
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<LegacyOperatorSnapshot> 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()
|
||||
{
|
||||
@@ -86,6 +137,10 @@ public sealed class LegacyPlayoutNativeContractTests
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("LegacyConfirmManualListIntent", Playout,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("LegacyCutPointerDownIntent", Playout,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("LegacyClearCutSelectionIntent", Playout,
|
||||
StringComparison.Ordinal);
|
||||
}
|
||||
|
||||
private static string FindRepositoryRoot()
|
||||
|
||||
@@ -39,6 +39,18 @@ public sealed class LegacyPlayoutWebContractTests
|
||||
Assert.Contains("TAKE OUT", Markup, StringComparison.Ordinal);
|
||||
var fadeMarkup = ExtractElement(Markup, "playout-fade-duration", "</select>");
|
||||
Assert.Equal(20, CountOccurrences(fadeMarkup, "<option value="));
|
||||
Assert.Contains(
|
||||
"class=\"fade-control\" for=\"playout-fade-duration\">DissolveTime</label>",
|
||||
Markup,
|
||||
StringComparison.Ordinal);
|
||||
Assert.DoesNotContain(" hidden", fadeMarkup, StringComparison.Ordinal);
|
||||
for (var index = 0; index < 20; index++)
|
||||
{
|
||||
Assert.Contains(
|
||||
$"<option value=\"{index}\">{index + 1}</option>",
|
||||
fadeMarkup,
|
||||
StringComparison.Ordinal);
|
||||
}
|
||||
Assert.Contains("<script src=\"playout-ui.js\"></script>", Markup,
|
||||
StringComparison.Ordinal);
|
||||
}
|
||||
@@ -80,7 +92,7 @@ public sealed class LegacyPlayoutWebContractTests
|
||||
Assert.Contains("event.key === \"F3\"", Script, StringComparison.Ordinal);
|
||||
Assert.Contains("event.key === \"F8\"", Script, StringComparison.Ordinal);
|
||||
Assert.Contains("event.key === \"Escape\"", Script, StringComparison.Ordinal);
|
||||
Assert.Contains("event.repeat || hasOpenDialog()", Script,
|
||||
Assert.Contains("event.defaultPrevented || event.repeat || hasOpenDialog()", Script,
|
||||
StringComparison.Ordinal);
|
||||
}
|
||||
|
||||
@@ -91,16 +103,23 @@ public sealed class LegacyPlayoutWebContractTests
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("const canPrepareToggle = playout.phase === \"idle\"", Script,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("const canTakeIn = playout.phase === \"prepared\"", Script,
|
||||
Assert.Contains("canTakeInFromState(playout, hasPlaylist)", Script,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("playout.phase === \"idle\" && hasPlaylist", Script,
|
||||
Assert.Contains("playout.phase === \"idle\" || playout.phase === \"program\"", Script,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("playout.phase !== \"program\"", Script,
|
||||
Assert.Contains("canAdvanceFromState(playout)", Script,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("playout.isPlayCompletionPending === true", Script,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("playout.isTakeOutCompletionPending !== true", Script,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("playout.nextKind === \"none\"", Script,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("playout.nextKind === \"endOfPlaylist\"", Script,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("takeOut.disabled = busy || !commandAvailable;", Script,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("마지막 항목", Script, StringComparison.Ordinal);
|
||||
}
|
||||
|
||||
private static int CountOccurrences(string source, string value)
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
namespace MBN_STOCK_WEBVIEW.LegacyWeb.Tests;
|
||||
|
||||
public sealed class LegacyRuntimeStockCutMenuNativeContractTests
|
||||
{
|
||||
private static readonly string RepositoryRoot = FindRepositoryRoot();
|
||||
private static readonly string MainWindow = File.ReadAllText(Path.Combine(
|
||||
RepositoryRoot,
|
||||
"src",
|
||||
"MBN_STOCK_WEBVIEW.LegacyParityApp",
|
||||
"MainWindow.xaml.cs"));
|
||||
|
||||
[Fact]
|
||||
public void MainWindowUsesExternalThenPackagedCandidatesAndInjectsResolvedRows()
|
||||
{
|
||||
Assert.Contains(
|
||||
"Environment.SpecialFolder.LocalApplicationData",
|
||||
MainWindow,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("\"MBN_STOCK_WEBVIEW\"", MainWindow, StringComparison.Ordinal);
|
||||
Assert.Contains("\"Res\"", MainWindow, StringComparison.Ordinal);
|
||||
Assert.Contains("\"종목.ini\"", MainWindow, StringComparison.Ordinal);
|
||||
Assert.Contains(
|
||||
"LegacyRuntimeStockCutMenuLoader.ResolveFromCandidates(",
|
||||
MainWindow,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("runtimeCutMenuOverridePath", MainWindow,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("AppContext.BaseDirectory", MainWindow, StringComparison.Ordinal);
|
||||
Assert.Contains("cutRows: cutMenuComposition.Rows", MainWindow,
|
||||
StringComparison.Ordinal);
|
||||
Assert.DoesNotContain("Environment.CurrentDirectory", MainWindow,
|
||||
StringComparison.Ordinal);
|
||||
Assert.DoesNotContain("Directory.GetCurrentDirectory", MainWindow,
|
||||
StringComparison.Ordinal);
|
||||
Assert.DoesNotContain("MBN_STOCK_N", MainWindow, StringComparison.OrdinalIgnoreCase);
|
||||
Assert.DoesNotContain("bin\\Debug\\Res\\종목.ini", MainWindow,
|
||||
StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DatabaseInitializationErrorWinsOverTheSingleCutMenuFallbackWarning()
|
||||
{
|
||||
var errorBranch = MainWindow.IndexOf(
|
||||
"if (initializationError is not null)",
|
||||
StringComparison.Ordinal);
|
||||
var warningBranch = MainWindow.IndexOf(
|
||||
"else if (cutMenuComposition.WarningMessage is { } cutMenuWarning)",
|
||||
errorBranch,
|
||||
StringComparison.Ordinal);
|
||||
var errorReport = MainWindow.IndexOf(
|
||||
"_controller.ReportError(initializationError);",
|
||||
errorBranch,
|
||||
StringComparison.Ordinal);
|
||||
var warningReport = MainWindow.IndexOf(
|
||||
"_controller.ReportWarning(cutMenuWarning);",
|
||||
warningBranch,
|
||||
StringComparison.Ordinal);
|
||||
|
||||
Assert.True(errorBranch >= 0);
|
||||
Assert.True(errorReport > errorBranch);
|
||||
Assert.True(warningBranch > errorReport);
|
||||
Assert.True(warningReport > warningBranch);
|
||||
Assert.Equal(
|
||||
warningReport,
|
||||
MainWindow.LastIndexOf(
|
||||
"_controller.ReportWarning(cutMenuWarning);",
|
||||
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.");
|
||||
}
|
||||
}
|
||||
@@ -77,6 +77,15 @@ public sealed class LegacyWebContractTests
|
||||
Assert.Contains("timestampMilliseconds", App, StringComparison.Ordinal);
|
||||
Assert.Contains("event.ctrlKey", App, StringComparison.Ordinal);
|
||||
Assert.Contains("event.shiftKey", App, StringComparison.Ordinal);
|
||||
Assert.Contains("if (playlistMutationLocked) return", App,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("send(\"clear-cut-selection\", {})", App,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("event.target !== cutList", App, StringComparison.Ordinal);
|
||||
Assert.Contains("button.addEventListener(\"keydown\"", App,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("stockResults.querySelectorAll(\"button[data-result-index]\")", App,
|
||||
StringComparison.Ordinal);
|
||||
var cutFactory = App[
|
||||
App.IndexOf("function createCutElement", StringComparison.Ordinal)..App.IndexOf("function renderCuts", StringComparison.Ordinal)];
|
||||
Assert.DoesNotContain("dblclick", cutFactory, StringComparison.Ordinal);
|
||||
@@ -95,8 +104,25 @@ public sealed class LegacyWebContractTests
|
||||
{
|
||||
Assert.Contains("dataset.resultIndex", App, StringComparison.Ordinal);
|
||||
Assert.Contains("dataset.rowId", App, StringComparison.Ordinal);
|
||||
Assert.Contains("playlistPlayoutPresentation", App, StringComparison.Ordinal);
|
||||
Assert.Contains("playout.currentEntryId", App, StringComparison.Ordinal);
|
||||
Assert.Contains("playout.currentCueIndexZeroBased", App, StringComparison.Ordinal);
|
||||
Assert.Contains("presentation.pageText", App, StringComparison.Ordinal);
|
||||
Assert.Contains("aria-current", App, StringComparison.Ordinal);
|
||||
Assert.Contains("scrollIntoView({ block: \"nearest\", inline: \"nearest\" })", App,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains(".playlist-data-row.on-air", Styles, StringComparison.Ordinal);
|
||||
Assert.Contains("#fdc8d2", Styles, StringComparison.OrdinalIgnoreCase);
|
||||
Assert.Contains(".playlist-data-row.on-air.selected", Styles, StringComparison.Ordinal);
|
||||
Assert.DoesNotContain("stockResults.replaceChildren", App, StringComparison.Ordinal);
|
||||
Assert.DoesNotContain("playlistRows.replaceChildren", App, StringComparison.Ordinal);
|
||||
var boundaryStart = App.IndexOf(
|
||||
"function selectPlaylistBoundary", StringComparison.Ordinal);
|
||||
var boundaryEnd = App.IndexOf(
|
||||
"function clearDelayedClick", boundaryStart, StringComparison.Ordinal);
|
||||
var boundaryHelper = App[boundaryStart..boundaryEnd];
|
||||
Assert.DoesNotContain(".focus(", boundaryHelper, StringComparison.Ordinal);
|
||||
Assert.Contains("scrollIntoView", boundaryHelper, StringComparison.Ordinal);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -105,6 +131,7 @@ public sealed class LegacyWebContractTests
|
||||
foreach (var intent in new[]
|
||||
{
|
||||
"select-playlist-row",
|
||||
"activate-playlist-row",
|
||||
"set-playlist-enabled",
|
||||
"reorder-playlist-rows",
|
||||
"move-selected-playlist-rows",
|
||||
@@ -119,13 +146,49 @@ public sealed class LegacyWebContractTests
|
||||
Assert.Contains("shift: event.shiftKey", App, StringComparison.Ordinal);
|
||||
Assert.Contains("event.key === \"Delete\"", App, StringComparison.Ordinal);
|
||||
Assert.Contains("row.isSelected", App, StringComparison.Ordinal);
|
||||
Assert.Contains("enabled.disabled = state.isBusy === true", App, StringComparison.Ordinal);
|
||||
Assert.Contains("row.isActive === true", App, StringComparison.Ordinal);
|
||||
Assert.Contains("enabled.checked !== true", App, StringComparison.Ordinal);
|
||||
Assert.Contains("enabled.setAttribute(\"aria-disabled\", playlistMutationLocked", App,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("interactionDisabled = playlistMutationLocked", App,
|
||||
StringComparison.Ordinal);
|
||||
Assert.DoesNotContain("send(\"toggle-active-playlist-enabled\"", App,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("event.target.closest(\"input, button\")", App,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("preserveSelectedBlock", App, StringComparison.Ordinal);
|
||||
Assert.Contains("deferSelectedRowPlainClickForDrag", App, StringComparison.Ordinal);
|
||||
Assert.Contains("deferredPlaylistPlainSelectionRowId", App, StringComparison.Ordinal);
|
||||
Assert.Contains("event.dataTransfer.setData(playlistDragMime, rowId)", App,
|
||||
StringComparison.Ordinal);
|
||||
Assert.DoesNotContain("selectedRowIds", App, StringComparison.Ordinal);
|
||||
Assert.Contains("element.draggable = !cutDragLocked", App, StringComparison.Ordinal);
|
||||
Assert.Contains("if (playlistMutationLocked || !event.dataTransfer)", App,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("if (!playlistMutationLocked) send(\"delete-selected-playlist-rows\"", App,
|
||||
StringComparison.Ordinal);
|
||||
var deleteBranchStart = App.LastIndexOf(
|
||||
"if (event.key === \"Delete\"",
|
||||
StringComparison.Ordinal);
|
||||
var deleteBranchEnd = App.LastIndexOf(
|
||||
"} else if (event.key === \" \"",
|
||||
StringComparison.Ordinal);
|
||||
Assert.True(deleteBranchStart >= 0 && deleteBranchEnd > deleteBranchStart);
|
||||
Assert.DoesNotContain(
|
||||
"event.preventDefault()",
|
||||
App[deleteBranchStart..deleteBranchEnd],
|
||||
StringComparison.Ordinal);
|
||||
var homeEndBranchStart = App.LastIndexOf(
|
||||
"} else if ((event.key === \"Home\"",
|
||||
StringComparison.Ordinal);
|
||||
var homeEndBranchEnd = App.IndexOf(
|
||||
"} else if (event.key === \"Escape\"",
|
||||
homeEndBranchStart,
|
||||
StringComparison.Ordinal);
|
||||
Assert.True(homeEndBranchStart >= 0 && homeEndBranchEnd > homeEndBranchStart);
|
||||
Assert.DoesNotContain(
|
||||
"event.preventDefault()",
|
||||
App[homeEndBranchStart..homeEndBranchEnd],
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains(".playlist-data-row.drag-before", Styles, StringComparison.Ordinal);
|
||||
Assert.Contains(".playlist-data-row.drag-after", Styles, StringComparison.Ordinal);
|
||||
}
|
||||
@@ -144,11 +207,24 @@ public sealed class LegacyWebContractTests
|
||||
public void MarketTabDragSwapsOnHoverThroughExpectedCSharpPositions()
|
||||
{
|
||||
Assert.Contains("send(\"hover-swap-tabs\"", App, StringComparison.Ordinal);
|
||||
Assert.Contains("source: draggedTabId", App, StringComparison.Ordinal);
|
||||
Assert.Contains("expectedSourceIndex: sourceIndex", App, StringComparison.Ordinal);
|
||||
Assert.Contains("expectedTargetIndex: targetIndex", App, StringComparison.Ordinal);
|
||||
Assert.Contains("event.dataTransfer.setData(\"text/x-mbn-tab\"", App,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("marketTabs.addEventListener(\"dragover\"", App,
|
||||
Assert.Contains("function hasCrossedLegacyTabSwapThreshold", App,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("sourceRect.width < targetRect.width", App,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains(
|
||||
"clientX > targetRect.left + targetRect.width - sourceRect.width",
|
||||
App,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("clientX < targetRect.left + sourceRect.width", App,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("if (requestTabHoverSwap(targetId)) tabDragLastTargetId = targetId", App,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("marketTabs.addEventListener(\"dragover\", onMarketTabDragOver)", App,
|
||||
StringComparison.Ordinal);
|
||||
Assert.DoesNotContain("send(\"swap-tabs\"", App, StringComparison.Ordinal);
|
||||
}
|
||||
@@ -170,6 +246,26 @@ public sealed class LegacyWebContractTests
|
||||
Assert.Contains("send(\"set-moving-averages\"", App, StringComparison.Ordinal);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Uc1TreeSeparatesDisclosureFromSelectionAndPreservesRenderState()
|
||||
{
|
||||
Assert.Contains("function beginTreeRender", App, StringComparison.Ordinal);
|
||||
Assert.Contains("function finishTreeRender", App, StringComparison.Ordinal);
|
||||
Assert.Contains("const treeUiStateByTab = new Map()", App, StringComparison.Ordinal);
|
||||
Assert.Contains("pendingTreeResetTabs.add(nextTabId)", App, StringComparison.Ordinal);
|
||||
Assert.Contains("catalogExpandAll.checked = true", App, StringComparison.Ordinal);
|
||||
Assert.Contains("firstRoot.scrollIntoView", App, StringComparison.Ordinal);
|
||||
Assert.Contains("event.target.closest(\"[data-tree-disclosure]\")", App,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("event.preventDefault()", App, StringComparison.Ordinal);
|
||||
Assert.Contains("treeInteractionLocked = state.isBusy === true || " +
|
||||
"state.fixedSectionBatch != null", App, StringComparison.Ordinal);
|
||||
Assert.Contains("summary[data-tree-root].tree-node-selected", Styles,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("summary[data-tree-root]::-webkit-details-marker", Styles,
|
||||
StringComparison.Ordinal);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void IndustryWorkspaceUsesIndexesAndOpaqueActionIds()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user