Files
ft/CodexOutput/upserver/ReviewLifecycleTests/Stubs.cs

86 lines
11 KiB
C#

using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
// Dependency substitutes only. Production method bodies are in Generated.cs.
public static class Probe {
public static int RankCalls,HomeCalls,CameraWrites,VolumeAfterRelease,PoolCreates,Subscriptions,ReleasedHandles,UiCalls,Published,SubscriptionsAttempt,ThrowSubscriptionAt;
public static bool ThrowVolume,ThrowPool;
public static List<TaskCompletionSource<bool>> Seconds=new();
public static TaskCompletionSource<bool> Frame,Delay;
public static void Reset(){RankCalls=HomeCalls=CameraWrites=VolumeAfterRelease=PoolCreates=Subscriptions=ReleasedHandles=UiCalls=Published=SubscriptionsAttempt=ThrowSubscriptionAt=0;ThrowVolume=ThrowPool=false;Seconds.Clear();Frame=new();Delay=new();Addressables.Pending.Clear();Addressables.All.Clear();GContext.container=new();UIManager.Instance=new();}
}
public static class Awaiters {public static Task NextFrame=>Probe.Frame.Task;public static Task SecondsRealtime(float _) => Probe.Delay.Task;public static Task Seconds(float _){var t=new TaskCompletionSource<bool>();Probe.Seconds.Add(t);return t.Task;}}
public static class GContext {public static Container container;public static void Publish<T>(T _){Probe.Published++;} public static EventStream<T> OnEvent<T>()=>new();}
public class Container {public Dictionary<Type,object> Values=new();public void Unregister<T>(){Values.Remove(typeof(T));} public T Resolve<T>(){if(Values.TryGetValue(typeof(T),out var v))return (T)v; var a=Activator.CreateInstance<T>();Values[typeof(T)]=a;return a;}}
public class EventStream<T>{public IDisposable Subscribe(Action<T> action){Probe.SubscriptionsAttempt++;if(Probe.ThrowSubscriptionAt>0&&Probe.SubscriptionsAttempt==Probe.ThrowSubscriptionAt)throw new Exception("subscription failure");Probe.Subscriptions++;return new Subscription();}}
public class Subscription:IDisposable{bool disposed;public void Dispose(){if(disposed)return;disposed=true;Probe.Subscriptions--;}}
public class CompositeDisposable:IDisposable{public List<IDisposable> Items=new();public void Dispose(){foreach(var x in Items)x.Dispose();Items.Clear();}}
public static class RxExtensions{public static void AddTo(this IDisposable d,CompositeDisposable c)=>c.Items.Add(d);}
public class GameObject {public bool Destroyed;public Transform transform=new();public int ActiveWrites;public void SetActive(bool _){ActiveWrites++;}public T GetComponent<T>() where T:new()=>new();public static void Destroy(GameObject g){if(g!=null)g.Destroyed=true;}}
public class HomePanel {public void OnStart()=>Probe.HomeCalls++;}
public class UIManager {public static UIManager Instance;public TaskCompletionSource<GameObject> Ready=new();public Task<GameObject> RestartShowUI(object _) {Probe.UiCalls++;return Ready.Task;}}
public static class UITypes {public static object HomePanel=new();}
public class IDeferredRewardStashService{public void DisposeSubscriptions(){}}
public class PlayerShopData{public TaskCompletionSource<bool> Pending;public Task ReleaseReplenishment()=>Pending?.Task??Task.CompletedTask;}
public class FishingEventData{public void ShowRankTierChange()=>Probe.RankCalls++;}
public class FishingData{public bool isMapBuff;public GameObject mainCamera=new();public BehaviorConf fishingBehaviorConf=new();}
public class BehaviorConf{public float rodEnterMapDelay=.1f;}
public class Behavior {public Rod RodBehaviour=new();public Animator cameraAnimator=new();}
public class Rod {public GameObject gameObject=new();}
public class Animator {public bool enabled;public Transform transform=new();public int speed{set{Probe.CameraWrites++;}}public void Play(string _,int __,int ___){Probe.CameraWrites++;}}
public class Transform{public Vector3 localEulerAngles,localPosition;}
public struct Vector3{public static Vector3 zero=>new();}
public class PlayableDirector{public GameObject gameObject=new();public double duration=1;}
public class MapData{public string BGM="bgm";}
public class IUserService{public bool IsAuthorized=true;public CancellationTokenSource Lifetime=new();public CancellationToken LoginLifetime=>Lifetime.Token;}
public class ShowHandEvent{public bool isShow;}
public partial class GetUiSubject {public bool Destroyed;public FishingData fishingData=new();public bool IsHideHomeMap;public Behavior fishingBehavior=new();public MapData _curMapData=new();public void SetMapShow(bool _){} public static bool operator ==(GetUiSubject a,GetUiSubject b)=>ReferenceEquals(a,b)||(ReferenceEquals(a,null)&&!ReferenceEquals(b,null)&&b.Destroyed)||(ReferenceEquals(b,null)&&!ReferenceEquals(a,null)&&a.Destroyed);public static bool operator !=(GetUiSubject a,GetUiSubject b)=>!(a==b);public override bool Equals(object obj)=>ReferenceEquals(this,obj);public override int GetHashCode()=>base.GetHashCode();}
namespace cfg{public class Tables{}}
public class ISettingService{public bool Music=true,Sound=true;}
public class AudioClip{}
public class AudioMixer{public void GetFloat(string _,out float v){v=0;}public AudioMixerSnapshot FindSnapshot(string _)=>new();}
public class AudioMixerSnapshot{}
public class AudioMixerGroup{}
public class Sound {public GameObject gameObject=new();public AudioSource audioSource=new();}
public class AudioSource{public void Stop(){}}
public class FakeSoundService {
public bool Released;public int Releases;public TaskCompletionSource<bool> Pending;public Task InitAsync(){Released=false;return Pending?.Task??Task.CompletedTask;}public void Release(){Released=true;Releases++;}public void ReturnSound(Sound _){}
void Volume(){if(Released)Probe.VolumeAfterRelease++;if(Probe.ThrowVolume)throw new Exception("volume failure");}
public int BGMVol{set{Volume();}}public int SFXVol{set{Volume();}}public int VoiceVol{set{Volume();}}
}
public class EventUISound{} public class EventRewardSound{} public class EventFishingSound{} public class EventBGMSound{public EventBGMSound(string _) {}} public class FadeOutEvent{}
public class AssetReferenceAudioClip{} public class AssetReferenceAudioVoiceClip{} public class ChangeRodDataEvent{} public class SoundMuteEvent{} public class OnSoundStateEvent{} public class LowpassEffectEvt{}
public partial class ManagerSubject {
private int initializationVersion;
public FakeSoundService soundService=new();public cfg.Tables _tables;public string[] residentFish={"clip-a","clip-b"};
public Dictionary<string,AudioClip> residentClip;public CompositeDisposable disposables;public Dictionary<string,Sound> rewardSoundDic=new();public HashSet<Sound> _activeFishingLoopSounds=new();public AudioClip BGM_Clip;public Sound BGM_Sound;public string BGMName;
void PlaySound(EventUISound _){}void PlayRewardSound(EventRewardSound _){}void PlayFishingSound(EventFishingSound _){}void PlayMusic(EventBGMSound _){}void FadeOutEvent(FadeOutEvent _){}void PlaySoundByReference(AssetReferenceAudioClip _){}void PlayVoiceSoundByReference(AssetReferenceAudioVoiceClip _){}void OnChangeRodData(ChangeRodDataEvent _){}void OnSoundMute(SoundMuteEvent _){}void OnSoundStateEvent(OnSoundStateEvent _){}
}
public interface IOperation{bool Valid{get;set;}int Releases{get;set;}object Asset{get;}string Key{get;set;}}
public class Operation<T>:IOperation {public TaskCompletionSource<T> Completion=new(); public bool Valid{get;set;}=true; public int Releases{get;set;}public object Asset=>Completion.Task.IsCompletedSuccessfully?Completion.Task.Result:null;public string Key{get;set;}}
public struct AsyncOperationHandle<T>{public Operation<T> Op;public Task<T> Task=>Op.Completion.Task;public T Result{get{if(!IsValid())throw new Exception("read released handle");return Op.Completion.Task.GetAwaiter().GetResult();}}public bool IsValid()=>Op!=null&&Op.Valid;}
public static class Addressables {
public static List<IOperation> All=new();public static Dictionary<string,object> Pending=new();public static AsyncOperationHandle<T> LoadAssetAsync<T>(string key){var op=new Operation<T>{Key=key};Pending[key]=op;All.Add(op);return new(){Op=op};}
public static Operation<T> Get<T>(string key)=>(Operation<T>)Pending[key];public static void Complete<T>(string key,T value)=>Get<T>(key).Completion.SetResult(value);
public static void Release<T>(AsyncOperationHandle<T> h){if(!h.IsValid())throw new Exception("invalid/double handle release");h.Op.Valid=false;h.Op.Releases++;Probe.ReleasedHandles++;}
public static void Release(object asset) {if(asset==null)return;var op=All.FirstOrDefault(o=>o.Valid&&ReferenceEquals(o.Asset,asset));if(op==null)throw new Exception("unowned/double object release");op.Valid=false;op.Releases++;Probe.ReleasedHandles++;}
}
public static class Assert{public static void IsNotNull(object value){if(value==null)throw new Exception("Assert null");}}
public class Pool{public int Active;public void CreatePool<T>(T _,int a,int b){Active++;Probe.PoolCreates++;if(Probe.ThrowPool)throw new Exception("pool failure");}public void DestroyPool<T>(){Active=0;}}
public partial class ServiceSubject {
private int initializationVersion;
public Dictionary<Sound,CancellationTokenSource> SoundFadeTaskDic;public AsyncOperationHandle<AudioMixer> mixerHandle;public AsyncOperationHandle<GameObject> soundPrefabHandle;
public AudioMixer mixer;public float bgmVol,fishingVol;public AudioMixerGroup bgmGroup,fishingGroup,uiGroup,voiceGroup;public AudioMixerSnapshot normal;public IDisposable lowpassEvtDisposable;public Pool poolService=new();
const string Bgm_Vol_Param_Name="bgmVol",Fishing_Vol_Param_Name="fishingVol";
AudioMixerGroup FindMixerGroup(string _) => new();void OnLowpassEffectEvt(LowpassEffectEvt _){}
}
public class IStageData{}public class SurveyService{}public class IConfig{public string Get(string key,string fallback)=>fallback;}
public static class LoadingScreen{public static int Writes;public static void SetProgress(float _) => Writes++;}
public static class Debug{public static int Warnings;public static void LogWarning(string _) => Warnings++;}
public class SoundMgr{public Action<float> Progress;public TaskCompletionSource<bool> Ready=new();public Task Init(Action<float> progress){Progress=progress;return Ready.Task;}}
namespace UnityEngine.AddressableAssets{public static class Addressables{public static AsyncOperationHandle<GameObject> InstantiateAsync(string _){var op=new Operation<GameObject>();op.Completion.SetResult(new());return new(){Op=op};}public static void ReleaseInstance(GameObject _) {}}}
public class StageBase{public TaskCompletionSource<bool> StartReady=new();public TaskCompletionSource<bool> StopReady;public virtual Task StartAsync()=>StartReady.Task;public virtual Task Stop()=>StopReady?.Task??Task.CompletedTask;protected virtual void OnDestroy(){}}
public partial class StageSubject{private bool stopping;public bool Destroyed,Applied,CatchCompleted;public IUserService UserService=new();private CompositeDisposable disposable=new();private IDisposable _autoRestart;public void DestroyStage(){Destroyed=true;OnDestroy();}public static bool operator ==(StageSubject a,StageSubject b)=>ReferenceEquals(a,b)||(ReferenceEquals(a,null)&&!ReferenceEquals(b,null)&&b.Destroyed)||(ReferenceEquals(b,null)&&!ReferenceEquals(a,null)&&a.Destroyed);public static bool operator !=(StageSubject a,StageSubject b)=>!(a==b);public override bool Equals(object o)=>ReferenceEquals(this,o);public override int GetHashCode()=>base.GetHashCode();}