Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes #1989 Implement clone of SimulationConfiguration #1990

Merged
merged 2 commits into from
Apr 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 20 additions & 3 deletions src/OSPSuite.Core/Domain/Builder/SimulationConfiguration.cs
Original file line number Diff line number Diff line change
@@ -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<IVisitor>
public class SimulationConfiguration : IVisitable<IVisitor>, IUpdatable
{
private readonly List<ExpressionProfileBuildingBlock> _expressionProfiles = new List<ExpressionProfileBuildingBlock>();
private readonly List<ModuleConfiguration> _moduleConfigurations = new List<ModuleConfiguration>();
private readonly List<CoreCalculationMethod> _allCalculationMethods = new List<CoreCalculationMethod>();
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;
Expand All @@ -32,7 +33,7 @@ public class SimulationConfiguration : IVisitable<IVisitor>

public IReadOnlyList<T> All<T>() where T : class, IBuildingBlock
{
return ModuleConfigurations.Select(x=>x.BuildingBlock<T>()).Where(x=>x!=null).ToList();
return ModuleConfigurations.Select(x => x.BuildingBlock<T>()).Where(x => x != null).ToList();
}

public virtual void AcceptVisitor(IVisitor visitor)
Expand All @@ -41,5 +42,21 @@ 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);
}
}
}
8 changes: 7 additions & 1 deletion src/OSPSuite.Core/Domain/Module.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ public class Module : ObjectBase, IEnumerable<IBuildingBlock>

public virtual ExtendedProperties ExtendedProperties { get; } = new ExtendedProperties();

public Module()
{
Icon = IconNames.Module;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

THe icon that keeps on being set lol

}

public override void UpdatePropertiesFrom(IUpdatable source, ICloneManager cloneManager)
{
base.UpdatePropertiesFrom(source, cloneManager);
Expand All @@ -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);
}
Expand All @@ -75,7 +81,7 @@ public override void AcceptVisitor(IVisitor visitor)

public void AddExtendedProperty<T>(string propertyName, T property)
{
ExtendedProperties[propertyName] = new ExtendedProperty<T> {Name = propertyName, Value = property};
ExtendedProperties[propertyName] = new ExtendedProperty<T> { Name = propertyName, Value = property };
}

/// <summary>
Expand Down
16 changes: 14 additions & 2 deletions src/OSPSuite.Core/Domain/ModuleConfiguration.cs
Original file line number Diff line number Diff line change
@@ -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<IVisitor>
public class ModuleConfiguration : IVisitable<IVisitor>, IUpdatable
{
public Module Module { get; }
public Module Module { get; private set; }

/// <summary>
/// Reference to selected molecule start value in the Module (can be null if none is used)
Expand Down Expand Up @@ -76,5 +77,16 @@ public T BuildingBlock<T>() 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);
}
}
}
42 changes: 41 additions & 1 deletion tests/OSPSuite.Core.Tests/Domain/ModuleConfigurationSpecs.cs
Original file line number Diff line number Diff line change
@@ -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
{
Expand Down Expand Up @@ -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<IDataRepositoryTask>();
_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()
Expand Down
68 changes: 68 additions & 0 deletions tests/OSPSuite.Core.Tests/Domain/SimulationConfigurationSpecs.cs
Original file line number Diff line number Diff line change
@@ -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<SimulationConfiguration>
{

}

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<IDataRepositoryTask>();
_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);
}
}
}
12 changes: 12 additions & 0 deletions tests/OSPSuite.HelpersForTests/ModelHelperForSpecs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1280,6 +1280,15 @@ public T CreateObjectBaseFrom<T>(T sourceObject)
if (sourceObject.IsAnImplementationOf<Module>())
return new Module().WithId(id).DowncastTo<T>();

if (sourceObject.IsAnImplementationOf<ModuleConfiguration>())
return new ModuleConfiguration().DowncastTo<T>();

if (sourceObject.IsAnImplementationOf<SimulationConfiguration>())
return new SimulationConfiguration().DowncastTo<T>();

if (sourceObject.IsAnImplementationOf<OutputSelections>())
return new OutputSelections().DowncastTo<T>();

return default(T);
}

Expand Down Expand Up @@ -1310,6 +1319,9 @@ private T newBuildingBlockWithId<T>(T sourceObject, string id) where T : Buildin
if (sourceObject.IsAnImplementationOf<ParameterStartValuesBuildingBlock>())
bb = new ParameterStartValuesBuildingBlock();

if (sourceObject.IsAnImplementationOf<SimulationSettings>())
bb = new SimulationSettings();

if (bb != null)
return bb.WithId(id).DowncastTo<T>();

Expand Down