SDT/tests/DevTool.Tests/WorkspaceLoaderTests.cs
2026-03-01 20:52:56 -06:00

86 lines
3.1 KiB
C#

using Sdt.Config;
using Xunit;
namespace DevTool.Tests;
public sealed class WorkspaceLoaderTests
{
[Fact]
public void FindAndLoad_DoesNotThrow_WhenAutoDiscoverHitsStrictLegacyProject()
{
var root = Path.Combine(Path.GetTempPath(), "sdt-workspace-" + Guid.NewGuid().ToString("N"));
Directory.CreateDirectory(root);
File.WriteAllText(Path.Combine(root, "devtool.json"), """
{
"name": "legacy",
"version": "0.1.0",
"targets": [
{
"id": "build",
"label": "Build",
"group": "Build",
"command": "dotnet",
"args": ["build"],
"workingDir": ".",
"dependsOn": []
}
],
"workflows": []
}
""");
Environment.SetEnvironmentVariable("SDT_LEGACY_MODE", null);
var result = WorkspaceLoader.FindAndLoad(root);
Assert.Null(result);
}
[Fact]
public void ResolveProjectRoot_AcceptsAbsolutePaths()
{
var root = Path.GetFullPath(Path.Combine(Path.GetTempPath(), "ws-" + Guid.NewGuid().ToString("N")));
var abs = Path.GetFullPath(Path.Combine(Path.GetTempPath(), "proj-" + Guid.NewGuid().ToString("N")));
var project = new WorkspaceProject { Path = abs };
var resolved = WorkspaceLoader.ResolveProjectRoot(root, project);
Assert.Equal(abs, resolved, ignoreCase: OperatingSystem.IsWindows());
}
[Fact]
public void WorkspaceProject_AdditionalFields_DefaultsAreSafe()
{
var project = new WorkspaceProject();
Assert.Empty(project.Tags);
Assert.Empty(project.ToolFamilies);
Assert.False(project.Disabled);
}
[Fact]
public void WorkspaceConfig_FavoritesDefaultToEmpty()
{
var workspace = new WorkspaceConfig();
Assert.Empty(workspace.Favorites);
Assert.True(workspace.Inventory.Enabled);
Assert.Equal(4, workspace.Inventory.MaxDepth);
Assert.Contains("*.slnx", workspace.Inventory.IncludeMarkers);
}
[Fact]
public void FindAndLoad_AutoDiscover_AddsOnlyDevtoolProjects_NotMarkerOnlyCandidates()
{
var workspaceRoot = Path.Combine(Path.GetTempPath(), "sdt-ws-auto-" + Guid.NewGuid().ToString("N"));
var current = Path.Combine(workspaceRoot, "current");
var markerOnly = Path.Combine(workspaceRoot, "marker");
Directory.CreateDirectory(current);
Directory.CreateDirectory(markerOnly);
File.WriteAllText(Path.Combine(current, "devtool.json"), """{"name":"current","version":"0.1.0","workflows":[]}""");
File.WriteAllText(Path.Combine(markerOnly, "marker.csproj"), "<Project />");
var loaded = WorkspaceLoader.FindAndLoad(current);
Assert.NotNull(loaded);
Assert.Contains(loaded!.Value.Config.Projects, p =>
WorkspaceLoader.ResolveProjectRoot(loaded.Value.WorkspaceRoot, p).Equals(Path.GetFullPath(current), StringComparison.OrdinalIgnoreCase));
Assert.DoesNotContain(loaded.Value.Config.Projects, p =>
WorkspaceLoader.ResolveProjectRoot(loaded.Value.WorkspaceRoot, p).Equals(Path.GetFullPath(markerOnly), StringComparison.OrdinalIgnoreCase));
}
}