internal override ValidationResult ValidateSetting(Type validationTest, AbstractPluginManager pluginManager)
        {
            ValidationResult result = base.ValidateSetting(validationTest, pluginManager);

            if (result.impact != ValidationResult.Level.OK)
            {
                return(result);
            }

            GameObject go = ((GameObject)ActualValue);

            if (postProcessingProfile)
            {
                PostProcessVolume volume = go.GetComponent <PostProcessVolume>();
                if (volume == null)
                {
                    return(GetWarningResult(TestName, pluginManager, "Camera does not have a post processing volume.", validationTest.Name, new ResolutionCallback(AddPostProcessing)));
                }

                if (volume.profile != postProcessingProfile)
                {
                    return(GetWarningResult(TestName, pluginManager, "Camera does not have the correct post processing volume.", validationTest.Name, new ResolutionCallback(AddPostProcessingProfile)));
                }
            }
            return(GetPassResult(TestName, pluginManager, validationTest.Name));
        }
        internal ValidationResult GetPassResult(string testName, AbstractPluginManager pluginManager, string reportingTest)
        {
            ValidationResult result = GetResult(testName, pluginManager, "Looks good.", reportingTest);

            result.impact = ValidationResult.Level.OK;
            return(result);
        }
Example #3
0
        internal override ValidationResult ValidateSetting(Type validationTest, AbstractPluginManager pluginManager)
        {
            ValidationResult result = null;
            T value;

            try
            {
                value = ActualValue;
            }
            catch (Exception e)
            {
                result = GetErrorResult(TestName, pluginManager, "Exception validating " + name + "\n" + e.Message + "\n" + e.StackTrace, validationTest.Name);
                result.RemoveCallbacks();
                return(result);
            }

            if (!object.Equals(value, SuggestedValue))
            {
                result = GetWarningResult(TestName, pluginManager, "The value set is not the same as the suggested value.\n"
                                          + "Suggested value = " + SuggestedValue + "\n"
                                          + "Actual Value = " + value + "\n"
                                          + "This may be OK, in which case click the ignore button.", validationTest.Name);
                return(result);
            }

            return(GetPassResult(TestName, pluginManager, validationTest.Name));
        }
        private void ValidateChildFields(Type validationTest, AbstractPluginManager pluginManager, IEnumerable <FieldInfo> fields, AbstractSettingSO parentFieldInstance)
        {
            ValidationResult result;

            foreach (FieldInfo field in fields)
            {
                AbstractSettingSO fieldInstance = field.GetValue(parentFieldInstance) as AbstractSettingSO;
                if (fieldInstance == null)
                {
                    AddOrUpdateAsError(field.Name, pluginManager, "Must provide a Setting Scriptable Object");
                    return;
                }

                ResultCollection.Remove(field.Name);

                if (field.FieldType == typeof(GenericSettingSO <>))
                {
                    ValidateGenericSettingField(field, pluginManager, fieldInstance);
                }

                Type type = field.FieldType;
                // Validate the field according to the SO validation setting.
                result = (ValidationResult)type.InvokeMember("Validate",
                                                             BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public,
                                                             null, fieldInstance, new object[] { validationTest, pluginManager });

                ResultCollection.AddOrUpdate(result, validationTest.Name);

                IEnumerable <FieldInfo> childFields = field.FieldType.GetFields()
                                                      .Where(childField => childField.FieldType.IsSubclassOf(typeof(AbstractSettingSO)));
                ValidateChildFields(validationTest, pluginManager, childFields, fieldInstance);
            }
        }
        private void ValidateGenericSettingField(FieldInfo field, AbstractPluginManager pluginManager, AbstractSettingSO fieldInstance)
        {
            string className    = ((GenericSettingSO <T>)fieldInstance).valueClassName;
            string accessorName = ((GenericSettingSO <T>)fieldInstance).valueName;

            if ((className != null && className.Length > 0) ||
                (accessorName != null && accessorName.Length > 0))
            {
                IEnumerable <Type> propertyTypes = (from assembly in AppDomain.CurrentDomain.GetAssemblies()
                                                    from candidate in assembly.GetTypes()
                                                    where candidate.Name == className
                                                    select candidate);
                Type propertyType = propertyTypes.FirstOrDefault();

                if (propertyType == null)
                {
                    string msg = "A property accessor is provided but the class identified, `"
                                 + className + "`, cannot be found in the Assembly.";
                    AddOrUpdateAsError(field.Name, pluginManager, msg);
                }
                else
                {
                    PropertyInfo accessorPropertyInfo = propertyType.GetProperty(accessorName);
                    FieldInfo    acessorFieldInfo     = propertyType.GetField(accessorName);
                    if (accessorPropertyInfo == null && acessorFieldInfo == null)
                    {
                        string msg = "A property accessor is provided but the accessor identified, `"
                                     + accessorName + "`, cannot be found in the class specified, `" + className + "`.";
                        AddOrUpdateAsError(field.Name, pluginManager, msg);
                    }
                }
            }
        }
        /// <summary>
        /// Test to see if the setting is valid or not.
        /// </summary>
        /// <returns>A ValidationResult. This will have an impact of "OK" if the setting is set to an acceptable value.</returns>
        public virtual ValidationResult Validate(Type validationTest, AbstractPluginManager pluginManager)
        {
            ValidationResult result;

            if (!Nullable)
            {
                string testName = "Suggested Value error in " + validationTest.Name.Prettify();
                if (SuggestedValue is UnityEngine.Object)
                {
                    if (SuggestedValue as UnityEngine.Object == null)
                    {
                        result = GetErrorResult(testName, pluginManager, "Suggested value cannot be null.", validationTest.Name);
                        return(result);
                    }
                    else
                    {
                        result = GetPassResult(testName, pluginManager, validationTest.Name);
                    }
                }
                else if (SuggestedValue == null)
                {
                    result = GetErrorResult(testName, pluginManager, "Suggested value cannot be null.", validationTest.Name);
                    return(result);
                }
                else
                {
                    result = GetPassResult(testName, pluginManager, validationTest.Name);
                }
            }

            return(ValidateSetting(validationTest, pluginManager));
        }
        internal ValidationResult GetWarningResult(string testName, AbstractPluginManager pluginManager, string message, string reportingTest, ResolutionCallback callback = null)
        {
            ValidationResult result = GetResult(testName, pluginManager, message, reportingTest, callback);

            result.impact = ValidationResult.Level.Warning;
            return(result);
        }
