public void Method_Autorun_InvokeOnChange() { // Arrange IStoreAccessor <ClassStoreWithAction> storeAccessor = serviceProvider.GetRequiredService <IStoreAccessor <ClassStoreWithAction> >(); var consumer = new FakeBlazorComponent(); storeAccessor.SetConsumer(consumer); var store = storeAccessor.Store; int invokeCount = 0, actualInvokeCount = 0; storeAccessor.Autorun(store => { _ = store.Value; actualInvokeCount++; }); // Act Assert.AreEqual(invokeCount, actualInvokeCount); // Always invokes on first change store.Value = 65; invokeCount++; // Real invoke store.Value = 65; invokeCount++; // Assert Assert.AreEqual(invokeCount, actualInvokeCount); }
public void Render(IStoreAccessor _store, ISerializeFactory serializer) { if (_store == null) { EditorGUILayout.HelpBox("Please Set IStoreAccessor", MessageType.Warning); return; } var title = "State Json:"; var jsonPath = EditorPrefs.GetString(JsonPathKey, DefaultStateJsonPath); var existsJson = File.Exists(jsonPath); EditorGUILayout.LabelField(title, EditorStyles.boldLabel); if (existsJson) { if (GUILayout.Button(jsonPath, EditorStyles.label)) { var asset = AssetDatabase.LoadAssetAtPath <TextAsset>(jsonPath); Selection.activeObject = asset; } } else { EditorGUILayout.HelpBox("Create or Select json to save/load", MessageType.Warning); } EditorGUILayout.BeginHorizontal(); if (!existsJson && GUILayout.Button("Create")) { jsonPath = EditorUtility.SaveFilePanel("Create empty json", "Assets", "state.json", "json"); jsonPath = ReplaceJsonPath(jsonPath); if (!string.IsNullOrEmpty(jsonPath)) { File.WriteAllText(jsonPath, "{}"); AssetDatabase.Refresh(); RecordJsonPath(jsonPath); } } if (GUILayout.Button("Select")) { jsonPath = EditorUtility.OpenFilePanel("Select json to save", "", "json"); jsonPath = ReplaceJsonPath(jsonPath); RecordJsonPath(jsonPath); } if (existsJson && GUILayout.Button("Save")) { var json = serializer.Serialize(_store.StoreObject.ObjectState); File.WriteAllBytes(jsonPath, json); AssetDatabase.Refresh(); } if (existsJson && GUILayout.Button("Load")) { var content = File.ReadAllBytes(jsonPath); _store.StoreObject.ObjectState = serializer.Deserialize(content, _store.StoreObject.StateType); } EditorGUILayout.EndHorizontal(); }
public void Render(IStoreAccessor accessor) { this.scrollPosition = EditorGUILayout.BeginScrollView(this.scrollPosition); this.Render(accessor, accessor.GetRawData()); EditorGUILayout.EndScrollView(); }
public void Store_PropertyHasDefaultValue_PreserveDefaultValue() { // Arrange string defaultValue = new ClassStoreWithDefaultValue().PropertyWithDefaultValue; IStoreAccessor <ClassStoreWithDefaultValue> storeAccessor = serviceProvider.GetRequiredService <IStoreAccessor <ClassStoreWithDefaultValue> >(); var consumer = new FakeBlazorComponent(); storeAccessor.SetConsumer(consumer); // Assert Assert.AreEqual(defaultValue, storeAccessor.Store.PropertyWithDefaultValue); }
public void Store_Dependencies_DependencyInjected() { // Arrange IStoreAccessor <ClassWithDependency> storeAccessor = serviceProvider.GetRequiredService <IStoreAccessor <ClassWithDependency> >(); var consumer = new FakeBlazorComponent(); storeAccessor.SetConsumer(consumer); var store = storeAccessor.Store; // Assert Assert.IsNotNull(store.Dependency); }
private void CheckInitialize() { if (!Application.isPlaying) { accessor = null; return; } if (accessor != null) { return; } this.accessor = SingleStore.Instance?.GetStoreAccessor(); }
public void Store_ComputedValue_CacheValue() { // Arrange IStoreAccessor <ClassStoreWithComputed> storeAccessor = serviceProvider.GetRequiredService <IStoreAccessor <ClassStoreWithComputed> >(); var consumer = new FakeBlazorComponent(); storeAccessor.SetConsumer(consumer); var store = storeAccessor.Store; // Act var result = store.ComputedMethodIncerceptingValue(); // Assert Assert.AreEqual(result, store.ComputedMethodIncerceptingValue()); }
public void AsyncStore_AsyncResult_ReturnValueAfterAwaited() { // Arrange IStoreAccessor <AsyncStoreWithComputed> storeAccessor = serviceProvider.GetRequiredService <IStoreAccessor <AsyncStoreWithComputed> >(); var consumer = new FakeBlazorComponent(); storeAccessor.SetConsumer(consumer); var store = storeAccessor.Store; var result = store.GetValueAsync(); result.Wait(); // Assert Assert.IsTrue(result.Value); }
public void AsyncStore_CacheAsyncResult() { // Arrange IStoreAccessor <AsyncStoreWithComputed> storeAccessor = serviceProvider.GetRequiredService <IStoreAccessor <AsyncStoreWithComputed> >(); var consumer = new FakeBlazorComponent(); storeAccessor.SetConsumer(consumer); var store = storeAccessor.Store; var result = store.GetValueAsync(); result.Wait(); // Assert Assert.ReferenceEquals(result, store.GetValueAsync()); }
void OnGUI() { this.titleContent.text = "UniduxPanel"; EditorGUILayout.LabelField("UniduxEditorWindow", EditorStyles.boldLabel); // XXX: ObjectField cannot restrict type selection of IStoreAccessor var selectObject = EditorGUILayout.ObjectField( "IStoreAccessor", this._storeObject, typeof(GameObject), true ) as GameObject; // Initial case, but it excepts the case of setting none object. if (selectObject == null && this._storeObject == null) { selectObject = this.LoadObject(StoreObjectKey); } this._store = selectObject != null?selectObject.GetComponent <IStoreAccessor>() : null; if (this._store != null && this._storeObject != selectObject) { this.SaveObject(selectObject, StoreObjectKey); this._storeObject = selectObject; } else if (this._store == null && this._storeObject != null) { this._storeObject = null; this.ResetObject(StoreObjectKey); } // Show toolbar this._toolBarPosition = GUILayout.Toolbar(this._toolBarPosition, new[] { "save/load", "state" }); switch (this._toolBarPosition) { case 0: this._settingTab.Render(this._store, this.Serializer); break; case 1: this._stateTab.Render(this._store); break; } }
public void Method_ComputedValue_IsProperty() { // Arrange IStoreAccessor <ClassStoreWithComputed> storeAccessor = serviceProvider.GetRequiredService <IStoreAccessor <ClassStoreWithComputed> >(); var consumer = new FakeBlazorComponent(); storeAccessor.SetConsumer(consumer); var store = storeAccessor.Store; int invokeCount = 0; // Act Assert.AreEqual(invokeCount, ClassStoreWithComputed.InvokeCount); _ = store.ComputedProperty; invokeCount++; // Assert Assert.AreEqual(invokeCount, ClassStoreWithComputed.InvokeCount); }
public void Store_Action_BatchMutations() { // Arrange IStoreAccessor <ClassStoreWithAction> storeAccessor = serviceProvider.GetRequiredService <IStoreAccessor <ClassStoreWithAction> >(); var consumer = new FakeBlazorComponent(); storeAccessor.SetConsumer(consumer); var store = storeAccessor.Store; int invokeCount = 0; // Act Assert.AreEqual(invokeCount, ClassStoreWithAction.AutorunInvokeCount); store.ActionMethod(String.Empty); invokeCount++; // Assert Assert.AreEqual(invokeCount, ClassStoreWithAction.AutorunInvokeCount); }
public void Store_ComputedValue_BehavePromiscous() { // Arrange IStoreAccessor <ClassStoreWithComputed> storeAccessor = serviceProvider.GetRequiredService <IStoreAccessor <ClassStoreWithComputed> >(); var consumer = new FakeBlazorComponent(); storeAccessor.SetConsumer(consumer); var store = storeAccessor.Store; int invokeCount = 0; // Act Assert.AreEqual(invokeCount, ClassStoreWithComputed.InvokeCount); store.ComputedMethodIncerceptingValue(); invokeCount++; // Assert Assert.AreEqual(invokeCount, ClassStoreWithComputed.InvokeCount); }
public void Store_Autorun_BehavePromiscous() { // Arrange IStoreAccessor <ClassStoreWithAction> storeAccessor = serviceProvider.GetRequiredService <IStoreAccessor <ClassStoreWithAction> >(); var consumer = new FakeBlazorComponent(); storeAccessor.SetConsumer(consumer); var store = storeAccessor.Store; int invokeCount = 0; // Act Assert.AreEqual(invokeCount, ClassStoreWithAction.AutorunInvokeCount); store.AnotherValue = 65; invokeCount++; store.AnotherValue = 50; // Assert Assert.AreEqual(invokeCount, ClassStoreWithAction.AutorunInvokeCount); }
public static CachePolicy Default(IStoreAccessor storeAccessor, TimeSpan timeToLive) { var sync = new object(); var lastClean = DateTime.UtcNow; var cleaning = false; return(new(storeAccessor.OperationStore.Watch().Subscribe(result => { DateTime time = DateTime.UtcNow; if (!cleaning && time - lastClean >= timeToLive) { lock (sync) { if (!cleaning && time - lastClean >= timeToLive) { Clean(time); } } } }))); void Clean(DateTime time) { cleaning = true; try { foreach (var operationVersion in storeAccessor.OperationStore.GetAll()) { if (operationVersion.Subscribers == 0 && time - operationVersion.LastModified >= timeToLive) { storeAccessor.OperationStore.Remove(operationVersion.Request); } } } finally { lastClean = DateTime.UtcNow; cleaning = false; } } }
private bool Render(IStoreAccessor accessor, IDictionary <string, Any> map) { var dirty = false; foreach (var key in map.Keys.ToArray()) { EditorGUILayout.LabelField(key); EditorGUI.indentLevel++; if (EditorGUILayoutRenderer.RenderSystemObject( key, map[key].Type, map[key].Object, newValue => map[key] = new Any(newValue), type => null)) { dirty = true; accessor.Notify(key); } EditorGUI.indentLevel--; } return(dirty); }
public void Store_Autorun_DontInvokeOnNotObservedPropertyChange() { // Arrange IStoreAccessor <ClassStoreWithAction> storeAccessor = serviceProvider.GetRequiredService <IStoreAccessor <ClassStoreWithAction> >(); var consumer = new FakeBlazorComponent(); storeAccessor.SetConsumer(consumer); var store = storeAccessor.Store; int invokeCount = 0; // Act Assert.AreEqual(invokeCount, ClassStoreWithAction.AutorunInvokeCount); // Always invokes on first change store.Value = 65; invokeCount++; // Real invoke store.AnotherValue = 65; // Assert Assert.AreEqual(invokeCount, ClassStoreWithAction.AutorunInvokeCount); }
public void ExecuteInAction_BatchMutations() { // Arrange IStoreAccessor <ClassStoreWithAction> storeAccessor = serviceProvider.GetRequiredService <IStoreAccessor <ClassStoreWithAction> >(); var consumer = new FakeBlazorComponent(); storeAccessor.SetConsumer(consumer); var store = storeAccessor.Store; int invokeCount = 0; // Act Assert.AreEqual(invokeCount, ClassStoreWithAction.AutorunInvokeCount); storeAccessor.ExecuteInAction(() => { store.AnotherValue = 10; store.Value = 5; }); invokeCount++; // Assert Assert.AreEqual(invokeCount, ClassStoreWithAction.AutorunInvokeCount); }
public void Render(IStoreAccessor _store) { if (_store == null) { EditorGUILayout.HelpBox("Please Set IStoreAccessor", MessageType.Warning); return; } // scrollview of state { this._scrollPosition = EditorGUILayout.BeginScrollView(this._scrollPosition); if (!(_store.StoreObject.ObjectState is ICloneable)) { EditorGUILayout.HelpBox("Please inplement ICloneable on State", MessageType.Warning); return; } var state = _store.StoreObject.ObjectState; var names = new List <string>(); var type = state.GetType(); if (!state.Equals(this._newState)) { this._newState = ((ICloneable)state).Clone(); } var dirty = this.RenderObject(names, state.GetType().Name, this._newState, type, _ => { }); EditorGUILayout.EndScrollView(); // XXX: it might be slow and should be updated less frequency. if (dirty) { _store.StoreObject.ObjectState = this._newState; this._newState = null; } } }
public static CachePolicy NoCache(IStoreAccessor storeAccessor) =>
public static CachePolicy Default(IStoreAccessor storeAccessor) => Default(storeAccessor, TimeSpan.FromMinutes(5));