From f588c730a9c9aa516cea7242ab54d409bf7c3f0b Mon Sep 17 00:00:00 2001 From: Robert McIntosh <261477+rwmcintosh@users.noreply.github.com> Date: Wed, 26 Apr 2023 09:50:41 -0400 Subject: [PATCH 1/2] Fixes #1989 Implement clone of SimulationConfiguration --- .../Domain/Builder/SimulationConfiguration.cs | 26 ++++++- src/OSPSuite.Core/Domain/Module.cs | 8 ++- .../Domain/ModuleConfiguration.cs | 16 ++++- .../Domain/ModuleConfigurationSpecs.cs | 42 +++++++++++- .../Domain/SimulationConfigurationSpecs.cs | 68 +++++++++++++++++++ .../ModelHelperForSpecs.cs | 12 ++++ 6 files changed, 165 insertions(+), 7 deletions(-) create mode 100644 tests/OSPSuite.Core.Tests/Domain/SimulationConfigurationSpecs.cs diff --git a/src/OSPSuite.Core/Domain/Builder/SimulationConfiguration.cs b/src/OSPSuite.Core/Domain/Builder/SimulationConfiguration.cs index 4fdbe5866..57b455311 100644 --- a/src/OSPSuite.Core/Domain/Builder/SimulationConfiguration.cs +++ b/src/OSPSuite.Core/Domain/Builder/SimulationConfiguration.cs @@ -1,18 +1,19 @@ using System.Collections.Generic; using System.Linq; +using OSPSuite.Core.Domain.Services; using OSPSuite.Core.Serialization.SimModel.Services; using OSPSuite.Utility.Extensions; using OSPSuite.Utility.Visitor; namespace OSPSuite.Core.Domain.Builder { - public class SimulationConfiguration : IVisitable + public class SimulationConfiguration : IVisitable, IUpdatable { private readonly List _expressionProfiles = new List(); private readonly List _moduleConfigurations = new List(); private readonly List _allCalculationMethods = new List(); - public SimModelExportMode SimModelExportMode { get; set; } = SimModelExportMode.Full; + public SimModelExportMode SimModelExportMode { get; set; } = SimModelExportMode.Full; public bool ShouldValidate { get; set; } = true; public bool ShowProgress { get; set; } = true; public bool PerformCircularReferenceCheck { get; set; } = true; @@ -32,7 +33,7 @@ public class SimulationConfiguration : IVisitable public IReadOnlyList All() where T : class, IBuildingBlock { - return ModuleConfigurations.Select(x=>x.BuildingBlock()).Where(x=>x!=null).ToList(); + return ModuleConfigurations.Select(x => x.BuildingBlock()).Where(x => x != null).ToList(); } public virtual void AcceptVisitor(IVisitor visitor) @@ -41,5 +42,24 @@ public virtual void AcceptVisitor(IVisitor visitor) Individual?.AcceptVisitor(visitor); _expressionProfiles.Each(x => x.AcceptVisitor(visitor)); } + + public void UpdatePropertiesFrom(IUpdatable source, ICloneManager cloneManager) + { + if (!(source is SimulationConfiguration sourceConfiguration)) + return; + + SimModelExportMode = sourceConfiguration.SimModelExportMode; + ShouldValidate = sourceConfiguration.ShouldValidate; + ShowProgress = sourceConfiguration.ShowProgress; + PerformCircularReferenceCheck = sourceConfiguration.PerformCircularReferenceCheck; + + sourceConfiguration.ExpressionProfiles.Each(x => AddExpressionProfile(cloneManager.Clone(x))); + sourceConfiguration.AllCalculationMethods.Each(x => AddCalculationMethod(cloneManager.Clone(x))); + sourceConfiguration.ModuleConfigurations.Each(x => AddModuleConfiguration(cloneManager.Clone(x))); + + SimulationSettings = cloneManager.Clone(sourceConfiguration.SimulationSettings); + + Individual = cloneManager.Clone(sourceConfiguration.Individual); + } } } \ No newline at end of file diff --git a/src/OSPSuite.Core/Domain/Module.cs b/src/OSPSuite.Core/Domain/Module.cs index f63bd3d5d..19e288a42 100644 --- a/src/OSPSuite.Core/Domain/Module.cs +++ b/src/OSPSuite.Core/Domain/Module.cs @@ -32,6 +32,11 @@ public class Module : ObjectBase, IEnumerable public virtual ExtendedProperties ExtendedProperties { get; } = new ExtendedProperties(); + public Module() + { + Icon = IconNames.Module; + } + public override void UpdatePropertiesFrom(IUpdatable source, ICloneManager cloneManager) { base.UpdatePropertiesFrom(source, cloneManager); @@ -53,6 +58,7 @@ public void Add(IBuildingBlock buildingBlock) if (existingBuildingBlock != null) throw new OSPSuiteException(Error.BuildingBlockTypeAlreadyAddedToModule(buildingBlock.Name, type.Name)); } + buildingBlock.Module = this; _buildingBlocks.Add(buildingBlock); } @@ -75,7 +81,7 @@ public override void AcceptVisitor(IVisitor visitor) public void AddExtendedProperty(string propertyName, T property) { - ExtendedProperties[propertyName] = new ExtendedProperty {Name = propertyName, Value = property}; + ExtendedProperties[propertyName] = new ExtendedProperty { Name = propertyName, Value = property }; } /// diff --git a/src/OSPSuite.Core/Domain/ModuleConfiguration.cs b/src/OSPSuite.Core/Domain/ModuleConfiguration.cs index 56733c741..ad7a02d5f 100644 --- a/src/OSPSuite.Core/Domain/ModuleConfiguration.cs +++ b/src/OSPSuite.Core/Domain/ModuleConfiguration.cs @@ -1,13 +1,14 @@ using System; using System.Linq; using OSPSuite.Core.Domain.Builder; +using OSPSuite.Core.Domain.Services; using OSPSuite.Utility.Visitor; namespace OSPSuite.Core.Domain { - public class ModuleConfiguration : IVisitable + public class ModuleConfiguration : IVisitable, IUpdatable { - public Module Module { get; } + public Module Module { get; private set; } /// /// Reference to selected molecule start value in the Module (can be null if none is used) @@ -76,5 +77,16 @@ public T BuildingBlock() where T : class, IBuildingBlock return null; } } + + public void UpdatePropertiesFrom(IUpdatable source, ICloneManager cloneManager) + { + if (!(source is ModuleConfiguration sourceConfiguration)) + return; + + Module = cloneManager.Clone(sourceConfiguration.Module); + + SelectedMoleculeStartValues = Module.MoleculeStartValuesCollection.FindByName(sourceConfiguration.SelectedMoleculeStartValues?.Name); + SelectedParameterStartValues = Module.ParameterStartValuesCollection.FindByName(sourceConfiguration.SelectedParameterStartValues?.Name); + } } } \ No newline at end of file diff --git a/tests/OSPSuite.Core.Tests/Domain/ModuleConfigurationSpecs.cs b/tests/OSPSuite.Core.Tests/Domain/ModuleConfigurationSpecs.cs index 6019ab666..44fd94cfb 100644 --- a/tests/OSPSuite.Core.Tests/Domain/ModuleConfigurationSpecs.cs +++ b/tests/OSPSuite.Core.Tests/Domain/ModuleConfigurationSpecs.cs @@ -1,6 +1,9 @@ -using OSPSuite.BDDHelper; +using FakeItEasy; +using OSPSuite.BDDHelper; using OSPSuite.BDDHelper.Extensions; using OSPSuite.Core.Domain.Builder; +using OSPSuite.Core.Domain.Services; +using OSPSuite.Helpers; namespace OSPSuite.Core.Domain { @@ -59,6 +62,43 @@ public void should_return_the_expected_molecule_and_parameter_start_values() } } + public class When_cloning_a_module_configuration : concern_for_ModuleConfiguration + { + private ICloneManager _cloneManager; + private IDataRepositoryTask _dataRepositoryTask; + private ModuleConfiguration _result; + + protected override void Context() + { + base.Context(); + _dataRepositoryTask = A.Fake(); + _cloneManager = new CloneManagerForBuildingBlock(new ObjectBaseFactoryForSpecs(new DimensionFactoryForIntegrationTests()), _dataRepositoryTask); + + sut.SelectedMoleculeStartValues = _moleculeStartValuesBuildingBlock2; + sut.SelectedParameterStartValues = null; + } + + protected override void Because() + { + _result = _cloneManager.Clone(sut); + } + + [Observation] + public void the_cloned_building_block_should_have_the_properly_selected_start_values() + { + _result.SelectedParameterStartValues.ShouldBeNull(); + _result.SelectedMoleculeStartValues.ShouldNotBeEqualTo(sut.SelectedMoleculeStartValues); + _result.SelectedMoleculeStartValues.Name.ShouldBeEqualTo(sut.SelectedMoleculeStartValues.Name); + } + + [Observation] + public void the_module_should_be_a_clone_of_the_original() + { + _result.Module.ShouldNotBeEqualTo(sut.Module); + _result.Module.Name.ShouldBeEqualTo(sut.Module.Name); + } + } + public class When_returning_the_building_block_by_type_for_a_module_configuration : concern_for_ModuleConfiguration { protected override void Context() diff --git a/tests/OSPSuite.Core.Tests/Domain/SimulationConfigurationSpecs.cs b/tests/OSPSuite.Core.Tests/Domain/SimulationConfigurationSpecs.cs new file mode 100644 index 000000000..a8f938dbf --- /dev/null +++ b/tests/OSPSuite.Core.Tests/Domain/SimulationConfigurationSpecs.cs @@ -0,0 +1,68 @@ +using FakeItEasy; +using OSPSuite.BDDHelper; +using OSPSuite.BDDHelper.Extensions; +using OSPSuite.Core.Domain.Builder; +using OSPSuite.Core.Domain.Services; +using OSPSuite.Core.Serialization.SimModel.Services; +using OSPSuite.Helpers; + +namespace OSPSuite.Core.Domain +{ + public abstract class concern_for_SimulationConfiguration : ContextSpecification + { + + } + + public class When_cloning_a_simulation_configuration : concern_for_SimulationConfiguration + { + private ICloneManager _cloneManager; + private IDataRepositoryTask _dataRepositoryTask; + private SimulationConfiguration _result; + + protected override void Context() + { + _dataRepositoryTask = A.Fake(); + _cloneManager = new CloneManagerForBuildingBlock(new ObjectBaseFactoryForSpecs(new DimensionFactoryForIntegrationTests()), _dataRepositoryTask); + sut = new SimulationConfiguration(); + var module = new Module + { + Name = "module" + }; + module.Add(new SpatialStructure().WithName("spatial structure")); + module.Add(new MoleculeStartValuesBuildingBlock()); + module.Add(new ParameterStartValuesBuildingBlock()); + sut.AddModuleConfiguration(new ModuleConfiguration(module)); + + sut.PerformCircularReferenceCheck = !sut.PerformCircularReferenceCheck; + sut.ShowProgress = !sut.ShowProgress; + sut.ShouldValidate = !sut.ShouldValidate; + sut.SimModelExportMode = SimModelExportMode.Full; + + sut.SimulationSettings = new SimulationSettings(); + } + + protected override void Because() + { + _result = _cloneManager.Clone(sut); + } + + [Observation] + public void the_cloned_configuration_should_have_clones_of_module_configurations_and_modules() + { + _result.ModuleConfigurations.Count.ShouldBeEqualTo(1); + _result.ModuleConfigurations[0].ShouldNotBeEqualTo(sut.ModuleConfigurations[0]); + _result.ModuleConfigurations[0].Module.Name.ShouldBeEqualTo(sut.ModuleConfigurations[0].Module.Name); + _result.ModuleConfigurations[0].Module.SpatialStructure.ShouldNotBeEqualTo(sut.ModuleConfigurations[0].Module.SpatialStructure); + _result.ModuleConfigurations[0].Module.SpatialStructure.Name.ShouldBeEqualTo(sut.ModuleConfigurations[0].Module.SpatialStructure.Name); + } + + [Observation] + public void properties_should_match() + { + _result.PerformCircularReferenceCheck.ShouldBeEqualTo(sut.PerformCircularReferenceCheck); + _result.ShowProgress.ShouldBeEqualTo(sut.ShowProgress); + _result.ShouldValidate.ShouldBeEqualTo(sut.ShouldValidate); + _result.SimModelExportMode.ShouldBeEqualTo(sut.SimModelExportMode); + } + } +} \ No newline at end of file diff --git a/tests/OSPSuite.HelpersForTests/ModelHelperForSpecs.cs b/tests/OSPSuite.HelpersForTests/ModelHelperForSpecs.cs index b4cd57c7f..9d136852a 100644 --- a/tests/OSPSuite.HelpersForTests/ModelHelperForSpecs.cs +++ b/tests/OSPSuite.HelpersForTests/ModelHelperForSpecs.cs @@ -1280,6 +1280,15 @@ public T CreateObjectBaseFrom(T sourceObject) if (sourceObject.IsAnImplementationOf()) return new Module().WithId(id).DowncastTo(); + if (sourceObject.IsAnImplementationOf()) + return new ModuleConfiguration().DowncastTo(); + + if (sourceObject.IsAnImplementationOf()) + return new SimulationConfiguration().DowncastTo(); + + if (sourceObject.IsAnImplementationOf()) + return new OutputSelections().DowncastTo(); + return default(T); } @@ -1310,6 +1319,9 @@ private T newBuildingBlockWithId(T sourceObject, string id) where T : Buildin if (sourceObject.IsAnImplementationOf()) bb = new ParameterStartValuesBuildingBlock(); + if (sourceObject.IsAnImplementationOf()) + bb = new SimulationSettings(); + if (bb != null) return bb.WithId(id).DowncastTo(); From deeb3d7ac3525224a4efa08cfcdc1c7256d2d6a4 Mon Sep 17 00:00:00 2001 From: Robert McIntosh <261477+rwmcintosh@users.noreply.github.com> Date: Thu, 27 Apr 2023 08:03:38 -0400 Subject: [PATCH 2/2] remove spaces --- src/OSPSuite.Core/Domain/Builder/SimulationConfiguration.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/OSPSuite.Core/Domain/Builder/SimulationConfiguration.cs b/src/OSPSuite.Core/Domain/Builder/SimulationConfiguration.cs index 57b455311..b7c4cb5ea 100644 --- a/src/OSPSuite.Core/Domain/Builder/SimulationConfiguration.cs +++ b/src/OSPSuite.Core/Domain/Builder/SimulationConfiguration.cs @@ -52,13 +52,10 @@ public void UpdatePropertiesFrom(IUpdatable source, ICloneManager cloneManager) ShouldValidate = sourceConfiguration.ShouldValidate; ShowProgress = sourceConfiguration.ShowProgress; PerformCircularReferenceCheck = sourceConfiguration.PerformCircularReferenceCheck; - sourceConfiguration.ExpressionProfiles.Each(x => AddExpressionProfile(cloneManager.Clone(x))); sourceConfiguration.AllCalculationMethods.Each(x => AddCalculationMethod(cloneManager.Clone(x))); sourceConfiguration.ModuleConfigurations.Each(x => AddModuleConfiguration(cloneManager.Clone(x))); - SimulationSettings = cloneManager.Clone(sourceConfiguration.SimulationSettings); - Individual = cloneManager.Clone(sourceConfiguration.Individual); } }