1
0

BiDiClassTests.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. for (int i = 0; i < 10; i++)
  35. {
  36. bidi.Process(bidiData);
  37. }
  38. var resultLevels = bidi.ResolvedLevels;
  39. var resultParagraphLevel = bidi.ResolvedParagraphEmbeddingLevel;
  40. // Assert
  41. var passed = true;
  42. if (t.ResolvedParagraphLevel != resultParagraphLevel)
  43. {
  44. return false;
  45. }
  46. for (var i = 0; i < t.ResolvedLevels.Length; i++)
  47. {
  48. if (t.ResolvedLevels[i] == -1)
  49. {
  50. continue;
  51. }
  52. if (t.ResolvedLevels[i] != resultLevels[i])
  53. {
  54. passed = false;
  55. break;
  56. }
  57. }
  58. if (passed)
  59. {
  60. return true;
  61. }
  62. _outputHelper.WriteLine($"Failed line {t.LineNumber}");
  63. _outputHelper.WriteLine(
  64. $" Code Points: {string.Join(" ", t.CodePoints.Select(x => x.ToString("X4")))}");
  65. _outputHelper.WriteLine(
  66. $" Pair Bracket Types: {string.Join(" ", bidiData.PairedBracketTypes.Select(x => " " + x.ToString()))}");
  67. _outputHelper.WriteLine(
  68. $" Pair Bracket Values: {string.Join(" ", bidiData.PairedBracketValues.Select(x => x.ToString("X4")))}");
  69. _outputHelper.WriteLine($" Embed Level: {t.ParagraphLevel}");
  70. _outputHelper.WriteLine($" Expected Embed Level: {t.ResolvedParagraphLevel}");
  71. _outputHelper.WriteLine($" Actual Embed Level: {resultParagraphLevel}");
  72. _outputHelper.WriteLine($" Directionality: {string.Join(" ", bidiData.Classes)}");
  73. _outputHelper.WriteLine($" Expected Levels: {string.Join(" ", t.ResolvedLevels)}");
  74. _outputHelper.WriteLine($" Actual Levels: {string.Join(" ", resultLevels)}");
  75. return false;
  76. }
  77. }
  78. }