|
@@ -0,0 +1,44 @@ |
|
|
|
|
|
using System; |
|
|
|
|
|
using Xunit; |
|
|
|
|
|
|
|
|
|
|
|
namespace Discord |
|
|
|
|
|
{ |
|
|
|
|
|
public class EmoteTests |
|
|
|
|
|
{ |
|
|
|
|
|
[Fact] |
|
|
|
|
|
public void Test_Emote_Parse() |
|
|
|
|
|
{ |
|
|
|
|
|
Assert.True(Emote.TryParse("<:typingstatus:394207658351263745>", out Emote emote)); |
|
|
|
|
|
Assert.NotNull(emote); |
|
|
|
|
|
Assert.Equal("typingstatus", emote.Name); |
|
|
|
|
|
Assert.Equal(394207658351263745UL, emote.Id); |
|
|
|
|
|
Assert.False(emote.Animated); |
|
|
|
|
|
Assert.Equal(DateTimeOffset.FromUnixTimeMilliseconds(1514056829775), emote.CreatedAt); |
|
|
|
|
|
Assert.EndsWith("png", emote.Url); |
|
|
|
|
|
} |
|
|
|
|
|
[Fact] |
|
|
|
|
|
public void Test_Invalid_Emote_Parse() |
|
|
|
|
|
{ |
|
|
|
|
|
Assert.False(Emote.TryParse("invalid", out _)); |
|
|
|
|
|
Assert.False(Emote.TryParse("<:typingstatus:not_a_number>", out _)); |
|
|
|
|
|
Assert.Throws<ArgumentException>(() => Emote.Parse("invalid")); |
|
|
|
|
|
} |
|
|
|
|
|
[Fact] |
|
|
|
|
|
public void Test_Animated_Emote_Parse() |
|
|
|
|
|
{ |
|
|
|
|
|
Assert.True(Emote.TryParse("<a:typingstatus:394207658351263745>", out Emote emote)); |
|
|
|
|
|
Assert.NotNull(emote); |
|
|
|
|
|
Assert.Equal("typingstatus", emote.Name); |
|
|
|
|
|
Assert.Equal(394207658351263745UL, emote.Id); |
|
|
|
|
|
Assert.True(emote.Animated); |
|
|
|
|
|
Assert.Equal(DateTimeOffset.FromUnixTimeMilliseconds(1514056829775), emote.CreatedAt); |
|
|
|
|
|
Assert.EndsWith("gif", emote.Url); |
|
|
|
|
|
} |
|
|
|
|
|
public void Test_Invalid_Amimated_Emote_Parse() |
|
|
|
|
|
{ |
|
|
|
|
|
Assert.False(Emote.TryParse("<x:typingstatus:394207658351263745>", out _)); |
|
|
|
|
|
Assert.False(Emote.TryParse("<a:typingstatus>", out _)); |
|
|
|
|
|
Assert.False(Emote.TryParse("<a:typingstatus:not_a_number>", out _)); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |