|
|
@@ -0,0 +1,85 @@ |
|
|
|
using System; |
|
|
|
using System.Collections.Generic; |
|
|
|
using Xunit; |
|
|
|
|
|
|
|
namespace Discord.UnitTests |
|
|
|
{ |
|
|
|
public class SnowflakeTests |
|
|
|
{ |
|
|
|
private static IEnumerable<object[]> GetTimestampTestData() |
|
|
|
{ |
|
|
|
// N.B. snowflakes here should have the least significant 22 bits |
|
|
|
// set to zero. |
|
|
|
yield return new object[] |
|
|
|
{ |
|
|
|
81062087257751552UL, |
|
|
|
new DateTimeOffset( |
|
|
|
year: 2015, month: 08, day: 12, |
|
|
|
hour: 16, minute: 31, second: 47, |
|
|
|
millisecond: 663, |
|
|
|
offset: TimeSpan.Zero), |
|
|
|
}; |
|
|
|
|
|
|
|
yield return new object[] |
|
|
|
{ |
|
|
|
0UL, |
|
|
|
new DateTimeOffset( |
|
|
|
year: 2015, month: 1, day: 1, |
|
|
|
hour: 0, minute: 0, second: 0, |
|
|
|
millisecond: 0, |
|
|
|
offset: TimeSpan.Zero) |
|
|
|
}; |
|
|
|
|
|
|
|
yield return new object[] |
|
|
|
{ |
|
|
|
(ulong.MaxValue >> 22) << 22, |
|
|
|
new DateTimeOffset( |
|
|
|
year: 2154, month: 05, day: 15, |
|
|
|
hour: 07, minute: 35, second: 11, |
|
|
|
millisecond: 103, |
|
|
|
offset: TimeSpan.Zero) |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
private static IEnumerable<object[]> GetRoundtrippableTestData() |
|
|
|
{ |
|
|
|
// N.B. snowflakes here should have the least significant 22 bits |
|
|
|
// set to zero. |
|
|
|
|
|
|
|
yield return new object[]{ 81062087257751552UL }; |
|
|
|
yield return new object[]{ 0UL }; |
|
|
|
yield return new object[]{ (ulong.MaxValue >> 22) << 22 }; |
|
|
|
} |
|
|
|
|
|
|
|
[Theory] |
|
|
|
[MemberData(nameof(GetTimestampTestData))] |
|
|
|
public void SnowflakeExpectedTimestamp( |
|
|
|
ulong snowflake, DateTimeOffset expected) |
|
|
|
{ |
|
|
|
var time = Snowflake.GetCreatedTime(snowflake); |
|
|
|
|
|
|
|
Assert.Equal(time, expected); |
|
|
|
} |
|
|
|
|
|
|
|
[Theory] |
|
|
|
[MemberData(nameof(GetTimestampTestData))] |
|
|
|
public void SnowflakeExpectedSnowflake( |
|
|
|
ulong expected, DateTimeOffset time) |
|
|
|
{ |
|
|
|
var snowflake = Snowflake.GetSnowflake(time); |
|
|
|
|
|
|
|
Assert.Equal(expected, snowflake); |
|
|
|
} |
|
|
|
|
|
|
|
[Theory] |
|
|
|
[MemberData(nameof(GetRoundtrippableTestData))] |
|
|
|
public void SnowflakeIsRoundTrippable( |
|
|
|
ulong expected) |
|
|
|
{ |
|
|
|
var time = Snowflake.GetCreatedTime(expected); |
|
|
|
var roundtripped = Snowflake.GetSnowflake(time); |
|
|
|
|
|
|
|
Assert.Equal(expected, roundtripped); |
|
|
|
} |
|
|
|
} |
|
|
|
} |