Browse Source

Clean up Emoji validation

experiment/emoji-validation
Christopher F 7 years ago
parent
commit
ac9b575230
2 changed files with 36 additions and 17 deletions
  1. +11
    -13
      src/Discord.Net.Core/Entities/Emotes/Emoji.cs
  2. +25
    -4
      test/Discord.Net.Tests/Tests.Emotes.cs

+ 11
- 13
src/Discord.Net.Core/Entities/Emotes/Emoji.cs View File

@@ -23,13 +23,14 @@ namespace Discord
/// <param name="unicode">The pure UTF-8 encoding of an emoji</param> /// <param name="unicode">The pure UTF-8 encoding of an emoji</param>
public Emoji(string unicode) public Emoji(string unicode)
{ {
byte[] utf32 = Encoding.Unicode.GetBytes(unicode);
bool safe = false, any = false;
int codepoint = 0;
// NETStandard1.1 doesn't support UTF32
#if !NETSTANDARD1_1
byte[] utf32 = Encoding.UTF32.GetBytes(unicode);
for (var i = 0; i < utf32.Length; i += 4) for (var i = 0; i < utf32.Length; i += 4)
{ {
codepoint = BitConverter.ToInt32(utf32, i);
any = false;
int codepoint = BitConverter.ToInt32(utf32, i);
bool any = false;

for (var j = 0; j < Codepoints.Length; j++) for (var j = 0; j < Codepoints.Length; j++)
{ {
if (Codepoints[j] == codepoint) if (Codepoints[j] == codepoint)
@@ -38,16 +39,13 @@ namespace Discord
break; break;
} }
} }
if (any)
safe = true;
if (any) continue;
else else
{
safe = false;
break;
}
throw new ArgumentException("One or more characters was not a valid Emoji", nameof(unicode));
} }
if (!safe)
throw new ArgumentException("One or more characters was not a valid Emoji", nameof(unicode));
#endif

Name = unicode; Name = unicode;
} }




+ 25
- 4
test/Discord.Net.Tests/Tests.Emotes.cs View File

@@ -5,11 +5,32 @@ namespace Discord
{ {
public class EmoteTests public class EmoteTests
{ {
[Fact]
public void Emoji()
const string Smiley = "\U0001F603";
const string Man = "\U0001F468";
const string Woman = "\U0001F469";
const string Girl = "\U0001F467";
const string Boy = "\U0001F466";
const string Join = "\u200D";

[Fact]
public void Single_Emoji()
{
Assert.Equal(Smiley, new Emoji(Smiley).Name);
Assert.Equal(Man, new Emoji(Man).Name);
Assert.Equal(Woman, new Emoji(Woman).Name);
Assert.Equal(Girl, new Emoji(Girl).Name);
Assert.Equal(Boy, new Emoji(Boy).Name);
}
[Fact]
public void Multipart_Emoji()
{
string family = string.Concat(Man, Join, Woman, Join, Girl, Join, Boy);
Assert.Equal(family, new Emoji(family).Name);
}
[Fact]
public void Emoji_Fail()
{ {
// Future: Validate emoji parsing
Assert.Equal("🦅", new Emoji("🦅").Name);
Assert.Throws<ArgumentException>(() => new Emoji("foxDab"));
} }


[Fact] [Fact]


Loading…
Cancel
Save