Example #8
0
        internal override ValidationResult ValidateSetting(Type validationTest, AbstractPluginManager pluginManager)
        {
            ValidationResult result = base.ValidateSetting(validationTest, pluginManager);

            if (result.impact != ValidationResult.Level.OK)
            {
                return(result);
            }

            GameObject sun = GetFirstInstanceInScene();

#if WEATHER_MAKER_PRESENT
            if (sun.GetComponent <WeatherMakerCelestialObjectScript>() == null)
            {
                ResolutionCallback callback = new ResolutionCallback(ConfigureSunAsCelestialObject);
                result = GetErrorResult(TestName, pluginManager, "The sun does not have the celestial object component attached.", validationTest.Name);
                List <ResolutionCallback> callbacks = new List <ResolutionCallback>();
                callbacks.Add(callback);
                result.Callbacks = callbacks;
                return(result);
            }
#endif

            return(GetPassResult(TestName, pluginManager, validationTest.Name));
        }
        /// <summary>
        /// Set the testName conducted by this ValidationTest to an Error.
        /// </summary>
        /// <param name="testName">Human readable test name.</param>
        /// <param name="message">Human readable message describing the test status.</param>
        internal void AddOrUpdateAsError(string testName, AbstractPluginManager pluginManager, string message, ResolutionCallback callback = null)
        {
            string           reportingTest = this.GetType().Name;
            ValidationResult result        = GetResult(testName, pluginManager, message, reportingTest, callback);

            result.impact = ValidationResult.Level.Error;
            ResultCollection.AddOrUpdate(result, reportingTest);
        }
        /// <summary>
        /// Set the testName conducted by this ValidationTest to a Pass.
        /// </summary>
        /// <param name="testName">Human readable test name.</param>
        /// <param name="message">Human readable message describing the test status.</param>
        internal void AddOrUpdateAsPass(string testName, AbstractPluginManager pluginManager, string message)
        {
            string           reportingTest = this.GetType().Name;
            ValidationResult result        = GetResult(testName, pluginManager, message, reportingTest);

            result.impact = ValidationResult.Level.OK;
            ResultCollection.AddOrUpdate(result, reportingTest);
        }
Example #11
0
 /// <summary>
 /// Create a Validation object.
 /// </summary>
 /// <param name="name">A human readable message describing the validation state.</param>
 /// <param name="impact">The importance of the result from OK to Error.</param>
 /// <param name="callbackToFix">A callback method that will allow the result to be corrected if possible.</param>
 internal ValidationResult(string name, AbstractPluginManager pluginManager, Level impact, ProfileCallback callbackToFix)
 {
     this.id            = name.GetHashCode();
     this.name          = name;
     this.PluginManager = pluginManager;
     this.impact        = impact;
     if (callbackToFix != null)
     {
         this.Callbacks.Add(new ResolutionCallback(callbackToFix));
     }
 }
