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); }
/***************************************************/ /**** 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); }