Skip to content

Commit 3a2f3b3

Browse files
committed
modinfo file finder does not throw when main modinfo file is invalid.
1 parent 26ef04c commit 3a2f3b3

2 files changed

Lines changed: 110 additions & 28 deletions

File tree

src/EawModinfo.Tests/ModinfoFileFinderTests.cs

Lines changed: 106 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,15 @@ public void FindModinfoFiles_InvalidArgs_Throws()
2323

2424
public ModinfoFileFinderTests()
2525
{
26-
CreateScenario_MainModinfoOnly();
27-
CreateScenario_MainModinfoOnly_WithCaseInsensitiveName();
28-
CreateScenario_WithNoValidModinfoFiles();
29-
CreateScenario_WithMainModinfoAndVariant();
30-
CreateScenario_WithOnlyVariants();
31-
CreateScenario_WithMainModinfoAndVariantAndInvalidFiles();
26+
CreateScenario1_MainModinfoOnly();
27+
CreateScenario2_MainModinfoOnly_WithCaseInsensitiveName();
28+
CreateScenario3_WithNoValidModinfoFiles();
29+
CreateScenario4_WithMainModinfoAndVariant();
30+
CreateScenario5_WithOnlyVariants();
31+
CreateScenario6_CreateWithMainModinfoAndVariantAndOtherFiles();
32+
CreateScenario7_WithInvalidMainModinfo();
33+
CreateScenario8_WithMainModinfoAndInvalidVariant();
34+
CreateScenario9_WithInvalidMainModinfoAndValidVariant();
3235
}
3336

3437
[Theory]
@@ -38,6 +41,9 @@ public ModinfoFileFinderTests()
3841
[InlineData(4, true, 1)]
3942
[InlineData(5, false, 2)]
4043
[InlineData(6, true, 1)]
44+
[InlineData(7, true, 0)]
45+
[InlineData(8, true, 1)]
46+
[InlineData(9, true, 1)]
4147
public void FindModinfoFiles_TestAll(int scenario, bool hasMain, int numberVariants)
4248
{
4349
var scenarioPath = _fileSystem.DirectoryInfo.New(_scenarioPaths[scenario]);
@@ -57,7 +63,20 @@ public void FindModinfoFiles_TestMerge(int scenario)
5763
Assert.NotNull(all.Variants.ElementAt(0).GetModinfo().Version);
5864
}
5965

60-
private void CreateScenario_MainModinfoOnly()
66+
[Theory]
67+
[InlineData(7)]
68+
[InlineData(9)]
69+
public void FindModinfoFiles_InvalidMain_CannotGetModinfo(int scenario)
70+
{
71+
var scenarioPath = _fileSystem.DirectoryInfo.New(_scenarioPaths[scenario]);
72+
var all = ModinfoFileFinder.FindModinfoFiles(scenarioPath);
73+
74+
Assert.False(all.MainModinfo!.TryGetModinfo(out _));
75+
foreach (var modinfoVariantFile in all.Variants)
76+
Assert.False(modinfoVariantFile.TryGetModinfo(out _));
77+
}
78+
79+
private void CreateScenario1_MainModinfoOnly()
6180
{
6281
CreateScenario(1, () =>
6382
{
@@ -73,7 +92,7 @@ private void CreateScenario_MainModinfoOnly()
7392
});
7493
}
7594

76-
private void CreateScenario_MainModinfoOnly_WithCaseInsensitiveName()
95+
private void CreateScenario2_MainModinfoOnly_WithCaseInsensitiveName()
7796
{
7897
CreateScenario(2, () =>
7998
{
@@ -89,7 +108,7 @@ private void CreateScenario_MainModinfoOnly_WithCaseInsensitiveName()
89108
});
90109
}
91110

92-
private void CreateScenario_WithNoValidModinfoFiles()
111+
private void CreateScenario3_WithNoValidModinfoFiles()
93112
{
94113
CreateScenario(3, () =>
95114
{
@@ -101,7 +120,7 @@ private void CreateScenario_WithNoValidModinfoFiles()
101120
});
102121
}
103122

104-
private void CreateScenario_WithMainModinfoAndVariant()
123+
private void CreateScenario4_WithMainModinfoAndVariant()
105124
{
106125
CreateScenario(4, () =>
107126
{
@@ -127,7 +146,31 @@ private void CreateScenario_WithMainModinfoAndVariant()
127146
});
128147
}
129148

130-
private void CreateScenario_WithMainModinfoAndVariantAndInvalidFiles()
149+
private void CreateScenario5_WithOnlyVariants()
150+
{
151+
CreateScenario(5, () =>
152+
{
153+
const string path = "scenario5";
154+
const string variant1FileName = "1-modinfo.json";
155+
const string variant2FileName = "2-modinfo.json";
156+
var filePath1 = _fileSystem.Path.Combine(path, variant1FileName);
157+
var filePath2 = _fileSystem.Path.Combine(path, variant2FileName);
158+
159+
const string data1 = @"{
160+
""name"": ""Addon-1""
161+
}";
162+
163+
const string data2 = @"{
164+
""name"": ""Addon-2""
165+
}";
166+
167+
_fileSystem.AddFile(filePath1, new MockFileData(data1));
168+
_fileSystem.AddFile(filePath2, new MockFileData(data2));
169+
return path;
170+
});
171+
}
172+
173+
private void CreateScenario6_CreateWithMainModinfoAndVariantAndOtherFiles()
131174
{
132175
CreateScenario(6, () =>
133176
{
@@ -156,26 +199,65 @@ private void CreateScenario_WithMainModinfoAndVariantAndInvalidFiles()
156199
});
157200
}
158201

