csharpc-sharpdotnetxamlavaloniauicross-platformcross-platform-xamlavaloniaguimulti-platformuser-interfacedotnetcore
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
3.1 KiB
96 lines
3.1 KiB
using System.Linq;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
using Avalonia.Media.TextFormatting.Unicode;
|
|
using Xunit;
|
|
using Xunit.Abstractions;
|
|
|
|
namespace Avalonia.Visuals.UnitTests.Media.TextFormatting
|
|
{
|
|
public class BiDiClassTests
|
|
{
|
|
private readonly ITestOutputHelper _outputHelper;
|
|
|
|
public BiDiClassTests(ITestOutputHelper outputHelper)
|
|
{
|
|
_outputHelper = outputHelper;
|
|
}
|
|
|
|
[Fact(Skip = "Only run when the Unicode spec changes.")]
|
|
public void Should_Resolve()
|
|
{
|
|
var generator = new BiDiClassTestDataGenerator();
|
|
|
|
foreach (var testData in generator)
|
|
{
|
|
Assert.True(Run(testData));
|
|
}
|
|
}
|
|
|
|
private bool Run(BiDiClassData t)
|
|
{
|
|
var bidi = new BidiAlgorithm();
|
|
var bidiData = new BidiData { ParagraphEmbeddingLevel = t.ParagraphLevel };
|
|
|
|
var text = Encoding.UTF32.GetString(MemoryMarshal.Cast<int, byte>(t.CodePoints).ToArray());
|
|
|
|
// Append
|
|
bidiData.Append(text);
|
|
|
|
// Act
|
|
for (int i = 0; i < 10; i++)
|
|
{
|
|
bidi.Process(bidiData);
|
|
}
|
|
|
|
var resultLevels = bidi.ResolvedLevels;
|
|
var resultParagraphLevel = bidi.ResolvedParagraphEmbeddingLevel;
|
|
|
|
// Assert
|
|
var passed = true;
|
|
|
|
if (t.ResolvedParagraphLevel != resultParagraphLevel)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
for (var i = 0; i < t.ResolvedLevels.Length; i++)
|
|
{
|
|
if (t.ResolvedLevels[i] == -1)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if (t.ResolvedLevels[i] != resultLevels[i])
|
|
{
|
|
passed = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (passed)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
_outputHelper.WriteLine($"Failed line {t.LineNumber}");
|
|
|
|
_outputHelper.WriteLine(
|
|
$" Code Points: {string.Join(" ", t.CodePoints.Select(x => x.ToString("X4")))}");
|
|
|
|
_outputHelper.WriteLine(
|
|
$" Pair Bracket Types: {string.Join(" ", bidiData.PairedBracketTypes.Select(x => " " + x.ToString()))}");
|
|
|
|
_outputHelper.WriteLine(
|
|
$" Pair Bracket Values: {string.Join(" ", bidiData.PairedBracketValues.Select(x => x.ToString("X4")))}");
|
|
_outputHelper.WriteLine($" Embed Level: {t.ParagraphLevel}");
|
|
_outputHelper.WriteLine($" Expected Embed Level: {t.ResolvedParagraphLevel}");
|
|
_outputHelper.WriteLine($" Actual Embed Level: {resultParagraphLevel}");
|
|
_outputHelper.WriteLine($" Directionality: {string.Join(" ", bidiData.Classes)}");
|
|
_outputHelper.WriteLine($" Expected Levels: {string.Join(" ", t.ResolvedLevels)}");
|
|
_outputHelper.WriteLine($" Actual Levels: {string.Join(" ", resultLevels)}");
|
|
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|