Skip to content

Commit 939aeb6

Browse files
committed
feat(commands): add UpkeepLine formatter (6b)
1 parent 556b9ee commit 939aeb6

2 files changed

Lines changed: 60 additions & 0 deletions

File tree

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using System.Globalization;
2+
using RustPlusBot.Features.ItemData.Data;
3+
using RustPlusBot.Features.ItemData.Naming;
4+
5+
namespace RustPlusBot.Features.Commands.Formatting;
6+
7+
/// <summary>Formats the one-line upkeep-cost reply.</summary>
8+
internal static class UpkeepLine
9+
{
10+
/// <summary>Formats the per-resource upkeep cost for a building block.</summary>
11+
/// <param name="item">The item (must have non-null <see cref="ItemRecord.Upkeep"/>).</param>
12+
/// <param name="names">Resolves resource item ids to names.</param>
13+
public static string Format(ItemRecord item, IItemNameResolver names)
14+
{
15+
ArgumentNullException.ThrowIfNull(item);
16+
ArgumentNullException.ThrowIfNull(names);
17+
ArgumentNullException.ThrowIfNull(item.Upkeep);
18+
19+
var parts = item.Upkeep.Entries.Select(e =>
20+
{
21+
var quantity = e.QuantityMin == e.QuantityMax
22+
? e.QuantityMin.ToString(CultureInfo.InvariantCulture)
23+
: string.Create(CultureInfo.InvariantCulture, $"{e.QuantityMin}{e.QuantityMax}");
24+
return string.Create(CultureInfo.InvariantCulture, $"{quantity} {names.Resolve(e.ItemId)}");
25+
});
26+
return string.Create(CultureInfo.InvariantCulture, $"{item.Name} upkeep: {string.Join(", ", parts)}");
27+
}
28+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using RustPlusBot.Features.Commands.Formatting;
2+
using RustPlusBot.Features.ItemData;
3+
using RustPlusBot.Features.ItemData.Data;
4+
using RustPlusBot.Features.ItemData.Naming;
5+
6+
namespace RustPlusBot.Features.Commands.Tests.Formatting;
7+
8+
public sealed class UpkeepFormatterTests
9+
{
10+
private readonly IItemNameResolver _names = new ItemDatabaseNameResolver(new EmbeddedItemDatabase());
11+
12+
[Fact]
13+
public void UpkeepLine_RendersRange()
14+
{
15+
var item = new ItemRecord(1, "Wooden Door", 1, null, null, null, null, null,
16+
new UpkeepCost([new UpkeepEntry(-151838493, 8, 25)]));
17+
var line = UpkeepLine.Format(item, _names);
18+
Assert.Contains("Wooden Door", line, StringComparison.Ordinal);
19+
Assert.Contains("8–25", line, StringComparison.Ordinal); // 8–25
20+
Assert.Contains("Wood", line, StringComparison.Ordinal);
21+
}
22+
23+
[Fact]
24+
public void UpkeepLine_RendersSingleQuantityWithoutRange()
25+
{
26+
var item = new ItemRecord(1, "Reinforced Glass Window", 1, null, null, null, null, null,
27+
new UpkeepCost([new UpkeepEntry(317398316, 1, 1)]));
28+
var line = UpkeepLine.Format(item, _names);
29+
Assert.DoesNotContain("–", line, StringComparison.Ordinal); // no en-dash for a single value
30+
Assert.Contains("1", line, StringComparison.Ordinal);
31+
}
32+
}

0 commit comments

Comments
 (0)