using System; using System.Collections.Generic; using Xunit; namespace Discord.UnitTests { public class SnowflakeTests { private static IEnumerable 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 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); } } }