Skip to content

Commit 901ef08

Browse files
committed
Add deeper tests for InstallOptions, fix bug
1 parent ebfad11 commit 901ef08

File tree

3 files changed

+97
-38
lines changed

3 files changed

+97
-38
lines changed

src/UniGetUI.PackageEngine.Serializable.Tests/TestInstallOptions.cs

Lines changed: 79 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
using System.Text.Json.Nodes;
2+
using WinRT.Interop;
3+
using Xunit.Sdk;
24

35
namespace UniGetUI.PackageEngine.Serializable.Tests;
46

@@ -37,13 +39,13 @@ public void ToAndFromJsonNode(bool a, bool b, string c, string d, string e, stri
3739
var jsonContent = JsonNode.Parse(contents);
3840
Assert.NotNull(jsonContent);
3941
object2.LoadFromJson(jsonContent);
40-
AreEqual(originalObject1, object2);
42+
AssertAreEqual(originalObject1, object2);
4143

4244
var object3 = new InstallOptions(originalObject1.AsJsonNode());
43-
AreEqual(originalObject1, object3);
45+
AssertAreEqual(originalObject1, object3);
4446

4547
var object4 = originalObject1.Copy();
46-
AreEqual(originalObject1, object4);
48+
AssertAreEqual(originalObject1, object4);
4749
}
4850

4951
[Theory]
@@ -99,19 +101,80 @@ public void FromJson(string JSON, bool hash, bool inter, string installLoc, stri
99101
Assert.Equal(ver, o2.Version);
100102
}
101103

102-
internal static void AreEqual(InstallOptions o1, InstallOptions o2)
104+
[Theory]
105+
[InlineData(13345)]
106+
[InlineData(219574)]
107+
[InlineData(-3453)]
108+
[InlineData(15820753)]
109+
[InlineData(9026)]
110+
[InlineData(12783)]
111+
[InlineData(87432574)]
112+
[InlineData(34)]
113+
[InlineData(86578312)]
114+
public void RandomPropertyAssignTester(int seed)
103115
{
104-
Assert.Equal(o1.SkipHashCheck, o2.SkipHashCheck);
105-
Assert.Equal(o1.Architecture, o2.Architecture);
106-
Assert.Equal(o1.CustomInstallLocation, o2.CustomInstallLocation);
107-
Assert.Equal(o1.CustomParameters_Install.Where(x => x.Any()).ToList(), o2.CustomParameters_Install.Where(x => x.Any()).ToList());
108-
Assert.Equal(o1.CustomParameters_Uninstall.Where(x => x.Any()).ToList(), o2.CustomParameters_Uninstall.Where(x => x.Any()).ToList());
109-
Assert.Equal(o1.CustomParameters_Update.Where(x => x.Any()).ToList(), o2.CustomParameters_Update.Where(x => x.Any()).ToList());
110-
Assert.Equal(o1.InstallationScope, o2.InstallationScope);
111-
Assert.Equal(o1.InteractiveInstallation, o2.InteractiveInstallation);
112-
Assert.Equal(o1.PreRelease, o2.PreRelease);
113-
Assert.Equal(o1.RunAsAdministrator, o2.RunAsAdministrator);
114-
Assert.Equal(o1.SkipMinorUpdates, o2.SkipMinorUpdates);
115-
Assert.Equal(o1.Version, o2.Version);
116+
InstallOptions o1 = GenerateRandom(seed);
117+
InstallOptions o2 = o1.Copy();
118+
Assert.True(o2.DiffersFromDefault());
119+
AssertAreEqual(o1, o2);
120+
var c1 = o1.AsJsonString();
121+
var c2 = o2.AsJsonString();
122+
Assert.Equal(c1, c2);
123+
InstallOptions o3 = new();
124+
o3.LoadFromJson(JsonNode.Parse(c1) ?? throw new ArgumentException("null"));
125+
AssertAreEqual(o1, o2);
126+
AssertAreEqual(o2, o3);
127+
AssertAreEqual(o1, o3); // Yeah, it is redundant
128+
Assert.Equal(c1, o3.AsJsonString());
129+
}
130+
131+
private static InstallOptions GenerateRandom(int seed)
132+
{
133+
Random r = new(seed);
134+
135+
InstallOptions o1 = new();
136+
foreach (var (key, _) in o1._defaultBoolValues)
137+
o1.SetValueToProperty(key, r.Next(2) is 0);
138+
139+
o1.OverridesNextLevelOpts = r.Next(2) is 0;
140+
141+
foreach (var (key, _) in o1._defaultStringValues)
142+
o1.SetValueToProperty(key, r.Next().ToString());
143+
144+
foreach (var key in o1._defaultListValues)
145+
{
146+
var randomList = Enumerable.Range(0, r.Next(0, 11))
147+
.Select(_ => r.Next().ToString())
148+
.ToList();
149+
o1.SetValueToProperty(key, randomList);
150+
}
151+
152+
return o1;
153+
}
154+
155+
internal static void AssertAreEqual(InstallOptions o1, InstallOptions o2)
156+
{
157+
Assert.Equal(o1.OverridesNextLevelOpts, o2.OverridesNextLevelOpts);
158+
159+
foreach (var (key, _) in o1._defaultBoolValues)
160+
{
161+
Assert.Equal(
162+
o1.GetValueFromProperty<bool>(key),
163+
o2.GetValueFromProperty<bool>(key));
164+
}
165+
166+
foreach (var (key, _) in o1._defaultStringValues)
167+
{
168+
Assert.Equal(
169+
o1.GetValueFromProperty<string>(key),
170+
o2.GetValueFromProperty<string>(key));
171+
}
172+
173+
foreach (var key in o1._defaultListValues)
174+
{
175+
Assert.Equal(
176+
o1.GetValueFromProperty<IReadOnlyList<string>>(key).Where(x => x.Any()),
177+
o2.GetValueFromProperty<IReadOnlyList<string>>(key).Where(x => x.Any()));
178+
}
116179
}
117180
}