Example #12
0
        internal override ValidationResult ValidateSetting(Type validationTest, AbstractPluginManager pluginManager)
        {
            ValidationResult result = null;

            if (Instance == null)
            {
                result = GetErrorResult(TestName, pluginManager, SuggestedValue.name + " is required but doesn't currently exist in the scene.", validationTest.Name, new ResolutionCallback(InstantiateScriptableObject));
                return(result);
            }

            return(GetPassResult(TestName, pluginManager, validationTest.Name));
        }
Example #13
0
        /// <summary>
        /// Get or create a ValidationResult for a setting and a specific validation test.
        /// </summary>
        /// <param name="settingTest">The name of the setting test this is a result for.</param>
        /// <param name="reportingTest">The name of the ValidationTest that this result is generated for.</param>
        /// <returns>An existing ValidationResult if the test has already been run, or a new validation result with an untested state.</returns>
        public ValidationResult GetOrCreate(string settingTest, AbstractPluginManager pluginManager, string reportingTest)
        {
            ValidationResult result;

            if (!collection.TryGetValue(settingTest.GetHashCode(), out result))
            {
                result = new ValidationResult(settingTest, pluginManager);
                result.ReportingTest.Add(reportingTest);
                AddOrUpdate(result, reportingTest);
            }
            return(result);
        }
        public ValidationResultCollection Validate(Type validationTest, AbstractPluginManager pluginManager)
        {
            ResultCollection = new ValidationResultCollection();
            ValidationResult result;

            // Is plugin enabled, If not we don't need to test it
            if (pluginManager == null)
            {
                return(ResultCollection);
            }

            if (!InitialCustomValidations())
            {
                return(ResultCollection);
            }

            // Is a plugin profile provided?
            if (pluginManager.Profile == null)
            {
                result         = ResultCollection.GetOrCreate(pluginManager.GetType().Name.Prettify() + " - Missing Profile", pluginManager, validationTest.Name);
                result.Message = "You need to provide a plugin profile for " + pluginManager.GetType().Name.BreakCamelCase();
                result.ReportingTest.Add(validationTest.Name);
                result.impact = ValidationResult.Level.Error;
                result.RemoveCallbacks();
                ResultCollection.AddOrUpdate(result, validationTest.Name);

                return(ResultCollection);
            }

            if (!ProfileType.Name.EndsWith(pluginManager.Profile.GetType().Name))
            {
                return(ResultCollection);
            }

            if (!PreFieldCustomValidations(pluginManager))
            {
                return(ResultCollection);
            }

            //Validate SettingSO fields
            IEnumerable <FieldInfo> fields = pluginManager.Profile.GetType().GetFields()
                                             .Where(field => field.FieldType.IsSubclassOf(typeof(AbstractSettingSO)));

            ValidateFields(validationTest, fields, pluginManager);


            if (!PostFieldCustomValidations(pluginManager))
            {
                return(ResultCollection);
            }

            return(ResultCollection);
        }
        private ValidationResult GetResult(string testName, AbstractPluginManager pluginManager, string message, string reportingTest, ResolutionCallback callback = null)
        {
            ValidationResult result = ResultCollection.GetOrCreate(testName, pluginManager, reportingTest);

            result.Message = message;
            result.impact  = ValidationResult.Level.Warning;
            result.RemoveCallbacks();
            if (callback != null)
            {
                result.AddCallback(callback);
            }
            return(result);
        }
        internal override ValidationResult ValidateSetting(Type validationTest, AbstractPluginManager pluginManager)
        {
            if (Target.Instance == null)
            {
                return(GetErrorResult("Target is required.", pluginManager, Target.name, validationTest.Name, new ResolutionCallback(Target.InstantiatePrefab)));
            }

            if (ActualValue != null)
            {
                return(GetPassResult("MonoBehaviour is required", pluginManager, validationTest.Name));
            }
            else
            {
                return(GetErrorResult("MonoBehaviour is required", pluginManager, SuggestedValue.name + " is not present " + Target.Instance.name, validationTest.Name));
            }
        }
        internal override bool PostFieldCustomValidations(AbstractPluginManager pluginManager)
        {
            bool isPass = base.PostFieldCustomValidations(pluginManager);

            if (UnityEngine.Terrain.activeTerrain)
            {
                AddOrUpdateAsPass("Terrain is required.", pluginManager, "There is a terrain in the scene.");
            }
            else
            {
                ResolutionCallback callback = new ResolutionCallback(new ProfileCallback(GenerateTerrain));
                AddOrUpdateAsError("Terrain is required.", pluginManager, "There is no terrain in the scene.", callback);
                isPass = false;
            }

            return(isPass);
        }
        private ValidationResult GetResult(string testName, AbstractPluginManager pluginManager, string message, string reportingTest, ResolutionCallback callback = null)
        {
            ValidationResult result = ValidationCollection.GetOrCreate(SettingName + " - " + testName, pluginManager, reportingTest);

            result.Message   = message;
            result.impact    = ValidationResult.Level.Warning;
            result.Callbacks = new List <ResolutionCallback>();
            if (callback != null)
            {
                result.AddCallback(callback);
            }
            else
            {
                AddDefaultFixCallback(result);
            }
            return(result);
        }
        internal override bool InitialCustomValidations()
        {
            AbstractPluginManager pluginManager = GameObject.FindObjectOfType <Agent_HerdSim_PluginManager>();
            bool result = base.InitialCustomValidations();

            if (UnityEngine.Terrain.activeTerrain.gameObject.layer == LayerMask.NameToLayer(terrainLayerName))
            {
                AddOrUpdateAsPass("Terrain Layer", pluginManager, "The terrain is marked as having the layer `Ground`.");
                result &= true;
            }
            else
            {
                ResolutionCallback callback = new ResolutionCallback(SetTerrainLayer, "Set Terrain Layer");
                AddOrUpdateAsError("Terrain Layer", pluginManager, "The terrain must be marked as having the layer `Ground`.", callback);
                result = false;
            }
            return(result);
        }
