forked from GitTools/GitVersion
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathProgramFixture.cs
69 lines (55 loc) · 2.17 KB
/
ProgramFixture.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
using GitVersion.Core.Tests.Helpers;
using GitVersion.Extensions;
using GitVersion.Logging;
using Microsoft.Extensions.DependencyInjection;
namespace GitVersion.App.Tests;
public sealed class ProgramFixture
{
private readonly IEnvironment environment;
private List<Action<IServiceCollection>> Overrides { get; } = [];
private readonly Lazy<string> logger;
private readonly Lazy<string?> output;
private readonly string workingDirectory;
public ProgramFixture(string workingDirectory = "")
{
this.workingDirectory = workingDirectory;
var logBuilder = new StringBuilder();
var logAppender = new TestLogAppender(m => logBuilder.AppendLine(m));
ILog log = new Log(logAppender);
var consoleBuilder = new StringBuilder();
var consoleAdapter = new TestConsoleAdapter(consoleBuilder);
this.environment = new TestEnvironment();
WithOverrides(services =>
{
services.AddSingleton(log);
services.AddSingleton<IConsole>(consoleAdapter);
services.AddSingleton(this.environment);
});
this.logger = new(() => logBuilder.ToString());
this.output = new(() => consoleAdapter.ToString());
}
public void WithEnv(params KeyValuePair<string, string>[] envs)
{
foreach (var (key, value) in envs)
{
this.environment.SetEnvironmentVariable(key, value);
}
}
public void WithOverrides(Action<IServiceCollection> action) => Overrides.Add(action);
public Task<ExecutionResults> Run(string arg)
{
var args = arg.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToArray();
return Run(args);
}
public async Task<ExecutionResults> Run(params string[] args)
{
// Create the application and override registrations.
var program = new Program(builder => Overrides.ForEach(action => action(builder)));
if (!this.workingDirectory.IsNullOrWhiteSpace())
{
args = ["-targetpath", this.workingDirectory, .. args];
}
await program.RunAsync(args);
return new(SysEnv.ExitCode, this.output.Value, this.logger.Value);
}
}