feat: complete legacy parity and modernize operator UI

This commit is contained in:
2026-07-22 12:34:46 +09:00
parent fc4007d676
commit 939c252d23
149 changed files with 26515 additions and 1736 deletions

View File

@@ -4,12 +4,17 @@ namespace MBN_STOCK_WEBVIEW.LegacyWeb.Tests;
public sealed class LegacyGraphClickParityWebTests
{
private static readonly string RepositoryRoot = FindRepositoryRoot();
private static readonly string App = File.ReadAllText(Path.Combine(
FindRepositoryRoot(),
RepositoryRoot,
"src",
"MBN_STOCK_WEBVIEW.LegacyParityApp",
"Web",
"app.js"));
private static readonly string PackageInputHarness = File.ReadAllText(Path.Combine(
RepositoryRoot,
"scripts",
"Test-LegacyPackageInput.mjs"));
[Fact]
public void Uc3_targets_select_on_single_click_and_fill_slots_only_on_double_click()
@@ -52,7 +57,12 @@ public sealed class LegacyGraphClickParityWebTests
}
Assert.Contains("comparisonTargetClickTimer", singleClick, StringComparison.Ordinal);
Assert.Contains("}, 250);", singleClick, StringComparison.Ordinal);
Assert.Contains("beginComparisonTargetPendingSelection", singleClick,
StringComparison.Ordinal);
Assert.Contains("deferLegacySingleClick(function () {", singleClick,
StringComparison.Ordinal);
Assert.Contains("clearComparisonTargetPendingSelection(true)", singleClick,
StringComparison.Ordinal);
}
[Fact]
@@ -65,7 +75,7 @@ public sealed class LegacyGraphClickParityWebTests
Assert.Matches(
new Regex(
"addEventListener\\(\"click\"[\\s\\S]*?setTimeout[\\s\\S]*?send\\(\"select-manual-vi-result\"",
"addEventListener\\(\"click\"[\\s\\S]*?beginManualViResultPendingSelection[\\s\\S]*?deferLegacySingleClick[\\s\\S]*?send\\(\"select-manual-vi-result\"",
RegexOptions.CultureInvariant),
manual);
Assert.Matches(
@@ -75,6 +85,79 @@ public sealed class LegacyGraphClickParityWebTests
manual);
}
[Fact]
public void GraphE_stock_candidate_single_click_focuses_and_double_click_selects_once()
{
var doubleStart = App.IndexOf(
"manualWorkspace.addEventListener(\"dblclick\"",
StringComparison.Ordinal);
var clickStart = App.IndexOf(
"manualWorkspace.addEventListener(\"click\"",
doubleStart + 1,
StringComparison.Ordinal);
var keyStart = App.IndexOf(
"manualWorkspace.addEventListener(\"keydown\"",
clickStart + 1,
StringComparison.Ordinal);
Assert.True(doubleStart >= 0 && clickStart > doubleStart && keyStart > clickStart);
var doubleClick = App[doubleStart..clickStart];
var singleClick = App[clickStart..keyStart];
Assert.Contains("button[data-manual-stock-result-id]", doubleClick,
StringComparison.Ordinal);
Assert.Contains("selectManualFinancialStock(stock)", doubleClick,
StringComparison.Ordinal);
Assert.DoesNotContain("focusManualFinancialStock(stock)", doubleClick,
StringComparison.Ordinal);
Assert.Contains("focusManualFinancialStock(stock)", singleClick,
StringComparison.Ordinal);
Assert.DoesNotContain("queueManualFinancialStockSelection", App,
StringComparison.Ordinal);
var helperStart = App.IndexOf(
"function focusManualFinancialStock",
StringComparison.Ordinal);
var helperEnd = App.IndexOf(
"function captureManualDraftForChangedModel",
helperStart,
StringComparison.Ordinal);
Assert.True(helperStart >= 0 && helperEnd > helperStart);
var helper = App[helperStart..helperEnd];
Assert.DoesNotContain("deferLegacySingleClick", helper, StringComparison.Ordinal);
Assert.Contains("stock.focus({ preventScroll: true })", helper,
StringComparison.Ordinal);
Assert.Single(
Regex.Matches(helper, "send\\(\"select-manual-financial-stock\"")
.Cast<Match>());
var keyDown = App[keyStart..];
Assert.Contains("selectManualFinancialStock(stock)", keyDown,
StringComparison.Ordinal);
Assert.Contains("event.preventDefault();", keyDown, StringComparison.Ordinal);
}
[Fact]
public void Packaged_input_harness_double_clicks_GraphE_candidate_and_proves_one_intent()
{
Assert.Contains("beforeCandidateMessageSequence", PackageInputHarness,
StringComparison.Ordinal);
Assert.Contains("await pointerDoubleClick(", PackageInputHarness,
StringComparison.Ordinal);
Assert.Contains("select verified stock by slow Windows double-click", PackageInputHarness,
StringComparison.Ordinal);
Assert.Contains("message.sequence > beforeCandidateMessageSequence", PackageInputHarness,
StringComparison.Ordinal);
Assert.Contains("candidateMessages.length !== 1", PackageInputHarness,
StringComparison.Ordinal);
Assert.Contains("candidateMessages[0].type !== \"select-manual-financial-stock\"",
PackageInputHarness,
StringComparison.Ordinal);
Assert.Contains("await sleep(350);", PackageInputHarness, StringComparison.Ordinal);
Assert.Contains("SHOULD_CLEAR_ON_STOCK_CHANGE", PackageInputHarness,
StringComparison.Ordinal);
Assert.Contains("focusedCandidateId", PackageInputHarness, StringComparison.Ordinal);
}
private static string FindRepositoryRoot()
{
var directory = new DirectoryInfo(AppContext.BaseDirectory);