feat: align legacy operator and playout behavior

This commit is contained in:
2026-07-15 21:04:05 +09:00
parent 06a16e5741
commit 83398044c6
77 changed files with 6377 additions and 391 deletions

View File

@@ -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()
{