示例#1
0
        public static List <TestResult> PushPullCompare(InteropabilityTestSettings settings)
        {
            //Check settings for null
            if (settings == null)
            {
                Base.Compute.RecordError("Null InteropabilityTestSettings provided.");
                return(null);
            }

            //Create the adapter
            IBHoMAdapter adapter = Adapter.Create.BHoMAdapter(settings.AdapterType, settings.AdapterConstructorArguments);

            //Check adapter created properly
            if (adapter == null)
            {
                Base.Compute.RecordError("Failed to construct the adapter");
                return(null);
            }

            //Check types provided properly
            if (settings.TestTypes == null || settings.TestTypes.Count == 0)
            {
                Base.Compute.RecordError("No test types provided.");
                return(null);
            }

            //Check config provided properly
            if (settings.PushPullConfig == null)
            {
                Base.Compute.RecordError("No PushPullComapreConfig provided");
                return(null);
            }

            //Run through the PushPullCompare testing and return all the results
            List <TestResult> results = new List <TestResult>();

            foreach (Type type in settings.TestTypes)
            {
                results.AddRange(PushPullCompare(adapter, type, settings.PushPullConfig, true));
            }

            //Ask the adapter to fully close down any open instance of the software
            adapter.Execute(new Exit {
                SaveBeforeClose = false
            });

            return(results);
        }
示例#2
0
        /***************************************************/
        /**** Private Methods                           ****/
        /***************************************************/

        private static TestResult RunOneSet(IBHoMAdapter adapter, string setName, List <IBHoMObject> objects, IRequest request, IEqualityComparer <IBHoMObject> comparer, bool resetModelBetweenRuns)
        {
            if (adapter == null)
            {
                return(new TestResult {
                    Description = "PushPullCompare", Message = "Adapter is null, could not preform test", Status = oM.Test.TestStatus.Error
                });
            }

            TestResult setResult = new TestResult {
                Description = $"PushPullCompare: Adapter: {adapter.GetType().Name}, test set: {setName}.", ID = adapter.GetType().Name + ":" + setName
            };

            bool success = true;

            //CalculateObjectHashes
            objects = objects.SetHashFragment();

            //Start up an empty model
            if (resetModelBetweenRuns)
            {
                adapter.Execute(new NewModel());
            }

            List <IBHoMObject> pushedObjects = new List <IBHoMObject>();
            List <IBHoMObject> pulledObjects = new List <IBHoMObject>();

            BH.oM.Base.ComparisonConfig config = Engine.Test.Create.DefaultTestComparisonConfig();
            config.PropertyExceptions.Add("CustomData");
            config.TypeExceptions.Add(typeof(HashFragment));

            //Push objects
            try
            {
                Engine.Base.Compute.ClearCurrentEvents();
                pushedObjects = adapter.Push(objects).Cast <IBHoMObject>().ToList();
                success      &= pushedObjects.Count == objects.Count;
            }
            catch (Exception e)
            {
                Engine.Base.Compute.RecordError(e.Message);
                setResult.Message = "The adapter crashed trying to push the objects.";
                setResult.Status  = oM.Test.TestStatus.Error;
                return(setResult);
            }
            finally
            {
                setResult.Information.AddRange(Engine.Base.Query.CurrentEvents().Select(x => x.ToEventMessage()));
            }

            if (pushedObjects.Count != objects.Count)
            {
                setResult.Information.AddRange(objects.Where(x => !pushedObjects.Any(y => x.Name == y.Name)).Select(x => TestFailedResult(x, "Object could not be pushed.")));
            }

            //Pull objects
            try
            {
                Engine.Base.Compute.ClearCurrentEvents();
                pulledObjects = adapter.Pull(request).Cast <IBHoMObject>().ToList();
                success      &= pulledObjects.Count == pushedObjects.Count;
            }
            catch (Exception e)
            {
                Engine.Base.Compute.RecordError(e.Message);
                setResult.Message = "The adapter crashed trying to pull the objects.";
                setResult.Status  = oM.Test.TestStatus.Error;
                return(setResult);
            }
            finally
            {
                setResult.Information.AddRange(Engine.Base.Query.CurrentEvents().Select(x => x.ToEventMessage()));
            }

            //Compare pushed and pulled objects
            VennDiagram <IBHoMObject> diagram = Engine.Data.Create.VennDiagram(pushedObjects, pulledObjects, comparer);


            foreach (Tuple <IBHoMObject, IBHoMObject> pair in diagram.Intersection)
            {
                setResult.Information.Add(ComparePushedAndPulledObject(pair.Item1, pair.Item2, config));
            }

            setResult.Information.AddRange(diagram.OnlySet1.Select(x => TestFailedResult(x, "Unable to compare the object.")));

            //Close the model
            if (resetModelBetweenRuns)
            {
                adapter.Execute(new Close {
                    SaveBeforeClose = false
                });
            }

            //Clear events
            Engine.Base.Compute.ClearCurrentEvents();

            setResult.Status = setResult.Information.OfType <TestResult>().MostSevereStatus();

            if (setResult.Status == oM.Test.TestStatus.Error)
            {
                setResult.Message = "Errors where raised trying to run the test";
            }
            else if (setResult.Status == oM.Test.TestStatus.Pass)
            {
                setResult.Message = "All objects were successfully pushed, pulled and compared without any differences.";
            }
            else
            {
                setResult.Message = "All objects were successfully pushed and pulled, but some differences were found.";
            }

            return(setResult);
        }