using AngleSharp.Html.Parser;
using XFESystem.Browser;
using XFESystem.Desktop;
namespace XFESystem.Browser.Tests;
public sealed class RasterRenderYieldTests
{
[Theory]
[InlineData("background:white;border-radius:12px")]
[InlineData("background:linear-gradient(90deg,red,blue);border-radius:12px")]
[InlineData("background:white;box-shadow:0 4px 12px black")]
public void BoxRowsYieldWithoutPresentingWhenInteractiveInputBecomesPending(string css)
{
var page=new HtmlParser().ParseDocument("<style>body{margin:0}div{width:40px;height:40px;"+css+"}</style><div></div>");
var list=new BrowserLayoutEngine().Layout(page,new(80,80));var command=Assert.Single(list.Commands,c=>c.Decoration is not null);
var canvas=new YieldCanvas();
Assert.Throws<DesktopRenderYieldException>(()=>BrowserBoxRasterPainter.Paint(canvas,command,command.Bounds,new(0,0,80,80)));
Assert.InRange(canvas.BlendCalls,3,80);Assert.Equal(0,canvas.Presents);
}
[Fact]
public void RoundedClipForwardsPendingYieldToItsGradientDescendant()
{
var page=new HtmlParser().ParseDocument("<style>body{margin:0}#A{width:40px;height:40px;border-radius:12px;overflow:hidden}#B{width:40px;height:40px;background:linear-gradient(90deg,red,blue)}</style><div id=A><div id=B></div></div>");
var list=new BrowserLayoutEngine().Layout(page,new(80,80));var canvas=new YieldCanvas();
Assert.Throws<DesktopRenderYieldException>(()=>BrowserRasterPainter.Paint(canvas,new(0,0,80,80),list));
Assert.InRange(canvas.BlendCalls,3,80);Assert.Equal(0,canvas.Presents);
}
private sealed class YieldCanvas:IDesktopCoverageCanvas,IDesktopRenderYieldCanvas
{
public int Width=>80;public int Height=>80;public int BlendCalls;public int Presents;
public bool RenderYieldRequested=>BlendCalls>=3;
public void BlendCoverage(uint rgb,int x,int y,int width,int height,ReadOnlySpan<byte> source){BlendCalls++;}
public void Fill(uint rgb,int x,int y,int width,int height){}
public void Line(uint rgb,int x1,int y1,int x2,int y2){}
public void Text(string text,uint rgb,int x,int y){}
public void Present(){Presents++;}
}
}
using AngleSharp.Html.Parser;
using XFESystem.Browser;
using XFESystem.Desktop;
namespace XFESystem.Browser.Tests;
public sealed class RasterRenderYieldTests
{
[Theory]
[InlineData("background:white;border-radius:12px")]
[InlineData("background:linear-gradient(90deg,red,blue);border-radius:12px")]
[InlineData("background:white;box-shadow:0 4px 12px black")]
public void BoxRowsYieldWithoutPresentingWhenInteractiveInputBecomesPending(string css)
{
var page=new HtmlParser().ParseDocument("<style>body{margin:0}div{width:40px;height:40px;"+css+"}</style><div></div>");
var list=new BrowserLayoutEngine().Layout(page,new(80,80));var command=Assert.Single(list.Commands,c=>c.Decoration is not null);
var canvas=new YieldCanvas();
Assert.Throws<DesktopRenderYieldException>(()=>BrowserBoxRasterPainter.Paint(canvas,command,command.Bounds,new(0,0,80,80)));
Assert.InRange(canvas.BlendCalls,3,80);Assert.Equal(0,canvas.Presents);
}
[Fact]
public void RoundedClipForwardsPendingYieldToItsGradientDescendant()
{
var page=new HtmlParser().ParseDocument("<style>body{margin:0}#A{width:40px;height:40px;border-radius:12px;overflow:hidden}#B{width:40px;height:40px;background:linear-gradient(90deg,red,blue)}</style><div id=A><div id=B></div></div>");
var list=new BrowserLayoutEngine().Layout(page,new(80,80));var canvas=new YieldCanvas();
Assert.Throws<DesktopRenderYieldException>(()=>BrowserRasterPainter.Paint(canvas,new(0,0,80,80),list));
Assert.InRange(canvas.BlendCalls,3,80);Assert.Equal(0,canvas.Presents);
}
private sealed class YieldCanvas:IDesktopCoverageCanvas,IDesktopRenderYieldCanvas
{
public int Width=>80;public int Height=>80;public int BlendCalls;public int Presents;
public bool RenderYieldRequested=>BlendCalls>=3;
public void BlendCoverage(uint rgb,int x,int y,int width,int height,ReadOnlySpan<byte> source){BlendCalls++;}
public void Fill(uint rgb,int x,int y,int width,int height){}
public void Line(uint rgb,int x1,int y1,int x2,int y2){}
public void Text(string text,uint rgb,int x,int y){}
public void Present(){Presents++;}
}
}