-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathChannelEditPacerTests.cs
More file actions
84 lines (65 loc) · 2.36 KB
/
Copy pathChannelEditPacerTests.cs
File metadata and controls
84 lines (65 loc) · 2.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
using RustPlusBot.Abstractions.Time;
using RustPlusBot.Discord.Posting;
namespace RustPlusBot.Discord.Tests.Posting;
public sealed class ChannelEditPacerTests
{
private const ulong ChannelA = 500;
private const ulong ChannelB = 501;
private static readonly TimeSpan Gap = TimeSpan.FromSeconds(1);
[Fact]
public void A_negative_gap_is_rejected()
{
Assert.Throws<ArgumentOutOfRangeException>(() =>
new ChannelEditPacer(new TestClock(), TimeSpan.FromSeconds(-1)));
}
[Fact]
public void A_zero_gap_disables_pacing_without_throwing()
{
var pacer = new ChannelEditPacer(new TestClock(), TimeSpan.Zero);
Assert.Equal(TimeSpan.Zero, pacer.Reserve(ChannelA));
Assert.Equal(TimeSpan.Zero, pacer.Reserve(ChannelA));
}
[Fact]
public void First_edit_to_a_channel_waits_zero()
{
var pacer = new ChannelEditPacer(new TestClock(), Gap);
Assert.Equal(TimeSpan.Zero, pacer.Reserve(ChannelA));
}
[Fact]
public void Successive_edits_in_the_same_instant_are_staggered_by_the_gap()
{
var pacer = new ChannelEditPacer(new TestClock(), Gap);
Assert.Equal(TimeSpan.Zero, pacer.Reserve(ChannelA));
Assert.Equal(Gap, pacer.Reserve(ChannelA));
Assert.Equal(Gap * 2, pacer.Reserve(ChannelA));
}
[Fact]
public void An_edit_after_the_gap_has_elapsed_waits_zero()
{
var clock = new TestClock();
var pacer = new ChannelEditPacer(clock, Gap);
pacer.Reserve(ChannelA);
clock.UtcNow = clock.UtcNow.Add(Gap);
Assert.Equal(TimeSpan.Zero, pacer.Reserve(ChannelA));
}
[Fact]
public void An_edit_partway_through_the_gap_waits_only_the_remainder()
{
var clock = new TestClock();
var pacer = new ChannelEditPacer(clock, Gap);
pacer.Reserve(ChannelA);
clock.UtcNow = clock.UtcNow.Add(TimeSpan.FromMilliseconds(400));
Assert.Equal(TimeSpan.FromMilliseconds(600), pacer.Reserve(ChannelA));
}
[Fact]
public void Channels_are_paced_independently()
{
var pacer = new ChannelEditPacer(new TestClock(), Gap);
pacer.Reserve(ChannelA);
Assert.Equal(TimeSpan.Zero, pacer.Reserve(ChannelB));
}
private sealed class TestClock : IClock
{
public DateTimeOffset UtcNow { get; set; } = DateTimeOffset.UnixEpoch;
}
}