初始提交:WinUI 3 一键运行轮盘工具

This commit is contained in:
2026-08-30 01:37:56 +08:00
commit 83011e5d29
58 changed files with 4373 additions and 0 deletions
@@ -0,0 +1,127 @@
using System.Diagnostics;
using OneClickRun.Core.Models;
using OneClickRun.Core.Services;
using Xunit;
namespace OneClickRun.Core.Tests;
public class CommandRunnerTests
{
private static string SystemRoot => Environment.GetFolderPath(Environment.SpecialFolder.Windows);
[Fact]
public void App_BuildsShellExecuteInfo()
{
var item = new CommandItem { ActionType = ActionType.App, Target = SystemRoot + "\\explorer.exe", Arguments = "-n" };
var psi = CommandRunner.BuildStartInfo(item);
Assert.True(psi.UseShellExecute);
Assert.Equal("-n", psi.Arguments);
Assert.False(string.IsNullOrEmpty(psi.WorkingDirectory));
}
[Fact]
public void App_Admin_SetsVerb()
{
var item = new CommandItem { ActionType = ActionType.App, Target = SystemRoot + "\\explorer.exe", RunAsAdmin = true };
var psi = CommandRunner.BuildStartInfo(item);
Assert.Equal("runas", psi.Verb);
}
[Fact]
public void Folder_UsesExplorer()
{
var item = new CommandItem { ActionType = ActionType.Folder, Target = "C:\\Some Folder" };
var psi = CommandRunner.BuildStartInfo(item);
Assert.Equal("explorer.exe", psi.FileName);
Assert.Contains("\"C:\\Some Folder\"", psi.Arguments);
Assert.False(psi.UseShellExecute);
}
[Theory]
[InlineData("www.bing.com", "https://www.bing.com")]
[InlineData("bing.com", "https://bing.com")]
[InlineData("https://example.com/x", "https://example.com/x")]
[InlineData("ms-settings:", "ms-settings:")]
public void Url_Normalization(string input, string expected)
{
Assert.Equal(expected, CommandRunner.NormalizeUrl(input));
}
[Fact]
public void Script_BuildsPowerShellArgs()
{
var item = new CommandItem { ActionType = ActionType.Script, Target = "C:\\Scripts\\demo.ps1" };
var psi = CommandRunner.BuildStartInfo(item);
Assert.Equal("powershell.exe", psi.FileName);
Assert.Contains("-NoProfile", psi.Arguments);
Assert.Contains("-ExecutionPolicy Bypass", psi.Arguments);
Assert.Contains("-File \"C:\\Scripts\\demo.ps1\"", psi.Arguments);
Assert.False(psi.UseShellExecute);
Assert.False(psi.CreateNoWindow);
}
[Fact]
public void Script_Hidden_SetsNoWindow()
{
var item = new CommandItem { ActionType = ActionType.Script, Target = "C:\\a.ps1", HideWindow = true };
var psi = CommandRunner.BuildStartInfo(item);
Assert.True(psi.CreateNoWindow);
Assert.Equal(ProcessWindowStyle.Hidden, psi.WindowStyle);
}
[Fact]
public void Script_Admin_SetsVerb()
{
var item = new CommandItem { ActionType = ActionType.Script, Target = "C:\\a.ps1", RunAsAdmin = true };
var psi = CommandRunner.BuildStartInfo(item);
Assert.True(psi.UseShellExecute);
Assert.Equal("runas", psi.Verb);
}
[Theory]
[InlineData(ActionType.App)]
[InlineData(ActionType.Folder)]
[InlineData(ActionType.Script)]
[InlineData(ActionType.Url)]
public void Validate_MissingTarget_ReturnsError(ActionType type)
{
var item = new CommandItem { Name = "x", ActionType = type, Target = "" };
Assert.NotNull(CommandRunner.Validate(item));
}
[Fact]
public void Validate_ExistingApp_ReturnsNull()
{
var item = new CommandItem { Name = "x", ActionType = ActionType.App, Target = SystemRoot + "\\notepad.exe" };
Assert.Null(CommandRunner.Validate(item));
}
[Fact]
public void Validate_InvalidUrl_ReturnsError()
{
var item = new CommandItem { Name = "x", ActionType = ActionType.Url, Target = "::not a url::" };
Assert.NotNull(CommandRunner.Validate(item));
}
[Theory]
[InlineData(@"C:\Scripts\run.cmd")]
[InlineData(@"C:\Scripts\run.bat")]
public void Script_Batch_BuildsCmdArgs(string target)
{
var item = new CommandItem { ActionType = ActionType.Script, Target = target };
var psi = CommandRunner.BuildStartInfo(item);
Assert.Equal("cmd.exe", psi.FileName);
Assert.Equal("/c \"\"" + target + "\"\"", psi.Arguments);
Assert.False(psi.UseShellExecute);
}
[Fact]
public void Script_Batch_Admin_SetsVerb()
{
var item = new CommandItem { ActionType = ActionType.Script, Target = "C:\run.bat", RunAsAdmin = true };
var psi = CommandRunner.BuildStartInfo(item);
Assert.Equal("cmd.exe", psi.FileName);
Assert.True(psi.UseShellExecute);
Assert.Equal("runas", psi.Verb);
}
}