Beispiel #1
0
        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();
        }
Beispiel #3
0
        public void Render(IStoreAccessor accessor)
        {
            this.scrollPosition = EditorGUILayout.BeginScrollView(this.scrollPosition);

            this.Render(accessor, accessor.GetRawData());

            EditorGUILayout.EndScrollView();
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        private void CheckInitialize()
        {
            if (!Application.isPlaying)
            {
                accessor = null;
                return;
            }

            if (accessor != null)
            {
                return;
            }
            this.accessor = SingleStore.Instance?.GetStoreAccessor();
        }
Beispiel #7
0
        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());
        }
Beispiel #8
0
        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);
        }
Beispiel #9
0
        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());
        }
Beispiel #10
0
        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;
            }
        }
Beispiel #11
0
        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);
        }
Beispiel #12
0
        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);
        }
Beispiel #13
0
        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);
        }
Beispiel #14
0
        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;
                }
            }
        }
Beispiel #16
0
        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);
        }
Beispiel #17
0
        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);
        }
Beispiel #18
0
        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));