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());
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);
}
}
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());
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);
}
}