using XFESystem.Desktop; using XFESystem.Core; using Xunit; namespace XFESystem.Core.Tests; public sealed class BrowserRoutingTests { [Fact] public void CapturedBrowserReceivesMoveAndReleaseOutsideItsViewport() { var factory = new Browser(); var desktop = new DesktopSession(new Canvas(),new MemoryWorkspace(),factory); var window = desktop.Open(DesktopApplication.Browser); var page = factory.Pages.Single(); desktop.Pointer(window.Bounds.X+20,window.Bounds.Y+100,true); desktop.Pointer(4,4,true); desktop.Pointer(4,4,false); Assert.Contains(page.Events,e=>e.Type=="mousemove"&&e.X<0&&e.Buttons==1); Assert.Contains(page.Events,e=>e.Type=="mouseup"&&e.X<0&&e.Buttons==0); } [Fact] public void ClickingVisibleInactiveBrowserActivatesAndDeliversFirstMouseDown() { var factory = new Browser(); var desktop = new DesktopSession(new Canvas(),new MemoryWorkspace(),factory); var browser = desktop.Open(DesktopApplication.Browser); desktop.Open(DesktopApplication.Terminal); desktop.Pointer(browser.Bounds.X+12,browser.Bounds.Y+100,true); desktop.Pointer(browser.Bounds.X+12,browser.Bounds.Y+100,false); Assert.Same(browser,desktop.ActiveWindow); Assert.Contains(factory.Pages.Single().Events,e=>e.Type=="mousedown"); } [Fact] public void StableHoverMovesOnlyPointerWhenPageRevisionHasNotChanged() { var factory = new Browser(); var desktop = new DesktopSession(new Canvas(),new MemoryWorkspace(),factory); var browser = desktop.Open(DesktopApplication.Browser); var page = factory.Pages.Single(); desktop.Pointer(browser.Bounds.X+20,browser.Bounds.Y+100,false);desktop.Render();int paints=page.Paints; desktop.Pointer(browser.Bounds.X+24,browser.Bounds.Y+100,false);desktop.Render(); Assert.Equal(paints,page.Paints); Assert.Equal(2,page.Events.Count(e=>e.Type=="mousemove")); desktop.Pointer(browser.Bounds.X+24,browser.Bounds.Y+100,false); Assert.Equal(2,page.Events.Count(e=>e.Type=="mousemove")); } private sealed class Canvas : IDesktopCanvas { public int Width=>1280;public int Height=>800;public bool SupportsSceneCache=>true; 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() { } } private sealed class Browser : IBrowserService,IInteractiveBrowserFactory { public List Pages {get;}=[]; public IInteractiveBrowserSession CreatePageSession() {var page=new Page();Pages.Add(page);return page;} public BrowserPage Navigate(string address)=>new(address,"Page",""); public string ExecuteJavaScript(string source)=>""; public string PreviewMarkdown(string markdown)=>""; } private sealed class Page : IInteractiveBrowserSession { public List Events {get;}=[]; public int Paints {get;private set;} public long Revision=>0;public double DocumentHeight=>1000; public BrowserPage CurrentPage {get;private set;} public BrowserPage Navigate(string address)=>CurrentPage=new(address,"Page",""); public void Paint(IDesktopCanvas canvas,DesktopBounds viewport,double scrollY)=>Paints++; public bool Pointer(BrowserPointerInput input) {Events.Add(input);return false;} public bool Key(BrowserKeyboardInput input)=>true; public bool AdvanceTime(long monotonicMilliseconds)=>false; } }