namespace MBN_STOCK_WEBVIEW.LegacyWeb.Tests;
public sealed class LegacySidebarIconContractTests
{
private static readonly string RepositoryRoot = FindRepositoryRoot();
private static readonly string WebRoot = Path.Combine(
RepositoryRoot,
"src",
"MBN_STOCK_WEBVIEW.LegacyParityApp",
"Web");
private static readonly string Markup = File.ReadAllText(
Path.Combine(WebRoot, "index.html"));
private static readonly string Navigation = File.ReadAllText(
Path.Combine(WebRoot, "workspace-navigation.js"));
private static readonly string Styles = File.ReadAllText(
Path.Combine(WebRoot, "styles.css"));
private static readonly string PackageInputSmoke = File.ReadAllText(
Path.Combine(RepositoryRoot, "scripts", "Test-LegacyPackageInput.mjs"));
private static readonly string UiOnlySmoke = File.ReadAllText(
Path.Combine(RepositoryRoot, "scripts", "Test-LegacyPackageUiOnlySmoke.mjs"));
[Fact]
public void EverySidebarDestinationUsesOneClosedSemanticSvgIcon()
{
var mappings = new (string Anchor, string Icon)[]
{
("id=\"workspace-stock-tab\"", "stock-cut"),
("data-tab-id=\"overseas\"", "overseas"),
("data-tab-id=\"exchange\"", "exchange"),
("data-tab-id=\"index\"", "index"),
("data-tab-id=\"kospiIndustry\"", "kospi"),
("data-tab-id=\"kosdaqIndustry\"", "kosdaq"),
("data-tab-id=\"comparison\"", "comparison"),
("data-tab-id=\"theme\"", "theme"),
("data-tab-id=\"overseasStocks\"", "overseas-stocks"),
("data-tab-id=\"expert\"", "expert"),
("data-tab-id=\"tradingHalt\"", "trading-halt"),
("id=\"workspace-settings-tab\"", "settings")
};
foreach (var (anchor, icon) in mappings)
{
var button = Slice(Markup, anchor, "");
Assert.Contains($"data-icon=\"{icon}\"", button, StringComparison.Ordinal);
Assert.Contains(
$"href=\"#workspace-icon-{icon}\"",
button,
StringComparison.Ordinal);
Assert.DoesNotContain("
");
Assert.DoesNotContain("");
var kosdaq = Slice(
Markup,
"");
Assert.Contains(
"M4.5 18V6h4a4 4 0 0 1 0 8h-4",
kospi,
StringComparison.Ordinal);
Assert.Contains(
"M15 6h4M17 6v12M15 18h4",
kospi,
StringComparison.Ordinal);
Assert.Contains(
"M2.3 18V6h1.6c2.8 0 4.3 2.2 4.3 6",
kosdaq,
StringComparison.Ordinal);
Assert.Contains(
"M9 18l2.5-12H13l2.5 12M10 14h4.5",
kosdaq,
StringComparison.Ordinal);
Assert.Contains(
"",
kosdaq,
StringComparison.Ordinal);
Assert.Contains("m19.5 14.5 3.2 4", kosdaq, StringComparison.Ordinal);
Assert.DoesNotContain(" 0",
harness,
StringComparison.Ordinal);
Assert.Contains("style.stroke !== \"none\" || style.fill !== \"none\"",
harness,
StringComparison.Ordinal);
Assert.Contains("rendered: Boolean(", harness, StringComparison.Ordinal);
Assert.Contains("expectedHeadingIcon", harness, StringComparison.Ordinal);
}
Assert.Contains("navigationItems:", PackageInputSmoke, StringComparison.Ordinal);
Assert.Contains("iconCenterOffset:", PackageInputSmoke, StringComparison.Ordinal);
Assert.Contains("iconCenterOffsetY:", PackageInputSmoke, StringComparison.Ordinal);
Assert.Contains("item.iconCenterOffset > 1.5", PackageInputSmoke, StringComparison.Ordinal);
Assert.Contains("item.iconCenterOffsetY > 1.5",
PackageInputSmoke,
StringComparison.Ordinal);
Assert.Contains("collapsedIconCenterOffsets:", PackageInputSmoke, StringComparison.Ordinal);
Assert.Contains("tab.icon.key === baseline.marketTabs[index].icon.key",
PackageInputSmoke,
StringComparison.Ordinal);
Assert.Contains("layout.stockTabIcon.rendered === true",
UiOnlySmoke,
StringComparison.Ordinal);
Assert.Contains("layout.settingsTabIcon.rendered === true",
UiOnlySmoke,
StringComparison.Ordinal);
Assert.Contains("tab.icon.rendered === true",
UiOnlySmoke,
StringComparison.Ordinal);
}
private static string Slice(string value, string start, string end)
{
var startIndex = value.IndexOf(start, StringComparison.Ordinal);
Assert.True(startIndex >= 0, $"Required marker was not found: {start}");
var endIndex = value.IndexOf(
end,
startIndex + start.Length,
StringComparison.Ordinal);
Assert.True(endIndex > startIndex, $"Required marker was not found: {end}");
return value[startIndex..(endIndex + end.Length)];
}
private static void AssertInOrder(string value, params string[] needles)
{
var previous = -1;
foreach (var needle in needles)
{
var current = value.IndexOf(needle, previous + 1, StringComparison.Ordinal);
Assert.True(current > previous, $"Required ordered marker was not found: {needle}");
previous = current;
}
}
private static string FindRepositoryRoot()
{
var directory = new DirectoryInfo(AppContext.BaseDirectory);
while (directory is not null)
{
if (File.Exists(Path.Combine(directory.FullName, "MBN_STOCK_WEBVIEW.sln")))
{
return directory.FullName;
}
directory = directory.Parent;
}
throw new DirectoryNotFoundException("Repository root was not found.");
}
}