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

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using System.Text.Json;
using XFEEDToolBox.Core.Galaxy;

namespace XFEEDToolBox.ViewModels;

// Execute the actual production partial; only unrelated VM presentation and
// persistence are substituted. No game pipe/process or public network is used.
public partial class ToolboxViewModel
{
    private readonly Dictionary<string,GalacticSystem> galaxyCache=[];
    private readonly CancellationTokenSource lifetime=new();
    private CancellationTokenSource? galaxyOverrideResolveStop;
    private long galaxySourceEpoch=1,galaxyViewVersion=1;
    private GalaxyCatalogueSelection? GalaxyCatalogueSelection;
    private int publishes,queued;
    private Action? onPublish;
    private GalacticSystem RememberGalaxy(GalacticSystem system,int? processId=null)
    {if(processId!=42)throw new Exception("Result lost its native process binding");galaxyCache[system.Name]=system;return system;}
    private void PublishGalaxy(){publishes++;onPublish?.Invoke();}
    private void QueueGalaxyFilterInformation()=>queued++;
    private static void Require(bool value,string message){if(!value)throw new Exception(message);}
    private static GalaxyCatalogueSelection Selection(int count=97,int process=42,long generation=1)
    {
        var rows=Enumerable.Range(1,count).Select(i=>new GalaxyOriginalPointOverride(i,1,false,false,new(i,2,3),null,"G",null));
        return new(GalaxyOriginalCatalogueLod.Create(new(0,0,0),1,500,1,1,4),new(0,0,0))
            {PointOverrides=new(process,generation,1,0,true,true,rows,[])};
    }
    private static GalacticSystem Star(long id)=>new("Explicit resolver fixture "+id,new(id,2,3),id,"G","游戏银河目录");
    private Task Run(GalaxyCatalogueSelection selection,Func<long,CancellationToken,Task<GalacticSystem>> resolve,
        Func<bool>? current=null,CancellationToken token=default)=>
        ResolvePublishedGalaxyOverridesAsync(selection,42,resolve,current??(()=>true),token);
    private static TaskCompletionSource<T> Signal<T>()=>new(TaskCreationOptions.RunContinuationsAsynchronously);