src/UniGetUI.PackageEngine.Serializable.Tests/TestSerializablePackage.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public void FromJson(string JSON, string id, string name, string version, string
9090
Assert.Equal(manager, o2.ManagerName);
9191
Assert.Equal(source, o2.Source);
9292
Assert.Equal(version, o2.Version);
93-
TestInstallOptions.AreEqual(new() { SkipHashCheck = skipHash }, o2.InstallationOptions);
93+
TestInstallOptions.AssertAreEqual(new() { SkipHashCheck = skipHash }, o2.InstallationOptions);
9494
TestSerializableUpdatesOptions.AreEqual(new(){IgnoredVersion = ignoredVer}, o2.Updates);
9595
}
9696

@@ -101,7 +101,7 @@ internal static void AreEqual(SerializablePackage o1, SerializablePackage o2)
101101
Assert.Equal(o1.Source, o2.Source);
102102
Assert.Equal(o1.Version, o2.Version);
103103
Assert.Equal(o1.ManagerName, o2.ManagerName);
104-
TestInstallOptions.AreEqual(o1.InstallationOptions, o2.InstallationOptions);
104+
TestInstallOptions.AssertAreEqual(o1.InstallationOptions, o2.InstallationOptions);
105105
TestSerializableUpdatesOptions.AreEqual(o1.Updates, o2.Updates);
106106
}
107107
}