Example #20
0
        internal override bool InitialCustomValidations()
        {
            AbstractPluginManager pluginManager = GameObject.FindObjectOfType <DigitalPaintingManager>();
            bool isPass = base.InitialCustomValidations();

            string path = GetPathToScene();

            if (AssetDatabase.IsValidFolder(path + "/" + AssetDatabaseUtility.dataFolderName))
            {
                AddOrUpdateAsPass("Data Directory Existence", pluginManager, "The Digital Painting Data exists.");
            }
            else
            {
                ResolutionCallback callback = new ResolutionCallback(new ProfileCallback(CreateDefaultSettingsData));
                AddOrUpdateAsWarning("Data Directory Existence", pluginManager, "The Digital Painting Data folder does not exist.", callback);
                return(false);
            }

            return(isPass);
        }
Example #21
0
        internal override ValidationResult ValidateSetting(Type validationTest, AbstractPluginManager pluginManager)
        {
            ValidationResult result = null;

            if (Instance == null)
            {
                if (AddToScene)
                {
                    result = GetErrorResult(TestName, pluginManager, SuggestedValue.name + " is required but doesn't currently exist in the scene", validationTest.Name);
                }
                else
                {
                    result = GetWarningResult(TestName, pluginManager, SuggestedValue.name + " doesn't currently exist in the scene. It is not required, if you don't want it then click the ignore button.", validationTest.Name);
                }
                List <ResolutionCallback> callbacks = new List <ResolutionCallback>();
                ResolutionCallback        callback  = new ResolutionCallback(InstantiatePrefab);
                callbacks.Add(callback);
                result.Callbacks = callbacks;
                return(result);
            }

            return(GetPassResult(TestName, pluginManager, validationTest.Name));
        }
 /// <summary>
 /// Test to see if the setting is valid or not. It's not necessary to test for null values here,
 /// that is done automatically.
 /// </summary>
 /// <returns>True or false depending on whether the setting is correctly set (true) or not (false)</returns>
 internal abstract ValidationResult ValidateSetting(Type validationTest, AbstractPluginManager pluginManager);
 /// <summary>
 /// If a plugin needs to perform any specific validations that are not expressed in the form of setting scriptable
 /// objects it should override this method if these validations are to be done after field validations.
 /// Any successes or failures should be added to the `Collection`.
 /// </summary>
 /// <returns>True if validations passed. False if one ore more warning or error occurs.</returns>
 internal virtual bool PostFieldCustomValidations(AbstractPluginManager pluginManager)
 {
     return(true);
 }
Example #24
0
 /// <summary>
 /// Create a Validation object.
 /// </summary>
 /// <param name="name">A human readable message describing the validation state.</param>
 /// <param name="impact">The importance of the result from OK to Error.</param>
 internal ValidationResult(string name, AbstractPluginManager pluginManager, Level impact) : this(name, pluginManager, impact, null)
 {
 }
Example #25
0
 /// <summary>
 /// Create a Validation object in an untested state.
 /// </summary>
 /// <param name="name">A human readable message describing the validation state.</param>
 /// <param name="impact">The importance of the result from OK to Error.</param>
 internal ValidationResult(string name, AbstractPluginManager pluginManager) : this(name, pluginManager, Level.Untested, null)
 {
 }
Example #26
0
 internal void Pass(string testName, AbstractPluginManager pluginManager, string reportingTest)
 {
     Remove(testName);
     AddOrUpdate(new ValidationResult(testName, pluginManager, ValidationResult.Level.OK), reportingTest);
 }