159-
private void CreateScenario_WithOnlyVariants()
202+
private void CreateScenario7_WithInvalidMainModinfo()
160203
{
161-
CreateScenario(5, () =>
204+
CreateScenario(7, () =>
162205
{
163-
const string path = "scenario5";
164-
const string variant1FileName = "1-modinfo.json";
165-
const string variant2FileName = "2-modinfo.json";
166-
var filePath1 = _fileSystem.Path.Combine(path, variant1FileName);
167-
var filePath2 = _fileSystem.Path.Combine(path, variant2FileName);
206+
const string path = "scenario7";
207+
const string mainFileName = "modinfo.json";
208+
var mainFilePath = _fileSystem.Path.Combine(path, mainFileName);
168209

169-
const string data1 = @"{
170-
""name"": ""Addon-1""
210+
const string mainFileData = "\0";
211+
212+
_fileSystem.AddFile(mainFilePath, new MockFileData(mainFileData));
213+
214+
return path;
215+
});
216+
}
217+
218+
private void CreateScenario8_WithMainModinfoAndInvalidVariant()
219+
{
220+
CreateScenario(8, () =>
221+
{
222+
const string path = "scenario8";
223+
const string mainFileName = "modinfo.json";
224+
const string variantFileName = "variant-modinfo.json";
225+
var mainFilePath = _fileSystem.Path.Combine(path, mainFileName);
226+
var variantFilePath = _fileSystem.Path.Combine(path, variantFileName);
227+
228+
const string mainFileData = @"{
229+
""name"": ""testmod"",
230+
""version"": ""1.0.0""
171231
}";
172232

173-
const string data2 = @"{
174-
""name"": ""Addon-2""
233+
const string variantFileData = "\0";
234+
235+
_fileSystem.AddFile(mainFilePath, new MockFileData(mainFileData));
236+
_fileSystem.AddFile(variantFilePath, new MockFileData(variantFileData));
237+
238+
return path;
239+
});
240+
}
241+
242+
private void CreateScenario9_WithInvalidMainModinfoAndValidVariant()
243+
{
244+
CreateScenario(9, () =>
245+
{
246+
const string path = "scenario9";
247+
const string mainFileName = "modinfo.json";
248+
const string variantFileName = "variant-modinfo.json";
249+
var mainFilePath = _fileSystem.Path.Combine(path, mainFileName);
250+
var variantFilePath = _fileSystem.Path.Combine(path, variantFileName);
251+
252+
const string mainFileData = "\0";
253+
254+
const string variantFileData = @"{
255+
""name"": ""Addon""
175256
}";
176257

177-
_fileSystem.AddFile(filePath1, new MockFileData(data1));
178-
_fileSystem.AddFile(filePath2, new MockFileData(data2));
258+
_fileSystem.AddFile(mainFilePath, new MockFileData(mainFileData));
259+
_fileSystem.AddFile(variantFilePath, new MockFileData(variantFileData));
260+
179261
return path;
180262
});
181263
}

src/EawModinfo/File/ModinfoFileFinder.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88
namespace EawModinfo.File;
99

1010
/// <summary>
11-
/// Searches a directory for modinfo files.
11+
/// Provides a method to searches a directory for modinfo files.
1212
/// </summary>
1313
public static class ModinfoFileFinder
1414
{
1515
/// <summary>
16-
/// Searches the directory specified for all modinfo files according to the modinfo specification in section III.3.
16+
/// Searches the directory specified for all modinfo files according to the modinfo specification in section II.3.
1717
/// </summary>
1818
/// <param name="directory">The directory to search for modinfo files.</param>
1919
/// <returns>A collection with all found modinfo files.</returns>
@@ -31,7 +31,7 @@ public static ModinfoFinderCollection FindModinfoFiles(IDirectoryInfo directory)
3131
private static ModinfoFinderCollection FindCore(IDirectoryInfo directory)
3232
{
3333
var mainModinfoFile = FindMainModinfoFileCore(directory);
34-
var variantFiles = new List<ModinfoVariantFile>(FindModinfoVariantFilesCore(directory, mainModinfoFile?.GetModinfo()));
34+
var variantFiles = new List<ModinfoVariantFile>(FindModinfoVariantFilesCore(directory, mainModinfoFile));
3535

3636
return new ModinfoFinderCollection(directory, mainModinfoFile, variantFiles);
3737
}
@@ -46,7 +46,7 @@ private static ModinfoFinderCollection FindCore(IDirectoryInfo directory)
4646
return !modinfo.IsFileValid(out _) ? null : modinfo;
4747
}
4848

49-
private static IEnumerable<ModinfoVariantFile> FindModinfoVariantFilesCore(IDirectoryInfo directory, IModinfo? mainModinfoData)
49+
private static IEnumerable<ModinfoVariantFile> FindModinfoVariantFilesCore(IDirectoryInfo directory, MainModinfoFile? mainModinfoData)
5050
{
5151
var possibleVariants = directory.EnumerateFiles(
5252
$"*{ModinfoVariantFile.VariantModinfoFileEnding}",

0 commit comments

Comments
 (0)