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"), ""); 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)); } }