GraphemeBreakClassTrieGeneratorTests.cs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using System;
  2. using Avalonia.Media.TextFormatting.Unicode;
  3. using Avalonia.Visuals.UnitTests.Media.TextFormatting;
  4. using Xunit;
  5. using Xunit.Abstractions;
  6. namespace Avalonia.Base.UnitTests.Media.TextFormatting
  7. {
  8. /// <summary>
  9. /// This class is intended for use when the Unicode spec changes. Otherwise the containing tests are redundant.
  10. /// To update the <c>GraphemeBreak.trie</c> run the <see cref="Should_Generate_Trie"/> test.
  11. /// </summary>
  12. public class GraphemeBreakClassTrieGeneratorTests
  13. {
  14. private readonly ITestOutputHelper _outputHelper;
  15. public GraphemeBreakClassTrieGeneratorTests(ITestOutputHelper outputHelper)
  16. {
  17. _outputHelper = outputHelper;
  18. }
  19. [ClassData(typeof(GraphemeBreakTestDataGenerator))]
  20. [Theory(Skip = "Only run when we update the trie.")]
  21. public void Should_Enumerate(string line, int lineNumber, string grapheme, string text)
  22. {
  23. var enumerator = new GraphemeEnumerator(text);
  24. enumerator.MoveNext(out var g);
  25. var actual = text.AsSpan(g.Offset, g.Length);
  26. bool pass = actual.Length == grapheme.Length;
  27. if (pass)
  28. {
  29. for (int i = 0; i < grapheme.Length; i++)
  30. {
  31. var a = grapheme[i];
  32. var b = actual[i];
  33. if (a != b)
  34. {
  35. pass = false;
  36. break;
  37. }
  38. }
  39. }
  40. if (!pass)
  41. {
  42. _outputHelper.WriteLine($"Failed line {lineNumber}");
  43. _outputHelper.WriteLine($" Text: {text}");
  44. _outputHelper.WriteLine($" Grapheme: {grapheme}");
  45. _outputHelper.WriteLine($" Line: {line}");
  46. Assert.True(false);
  47. }
  48. }
  49. [Fact(Skip = "Only run when we update the trie.")]
  50. public void Should_Enumerate_Other()
  51. {
  52. const string text = "ABCDEFGHIJ";
  53. var enumerator = new GraphemeEnumerator(text);
  54. var count = 0;
  55. while (enumerator.MoveNext(out var grapheme))
  56. {
  57. Assert.Equal(1, grapheme.Length);
  58. count++;
  59. }
  60. Assert.Equal(10, count);
  61. }
  62. [Fact(Skip = "Only run when we update the trie.")]
  63. public void Should_Generate_Trie()
  64. {
  65. GraphemeBreakClassTrieGenerator.Execute();
  66. }
  67. }
  68. }