src/UniGetUI.PackageEngine.Serializable/InstallOptions.cs

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace UniGetUI.PackageEngine.Serializable
66
{
77
public class InstallOptions: SerializableComponent<InstallOptions>
88
{
9-
private readonly IReadOnlyDictionary<string, bool> DefaultBoolValues = new Dictionary<string, bool>()
9+
public readonly IReadOnlyDictionary<string, bool> _defaultBoolValues = new Dictionary<string, bool>()
1010
{ // OverridesNextLevelOpts is deliberately skipped here
1111
{ "SkipHashCheck", false },
1212
{ "InteractiveInstallation", false },
@@ -20,7 +20,7 @@ public class InstallOptions: SerializableComponent<InstallOptions>
2020
{ "AbortOnPreUninstallFail", true },
2121
};
2222

23-
private readonly IReadOnlyDictionary<string, string> DefaultStringValues = new Dictionary<string, string>()
23+
public readonly IReadOnlyDictionary<string, string> _defaultStringValues = new Dictionary<string, string>()
2424
{
2525
{"Architecture", ""},
2626
{"InstallationScope", ""},
@@ -34,7 +34,7 @@ public class InstallOptions: SerializableComponent<InstallOptions>
3434
{"PostUninstallCommand", ""},
3535
};
3636

37-
private readonly IReadOnlyList<string> DefaultListValues = new List<string>()
37+
public readonly IReadOnlyList<string> _defaultListValues = new List<string>()
3838
{
3939
"CustomParameters_Install",
4040
"CustomParameters_Update",
@@ -75,13 +75,13 @@ public override InstallOptions Copy()
7575
{
7676
var copy = new InstallOptions();
7777

78-
foreach (var (boolKey, _) in DefaultBoolValues)
78+
foreach (var (boolKey, _) in _defaultBoolValues)
7979
copy.SetValueToProperty(boolKey, GetValueFromProperty<bool>(boolKey));
8080

81-
foreach (var (stringKey, _) in DefaultStringValues)
81+
foreach (var (stringKey, _) in _defaultStringValues)
8282
copy.SetValueToProperty(stringKey, GetValueFromProperty<string>(stringKey));
8383

84-
foreach (var listKey in DefaultListValues)
84+
foreach (var listKey in _defaultListValues)
8585
copy.SetValueToProperty(listKey, GetValueFromProperty<IReadOnlyList<string>>(listKey).ToList());
8686

8787
// Handle non-automated OverridesNextLevelOpts
@@ -103,17 +103,13 @@ public T GetValueFromProperty<T>(string name)
103103

104104
public override void LoadFromJson(JsonNode data)
105105
{
106-
foreach (var (boolKey, defValue) in DefaultBoolValues)
107-
{
108-
// RemoveDataOnUninstall should not be loaded from disk
109-
if(boolKey == "RemoveDataOnUninstall") continue;
106+
foreach (var (boolKey, defValue) in _defaultBoolValues)
110107
SetValueToProperty(boolKey, data[boolKey]?.GetVal<bool>() ?? defValue);
111-
}
112108

113-
foreach (var (stringKey, defValue) in DefaultStringValues)
109+
foreach (var (stringKey, defValue) in _defaultStringValues)
114110
SetValueToProperty(stringKey, data[stringKey]?.GetVal<string>() ?? defValue);
115111

116-
foreach (var listKey in DefaultListValues)
112+
foreach (var listKey in _defaultListValues)
117113
SetValueToProperty(listKey, ReadArrayFromJson(data, listKey));
118114

119115
// Handle case where setting has not been migrated yet
@@ -137,22 +133,22 @@ public override JsonNode AsJsonNode()
137133
{
138134
JsonObject obj = new();
139135

140-
if (OverridesNextLevelOpts is not false)
136+
if (OverridesNextLevelOpts is not false || DiffersFromDefault())
141137
obj.Add(nameof(OverridesNextLevelOpts), OverridesNextLevelOpts);
142138

143-
foreach (var (boolKey, defValue) in DefaultBoolValues)
139+
foreach (var (boolKey, defValue) in _defaultBoolValues)
144140
{
145141
bool currentValue = GetValueFromProperty<bool>(boolKey);
146142
if (currentValue != defValue) obj.Add(boolKey, currentValue);
147143
}
148144

149-
foreach (var (stringKey, defValue) in DefaultStringValues)
145+
foreach (var (stringKey, defValue) in _defaultStringValues)
150146
{
151147
string currentValue = GetValueFromProperty<string>(stringKey);
152148
if (currentValue != defValue) obj.Add(stringKey, currentValue);
153149
}
154150

155-
foreach (var listKey in DefaultListValues)
151+
foreach (var listKey in _defaultListValues)
156152
{
157153
IReadOnlyList<string> currentValue = GetValueFromProperty<IReadOnlyList<string>>(listKey);
158154

@@ -176,13 +172,13 @@ private static List<string> ReadArrayFromJson(JsonNode data, string name)
176172

177173
public bool DiffersFromDefault()
178174
{
179-
foreach (var (boolKey, defValue) in DefaultBoolValues)
175+
foreach (var (boolKey, defValue) in _defaultBoolValues)
180176
if (GetValueFromProperty<bool>(boolKey) != defValue) return true;
181177

182-
foreach (var (stringKey, defValue) in DefaultStringValues)
178+
foreach (var (stringKey, defValue) in _defaultStringValues)
183179
if (GetValueFromProperty<string>(stringKey) != defValue) return true;
184180

185-
foreach (var listKey in DefaultListValues)
181+
foreach (var listKey in _defaultListValues)
186182
{
187183
IReadOnlyList<string> currentValue = GetValueFromProperty<IReadOnlyList<string>>(listKey);
188184
if (currentValue.Where(x => x.Any()).Any()) return true;

0 commit comments

Comments
 (0)