Skip to content

Commit 0e23d24

Browse files
HandyS11claude
andcommitted
feat(generator): validate decay + upkeep (6b)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent ef7f6f8 commit 0e23d24

2 files changed

Lines changed: 67 additions & 0 deletions

File tree

tests/RustPlusBot.ItemData.Generator.Tests/DatasetValidatorTests.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,43 @@ public void UnresolvableCraftIngredientId_isError()
5656
var errors = DatasetValidator.Validate(bad, new ValidationOptions(MinItemCount: 1));
5757
Assert.Contains(errors, e => e.Contains("88888", StringComparison.Ordinal));
5858
}
59+
60+
/// <summary>An upkeep entry that references an unknown item id should produce an error.</summary>
61+
[Fact]
62+
public void UnresolvableUpkeepId_isError()
63+
{
64+
var bad = new ItemDataset(2, Good().Sources,
65+
[
66+
new ItemRecord(1, "Wooden Door", 1, null, null, null, null, null,
67+
new UpkeepCost([new UpkeepEntry(77777, 8, 25)])),
68+
]);
69+
var errors = DatasetValidator.Validate(bad, new ValidationOptions(MinItemCount: 1));
70+
Assert.Contains(errors, e => e.Contains("77777", StringComparison.Ordinal));
71+
}
72+
73+
/// <summary>An upkeep entry with min greater than max should produce an error.</summary>
74+
[Fact]
75+
public void UpkeepMinGreaterThanMax_isError()
76+
{
77+
var bad = new ItemDataset(2, Good().Sources,
78+
[
79+
new ItemRecord(1, "Wooden Door", 1, null, null, null, null, null,
80+
new UpkeepCost([new UpkeepEntry(1, 25, 8)])),
81+
]);
82+
var errors = DatasetValidator.Validate(bad, new ValidationOptions(MinItemCount: 1));
83+
Assert.Contains(errors, e => e.Contains("upkeep", StringComparison.OrdinalIgnoreCase));
84+
}
85+
86+
/// <summary>Negative decay seconds should produce an error.</summary>
87+
[Fact]
88+
public void NegativeDecay_isError()
89+
{
90+
var bad = new ItemDataset(2, Good().Sources,
91+
[
92+
new ItemRecord(1, "Stone Barricade", 1, null, null, null, null,
93+
new DecayInfo(-900, null, null, null, 100), null),
94+
]);
95+
var errors = DatasetValidator.Validate(bad, new ValidationOptions(MinItemCount: 1));
96+
Assert.Contains(errors, e => e.Contains("decay", StringComparison.OrdinalIgnoreCase));
97+
}
5998
}

tools/RustPlusBot.ItemData.Generator/Validation/DatasetValidator.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,34 @@ public static IReadOnlyList<string> Validate(ItemDataset dataset, ValidationOpti
4646
}
4747
}
4848

49+
foreach (var item in dataset.Items.Where(i => i.Upkeep is not null))
50+
{
51+
foreach (var entry in item.Upkeep!.Entries)
52+
{
53+
if (!ids.Contains(entry.ItemId))
54+
{
55+
errors.Add(
56+
$"item {item.Id} ({item.Name}): upkeep references unknown id {entry.ItemId}");
57+
}
58+
59+
if (entry.QuantityMin > entry.QuantityMax)
60+
{
61+
errors.Add(
62+
$"item {item.Id} ({item.Name}): upkeep quantity min {entry.QuantityMin} > max {entry.QuantityMax}");
63+
}
64+
}
65+
}
66+
67+
foreach (var item in dataset.Items.Where(i => i.Decay is not null))
68+
{
69+
var decay = item.Decay!;
70+
if (decay.Seconds is < 0 || decay.OutsideSeconds is < 0 || decay.InsideSeconds is < 0 ||
71+
decay.UnderwaterSeconds is < 0 || decay.Hp is < 0)
72+
{
73+
errors.Add($"item {item.Id} ({item.Name}): decay has a negative value");
74+
}
75+
}
76+
4977
return errors;
5078
}
5179
}

0 commit comments

Comments
 (0)