Skip to content

Commit 278355f

Browse files
committed
Partial testing suite refactoring
1 parent fc00f97 commit 278355f

26 files changed

Lines changed: 751 additions & 531 deletions

Mythril.Headless/Simulation/LatticeSimulator_Stats.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,10 @@ void Check(string cad, bool condition)
8181
var cadenceName = parts[0];
8282
var abilityName = parts[1];
8383

84-
var cadence = cadences.All.First(c => c.Name == cadenceName);
85-
var unlock = cadence.Abilities.First(a => a.Ability.Name == abilityName);
84+
var cadence = cadences.All.FirstOrDefault(c => c.Name == cadenceName);
85+
if (cadence.Name == null) continue;
86+
var unlock = cadence.Abilities.FirstOrDefault(a => a.Ability.Name == abilityName);
87+
if (unlock.Ability.Name == null) continue;
8688

8789
if (unlock.Ability.Effects != null)
8890
{

Mythril.Headless/Simulation/RoutedSimulator.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public partial class RoutedSimulator(
1212
ItemRefinements refinements, StatAugments statAugments, Stats stats)
1313
{
1414
private readonly HashSet<string> _farmingStack = [];
15-
private const string END_QUEST = "Defeat the Mythril Construct";
15+
public string EndQuest { get; set; } = "Defeat the Mythril Construct";
1616

1717
public void Run(SimulationSeed? seed = null)
1818
{
@@ -29,14 +29,14 @@ public void Run(SimulationSeed? seed = null)
2929
{
3030
steps++;
3131
progressed = AttemptStep(state, steps);
32-
if (state.CompletedQuests.Contains(END_QUEST)) { Console.WriteLine($"[SUCCESS] End Game reached!"); break; }
32+
if (state.CompletedQuests.Contains(EndQuest)) { Console.WriteLine($"[SUCCESS] End Game reached!"); break; }
3333
if (state.CurrentTime > 3600 * 24 * 365) break;
3434
}
3535
Console.WriteLine($"Routed Completion Time: {(state.CurrentTime / 60.0):F1} minutes");
3636
Console.WriteLine($"Total Quests Completed: {state.CompletedQuests.Count}");
37-
if (!state.CompletedQuests.Contains(END_QUEST)) {
37+
if (!state.CompletedQuests.Contains(EndQuest)) {
3838
Console.WriteLine("[FAIL] End Game node never reached.");
39-
var endQuestObj = quests.All.First(q => q.Name == END_QUEST);
39+
var endQuestObj = quests.All.First(q => q.Name == EndQuest);
4040
var endQuestDet = questDetails[endQuestObj];
4141
Console.WriteLine($"[DEBUG] End Game Stats Required: {string.Join(", ", endQuestDet.RequiredStats?.Select(kvp => $"{kvp.Key}: {kvp.Value}") ?? ["None"])}");
4242
Console.WriteLine($"[DEBUG] Current Stats: {string.Join(", ", state.CurrentStats.Select(kvp => $"{kvp.Key}: {kvp.Value}"))}");
@@ -45,7 +45,7 @@ public void Run(SimulationSeed? seed = null)
4545

4646
// Expose time for ReachabilitySimulator to report
4747
LastRunTime = state.CurrentTime;
48-
EndGameReached = state.CompletedQuests.Contains(END_QUEST);
48+
EndGameReached = state.CompletedQuests.Contains(EndQuest);
4949
}
5050

5151
public double LastRunTime { get; private set; }

Mythril.Headless/Simulation/RoutedSimulator_Logic.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ private bool AttemptStep(SimulationState state, int steps)
1212
var available = GetAvailableQuests(state);
1313

1414
// Priority 0: End Game if available and affordable
15-
var endQuest = available.FirstOrDefault(q => q.Quest.Name == END_QUEST);
15+
var endQuest = available.FirstOrDefault(q => q.Quest.Name == EndQuest);
1616
if (endQuest.Quest.Name != null && CanAffordEventually(state, endQuest.Detail.Requirements)) {
1717
ExecuteQuest(state, endQuest.Quest, endQuest.Detail, steps); return true;
1818
}
@@ -113,7 +113,7 @@ private bool CanAffordEventually(SimulationState state, ItemQuantity[] requireme
113113
.Select(req => req.Item.Name)
114114
.Distinct().ToHashSet();
115115

116-
return available.OrderByDescending(q => q.Item1.Name == END_QUEST ? 1000 : 0)
116+
return available.OrderByDescending(q => q.Item1.Name == EndQuest ? 1000 : 0)
117117
.ThenByDescending(q => q.Item2.Rewards?.Any(r => neededItems.Contains(r.Item.Name)) ?? false ? 100 : 0)
118118
.ThenBy(q => q.Item2.DurationSeconds)
119119
.ToList();

Mythril.Tests/AutomationTests.cs

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class AutomationTests
1818
[TestInitialize]
1919
public void Setup()
2020
{
21-
TestContentLoader.Load();
21+
SandboxContent.Load();
2222
_items = ContentHost.GetContent<Items>();
2323
_quests = ContentHost.GetContent<Quests>();
2424
_questDetails = ContentHost.GetContent<QuestDetails>();
@@ -54,13 +54,13 @@ public void Setup()
5454
public async Task AutoQuest_RestartsSlotZero()
5555
{
5656
var character = _resourceManager!.Characters[0];
57-
var recruit = _cadences!.All.First(c => c.Name == "Recruit");
57+
var recruit = _cadences!.All.First(c => c.Name == SandboxContent.Recruit);
5858
_resourceManager.UnlockCadence(recruit);
59-
_resourceManager.UnlockAbility("Recruit", "AutoQuest I");
59+
_resourceManager.UnlockAbility(SandboxContent.Recruit, SandboxContent.AutoQuestI);
6060
_resourceManager.JunctionManager.AssignCadence(recruit, character, _resourceManager.UnlockedAbilities);
6161
_resourceManager.SetAutoQuestEnabled(character, true);
6262

63-
var questGoblins = new QuestData(_quests!.All.First(q => q.Name == "Hunt Goblins"), _questDetails![_quests.All.First(q => q.Name == "Hunt Goblins")]);
63+
var questGoblins = new QuestData(_quests!.All.First(q => q.Name == SandboxContent.HuntGoblins), _questDetails![_quests.All.First(q => q.Name == SandboxContent.HuntGoblins)]);
6464
_resourceManager.StartQuest(questGoblins, character);
6565

6666
var progress = _resourceManager.ActiveQuests.First();
@@ -74,15 +74,15 @@ public async Task AutoQuest_RestartsSlotZero()
7474
public async Task AutoQuestII_RestartsSlotOne()
7575
{
7676
var character = _resourceManager!.Characters[0];
77-
var scholar = _cadences!.All.First(c => c.Name == "Scholar");
77+
var scholar = _cadences!.All.First(c => c.Name == SandboxContent.Scholar);
7878
_resourceManager.UnlockCadence(scholar);
79-
_resourceManager.UnlockAbility("Scholar", "Logistics II");
80-
_resourceManager.UnlockAbility("Scholar", "AutoQuest II");
79+
_resourceManager.UnlockAbility(SandboxContent.Scholar, SandboxContent.LogisticsII);
80+
_resourceManager.UnlockAbility(SandboxContent.Scholar, SandboxContent.AutoQuestII);
8181
_resourceManager.JunctionManager.AssignCadence(scholar, character, _resourceManager.UnlockedAbilities);
8282
_resourceManager.SetAutoQuestEnabled(character, true);
8383

84-
var q1 = new QuestData(_quests!.All.First(q => q.Name == "Hunt Goblins"), _questDetails![_quests.All.First(q => q.Name == "Hunt Goblins")]);
85-
var q2 = new QuestData(_quests.All.First(q => q.Name == "Hunt Bats"), _questDetails[_quests.All.First(q => q.Name == "Hunt Bats")]);
84+
var q1 = new QuestData(_quests!.All.First(q => q.Name == SandboxContent.HuntGoblins), _questDetails![_quests.All.First(q => q.Name == SandboxContent.HuntGoblins)]);
85+
var q2 = new QuestData(_quests.All.First(q => q.Name == SandboxContent.HuntBats), _questDetails[_quests.All.First(q => q.Name == SandboxContent.HuntBats)]);
8686

8787
_resourceManager.StartQuest(q1, character); // Slot 0
8888
_resourceManager.StartQuest(q2, character); // Slot 1
@@ -98,16 +98,16 @@ public async Task AutoQuestII_RestartsSlotOne()
9898
public async Task SlotTwo_NeverAutoRestarts()
9999
{
100100
var character = _resourceManager!.Characters[0];
101-
var scholar = _cadences!.All.First(c => c.Name == "Scholar");
101+
var scholar = _cadences!.All.First(c => c.Name == SandboxContent.Scholar);
102102
_resourceManager.UnlockCadence(scholar);
103-
_resourceManager.UnlockAbility("Scholar", "Logistics II");
104-
_resourceManager.UnlockAbility("Scholar", "AutoQuest II");
103+
_resourceManager.UnlockAbility(SandboxContent.Scholar, SandboxContent.LogisticsII);
104+
_resourceManager.UnlockAbility(SandboxContent.Scholar, SandboxContent.AutoQuestII);
105105
_resourceManager.JunctionManager.AssignCadence(scholar, character, _resourceManager.UnlockedAbilities);
106106
_resourceManager.SetAutoQuestEnabled(character, true);
107107

108-
var q1 = new QuestData(_quests!.All.First(q => q.Name == "Hunt Goblins"), _questDetails![_quests.All.First(q => q.Name == "Hunt Goblins")]);
109-
var q2 = new QuestData(_quests.All.First(q => q.Name == "Hunt Bats"), _questDetails[_quests.All.First(q => q.Name == "Hunt Bats")]);
110-
var q3 = new QuestData(_quests.All.First(q => q.Name == "Hunt Spiders"), _questDetails[_quests.All.First(q => q.Name == "Hunt Spiders")]);
108+
var q1 = new QuestData(_quests!.All.First(q => q.Name == SandboxContent.HuntGoblins), _questDetails![_quests.All.First(q => q.Name == SandboxContent.HuntGoblins)]);
109+
var q2 = new QuestData(_quests.All.First(q => q.Name == SandboxContent.HuntBats), _questDetails[_quests.All.First(q => q.Name == SandboxContent.HuntBats)]);
110+
var q3 = new QuestData(_quests.All.First(q => q.Name == SandboxContent.HuntSpiders), _questDetails[_quests.All.First(q => q.Name == SandboxContent.HuntSpiders)]);
111111

112112
_resourceManager.StartQuest(q1, character);
113113
_resourceManager.StartQuest(q2, character);
@@ -123,10 +123,10 @@ public async Task SlotTwo_NeverAutoRestarts()
123123
public async Task AutoQuest_DoesNotRestart_SingleUseQuest()
124124
{
125125
var character = _resourceManager!.Characters[0];
126-
_resourceManager.UnlockAbility("Recruit", "AutoQuest I");
126+
_resourceManager.UnlockAbility(SandboxContent.Recruit, SandboxContent.AutoQuestI);
127127
_resourceManager.SetAutoQuestEnabled(character, true);
128128

129-
var prologue = new QuestData(_quests!.All.First(q => q.Name == "Prologue"), _questDetails![_quests.All.First(q => q.Name == "Prologue")]);
129+
var prologue = new QuestData(_quests!.All.First(q => q.Name == SandboxContent.Prologue), _questDetails![_quests.All.First(q => q.Name == SandboxContent.Prologue)]);
130130
_resourceManager.StartQuest(prologue, character);
131131

132132
var progress = _resourceManager.ActiveQuests.First();
@@ -139,15 +139,15 @@ public async Task AutoQuest_DoesNotRestart_SingleUseQuest()
139139
public async Task Refinement_AutoQuest_RespectsMagicCapacity()
140140
{
141141
var character = _resourceManager!.Characters[0];
142-
var student = _cadences!.All.First(c => c.Name == "Student");
142+
var student = _cadences!.All.First(c => c.Name == SandboxContent.Student);
143143
_resourceManager.UnlockCadence(student);
144-
_resourceManager.UnlockAbility("Student", "AutoQuest I");
145-
_resourceManager.UnlockAbility("Student", "Refine Fire");
144+
_resourceManager.UnlockAbility(SandboxContent.Student, SandboxContent.AutoQuestI);
145+
_resourceManager.UnlockAbility(SandboxContent.Student, SandboxContent.RefineFire);
146146
_resourceManager.JunctionManager.AssignCadence(student, character, _resourceManager.UnlockedAbilities);
147147
_resourceManager.SetAutoQuestEnabled(character, true);
148148

149149
// Get "Refine Fire" refinement for "Basic Gem" input
150-
var refData = _resourceManager.Refinements.GetRefinement("Refine Fire", "Basic Gem");
150+
var refData = _resourceManager.Refinements.GetRefinement(SandboxContent.RefineFire, SandboxContent.BasicGem);
151151
Assert.IsNotNull(refData, "Refinement 'Refine Fire' for 'Basic Gem' should exist.");
152152

153153
// Set capacity to 30
@@ -164,5 +164,3 @@ public async Task Refinement_AutoQuest_RespectsMagicCapacity()
164164
Assert.AreEqual(0, _resourceManager.ActiveQuests.Count, "Refinement producing Magic should NOT restart when capacity reached.");
165165
}
166166
}
167-
168-

Mythril.Tests/InventoryManagerTests.cs

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class InventoryManagerTests
1414
[TestInitialize]
1515
public void Setup()
1616
{
17-
TestContentLoader.Load();
17+
SandboxContent.Load();
1818
_items = ContentHost.GetContent<Items>();
1919
_gameStore = new GameStore();
2020
_inventoryManager = new InventoryManager(_gameStore);
@@ -23,8 +23,8 @@ public void Setup()
2323
[TestMethod]
2424
public void InventoryManager_AddsAndRemovesItems_Correctly()
2525
{
26-
var potion = _items!.All.First(x => x.Name == "Potion");
27-
var basicGem = _items!.All.First(x => x.Name == "Basic Gem");
26+
var potion = _items!.All.First(x => x.Name == SandboxContent.Potion);
27+
var basicGem = _items!.All.First(x => x.Name == SandboxContent.BasicGem);
2828

2929
// Act
3030
_inventoryManager!.Add(potion ,5);
@@ -45,7 +45,7 @@ public void InventoryManager_AddsAndRemovesItems_Correctly()
4545
[TestMethod]
4646
public void InventoryManager_Remove_FailsWhenInsufficient()
4747
{
48-
var potion = _items!.All.First(x => x.Name == "Potion");
48+
var potion = _items!.All.First(x => x.Name == SandboxContent.Potion);
4949

5050
_inventoryManager!.Add(potion, 5);
5151
var result = _inventoryManager.Remove(potion, 10);
@@ -57,7 +57,7 @@ public void InventoryManager_Remove_FailsWhenInsufficient()
5757
[TestMethod]
5858
public void InventoryManager_Remove_RemovesFromDictionaryWhenZero()
5959
{
60-
var potion = _items!.All.First(x => x.Name == "Potion");
60+
var potion = _items!.All.First(x => x.Name == SandboxContent.Potion);
6161

6262
_inventoryManager!.Add(potion, 5);
6363
_inventoryManager.Remove(potion, 5);
@@ -69,7 +69,7 @@ public void InventoryManager_Remove_RemovesFromDictionaryWhenZero()
6969
[TestMethod]
7070
public void InventoryManager_Remove_DoesNotRemoveGoldWhenZero()
7171
{
72-
var gold = _items!.All.First(x => x.Name == "Gold");
72+
var gold = _items!.All.First(x => x.Name == SandboxContent.Gold);
7373

7474
_inventoryManager!.Add(gold, 5);
7575
_inventoryManager.Remove(gold, 5);
@@ -80,8 +80,8 @@ public void InventoryManager_Remove_DoesNotRemoveGoldWhenZero()
8080
[TestMethod]
8181
public void InventoryManager_Has_Correctly()
8282
{
83-
var potion = _items!.All.First(x => x.Name == "Potion");
84-
var basicGem = _items!.All.First(x => x.Name == "Basic Gem");
83+
var potion = _items!.All.First(x => x.Name == SandboxContent.Potion);
84+
var basicGem = _items!.All.First(x => x.Name == SandboxContent.BasicGem);
8585

8686
// Act
8787
_inventoryManager!.Add(potion, 5);
@@ -95,8 +95,8 @@ public void InventoryManager_Has_Correctly()
9595
[TestMethod]
9696
public void InventoryManager_GetItemsAndSpells_FilterCorrectly()
9797
{
98-
var potion = _items!.All.First(x => x.Name == "Potion");
99-
var fire = _items!.All.First(x => x.Name == "Fire I");
98+
var potion = _items!.All.First(x => x.Name == SandboxContent.Potion);
99+
var fire = _items!.All.First(x => x.Name == SandboxContent.FireI);
100100

101101
_inventoryManager!.Add(potion, 1);
102102
_inventoryManager.Add(fire, 1);
@@ -113,37 +113,37 @@ public void InventoryManager_GetItemsAndSpells_FilterCorrectly()
113113
[TestMethod]
114114
public void InventoryManager_GetQuantity_ReturnsZeroForMissingItem()
115115
{
116-
var potion = _items!.All.First(x => x.Name == "Potion");
116+
var potion = _items!.All.First(x => x.Name == SandboxContent.Potion);
117117
Assert.AreEqual(0, _inventoryManager!.GetQuantity(potion));
118118
}
119119

120120
[TestMethod]
121121
public void InventoryManager_Has_ReturnsTrueForZeroQuantity()
122122
{
123-
var potion = _items!.All.First(x => x.Name == "Potion");
123+
var potion = _items!.All.First(x => x.Name == SandboxContent.Potion);
124124
Assert.IsTrue(_inventoryManager!.Has(potion, 0));
125125
}
126126

127127
[TestMethod]
128128
public void InventoryManager_Add_DoesNothingWithZeroQuantity()
129129
{
130-
var potion = _items!.All.First(x => x.Name == "Potion");
130+
var potion = _items!.All.First(x => x.Name == SandboxContent.Potion);
131131
_inventoryManager!.Add(potion, 0);
132132
Assert.AreEqual(0, _inventoryManager.GetQuantity(potion));
133133
}
134134

135135
[TestMethod]
136136
public void InventoryManager_Add_NegativeQuantity_DoesNothing()
137137
{
138-
var potion = _items!.All.First(x => x.Name == "Potion");
138+
var potion = _items!.All.First(x => x.Name == SandboxContent.Potion);
139139
_inventoryManager!.Add(potion, -10);
140140
Assert.AreEqual(0, _inventoryManager.GetQuantity(potion));
141141
}
142142

143143
[TestMethod]
144144
public void InventoryManager_Remove_NegativeQuantity_ReturnsTrueAndDoesNothing()
145145
{
146-
var potion = _items!.All.First(x => x.Name == "Potion");
146+
var potion = _items!.All.First(x => x.Name == SandboxContent.Potion);
147147
_inventoryManager!.Add(potion, 5);
148148
var result = _inventoryManager.Remove(potion, -5);
149149
Assert.IsTrue(result);
@@ -153,7 +153,7 @@ public void InventoryManager_Remove_NegativeQuantity_ReturnsTrueAndDoesNothing()
153153
[TestMethod]
154154
public void InventoryManager_MagicCapacity_Enforcement()
155155
{
156-
var fire = _items!.All.First(x => x.Name == "Fire I");
156+
var fire = _items!.All.First(x => x.Name == SandboxContent.FireI);
157157
_gameStore!.Dispatch(new SetMagicCapacityAction(30));
158158

159159
// Try adding 100
@@ -165,28 +165,28 @@ public void InventoryManager_MagicCapacity_Enforcement()
165165
[TestMethod]
166166
public void InventoryManager_Pinning_Works()
167167
{
168-
var potion = _items!.All.First(x => x.Name == "Potion");
168+
var potion = _items!.All.First(x => x.Name == SandboxContent.Potion);
169169

170-
Assert.IsFalse(_inventoryManager!.IsPinned("Potion"));
170+
Assert.IsFalse(_inventoryManager!.IsPinned(SandboxContent.Potion));
171171

172-
_inventoryManager.TogglePin("Potion");
173-
Assert.IsTrue(_inventoryManager.IsPinned("Potion"));
172+
_inventoryManager.TogglePin(SandboxContent.Potion);
173+
Assert.IsTrue(_inventoryManager.IsPinned(SandboxContent.Potion));
174174

175175
_inventoryManager.Add(potion, 5);
176176
var pinned = _inventoryManager.GetPinnedItems().ToList();
177177
Assert.AreEqual(1, pinned.Count);
178-
Assert.AreEqual("Potion", pinned[0].Item.Name);
178+
Assert.AreEqual(SandboxContent.Potion, pinned[0].Item.Name);
179179
Assert.AreEqual(5, pinned[0].Quantity);
180180

181-
_inventoryManager.TogglePin("Potion");
182-
Assert.IsFalse(_inventoryManager.IsPinned("Potion"));
181+
_inventoryManager.TogglePin(SandboxContent.Potion);
182+
Assert.IsFalse(_inventoryManager.IsPinned(SandboxContent.Potion));
183183
Assert.AreEqual(0, _inventoryManager.GetPinnedItems().Count());
184184
}
185185

186186
[TestMethod]
187187
public void InventoryManager_Clear_Works()
188188
{
189-
var potion = _items!.All.First(x => x.Name == "Potion");
189+
var potion = _items!.All.First(x => x.Name == SandboxContent.Potion);
190190

191191
_inventoryManager!.Add(potion, 5);
192192
Assert.AreEqual(5, _inventoryManager.GetQuantity(potion));
@@ -199,7 +199,7 @@ public void InventoryManager_Clear_Works()
199199
[TestMethod]
200200
public void InventoryManager_Subtract_Works()
201201
{
202-
var potion = _items!.All.First(x => x.Name == "Potion");
202+
var potion = _items!.All.First(x => x.Name == SandboxContent.Potion);
203203

204204
_inventoryManager!.Add(potion, 10);
205205
_inventoryManager.Remove(potion, 4);

0 commit comments

Comments
 (0)