Преглед изворни кода

feat(control): HostArgs 命令行参数解析 + 单测

阶段1-Task2:account/password/cacheDisk/port 解析,IsValid 守卫;4 单测通过。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
huangjie пре 3 дана
родитељ
комит
764be5f816

+ 40 - 0
ivf_tl_operate_2.0/control/ivf_tl_ControlHost.Tests/HostArgsTests.cs

@@ -0,0 +1,40 @@
+using IvfTl.ControlHost;
+using Xunit;
+
+namespace IvfTl.ControlHost.Tests
+{
+    public class HostArgsTests
+    {
+        [Fact]
+        public void Parse_AllArgs_FillsFields()
+        {
+            var a = HostArgs.Parse(new[] {
+                "--account=admin", "--password=123456", "--cacheDisk=C", "--port=38080" });
+            Assert.Equal("admin", a.Account);
+            Assert.Equal("123456", a.Password);
+            Assert.Equal("C", a.CacheDisk);
+            Assert.Equal(38080, a.Port);
+        }
+
+        [Fact]
+        public void Parse_MissingPort_UsesDefault38080()
+        {
+            var a = HostArgs.Parse(new[] { "--account=x", "--password=y" });
+            Assert.Equal(38080, a.Port);
+        }
+
+        [Fact]
+        public void Parse_NoCredentials_IsValidFalse()
+        {
+            var a = HostArgs.Parse(new[] { "--port=38080" });
+            Assert.False(a.IsValid);
+        }
+
+        [Fact]
+        public void Parse_WithCredentials_IsValidTrue()
+        {
+            var a = HostArgs.Parse(new[] { "--account=admin", "--password=123456" });
+            Assert.True(a.IsValid);
+        }
+    }
+}

+ 15 - 0
ivf_tl_operate_2.0/control/ivf_tl_ControlHost.Tests/ivf_tl_ControlHost.Tests.csproj

@@ -0,0 +1,15 @@
+<Project Sdk="Microsoft.NET.Sdk">
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <Nullable>disable</Nullable>
+    <IsPackable>false</IsPackable>
+  </PropertyGroup>
+  <ItemGroup>
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.0" />
+    <PackageReference Include="xunit" Version="2.4.2" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.4.5" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\ivf_tl_ControlHost\HostArgs.cs" Link="HostArgs.cs" />
+  </ItemGroup>
+</Project>

+ 40 - 0
ivf_tl_operate_2.0/control/ivf_tl_ControlHost/HostArgs.cs

@@ -0,0 +1,40 @@
+using System;
+using System.Collections.Generic;
+
+namespace IvfTl.ControlHost
+{
+    /// <summary>control 启动参数(由 operate 拉起时命令行传入)。纯 BCL,无 WPF/硬件依赖,可单测。</summary>
+    public class HostArgs
+    {
+        public string Account { get; set; } = "";
+        public string Password { get; set; } = "";
+        public string CacheDisk { get; set; } = "";
+        public int Port { get; set; } = 38080;
+
+        /// <summary>有账号密码才允许启动采集(对齐 operate MainWindow 的空账号守卫)。</summary>
+        public bool IsValid =>
+            !string.IsNullOrEmpty(Account) && !string.IsNullOrEmpty(Password);
+
+        public static HostArgs Parse(string[] args)
+        {
+            var map = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
+            if (args != null)
+            {
+                foreach (var raw in args)
+                {
+                    if (string.IsNullOrEmpty(raw)) continue;
+                    var s = raw.StartsWith("--") ? raw.Substring(2) : raw;
+                    int eq = s.IndexOf('=');
+                    if (eq <= 0) continue;
+                    map[s.Substring(0, eq)] = s.Substring(eq + 1);
+                }
+            }
+            var a = new HostArgs();
+            if (map.TryGetValue("account", out var acc)) a.Account = acc;
+            if (map.TryGetValue("password", out var pwd)) a.Password = pwd;
+            if (map.TryGetValue("cacheDisk", out var cd)) a.CacheDisk = cd;
+            if (map.TryGetValue("port", out var p) && int.TryParse(p, out var pi)) a.Port = pi;
+            return a;
+        }
+    }
+}