Forge
csharpdeeb25a2
1using System.Threading.Channels;
2using CascadeIDE.Features.Workspace.Application;
3using CascadeIDE.Services;
4using Xunit;
5
6namespace CascadeIDE.Tests;
7
8public sealed class ProjectInSolutionCreatorTests
9{
10 private sealed class SimRunner : IDotnetCommandRunner
11 {
12 public List<(IReadOnlyList<string> Args, string WorkingDir)> Calls { get; } = [];
13
14 public Task<(bool Success, int ExitCode, string Output)> RunAsync(
15 IReadOnlyList<string> arguments,
16 string workingDirectory,
17 CancellationToken cancellationToken = default)
18 {
19 Calls.Add((arguments.ToList(), workingDirectory));
20 var cmd = string.Join(' ', arguments);
21
22 if (cmd.StartsWith("new console", StringComparison.Ordinal))
23 {
24 var oIndex = IndexOf(arguments, "-o");
25 var dir = oIndex >= 0 && oIndex + 1 < arguments.Count ? arguments[oIndex + 1] : "";
26 Directory.CreateDirectory(dir);
27 File.WriteAllText(Path.Combine(dir, "App.csproj"), "<Project Sdk=\"Microsoft.NET.Sdk\"></Project>");
28 return Task.FromResult((true, 0, ""));
29 }
30
31 if (cmd.StartsWith("sln add", StringComparison.Ordinal))
32 return Task.FromResult((true, 0, ""));
33
34 return Task.FromResult((false, 1, "unexpected: " + cmd));
35 }
36
37 public Task<(bool Success, int ExitCode)> RunWithChunkWriterAsync(
38 IReadOnlyList<string> args,
39 string workingDirectory,
40 ChannelWriter<string> chunkWriter,
41 CancellationToken cancellationToken = default) =>
42 throw new NotSupportedException();
43
44 private static int IndexOf(IReadOnlyList<string> args, string value)
45 {
46 for (var i = 0; i < args.Count; i++)
47 {
48 if (string.Equals(args[i], value, StringComparison.Ordinal))
49 return i;
50 }
51
52 return -1;
53 }
54 }
55
56 [Fact]
57 public async Task TryCreateAsync_runs_new_and_sln_add()
58 {
59 var dir = Path.Combine(Path.GetTempPath(), "cide-sln-" + Guid.NewGuid().ToString("N"));
60 Directory.CreateDirectory(dir);
61 var sln = Path.Combine(dir, "Test.sln");
62 await File.WriteAllTextAsync(sln, "");
63
64 var runner = new SimRunner();
65 var result = await ProjectInSolutionCreator.TryCreateAsync(sln, "console", "MyApp", runner);
66
67 Assert.True(result.Ok, result.ErrorMessage);
68 Assert.Equal(2, runner.Calls.Count);
69 Assert.Contains("new", runner.Calls[0].Args);
70 Assert.Equal("sln", runner.Calls[1].Args[0]);
71 }
72
73 [Fact]
74 public async Task TryCreateAsync_without_solution_fails()
75 {
76 var runner = new SimRunner();
77 var result = await ProjectInSolutionCreator.TryCreateAsync(null, "console", "X", runner);
78
79 Assert.False(result.Ok);
80 Assert.Contains("открой", result.ErrorMessage, StringComparison.OrdinalIgnoreCase);
81 }
82}
83
View only · write via MCP/CIDE