using Sdt.Config; using Xunit; namespace DevTool.Tests; public sealed class ConfigBootstrapperMatrixTests { [Fact] public void DotnetProject_GeneratesDotnetCoreWorkflows() { var root = CreateTempDir("sdt-matrix-dotnet-"); File.WriteAllText(Path.Combine(root, "sample.sln"), ""); var scan = ConfigBootstrapper.Scan(root); var config = ConfigBootstrapper.BuildDefaultConfig(scan); var build = config.Workflows.FirstOrDefault(w => w.Id == "build"); var deps = config.Workflows.FirstOrDefault(w => w.Id == "deps-refresh"); var test = config.Workflows.FirstOrDefault(w => w.Id == "test"); Assert.NotNull(build); Assert.NotNull(deps); Assert.NotNull(test); Assert.Contains(build!.Steps, s => s.Action == "dotnet-build"); Assert.Contains(deps!.Steps, s => s.Action == "dotnet-restore"); Assert.Contains(test!.Steps, s => s.Action == "dotnet-test"); } [Fact] public void NodeProject_GeneratesNodeCoreWorkflows() { var root = CreateTempDir("sdt-matrix-node-"); File.WriteAllText(Path.Combine(root, "package.json"), """{ "name": "demo", "scripts": { "build": "echo build", "test": "echo test" } }"""); var scan = ConfigBootstrapper.Scan(root); var config = ConfigBootstrapper.BuildDefaultConfig(scan); var build = config.Workflows.FirstOrDefault(w => w.Id == "build"); var deps = config.Workflows.FirstOrDefault(w => w.Id == "deps-refresh"); var test = config.Workflows.FirstOrDefault(w => w.Id == "test"); Assert.NotNull(build); Assert.NotNull(deps); Assert.NotNull(test); Assert.Contains(build!.Steps, s => s.Action == "npm-build"); Assert.Contains(deps!.Steps, s => s.Action == "npm-ci"); Assert.Contains(test!.Steps, s => s.Action == "npm-test"); } [Fact] public void TauriCargoProject_GeneratesTauriAndCargoWorkflows() { var root = CreateTempDir("sdt-matrix-tauri-"); File.WriteAllText(Path.Combine(root, "package.json"), """{ "name": "demo", "scripts": { "build": "echo build" } }"""); File.WriteAllText(Path.Combine(root, "Cargo.toml"), "[package]\nname=\"demo\"\nversion=\"0.1.0\""); File.WriteAllText(Path.Combine(root, "tauri.conf.json"), "{ }"); var scan = ConfigBootstrapper.Scan(root); var config = ConfigBootstrapper.BuildDefaultConfig(scan); var build = config.Workflows.FirstOrDefault(w => w.Id == "build"); var deps = config.Workflows.FirstOrDefault(w => w.Id == "deps-refresh"); var test = config.Workflows.FirstOrDefault(w => w.Id == "test"); Assert.NotNull(build); Assert.NotNull(deps); Assert.NotNull(test); Assert.Contains(build!.Steps, s => s.Action == "tauri-build"); Assert.Contains(build.Steps, s => s.Action == "cargo-build"); Assert.Contains(deps!.Steps, s => s.Action == "npm-ci"); Assert.Contains(test!.Steps, s => s.Action == "cargo-test"); } [Fact] public void GoMavenGradle_ActionsRemainConservativeAndRunnable() { var root = CreateTempDir("sdt-matrix-jvm-go-"); File.WriteAllText(Path.Combine(root, "go.mod"), "module example.com/demo"); File.WriteAllText(Path.Combine(root, "pom.xml"), ""); File.WriteAllText(Path.Combine(root, "build.gradle"), "plugins {}"); var scan = ConfigBootstrapper.Scan(root); var config = ConfigBootstrapper.BuildDefaultConfig(scan); var build = config.Workflows.First(w => w.Id == "build"); var deps = config.Workflows.First(w => w.Id == "deps-refresh"); var test = config.Workflows.First(w => w.Id == "test"); Assert.Contains(build.Steps, s => s.Command == "go" && s.Args.SequenceEqual(["build", "./..."])); Assert.Contains(build.Steps, s => s.Command == "mvn" && s.Args.SequenceEqual(["package", "-DskipTests"])); Assert.Contains(build.Steps, s => s.Command == "gradle" && s.Args.SequenceEqual(["build"])); Assert.Contains(deps.Steps, s => s.Command == "go" && s.Args.SequenceEqual(["mod", "download"])); Assert.Contains(deps.Steps, s => s.Command == "mvn" && s.Args.SequenceEqual(["dependency:resolve"])); Assert.Contains(deps.Steps, s => s.Command == "gradle" && s.Args.SequenceEqual(["dependencies"])); Assert.Contains(test.Steps, s => s.Command == "go" && s.Args.SequenceEqual(["test", "./..."])); Assert.Contains(test.Steps, s => s.Command == "mvn" && s.Args.SequenceEqual(["test"])); Assert.Contains(test.Steps, s => s.Command == "gradle" && s.Args.SequenceEqual(["test"])); } private static string CreateTempDir(string prefix) { var path = Path.Combine(Path.GetTempPath(), prefix + Guid.NewGuid().ToString("N")); Directory.CreateDirectory(path); return path; } }