test(upserver): 归档存档迁移与玩法闭环回归工具

This commit is contained in:
Liubing\LB
2026-09-28 18:16:14 +08:00
parent c4ae02def9
commit a6f5e107f8
232 changed files with 12903 additions and 0 deletions

View File

@@ -0,0 +1,31 @@
using System;using System.Threading.Tasks;using game.PlayerDataStorage;
var panel=new ActualPanel();panel.Run();panel.Run();
if(panel.Applied!=1)throw new Exception("duplicate applies rewards");
if(panel.canvasGroup.alpha!=0)throw new Exception("pending reward already visible");
bool pendingBlocked=panel.canvasGroup.blocksRaycasts==false && panel.canvasGroup.interactable==false;
PlayerKVGameplayLoop.Pending.SetResult(true);await Task.Delay(25);
bool presented=panel.canvasGroup.alpha==1 && PlayerKVGameplayLoop.Shows==1;
bool interactRestored=panel.canvasGroup.blocksRaycasts && panel.canvasGroup.interactable;
var s2=new ActualPanel();s2.StartTail();bool kvListener=s2.playButton.onClick.Count==1 && !s2.NonKvOnly;
s2.playButton.onClick.Invoke();bool kvClick=s2.HomeClicks==1;
PlayerKVGameplayLoop.Enabled=false;var s3=new ActualPanel();s3.StartTail();bool pfListener=s3.playButton.onClick.Count==1 && s3.NonKvOnly;
bool ok=presented && interactRestored && kvListener && kvClick && pfListener && pendingBlocked;
Console.WriteLine($"{(ok?"PASS":"FAIL")} presentation restores interaction; KV listener registered; raycasts={panel.canvasGroup.blocksRaycasts}, kvListener={kvListener}, pfListener={pfListener}");return ok?0:1;
public class Canvas {public float alpha;public bool blocksRaycasts,interactable;}
public class ButtonEvent{System.Action h;public int Count=>h==null?0:1;public void AddListener(System.Action a)=>h+=a;public void Invoke()=>h?.Invoke();}
public class Button{public ButtonEvent onClick=new();}
public class Fish {public void SaveCaughtFishForKVLoop(int id){}}
public class Player {public PlayerKVEditResult SaveFishingRewardForKVLoop()=>new();}
namespace game.PlayerDataStorage {
public class PlayerKVEditResult{}
public static class PlayerKVGameplayLoop {
public class FishingRewardAction{}
public static bool Enabled=true;static FishingRewardAction action;public static int Shows;public static TaskCompletionSource<bool> Pending=new();
public static FishingRewardAction BindRewardPanel(object p) {if(action!=null)return null;return action=new();}
public static bool RewardPanelCurrent(FishingRewardAction a,object p)=>a!=null && ReferenceEquals(a,action);
public static IDisposable BeginRewardSegment(string name)=>new Scope();
public static Task ConfirmRewardAsync(FishingRewardAction a,PlayerKVEditResult p)=>Pending.Task;
public static void PresentReward(FishingRewardAction a,Action show){Shows++;show();}
public static void Fault(string message)=>throw new Exception(message);
class Scope:IDisposable{public void Dispose(){}}
}}