BiDiClassTests.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using System;
  2. using System.Linq;
  3. using System.Runtime.InteropServices;
  4. using System.Text;
  5. using Avalonia.Media.TextFormatting.Unicode;
  6. using Xunit;
  7. using Xunit.Abstractions;
  8. namespace Avalonia.Visuals.UnitTests.Media.TextFormatting
  9. {
  10. public class BiDiClassTests
  11. {
  12. private readonly ITestOutputHelper _outputHelper;
  13. public BiDiClassTests(ITestOutputHelper outputHelper)
  14. {
  15. _outputHelper = outputHelper;
  16. }
  17. [Fact(Skip = "Only run when the Unicode spec changes.")]
  18. public void Should_Resolve()
  19. {
  20. var generator = new BiDiClassTestDataGenerator();
  21. foreach (var testData in generator)
  22. {
  23. Assert.True(Run(testData));
  24. }
  25. }
  26. private bool Run(BiDiClassData t)
  27. {
  28. var bidi = new BidiAlgorithm();
  29. var bidiData = new BidiData(t.ParagraphLevel);
  30. var text = Encoding.UTF32.GetString(MemoryMarshal.Cast<int, byte>(t.CodePoints).ToArray());
  31. // Append
  32. bidiData.Append(text.AsMemory());
  33. // Act
  34. bidi.Process(bidiData);
  35. var resultLevels = bidi.ResolvedLevels;
  36. var resultParagraphLevel = bidi.ResolvedParagraphEmbeddingLevel;
  37. // Assert
  38. var passed = true;
  39. if (t.ResolvedParagraphLevel != resultParagraphLevel)
  40. {
  41. return false;
  42. }
  43. for (var i = 0; i < t.ResolvedLevels.Length; i++)
  44. {
  45. if (t.ResolvedLevels[i] == -1)
  46. {
  47. continue;
  48. }
  49. if (t.ResolvedLevels[i] != resultLevels[i])
  50. {
  51. passed = false;
  52. break;
  53. }
  54. }
  55. if (passed)
  56. {
  57. return true;
  58. }
  59. _outputHelper.WriteLine($"Failed line {t.LineNumber}");
  60. _outputHelper.WriteLine(
  61. $" Code Points: {string.Join(" ", t.CodePoints.Select(x => x.ToString("X4")))}");
  62. _outputHelper.WriteLine(
  63. $" Pair Bracket Types: {string.Join(" ", bidiData.PairedBracketTypes.Select(x => " " + x.ToString()))}");
  64. _outputHelper.WriteLine(
  65. $" Pair Bracket Values: {string.Join(" ", bidiData.PairedBracketValues.Select(x => x.ToString("X4")))}");
  66. _outputHelper.WriteLine($" Embed Level: {t.ParagraphLevel}");
  67. _outputHelper.WriteLine($" Expected Embed Level: {t.ResolvedParagraphLevel}");
  68. _outputHelper.WriteLine($" Actual Embed Level: {resultParagraphLevel}");
  69. _outputHelper.WriteLine($" Directionality: {string.Join(" ", bidiData.Classes)}");
  70. _outputHelper.WriteLine($" Expected Levels: {string.Join(" ", t.ResolvedLevels)}");
  71. _outputHelper.WriteLine($" Actual Levels: {string.Join(" ", resultLevels)}");
  72. return false;
  73. }
  74. }
  75. }