XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFESystem

【Rust】XFE系统,基于Rust和汇编

公开
关注 0 Fork 0 Star 0
UTF-8
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<Page> 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<BrowserPointerInput> 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;
    }
}