Skip to content

Commit 45ca2e6

Browse files
committed
various little changes
1 parent 95cfd74 commit 45ca2e6

12 files changed

Lines changed: 109 additions & 43 deletions

File tree

src/ModVerify.CliApp/ModVerifyApplication.cs

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
using Serilog;
1111
using System;
1212
using System.Collections.Generic;
13-
using System.IO;
1413
using System.IO.Abstractions;
1514
using System.Linq;
1615
using System.Threading.Tasks;
@@ -26,21 +25,21 @@ internal sealed class ModVerifyApplication(ModVerifyAppSettings settings, IServi
2625
private readonly IFileSystem _fileSystem = services.GetRequiredService<IFileSystem>();
2726
private readonly ModVerifyAppEnvironment _appEnvironment = services.GetRequiredService<ModVerifyAppEnvironment>();
2827

29-
public async Task<int> Run()
28+
public async Task<int> RunAsync()
3029
{
3130
using (new UnhandledExceptionHandler(services))
3231
using (new UnobservedTaskExceptionHandler(services))
33-
return await RunCore().ConfigureAwait(false);
32+
return await RunCoreAsync().ConfigureAwait(false);
3433
}
3534

36-
private async Task<int> RunCore()
35+
private async Task<int> RunCoreAsync()
3736
{
3837
_logger?.LogDebug("Raw command line: {CommandLine}", Environment.CommandLine);
3938

4039
var interactive = settings.Interactive;
4140
try
4241
{
43-
return await RunVerify().ConfigureAwait(false);
42+
return await RunModVerifyAsync().ConfigureAwait(false);
4443
}
4544
catch (Exception e)
4645
{
@@ -66,7 +65,7 @@ private async Task<int> RunCore()
6665
}
6766

6867

69-
private async Task<int> RunVerify()
68+
private async Task<int> RunModVerifyAsync()
7069
{
7170
VerificationTarget verificationTarget;
7271
try
@@ -102,28 +101,34 @@ private async Task<int> RunVerify()
102101
_logger?.LogDebug("Verification taget: {Target}", verificationTarget);
103102
_logger?.LogTrace("Verify settings: {Settings}", settings);
104103

105-
var allErrors = await Verify(verificationTarget, reportSettings)
104+
var allErrors = await VerifyTargetAsync(verificationTarget, reportSettings)
106105
.ConfigureAwait(false);
107106

107+
// TODO: Refactor method to represent "verify" and "baseline" mode of the app.
108+
// Also display to user more prominently which mode is active.
109+
108110
try
109111
{
110112
await ReportErrors(allErrors).ConfigureAwait(false);
111113
}
112114
catch (GameVerificationException e)
113115
{
116+
_logger?.LogInformation(ModVerifyConstants.ConsoleEventId,
117+
"The verification of {Target} completed with findings of the specified failure severity {Severity}",
118+
verificationTarget.Name, settings.AppThrowsOnMinimumSeverity);
114119
return e.HResult;
115120
}
116121

117122
if (!settings.CreateNewBaseline)
118123
return 0;
119124

120-
await WriteBaseline(verificationTarget, reportSettings, allErrors, settings.NewBaselinePath).ConfigureAwait(false);
125+
await WriteBaselineAsync(verificationTarget, reportSettings, allErrors, settings.NewBaselinePath).ConfigureAwait(false);
121126
_logger?.LogInformation(ModVerifyConstants.ConsoleEventId, "Baseline successfully created.");
122127

123128
return 0;
124129
}
125130

126-
private async Task<IReadOnlyCollection<VerificationError>> Verify(
131+
private async Task<IReadOnlyCollection<VerificationError>> VerifyTargetAsync(
127132
VerificationTarget verificationTarget,
128133
GlobalVerifyReportSettings reportSettings)
129134
{
@@ -181,22 +186,15 @@ private async Task ReportErrors(IReadOnlyCollection<VerificationError> errors)
181186
throw new GameVerificationException(errors);
182187
}
183188

184-
private async Task WriteBaseline(
189+
private async Task WriteBaselineAsync(
185190
VerificationTarget target,
186191
GlobalVerifyReportSettings reportSettings,
187192
IEnumerable<VerificationError> errors,
188193
string baselineFile)
189194
{
190-
var baseline = new VerificationBaseline(reportSettings.MinimumReportSeverity, errors, target);
191-
192-
var fullPath = _fileSystem.Path.GetFullPath(baselineFile);
193-
_logger?.LogInformation(ModVerifyConstants.ConsoleEventId, "Writing Baseline to '{FullPath}'", fullPath);
194-
195-
#if NET
196-
await
197-
#endif
198-
using var fs = _fileSystem.FileStream.New(fullPath, FileMode.Create, FileAccess.Write, FileShare.None);
199-
await baseline.ToJsonAsync(fs);
195+
var baselineFactory = services.GetRequiredService<BaselineFactory>();
196+
var baseline = baselineFactory.CreateBaseline(target, reportSettings, errors);
197+
await baselineFactory.WriteBaselineAsync(baseline, baselineFile);
200198
}
201199

202200
private GlobalVerifyReportSettings CreateGlobalReportSettings(VerificationTarget verificationTarget)

src/ModVerify.CliApp/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ protected override async Task<int> RunAppAsync(string[] args, IServiceProvider a
173173
return e.HResult;
174174
}
175175

176-
return await new ModVerifyApplication(modVerifySettings, appServiceProvider).Run().ConfigureAwait(false);
176+
return await new ModVerifyApplication(modVerifySettings, appServiceProvider).RunAsync().ConfigureAwait(false);
177177
}
178178

179179
private void SetupVerifyReporting(IServiceCollection serviceCollection)

src/ModVerify.CliApp/Properties/launchSettings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
},
77
"Interactive Verify": {
88
"commandName": "Project",
9-
"commandLineArgs": "verify -o verifyResults --minFailSeverity Information --offline"
9+
"commandLineArgs": "verify -o verifyResults --minFailSeverity Information --offline --failFast"
1010
},
1111
"Interactive Baseline": {
1212
"commandName": "Project",

src/ModVerify.CliApp/Reporting/BaselineFactory.cs

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1-
using System;
1+
using AET.ModVerify.Reporting;
2+
using AET.ModVerify.Reporting.Settings;
3+
using Microsoft.Extensions.DependencyInjection;
4+
using Microsoft.Extensions.Logging;
5+
using System;
6+
using System.Collections.Generic;
27
using System.Diagnostics.CodeAnalysis;
38
using System.IO;
49
using System.IO.Abstractions;
5-
using AET.ModVerify.Reporting;
6-
using Microsoft.Extensions.DependencyInjection;
7-
using Microsoft.Extensions.Logging;
10+
using System.Threading.Tasks;
811

912
namespace AET.ModVerify.App.Reporting;
1013

@@ -13,7 +16,7 @@ internal sealed class BaselineFactory(IServiceProvider serviceProvider)
1316
private readonly ILogger? _logger = serviceProvider.GetService<ILoggerFactory>()?.CreateLogger(typeof(BaselineFactory));
1417
private readonly IFileSystem _fileSystem = serviceProvider.GetRequiredService<IFileSystem>();
1518

16-
public bool TryCreateBaseline(
19+
public bool TryFindBaselineInDirectory(
1720
string directory,
1821
out VerificationBaseline baseline,
1922
[NotNullWhen(true)] out string? path)
@@ -58,11 +61,31 @@ public bool TryCreateBaseline(
5861
return false;
5962
}
6063

61-
public VerificationBaseline CreateBaseline(string filePath)
64+
public VerificationBaseline ParseBaseline(string filePath)
6265
{
6366
return CreateBaselineFromFilePath(filePath);
6467
}
6568

69+
public VerificationBaseline CreateBaseline(
70+
VerificationTarget target,
71+
GlobalVerifyReportSettings reportSettings,
72+
IEnumerable<VerificationError> errors)
73+
{
74+
return new VerificationBaseline(reportSettings.MinimumReportSeverity, errors, target);
75+
}
76+
77+
public async Task WriteBaselineAsync(VerificationBaseline baseline, string filePath)
78+
{
79+
var fullPath = _fileSystem.Path.GetFullPath(filePath);
80+
_logger?.LogInformation(ModVerifyConstants.ConsoleEventId, "Writing Baseline to '{FullPath}'", fullPath);
81+
82+
#if NET
83+
await
84+
#endif
85+
using var fs = _fileSystem.FileStream.New(fullPath, FileMode.Create, FileAccess.Write, FileShare.None);
86+
await baseline.ToJsonAsync(fs);
87+
}
88+
6689
private VerificationBaseline CreateBaselineFromFilePath(string baselineFile)
6790
{
6891
using var fs = _fileSystem.FileStream.New(baselineFile, FileMode.Open, FileAccess.Read);

src/ModVerify.CliApp/Reporting/BaselineSelector.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public VerificationBaseline SelectBaseline(VerificationTarget verificationTarget
2323
try
2424
{
2525
usedBaselinePath = baselinePath;
26-
return _baselineFactory.CreateBaseline(baselinePath!);
26+
return _baselineFactory.ParseBaseline(baselinePath!);
2727
}
2828
catch (InvalidBaselineException e)
2929
{
@@ -65,10 +65,10 @@ private VerificationBaseline FindBaselineInteractive(VerificationTarget verifica
6565

6666
_logger?.LogInformation(ModVerifyConstants.ConsoleEventId, "Searching for local baseline files...");
6767

68-
if (!_baselineFactory.TryCreateBaseline(verificationTarget.Location.TargetPath, out var baseline,
68+
if (!_baselineFactory.TryFindBaselineInDirectory(verificationTarget.Location.TargetPath, out var baseline,
6969
out baselinePath))
7070
{
71-
if (!_baselineFactory.TryCreateBaseline("./", out baseline, out baselinePath))
71+
if (!_baselineFactory.TryFindBaselineInDirectory("./", out baseline, out baselinePath))
7272
{
7373
// It does not make sense to load the game's default baselines if the user wants to verify the game,
7474
// as the verification result would always be empty (at least in a non-development scenario)
@@ -115,7 +115,7 @@ private VerificationBaseline TryGetDefaultBaseline(GameEngineType engineType, ou
115115
}
116116
}
117117

118-
internal VerificationBaseline LoadEmbeddedBaseline(GameEngineType engineType)
118+
internal static VerificationBaseline LoadEmbeddedBaseline(GameEngineType engineType)
119119
{
120120
var baselineFileName = $"baseline-{engineType.ToString().ToLower()}.json";
121121
var resourcePath = $"{typeof(BaselineResources).Namespace}.{baselineFileName}";
@@ -126,7 +126,7 @@ internal VerificationBaseline LoadEmbeddedBaseline(GameEngineType engineType)
126126

127127
private VerificationBaseline FindBaselineNonInteractive(string targetPath, out string? usedPath)
128128
{
129-
if (_baselineFactory.TryCreateBaseline(targetPath, out var baseline, out usedPath))
129+
if (_baselineFactory.TryFindBaselineInDirectory(targetPath, out var baseline, out usedPath))
130130
{
131131
_logger?.LogInformation(ModVerifyConstants.ConsoleEventId, "Automatically applying local baseline file '{Path}'.", usedPath);
132132
return baseline;

src/ModVerify.CliApp/Settings/CommandLine/VerifyVerbOption.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ internal sealed class VerifyVerbOption : BaseModVerifyOptions
2020
public bool FailFast { get; init; }
2121

2222
[Option("minFailSeverity", Required = false, Default = null,
23-
HelpText = "When set, the application return with an error, if any finding has at least the specified severity value.")]
23+
HelpText = "When set, the application returns with an error, if any finding has at least the specified severity value.")]
2424
public VerificationSeverity? MinimumFailureSeverity { get; set; }
2525

2626
[Option("ignoreAsserts", Required = false,

src/ModVerify.CliApp/Settings/ModVerifyAppSettings.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,30 @@ internal sealed class ModVerifyAppSettings
2020
public bool CreateNewBaseline => !string.IsNullOrEmpty(NewBaselinePath);
2121

2222
public string? NewBaselinePath { get; init; }
23+
}
24+
25+
26+
internal enum AppMode
27+
{
28+
Verify,
29+
Baseline
30+
}
31+
32+
internal abstract class ModVerifyAppSettingsBase
33+
{
34+
public abstract AppMode Mode { get; }
35+
public bool IsInteractive => VerificationTargetSettings.Interactive;
36+
public required VerificationTargetSettings VerificationTargetSettings { get; init; }
37+
}
38+
39+
internal sealed class VerifyAppSettings : ModVerifyAppSettingsBase
40+
{
41+
public override AppMode Mode => AppMode.Verify;
42+
public VerificationSeverity? AppThrowsOnMinimumSeverity { get; init; }
43+
}
44+
45+
internal sealed class BaselineAppSettings : ModVerifyAppSettingsBase
46+
{
47+
public override AppMode Mode => AppMode.Baseline;
48+
public required string NewBaselinePath { get; init; }
2349
}

src/ModVerify.CliApp/Settings/SettingsBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ private ModVerifyAppSettings BuildFromVerifyVerb(VerifyVerbOption verifyOptions)
5555
if (minFailSeverity == null)
5656
{
5757
_logger?.LogWarning(ModVerifyConstants.ConsoleEventId,
58-
"Verification is configured to fail fast but 'minFailSeverity' is not specified. Using severity '{Info}'.", VerificationSeverity.Information);
58+
"Verification is configured to fail fast but 'minFailSeverity' is not specified. Using severity '{Severity}'.", VerificationSeverity.Information);
5959
minFailSeverity = VerificationSeverity.Information;
6060
}
6161

src/ModVerify/Reporting/Json/JsonBaselineParser.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
namespace AET.ModVerify.Reporting.Json;
66

7-
public static class JsonBaselineParser
7+
internal static class JsonBaselineParser
88
{
99
public static VerificationBaseline Parse(Stream dataStream)
1010
{
@@ -13,7 +13,7 @@ public static VerificationBaseline Parse(Stream dataStream)
1313
try
1414
{
1515
var jsonNode = JsonDocument.Parse(dataStream);
16-
var jsonBaseline = ParseCore(jsonNode);
16+
var jsonBaseline = EvaluateAndDeserialize(jsonNode);
1717

1818
if (jsonBaseline is null)
1919
throw new InvalidBaselineException($"Unable to parse input from stream to {nameof(VerificationBaseline)}. Unknown Error!");
@@ -26,11 +26,10 @@ public static VerificationBaseline Parse(Stream dataStream)
2626
}
2727
}
2828

29-
private static JsonVerificationBaseline? ParseCore(JsonDocument? json)
29+
private static JsonVerificationBaseline? EvaluateAndDeserialize(JsonDocument? json)
3030
{
3131
if (json is null)
3232
return null;
33-
3433
JsonBaselineSchema.Evaluate(json.RootElement);
3534
return json.Deserialize<JsonVerificationBaseline>();
3635
}

src/ModVerify/Reporting/VerificationBaseline.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using System.Text.Json;
88
using System.Threading.Tasks;
99
using AET.ModVerify.Reporting.Json;
10+
using PG.StarWarsGame.Engine;
1011

1112
namespace AET.ModVerify.Reporting;
1213

@@ -88,4 +89,24 @@ public override string ToString()
8889
sb.Append(']');
8990
return sb.ToString();
9091
}
92+
}
93+
94+
public sealed class BaselineVerificationTarget
95+
{
96+
public required GameEngineType Engine { get; init; }
97+
public required string Name { get; init; }
98+
public GameLocations? Location { get; init; }
99+
public string? Version { get; init; }
100+
public bool IsGame => Location.ModPaths.Count == 0;
101+
102+
103+
104+
public override string ToString()
105+
{
106+
var sb = new StringBuilder($"[Name={Name};EngineType={Engine};");
107+
if (!string.IsNullOrEmpty(Version)) sb.Append($"Version={Version};");
108+
sb.Append($"Location={Location};");
109+
sb.Append(']');
110+
return sb.ToString();
111+
}
91112
}

0 commit comments

Comments
 (0)