    public static async Task<int> Main(string[] args)
    {
        var checks=new List<string>();
        {
            var vm=new ToolboxViewModel();var selection=Selection();vm.GalaxyCatalogueSelection=selection;
            foreach(var i in Enumerable.Range(1,32)){var star=Star(i);vm.galaxyCache[star.Name]=star;}
            var calls=new List<long>();var active=0;var maximum=0;
            await vm.Run(selection,async(id,_)=>{calls.Add(id);maximum=Math.Max(maximum,++active);await Task.Yield();active--;return Star(id);});
            Require(calls.Count==65&&calls.Contains(97)&&!calls.Contains(1)&&vm.galaxyCache.Count==97,
                "Cached first32 must not starve later pages; every remaining exact address must progress");
            Require(maximum==1&&vm.publishes is >0 and <=5,"Resolver must retain one outstanding query and batch fast UI publication");
            checks.Add("cached-first32-do-not-starve-all97-single-inflight");
            var repeated=0;await vm.Run(selection,(id,_)=>{repeated++;return Task.FromResult(Star(id));});
            Require(repeated==0,"A later pass must reuse exact named catalogue identities");checks.Add("all-exact-cache-hits-skip-native");
        }
        {
            var vm=new ToolboxViewModel();var selection=Selection();vm.GalaxyCatalogueSelection=selection;var calls=0;
            await vm.Run(selection,(id,_)=>{calls++;return id<=40?Task.FromException<GalacticSystem>(new KeyNotFoundException()):Task.FromResult(Star(id));});
            Require(calls==97&&vm.galaxyCache.Count==57&&vm.galaxyCache.ContainsKey(Star(97).Name),"Unavailable early addresses cannot end later pages");
            checks.Add("failed-prefix-still-progresses-to-final-page");
        }
        {
            var vm=new ToolboxViewModel();var selection=Selection(4);vm.GalaxyCatalogueSelection=selection;
            await vm.Run(selection,(id,_)=>Task.FromResult(id switch
            {1=>Star(id) with{SystemAddress=2},2=>Star(id) with{Position=new(200,2,3)},3=>Star(id) with{Name=" "},_=>Star(id)}));
            Require(vm.galaxyCache.Count==1&&vm.galaxyCache.ContainsKey(Star(4).Name),"Wrong address, coordinate, or empty name cannot become a published row");
            checks.Add("exact-address-position-and-real-name-required");
        }
        foreach(var kind in new[]{"token","epoch","view","selection","source","lifetime"})
        {
            var vm=new ToolboxViewModel();var selection=Selection(1);vm.GalaxyCatalogueSelection=selection;
            using var cancel=new CancellationTokenSource();var entered=Signal<bool>();var result=Signal<GalacticSystem>();var source=true;
            var task=vm.Run(selection,(_,_)=>{entered.SetResult(true);return result.Task;},()=>source,cancel.Token);
            await entered.Task;
            switch(kind)
            {case "token":cancel.Cancel();break;case "epoch":vm.galaxySourceEpoch++;break;case "view":vm.galaxyViewVersion++;break;
             case "selection":vm.GalaxyCatalogueSelection=selection with{};break;case "source":source=false;break;case "lifetime":vm.lifetime.Cancel();break;}
            // Deliberately return a successful response after ignoring cancellation.
            result.SetResult(Star(1));await task;
            Require(vm.galaxyCache.Count==0&&vm.publishes==0&&vm.queued==0,"Stale "+kind+" response was published");checks.Add("late-"+kind+"-response-rejected");
        }
        {
            var vm=new ToolboxViewModel();var selection=Selection(1,43);vm.GalaxyCatalogueSelection=selection;var calls=0;
            await vm.Run(selection,(id,_)=>{calls++;return Task.FromResult(Star(id));});
            Require(calls==0&&vm.galaxyCache.Count==0,"Another process's published table must not issue or accept resolves");checks.Add("snapshot-process-mismatch-rejected");
        }
        {
            var vm=new ToolboxViewModel();var attempted=new List<long>();
            for(var i=0;i<50;i++)
            {
                var selection=Selection(50,generation:i+1);vm.GalaxyCatalogueSelection=selection;vm.galaxyViewVersion++;
                using var stop=new CancellationTokenSource();
                await vm.Run(selection,(id,_)=>{attempted.Add(id);stop.Cancel();return Task.FromResult(Star(id));},token:stop.Token);
            }
            Require(attempted.Count==50&&attempted.Distinct().Count()==50&&vm.galaxyCache.Count==0&&vm.publishes==0,
                "Repeated cancelled views must fairly rotate every unresolved address without publishing old results");
            checks.Add("continuous-cancelled-views-fairly-advance-all50");
        }
        {
            var vm=new ToolboxViewModel();var first=Selection(1);vm.GalaxyCatalogueSelection=first;
            var oldEntered=Signal<bool>();var oldResult=Signal<GalacticSystem>();
            var oldTask=vm.Run(first,(_,_)=>{oldEntered.SetResult(true);return oldResult.Task;});await oldEntered.Task;
            var next=Selection(1,generation:2);vm.GalaxyCatalogueSelection=next;vm.galaxyViewVersion++;
            var newEntered=Signal<bool>();var newResult=Signal<GalacticSystem>();
            var nextTask=vm.Run(next,(_,_)=>{newEntered.SetResult(true);return newResult.Task;});await newEntered.Task;
            var latestStop=vm.galaxyOverrideResolveStop;oldResult.SetResult(Star(1));await oldTask;
            Require(ReferenceEquals(latestStop,vm.galaxyOverrideResolveStop)&&latestStop?.IsCancellationRequested==false,
                "An old completion must not clear or cancel the new worker");
            newResult.SetResult(Star(1));await nextTask;
            Require(vm.galaxyCache.Count==1&&vm.publishes==1,"Only the newest selection can publish");checks.Add("old-finally-cannot-clear-new-worker");
        }
        {
            var vm=new ToolboxViewModel();var selection=Selection();vm.GalaxyCatalogueSelection=selection;
            vm.onPublish=()=>vm.GalaxyCatalogueSelection=selection with{};var calls=0;
            await vm.Run(selection,(id,_)=>{calls++;return Task.FromResult(Star(id));});
            Require(calls==1&&vm.publishes==1&&vm.queued==0,"Reentrant view changes during publish must stop the old worker and its fact queue");
            checks.Add("reentrant-publication-change-stops-old-queue");
        }
        var core=typeof(GalaxyCatalogueSelection).Assembly.Location;
        var json=JsonSerializer.Serialize(new{passed=checks.Count,failed=0,checks,productionSource="XFEEDToolBox/ViewModels/GalaxyViewModel.PointOverrides.cs",
            modelAssembly=core,modelAssemblySha256=Convert.ToHexString(System.Security.Cryptography.SHA256.HashData(File.ReadAllBytes(core))),
            gameProcessAccess=false,gameCalls=0},new JsonSerializerOptions{WriteIndented=true});
        if(args.Length>0){Directory.CreateDirectory(Path.GetDirectoryName(Path.GetFullPath(args[0]))!);File.WriteAllText(args[0],json);}Console.WriteLine(json);return 0;
    }
}