-
-
Notifications
You must be signed in to change notification settings - Fork 504
Recognize supplementary characters #913
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 20 commits
f43d988
2a851a2
de5d3fe
095f0ed
948bf66
e968e52
bbffa33
3a65e4b
0f928a2
a4c9146
9839b99
3ba8a3c
8ab6542
f6d6916
03822ac
b9d9e09
476fb63
4cb6895
e1e58cb
b302cbc
a0d08bf
31f48ac
dbcbcf9
7d4a678
b23a002
c048018
15baf1e
3272f9a
0675757
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,129 @@ | ||
| // Copyright (c) Alexandre Mutel. All rights reserved. | ||
| // This file is licensed under the BSD-Clause 2 license. | ||
| // See the license.txt file in the project root for more information. | ||
|
|
||
| using Markdig.Helpers; | ||
| using System; | ||
| using System.Collections.Generic; | ||
| using System.Drawing; | ||
| using System.Linq; | ||
| using System.Text; | ||
| using System.Threading.Tasks; | ||
|
|
||
| namespace Markdig.Tests; | ||
|
|
||
| [TestFixture] | ||
| internal class TestStringSlice | ||
| { | ||
| // TODO: Add more tests for StringSlice | ||
|
|
||
| // Old versions of modern .NET (that meets NETCOREAPP but not the following #if) try to load the polyfilled Rune in .NET Standard 2.x build of Markdig while they have built-in Rune too | ||
| // Adjust this condition to match the minimal modern (not .NET Standard or Framework) .NET target framework of Markdig (not Markdig.Tests) | ||
| #if NET8_0_OR_GREATER | ||
|
|
||
| [Test] | ||
| public void TestRuneBmp() | ||
| { | ||
| var slice = new StringSlice("01234"); | ||
|
|
||
| Assert.AreEqual((Rune)'0', slice.CurrentRune); | ||
|
Check failure on line 29 in src/Markdig.Tests/TestStringSlice.cs
|
||
| Assert.AreEqual((Rune)'1', slice.NextRune()); | ||
|
Check failure on line 30 in src/Markdig.Tests/TestStringSlice.cs
|
||
| Assert.AreEqual((Rune)'2', slice.NextRune()); | ||
|
Check failure on line 31 in src/Markdig.Tests/TestStringSlice.cs
|
||
| Assert.AreEqual((Rune)'2', slice.CurrentRune); | ||
|
Check failure on line 32 in src/Markdig.Tests/TestStringSlice.cs
|
||
| Assert.AreEqual("234", slice.ToString()); | ||
| Assert.AreEqual((Rune)'3', slice.PeekRuneExtra(1)); | ||
|
Check failure on line 34 in src/Markdig.Tests/TestStringSlice.cs
|
||
| Assert.AreEqual((Rune)'4', slice.PeekRuneExtra(2)); | ||
|
Check failure on line 35 in src/Markdig.Tests/TestStringSlice.cs
|
||
| Assert.AreEqual((Rune)'\0', slice.PeekRuneExtra(3)); | ||
|
Check failure on line 36 in src/Markdig.Tests/TestStringSlice.cs
|
||
| Assert.AreEqual((Rune)'1', slice.PeekRuneExtra(-1)); | ||
|
Check failure on line 37 in src/Markdig.Tests/TestStringSlice.cs
|
||
| Assert.AreEqual((Rune)'0', slice.PeekRuneExtra(-2)); | ||
|
Check failure on line 38 in src/Markdig.Tests/TestStringSlice.cs
|
||
| Assert.AreEqual((Rune)'\0', slice.PeekRuneExtra(-3)); | ||
|
Check failure on line 39 in src/Markdig.Tests/TestStringSlice.cs
|
||
| Assert.AreEqual((Rune)'0', slice.RuneAt(0)); | ||
| Assert.AreEqual((Rune)'1', slice.RuneAt(1)); | ||
| Assert.AreEqual((Rune)'2', slice.RuneAt(2)); | ||
| Assert.AreEqual((Rune)'3', slice.RuneAt(3)); | ||
| Assert.AreEqual((Rune)'4', slice.RuneAt(4)); | ||
| } | ||
|
|
||
| [Test] | ||
| public void TestRuneSupplementaryOnly() | ||
| { | ||
| var slice = new StringSlice("𝟎𝟏𝟐𝟑𝟒"); | ||
|
|
||
| // 𝟎 = U+1D7CE, 𝟐 = U+1D7D0 | ||
| Assert.AreEqual((Rune)0x1D7CE, slice.CurrentRune); // 𝟎 | ||
| Assert.AreEqual((Rune)0x1D7CF, slice.NextRune()); // 𝟏 | ||
| Assert.AreEqual((Rune)0x1D7D0, slice.NextRune()); // 𝟐 | ||
| Assert.AreEqual((Rune)0x1D7D0, slice.CurrentRune); // 𝟐 | ||
| Assert.AreEqual("𝟐𝟑𝟒", slice.ToString()); | ||
| // CurrentRune occupies 2 `char`s, so next Rune starts at index 2 | ||
| Assert.AreEqual((Rune)0x1D7D1, slice.PeekRuneExtra(2)); // 𝟑 | ||
| Assert.AreEqual((Rune)0x1D7D2, slice.PeekRuneExtra(4)); // 𝟒 | ||
| Assert.AreEqual((Rune)'\0', slice.PeekRuneExtra(6)); | ||
| Assert.AreEqual((Rune)0x1D7CF, slice.PeekRuneExtra(-1)); // 𝟏 | ||
| Assert.AreEqual((Rune)0x1D7CE, slice.PeekRuneExtra(-3)); // 𝟎 | ||
| Assert.AreEqual((Rune)'\0', slice.PeekRuneExtra(-5)); | ||
| Assert.AreEqual((Rune)0x1D7CE, slice.RuneAt(0)); // 𝟎 | ||
| Assert.AreEqual((Rune)0x1D7CF, slice.RuneAt(2)); // 𝟏 | ||
| Assert.AreEqual((Rune)0x1D7D0, slice.RuneAt(4)); // 𝟐 | ||
| Assert.AreEqual((Rune)0x1D7D1, slice.RuneAt(6)); // 𝟑 | ||
| Assert.AreEqual((Rune)0x1D7D2, slice.RuneAt(8)); // 𝟒 | ||
| // The following usages are not expected. You should take into consideration the `char`s that the Rune you just acquired occupies. | ||
| Assert.AreEqual((Rune)'\0', slice.PeekRuneExtra(-4)); | ||
| Assert.AreEqual((Rune)'\0', slice.PeekRuneExtra(-2)); | ||
| Assert.AreEqual((Rune)'\0', slice.PeekRuneExtra(1)); | ||
| Assert.AreEqual((Rune)'\0', slice.PeekRuneExtra(3)); | ||
| Assert.AreEqual((Rune)'\0', slice.PeekRuneExtra(5)); | ||
| Assert.AreEqual((Rune)'\0', slice.RuneAt(1)); | ||
| Assert.AreEqual((Rune)'\0', slice.RuneAt(3)); | ||
| Assert.AreEqual((Rune)'\0', slice.RuneAt(5)); | ||
| Assert.AreEqual((Rune)'\0', slice.RuneAt(7)); | ||
| Assert.AreEqual((Rune)'\0', slice.RuneAt(9)); | ||
| } | ||
|
|
||
| [Test] | ||
| public void TestRuneIsolatedHighSurrogate() | ||
| { | ||
| var slice = new StringSlice("\ud800\ud801\ud802\ud803\ud804"); | ||
| Assert.AreEqual((Rune)'\0', slice.CurrentRune); | ||
| Assert.AreEqual((Rune)'\0', slice.NextRune()); | ||
| Assert.AreEqual('\ud801', slice.CurrentChar); | ||
| Assert.AreEqual((Rune)'\0', slice.NextRune()); | ||
| Assert.AreEqual('\ud802', slice.CurrentChar); | ||
| Assert.AreEqual((Rune)'\0', slice.CurrentRune); | ||
| Assert.AreEqual((Rune)'\0', slice.PeekRuneExtra(-3)); | ||
| Assert.AreEqual((Rune)'\0', slice.PeekRuneExtra(-2)); | ||
| Assert.AreEqual((Rune)'\0', slice.PeekRuneExtra(-1)); | ||
| Assert.AreEqual((Rune)'\0', slice.PeekRuneExtra(1)); | ||
| Assert.AreEqual((Rune)'\0', slice.PeekRuneExtra(2)); | ||
| Assert.AreEqual((Rune)'\0', slice.PeekRuneExtra(3)); | ||
| Assert.AreEqual((Rune)'\0', slice.RuneAt(0)); | ||
| Assert.AreEqual((Rune)'\0', slice.RuneAt(1)); | ||
| Assert.AreEqual((Rune)'\0', slice.RuneAt(2)); | ||
| Assert.AreEqual((Rune)'\0', slice.RuneAt(3)); | ||
| Assert.AreEqual((Rune)'\0', slice.RuneAt(4)); | ||
| } | ||
|
|
||
| [Test] | ||
| public void TestRuneIsolatedLowSurrogate() | ||
| { | ||
| var slice = new StringSlice("\udc00\udc01\udc02\udc03\udc04"); | ||
| Assert.AreEqual((Rune)'\0', slice.CurrentRune); | ||
| Assert.AreEqual((Rune)'\0', slice.NextRune()); | ||
| Assert.AreEqual('\udc01', slice.CurrentChar); | ||
| Assert.AreEqual((Rune)'\0', slice.NextRune()); | ||
| Assert.AreEqual('\udc02', slice.CurrentChar); | ||
| Assert.AreEqual((Rune)'\0', slice.CurrentRune); | ||
| Assert.AreEqual((Rune)'\0', slice.PeekRuneExtra(-3)); | ||
| Assert.AreEqual((Rune)'\0', slice.PeekRuneExtra(-2)); | ||
| Assert.AreEqual((Rune)'\0', slice.PeekRuneExtra(-1)); | ||
| Assert.AreEqual((Rune)'\0', slice.PeekRuneExtra(1)); | ||
| Assert.AreEqual((Rune)'\0', slice.PeekRuneExtra(2)); | ||
| Assert.AreEqual((Rune)'\0', slice.PeekRuneExtra(3)); | ||
| Assert.AreEqual((Rune)'\0', slice.RuneAt(0)); | ||
| Assert.AreEqual((Rune)'\0', slice.RuneAt(1)); | ||
| Assert.AreEqual((Rune)'\0', slice.RuneAt(2)); | ||
| Assert.AreEqual((Rune)'\0', slice.RuneAt(3)); | ||
| Assert.AreEqual((Rune)'\0', slice.RuneAt(4)); | ||
| } | ||
| #endif | ||
| } | ||
Uh oh!
There was an error while loading. Please reload this page.