|
|
@@ -0,0 +1,118 @@ |
|
|
|
using Xunit; |
|
|
|
using Discord.Rest; |
|
|
|
|
|
|
|
namespace Discord |
|
|
|
{ |
|
|
|
/// <summary> |
|
|
|
/// Tests for <see cref="MessageHelper"/> parsing. |
|
|
|
/// </summary> |
|
|
|
public class MessageHelperTests |
|
|
|
{ |
|
|
|
/// <summary> |
|
|
|
/// Tests that no tags are parsed while in code blocks |
|
|
|
/// or inline code. |
|
|
|
/// </summary> |
|
|
|
[Theory] |
|
|
|
[InlineData("`@everyone`")] |
|
|
|
[InlineData("`<@163184946742034432>`")] |
|
|
|
[InlineData("```@everyone```")] |
|
|
|
[InlineData("```cs \n @everyone```")] |
|
|
|
[InlineData("```cs <@163184946742034432> ```")] |
|
|
|
[InlineData("``` test ``` ```cs <@163184946742034432> ```")] |
|
|
|
[InlineData("`<:test:537920404019216384>`")] |
|
|
|
[InlineData("``` @everyone `")] // discord client handles these weirdly |
|
|
|
[InlineData("``` @everyone ``")] |
|
|
|
[InlineData("` @here `")] |
|
|
|
[InlineData("` @everyone @here <@163184946742034432> <@&163184946742034432> <#163184946742034432> <:test:537920404019216384> `")] |
|
|
|
public void ParseTagsInCode(string testData) |
|
|
|
{ |
|
|
|
// don't care that I'm passing in null channels/guilds/users |
|
|
|
// as they shouldn't be required |
|
|
|
var result = MessageHelper.ParseTags(testData, null, null, null); |
|
|
|
Assert.Empty(result); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary> Tests parsing tags that surround inline code or a code block. </summary> |
|
|
|
[Theory] |
|
|
|
[InlineData("`` <@&163184946742034432>")] |
|
|
|
[InlineData("``` code block 1 ``` ``` code block 2 ``` <@&163184946742034432>")] |
|
|
|
[InlineData("` code block 1 ``` ` code block 2 ``` <@&163184946742034432>")] |
|
|
|
[InlineData("<@&163184946742034432> ``` code block 1 ```")] |
|
|
|
[InlineData("``` code ``` ``` code ``` @here ``` code ``` ``` more ```")] |
|
|
|
[InlineData("``` code ``` @here ``` more ```")] |
|
|
|
public void ParseTagsAroundCode(string testData) |
|
|
|
{ |
|
|
|
// don't care that I'm passing in null channels/guilds/users |
|
|
|
// as they shouldn't be required |
|
|
|
var result = MessageHelper.ParseTags(testData, null, null, null); |
|
|
|
Assert.NotEmpty(result); |
|
|
|
} |
|
|
|
|
|
|
|
[Theory] |
|
|
|
[InlineData(@"\` @everyone \`")] |
|
|
|
[InlineData(@"\`\`\` @everyone \`\`\`")] |
|
|
|
[InlineData(@"hey\`\`\`@everyone\`\`\`!!")] |
|
|
|
public void IgnoreEscapedCodeBlocks(string testData) |
|
|
|
{ |
|
|
|
var result = MessageHelper.ParseTags(testData, null, null, null); |
|
|
|
Assert.NotEmpty(result); |
|
|
|
} |
|
|
|
|
|
|
|
// cannot test parsing a user, as it uses the ReadOnlyCollection<IUser> arg. |
|
|
|
// this could be done if mocked entities are merged in PR #1290 |
|
|
|
|
|
|
|
/// <summary> Tests parsing a mention of a role. </summary> |
|
|
|
[Theory] |
|
|
|
[InlineData("<@&163184946742034432>")] |
|
|
|
[InlineData("**<@&163184946742034432>**")] |
|
|
|
[InlineData("__<@&163184946742034432>__")] |
|
|
|
[InlineData("<><@&163184946742034432>")] |
|
|
|
public void ParseRole(string roleTag) |
|
|
|
{ |
|
|
|
var result = MessageHelper.ParseTags(roleTag, null, null, null); |
|
|
|
Assert.Contains(result, x => x.Type == TagType.RoleMention); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary> Tests parsing a channel. </summary> |
|
|
|
[Theory] |
|
|
|
[InlineData("<#429115823748284417>")] |
|
|
|
[InlineData("**<#429115823748284417>**")] |
|
|
|
[InlineData("<><#429115823748284417>")] |
|
|
|
public void ParseChannel(string channelTag) |
|
|
|
{ |
|
|
|
var result = MessageHelper.ParseTags(channelTag, null, null, null); |
|
|
|
Assert.Contains(result, x => x.Type == TagType.ChannelMention); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary> Tests parsing an emoji. </summary> |
|
|
|
[Theory] |
|
|
|
[InlineData("<:test:537920404019216384>")] |
|
|
|
[InlineData("**<:test:537920404019216384>**")] |
|
|
|
[InlineData("<><:test:537920404019216384>")] |
|
|
|
public void ParseEmoji(string emoji) |
|
|
|
{ |
|
|
|
var result = MessageHelper.ParseTags(emoji, null, null, null); |
|
|
|
Assert.Contains(result, x => x.Type == TagType.Emoji); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary> Tests parsing a mention of @everyone. </summary> |
|
|
|
[Theory] |
|
|
|
[InlineData("@everyone")] |
|
|
|
[InlineData("**@everyone**")] |
|
|
|
public void ParseEveryone(string everyone) |
|
|
|
{ |
|
|
|
var result = MessageHelper.ParseTags(everyone, null, null, null); |
|
|
|
Assert.Contains(result, x => x.Type == TagType.EveryoneMention); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary> Tests parsing a mention of @here. </summary> |
|
|
|
[Theory] |
|
|
|
[InlineData("@here")] |
|
|
|
[InlineData("**@here**")] |
|
|
|
public void ParseHere(string here) |
|
|
|
{ |
|
|
|
var result = MessageHelper.ParseTags(here, null, null, null); |
|
|
|
Assert.Contains(result, x => x.Type == TagType.HereMention); |
|
|
|
} |
|
|
|
} |
|
|
|
} |