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

XFESystem

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

公开
关注 0 Fork 0 Star 0
UTF-8
using System.Security.Cryptography;
using System.Text;
using System.Text.Json;

namespace XFESystem.Browser.Tests;

public sealed class WebsiteCodeAssetsTests
{
    [Fact]
    public void CodeAssetsKeepVerbatimWebsiteBytesAndDistinctAdapterProvenance()
    {
        var resources = new PackagedBrowserResources();
        Assert.True(resources.TryGet(new(PackagedBrowserResources.WebsiteCodeRoot+"Manifest.json"),out var manifest));
        using var json=JsonDocument.Parse(manifest.Body);
        Assert.False(json.RootElement.GetProperty("WebsiteHasMonaco").GetBoolean());
        using (var adapter = typeof(PackagedBrowserResources).Assembly.GetManifestResourceStream("WebsiteCode/WebsiteMonaco.js")!)
            Assert.Equal(json.RootElement.GetProperty("Adapter").GetProperty("Sha256").GetString(), Convert.ToHexStringLower(SHA256.HashData(adapter)));
        foreach(var entry in json.RootElement.GetProperty("Files").EnumerateArray())
        {
            var path=entry.GetProperty("Path").GetString()!;
            if(path=="WebsiteLicense.txt")continue;
            Assert.True(entry.GetProperty("Verbatim").GetBoolean());
            Assert.True(resources.TryGet(new(PackagedBrowserResources.WebsiteCodeRoot+path),out var response));
            using var stream=typeof(PackagedBrowserResources).Assembly.GetManifestResourceStream("WebsiteCode/"+path)!;
            using var buffer=new MemoryStream();stream.CopyTo(buffer);var bytes=buffer.ToArray();
            Assert.Equal(entry.GetProperty("Bytes").GetInt32(),bytes.Length);
            Assert.Equal(entry.GetProperty("Sha256").GetString(),Convert.ToHexStringLower(SHA256.HashData(bytes)));
            Assert.Equal(Encoding.UTF8.GetString(bytes).TrimStart('\uFEFF'),response.Body);
        }
    }

    [Fact]
    public void WebsiteCSharpAdapterRetainsWholeSourceScopesAndSourceDerivedCssPalette()
    {
        var resources=new PackagedBrowserResources();
        var runtime=new JavaScriptRuntime(new BrowserLimits {MaximumScriptCharacters=1_048_576,MaximumScriptMemoryBytes=128_000_000,MaximumStatements=10_000_000,ScriptTimeout=TimeSpan.FromSeconds(15)});
        foreach(var name in new[]{"Highlight.js","CSharp.js","CodePalette.js","WebsiteMonaco.js"})
        {
            Assert.True(resources.TryGet(new(PackagedBrowserResources.WebsiteCodeRoot+name),out var response));
            var evaluation=runtime.Evaluate(response.Body);
            Assert.True(evaluation.Success,evaluation.Error);
        }
        var result=runtime.Evaluate(""""
            (function(){
              const source='using System;\nclass Widget { public int Run(int value) { if(value>0) return Math.Max(value,42); return 0; } }';
              const parsed=xfeWebsiteHighlight.tokenizeSource(source);
              if(parsed.html!==hljs.highlight(source,{language:'csharp',ignoreIllegals:true}).value)throw new Error('Website grammar output changed');
              const tokens=parsed.lines.flat().map(token=>token.scopes);
              if(!tokens.includes('xfe.type')||!tokens.includes('xfe.number')||!tokens.includes('xfe.csharp_keyword'))throw new Error(JSON.stringify(tokens));
              if(!xfeWebsiteHighlight.themeRules.some(rule=>rule.token==='xfe.csharp_keyword'&&rule.foreground.toUpperCase()==='C586C0'))throw new Error('Control-flow CSS color changed');
              if(!xfeWebsiteHighlight.themeRules.some(rule=>rule.token==='xfe.type'&&rule.foreground.toUpperCase()==='4EC9B0'))throw new Error('Type CSS color changed');
              for(const expected of [['xfe','F1F1F4'],['xfe.namespace','DCDCDC'],['xfe.string','CE9178'],['xfe.number','B5CEA8'],['xfe.meta.string','D69D85']])
                if(!xfeWebsiteHighlight.themeRules.some(rule=>rule.token===expected[0]&&rule.foreground.toUpperCase()===expected[1]))throw new Error('Actual website article cascade changed '+expected);
              const raw='class C { string S = """\nHello <World>&\n"""; }';
              if(xfeWebsiteHighlight.tokenizeSource(raw).html!==hljs.highlight(raw,{language:'csharp',ignoreIllegals:true}).value)throw new Error('Multiline raw-string context changed');
              let rejected=false;try{xfeWebsiteHighlight.tokenizeSource('x'.repeat(131073));}catch(error){rejected=String(error).includes('128 KiB');}
              if(!rejected)throw new Error('Explicit highlighting bound was ignored');
              return 'PASS';
            })()
            """");
        Assert.True(result.Success,result.Error);Assert.Equal("PASS",result.Text);
    }
}