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.
120 lines
3.3 KiB
120 lines
3.3 KiB
using System;
|
|
using System.Linq;
|
|
using Avalonia.Base.UnitTests.Media.Fonts.Tables;
|
|
using Avalonia.Harfbuzz;
|
|
using Avalonia.Media;
|
|
using Avalonia.Media.TextFormatting;
|
|
using Avalonia.Platform;
|
|
using Avalonia.UnitTests;
|
|
using Xunit;
|
|
|
|
namespace Avalonia.Base.UnitTests.Media.TextFormatting;
|
|
|
|
public class HarfBuzzTextShaperTests
|
|
{
|
|
private static readonly string s_InterFontUri =
|
|
"resm:Avalonia.Base.UnitTests.Assets.Inter-Regular.ttf?assembly=Avalonia.Base.UnitTests";
|
|
|
|
private readonly HarfBuzzTextShaper _shaper;
|
|
|
|
private TestServices Services => TestServices.MockThreadingInterface.With(
|
|
textShaperImpl: _shaper);
|
|
|
|
public HarfBuzzTextShaperTests()
|
|
{
|
|
_shaper = new HarfBuzzTextShaper();
|
|
}
|
|
|
|
[Fact]
|
|
public void ShapeText_WithValidInput_ReturnsShapedBuffer()
|
|
{
|
|
using (UnitTestApplication.Start(Services))
|
|
{
|
|
var text = "Hello World".AsMemory();
|
|
var options = CreateTextShaperOptions();
|
|
|
|
var result = _shaper.ShapeText(text, options);
|
|
|
|
Assert.NotNull(result);
|
|
Assert.Equal(text.Length, result.Length);
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void ShapeText_WithEmptyString_ReturnsEmptyShapedBuffer()
|
|
{
|
|
using (UnitTestApplication.Start(Services))
|
|
{
|
|
var text = "".AsMemory();
|
|
var options = CreateTextShaperOptions();
|
|
|
|
var result = _shaper.ShapeText(text, options);
|
|
|
|
Assert.NotNull(result);
|
|
Assert.Equal(0, result.Length);
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void ShapeText_WithTabCharacter_ReplacesWithSpace()
|
|
{
|
|
using (UnitTestApplication.Start(Services))
|
|
{
|
|
var text = "Hello\tWorld".AsMemory();
|
|
var options = CreateTextShaperOptions();
|
|
|
|
var result = _shaper.ShapeText(text, options);
|
|
|
|
Assert.NotNull(result);
|
|
Assert.True(result.Length == 11);
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void ShapeText_WithCRLF_MergesBreakPair()
|
|
{
|
|
using (UnitTestApplication.Start(Services))
|
|
{
|
|
var text = "Line1\r\nLine2".AsMemory();
|
|
var options = CreateTextShaperOptions();
|
|
|
|
var result = _shaper.ShapeText(text, options);
|
|
|
|
Assert.NotNull(result);
|
|
Assert.NotEqual(0.0, result[5].GlyphAdvance);
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void ShapeText_EndWithCRLF_MergesBreakPair()
|
|
{
|
|
using (UnitTestApplication.Start(Services))
|
|
{
|
|
var text = "Line1\r\n".AsMemory();
|
|
var options = CreateTextShaperOptions();
|
|
|
|
var result = _shaper.ShapeText(text, options);
|
|
|
|
Assert.NotNull(result);
|
|
Assert.Equal(0.0, result[5].GlyphAdvance);
|
|
}
|
|
}
|
|
|
|
private TextShaperOptions CreateTextShaperOptions(
|
|
sbyte bidiLevel = 0,
|
|
double letterSpacing = 0,
|
|
double fontSize = 16)
|
|
{
|
|
var assetLoader = new StandardAssetLoader();
|
|
|
|
using var stream = assetLoader.Open(new Uri(s_InterFontUri));
|
|
|
|
var typeface = new GlyphTypeface(new CustomPlatformTypeface(stream));
|
|
|
|
return new TextShaperOptions(
|
|
typeface,
|
|
fontSize,
|
|
bidiLevel,
|
|
letterSpacing: letterSpacing);
|
|
}
|
|
}
|
|
|