From bd9d149270d6e4eebe4d7791efc930b6dbf3f3f6 Mon Sep 17 00:00:00 2001 From: Michael Sevestre Date: Wed, 9 Mar 2022 14:44:28 -0500 Subject: [PATCH] Fixes #1536 container criteria molecule --- .../Domain/Builder/MoleculeBuilder.cs | 78 ++++--------------- .../Domain/Builder/ReactionBuilder.cs | 21 ++--- .../Domain/DistributedParameter.cs | 5 +- .../EventGroupBuilderToEventGroupMapper.cs | 7 +- .../MoleculeBuilderToMoleculeAmountMapper.cs | 32 ++++++-- .../ParameterBuilderToParameterMapper.cs | 2 + src/OSPSuite.Core/Domain/Parameter.cs | 9 +++ src/OSPSuite.Core/Domain/Reaction.cs | 31 ++------ .../Domain/Services/ModelConstructor.cs | 9 +-- src/OSPSuite.Core/Domain/TimeParameter.cs | 2 + .../Xml/QuantityAndContainerXmlSerializer.cs | 6 +- .../Xml/QuantityXmlSerializer.cs | 2 + .../ModelConstructorIntegrationTests.cs | 26 ++++--- ...eculeBuilderToMoleculeAmountMapperSpecs.cs | 54 +++++++++---- .../ModelHelperForSpecs.cs | 8 ++ 15 files changed, 148 insertions(+), 144 deletions(-) diff --git a/src/OSPSuite.Core/Domain/Builder/MoleculeBuilder.cs b/src/OSPSuite.Core/Domain/Builder/MoleculeBuilder.cs index 0ca132bbe..c7c66bd46 100644 --- a/src/OSPSuite.Core/Domain/Builder/MoleculeBuilder.cs +++ b/src/OSPSuite.Core/Domain/Builder/MoleculeBuilder.cs @@ -1,9 +1,9 @@ using System.Collections.Generic; -using OSPSuite.Utility.Collections; -using OSPSuite.Utility.Extensions; using OSPSuite.Core.Domain.Formulas; using OSPSuite.Core.Domain.Services; using OSPSuite.Core.Domain.UnitSystem; +using OSPSuite.Utility.Collections; +using OSPSuite.Utility.Extensions; namespace OSPSuite.Core.Domain.Builder { @@ -84,70 +84,34 @@ public MoleculeBuilder() QuantityType = QuantityType.Undefined; } - public void AddParameter(IParameter parameter) - { - Add(parameter); - } + public void AddParameter(IParameter parameter) => Add(parameter); - public void RemoveParameter(IParameter parameterToRemove) - { - RemoveChild(parameterToRemove); - } + public void RemoveParameter(IParameter parameterToRemove) => RemoveChild(parameterToRemove); - public IEnumerable Parameters - { - get { return GetChildren(); } - } + public IEnumerable Parameters => GetChildren(); - public IEnumerable TransporterMoleculeContainerCollection - { - get { return GetChildren(); } - } + public IEnumerable TransporterMoleculeContainerCollection => GetChildren(); - public void AddTransporterMoleculeContainer(TransporterMoleculeContainer transporterMolecule) - { - Add(transporterMolecule); - } + public void AddTransporterMoleculeContainer(TransporterMoleculeContainer transporterMolecule) => Add(transporterMolecule); - public void RemoveTransporterMoleculeContainer(TransporterMoleculeContainer transporterMoleculeToRemove) - { - RemoveChild(transporterMoleculeToRemove); - } + public void RemoveTransporterMoleculeContainer(TransporterMoleculeContainer transporterMoleculeToRemove) => RemoveChild(transporterMoleculeToRemove); - public IEnumerable InteractionContainerCollection - { - get { return GetChildren(); } - } + public IEnumerable InteractionContainerCollection => GetChildren(); - public void AddInteractionContainer(InteractionContainer interactionContainer) - { - Add(interactionContainer); - } + public void AddInteractionContainer(InteractionContainer interactionContainer) => Add(interactionContainer); - public void RemoveInteractionContainer(InteractionContainer interactionContainer) - { - RemoveChild(interactionContainer); - } + public void RemoveInteractionContainer(InteractionContainer interactionContainer) => RemoveChild(interactionContainer); - public void AddUsedCalculationMethod(UsedCalculationMethod calculationMethod) - { - _usedCalculationMethods.Add(calculationMethod); - } + public void AddUsedCalculationMethod(UsedCalculationMethod calculationMethod) => _usedCalculationMethods.Add(calculationMethod); public void AddUsedCalculationMethod(ICoreCalculationMethod calculationMethod) { AddUsedCalculationMethod(new UsedCalculationMethod(calculationMethod.Category, calculationMethod.Name)); } - public IEnumerable UsedCalculationMethods - { - get { return _usedCalculationMethods; } - } + public IEnumerable UsedCalculationMethods => _usedCalculationMethods; - public bool IsFloatingXenobiotic - { - get { return IsFloating && IsXenobiotic; } - } + public bool IsFloatingXenobiotic => IsFloating && IsXenobiotic; public double? GetDefaultMoleculeStartValue() { @@ -177,18 +141,8 @@ public override void UpdatePropertiesFrom(IUpdatable source, ICloneManager clone public virtual Unit DisplayUnit { - get - { - if (_displayUnit != null) - return _displayUnit; - - return Dimension != null ? Dimension.DefaultUnit : null; - } - set - { - _displayUnit = value; - OnPropertyChanged(() => DisplayUnit); - } + get => _displayUnit ?? Dimension?.DefaultUnit; + set => SetProperty(ref _displayUnit, value); } } } \ No newline at end of file diff --git a/src/OSPSuite.Core/Domain/Builder/ReactionBuilder.cs b/src/OSPSuite.Core/Domain/Builder/ReactionBuilder.cs index 82fe45a1a..f2bf197d5 100644 --- a/src/OSPSuite.Core/Domain/Builder/ReactionBuilder.cs +++ b/src/OSPSuite.Core/Domain/Builder/ReactionBuilder.cs @@ -43,9 +43,9 @@ public interface IReactionBuilder : IProcessBuilder /// public class ReactionBuilder : ProcessBuilder, IReactionBuilder { - private readonly IList _educts; - private readonly IList _products; - private readonly IList _modifier; + private readonly List _educts; + private readonly List _products; + private readonly List _modifier; public DescriptorCriteria ContainerCriteria { get; set; } public ReactionBuilder() @@ -83,15 +83,9 @@ public void AddProduct(IReactionPartnerBuilder product) OnChanged(); } - public void RemoveEduct(IReactionPartnerBuilder educt) - { - _educts.Remove(educt); - } + public void RemoveEduct(IReactionPartnerBuilder educt) => _educts.Remove(educt); - public void RemoveProduct(IReactionPartnerBuilder product) - { - _products.Remove(product); - } + public void RemoveProduct(IReactionPartnerBuilder product) => _products.Remove(product); public IEnumerable ModifierNames => _modifier; @@ -110,10 +104,7 @@ public void RemoveModifier(string modifierToRemove) _modifier.Remove(modifierToRemove); } - public void ClearModifiers() - { - _modifier.Clear(); - } + public void ClearModifiers() => _modifier.Clear(); public IReactionPartnerBuilder EductBy(string moleculeName) { diff --git a/src/OSPSuite.Core/Domain/DistributedParameter.cs b/src/OSPSuite.Core/Domain/DistributedParameter.cs index 59d91754c..e70ef7efd 100644 --- a/src/OSPSuite.Core/Domain/DistributedParameter.cs +++ b/src/OSPSuite.Core/Domain/DistributedParameter.cs @@ -1,4 +1,5 @@ -using OSPSuite.Core.Domain.Formulas; +using OSPSuite.Core.Domain.Descriptors; +using OSPSuite.Core.Domain.Formulas; using OSPSuite.Core.Domain.Services; using OSPSuite.Core.Maths.Random; using OSPSuite.Utility.Extensions; @@ -24,6 +25,7 @@ public class DistributedParameter : QuantityAndContainer, IDistributedParameter public ParameterInfo Info { get; set; } public ParameterOrigin Origin { get; private set; } public double? DefaultValue { get; set; } + public DescriptorCriteria ContainerCriteria { get; set; } /// public bool IsDefault { get; set; } @@ -154,6 +156,7 @@ public override void UpdatePropertiesFrom(IUpdatable source, ICloneManager clone DefaultValue = sourceDistributedParameter.DefaultValue; Origin = sourceDistributedParameter.Origin.Clone(); IsDefault = sourceDistributedParameter.IsDefault; + ContainerCriteria = sourceDistributedParameter.ContainerCriteria?.Clone(); } #region Parameter Info diff --git a/src/OSPSuite.Core/Domain/Mappers/EventGroupBuilderToEventGroupMapper.cs b/src/OSPSuite.Core/Domain/Mappers/EventGroupBuilderToEventGroupMapper.cs index 1e6771c7b..a00397c5a 100644 --- a/src/OSPSuite.Core/Domain/Mappers/EventGroupBuilderToEventGroupMapper.cs +++ b/src/OSPSuite.Core/Domain/Mappers/EventGroupBuilderToEventGroupMapper.cs @@ -92,11 +92,12 @@ private void createApplication(IApplicationBuilder applicationBuilder, IEventGro //---- add molecule amounts foreach (var appMolecule in applicationBuilder.Molecules) { - var molecule = _moleculeMapper.MapFrom(molecules[applicationBuilder.MoleculeName], buildConfiguration); - molecule.Formula = _formulaMapper.MapFrom(appMolecule.Formula, buildConfiguration); - //get container for the molecule var moleculeContainer = appMolecule.RelativeContainerPath.Resolve(eventGroup); + + var molecule = _moleculeMapper.MapFrom(molecules[applicationBuilder.MoleculeName], moleculeContainer, buildConfiguration); + molecule.Formula = _formulaMapper.MapFrom(appMolecule.Formula, buildConfiguration); + moleculeContainer.Add(molecule); addVolumeParameterTo(moleculeContainer); diff --git a/src/OSPSuite.Core/Domain/Mappers/MoleculeBuilderToMoleculeAmountMapper.cs b/src/OSPSuite.Core/Domain/Mappers/MoleculeBuilderToMoleculeAmountMapper.cs index e5ac25fad..4cb1b95a4 100644 --- a/src/OSPSuite.Core/Domain/Mappers/MoleculeBuilderToMoleculeAmountMapper.cs +++ b/src/OSPSuite.Core/Domain/Mappers/MoleculeBuilderToMoleculeAmountMapper.cs @@ -1,7 +1,9 @@ -using OSPSuite.Core.Domain.Builder; +using System.Linq; +using OSPSuite.Core.Domain.Builder; using OSPSuite.Core.Domain.Formulas; using OSPSuite.Core.Domain.Services; using OSPSuite.Core.Domain.UnitSystem; +using OSPSuite.Utility.Extensions; namespace OSPSuite.Core.Domain.Mappers { @@ -14,15 +16,27 @@ namespace OSPSuite.Core.Domain.Mappers /// /// (by the global molecule properties mapper) /// - public interface IMoleculeBuilderToMoleculeAmountMapper : IBuilderMapper + public interface IMoleculeBuilderToMoleculeAmountMapper { + /// + /// Maps the to a MoleculeAmount. is where the + /// molecule amount will be added to. + /// + /// Molecule builder to map to a MoleculeAmount + /// + /// Container where the molecule amount will be added. This is required in order to evaluate + /// local parameters container criteria + /// + /// Build configuration + /// + IMoleculeAmount MapFrom(IMoleculeBuilder moleculeBuilder, IContainer targetContainer, IBuildConfiguration buildConfiguration); } public class MoleculeBuilderToMoleculeAmountMapper : IMoleculeBuilderToMoleculeAmountMapper { private readonly IObjectBaseFactory _objectBaseFactory; private readonly IFormulaBuilderToFormulaMapper _formulaMapper; - private readonly IParameterBuilderCollectionToParameterCollectionMapper _parameterMapper; + private readonly IParameterBuilderToParameterMapper _parameterMapper; private readonly IKeywordReplacerTask _keywordReplacerTask; private readonly IFormulaFactory _formulaFactory; private readonly IParameterFactory _parameterFactory; @@ -30,7 +44,7 @@ public class MoleculeBuilderToMoleculeAmountMapper : IMoleculeBuilderToMoleculeA public MoleculeBuilderToMoleculeAmountMapper(IObjectBaseFactory objectBaseFactory, IFormulaBuilderToFormulaMapper formulaMapper, - IParameterBuilderCollectionToParameterCollectionMapper parameterMapper, + IParameterBuilderToParameterMapper parameterMapper, IDimensionFactory dimensionFactory, IKeywordReplacerTask keywordReplacerTask, IFormulaFactory formulaFactory, IParameterFactory parameterFactory) { @@ -43,7 +57,7 @@ public MoleculeBuilderToMoleculeAmountMapper(IObjectBaseFactory objectBaseFactor _amountDimension = dimensionFactory.Dimension(Constants.Dimension.MOLAR_AMOUNT); } - public IMoleculeAmount MapFrom(IMoleculeBuilder moleculeBuilder, IBuildConfiguration buildConfiguration) + public IMoleculeAmount MapFrom(IMoleculeBuilder moleculeBuilder, IContainer targetContainer, IBuildConfiguration buildConfiguration) { //molecule amount always in amount var moleculeAmount = _objectBaseFactory.Create() @@ -62,7 +76,11 @@ public IMoleculeAmount MapFrom(IMoleculeBuilder moleculeBuilder, IBuildConfigura //map parameters. Only parameters having BuildMode="Local" will //be added to the molecule amount. Global/Property-Parameters //will be filled in elsewhere (by the GlobalProperties-Mapper) - moleculeAmount.AddChildren(_parameterMapper.MapLocalFrom(moleculeBuilder, buildConfiguration)); + var allLocalParameters = moleculeBuilder.Parameters + .Where(x => x.BuildMode == ParameterBuildMode.Local) + .Where(x => x.ContainerCriteria?.IsSatisfiedBy(targetContainer) ?? true); + + allLocalParameters.Each(x => moleculeAmount.Add(_parameterMapper.MapFrom(x, buildConfiguration))); _keywordReplacerTask.ReplaceIn(moleculeAmount); return moleculeAmount; @@ -85,7 +103,7 @@ private void createMoleculeAmountDefaultFormula(IMoleculeBuilder moleculeBuilder //create a start value parameter that will be referenced in the molecule formula var startValueParameter = _parameterFactory.CreateStartValueParameter(moleculeAmount, modelFormula, moleculeBuilder.DisplayUnit); - buildConfiguration.AddBuilderReference(startValueParameter,moleculeBuilder); + buildConfiguration.AddBuilderReference(startValueParameter, moleculeBuilder); moleculeAmount.Add(startValueParameter); moleculeAmount.Formula = _formulaFactory.CreateMoleculeAmountReferenceToStartValue(startValueParameter); } diff --git a/src/OSPSuite.Core/Domain/Mappers/ParameterBuilderToParameterMapper.cs b/src/OSPSuite.Core/Domain/Mappers/ParameterBuilderToParameterMapper.cs index b60549c60..ed55ec6e4 100644 --- a/src/OSPSuite.Core/Domain/Mappers/ParameterBuilderToParameterMapper.cs +++ b/src/OSPSuite.Core/Domain/Mappers/ParameterBuilderToParameterMapper.cs @@ -19,6 +19,8 @@ public ParameterBuilderToParameterMapper(ICloneManagerForModel cloneManagerForMo public IParameter MapFrom(IParameter parameterBuilder, IBuildConfiguration buildConfiguration) { var parameter = _cloneManagerForModel.Clone(parameterBuilder); + //We reset the container criteria explicitly in the model instance + parameter.ContainerCriteria = null; buildConfiguration.AddBuilderReference(parameter, parameterBuilder); return parameter; } diff --git a/src/OSPSuite.Core/Domain/Parameter.cs b/src/OSPSuite.Core/Domain/Parameter.cs index c54cf41d3..0f6afd1a9 100644 --- a/src/OSPSuite.Core/Domain/Parameter.cs +++ b/src/OSPSuite.Core/Domain/Parameter.cs @@ -1,4 +1,5 @@ using OSPSuite.Assets; +using OSPSuite.Core.Domain.Descriptors; using OSPSuite.Core.Domain.Formulas; using OSPSuite.Core.Domain.Services; using OSPSuite.Core.Maths.Random; @@ -92,6 +93,11 @@ public interface IParameter : IQuantity, IWithDefaultState /// Sets the RHS Formula to NULL. This is required for R-Only in order to be able to set the RHS formula to NULL /// void ClearRHSFormula(); + + /// + /// Criteria for containers where parameter should be created. This is only useful in builder and is not used in parameter instances + /// + DescriptorCriteria ContainerCriteria { set; get; } } public class Parameter : Quantity, IParameter @@ -102,6 +108,8 @@ public class Parameter : Quantity, IParameter public virtual ParameterOrigin Origin { get; private set; } public virtual double? DefaultValue { get; set; } + public DescriptorCriteria ContainerCriteria { set; get; } + /// public bool IsDefault { get; set; } @@ -136,6 +144,7 @@ public override void UpdatePropertiesFrom(IUpdatable source, ICloneManager clone Origin = sourceParameter.Origin.Clone(); DefaultValue = sourceParameter.DefaultValue; IsDefault = sourceParameter.IsDefault; + ContainerCriteria = sourceParameter.ContainerCriteria?.Clone(); } public double RandomDeviateIn(RandomGenerator randomGenerator, double? min = null, double? max = null) diff --git a/src/OSPSuite.Core/Domain/Reaction.cs b/src/OSPSuite.Core/Domain/Reaction.cs index 654279d96..ab32f96a2 100644 --- a/src/OSPSuite.Core/Domain/Reaction.cs +++ b/src/OSPSuite.Core/Domain/Reaction.cs @@ -50,9 +50,9 @@ public interface IReaction : IProcess public class Reaction : Process, IReaction { - private readonly IList _educts; - private readonly IList _products; - private readonly IList _modifier; + private readonly List _educts; + private readonly List _products; + private readonly List _modifier; public Reaction() { @@ -63,10 +63,7 @@ public Reaction() Icon = IconNames.REACTION; } - public IEnumerable Educts - { - get { return _educts; } - } + public IEnumerable Educts => _educts; public void AddModifier(string modifierName) { @@ -77,29 +74,17 @@ public void AddModifier(string modifierName) /// Adds the educt to the reactions educt list. /// /// The new educt. - public void AddEduct(IReactionPartner newEduct) - { - _educts.Add(newEduct); - } + public void AddEduct(IReactionPartner newEduct) => _educts.Add(newEduct); - public IEnumerable Products - { - get { return _products; } - } + public IEnumerable Products => _products; - public IEnumerable ModifierNames - { - get { return _modifier; } - } + public IEnumerable ModifierNames => _modifier; /// /// Adds the product to the reactions product list. /// /// The new product. - public void AddProduct(IReactionPartner newProduct) - { - _products.Add(newProduct); - } + public void AddProduct(IReactionPartner newProduct) => _products.Add(newProduct); public override bool Uses(IMoleculeAmount amount) { diff --git a/src/OSPSuite.Core/Domain/Services/ModelConstructor.cs b/src/OSPSuite.Core/Domain/Services/ModelConstructor.cs index 8d2e015fa..874e52019 100644 --- a/src/OSPSuite.Core/Domain/Services/ModelConstructor.cs +++ b/src/OSPSuite.Core/Domain/Services/ModelConstructor.cs @@ -113,7 +113,7 @@ private void finalizeModel(IModel model) //now we should be able to resolve all references _referencesResolver.ResolveReferencesIn(model); - + //This should be done after reference were resolved to ensure that we do not remove formula parameter that could not be evaluated removeUndefinedLocalMoleculeParametersIn(model); @@ -359,7 +359,7 @@ private IEnumerable createMoleculeAmounts(IContainer root, IB var presentMolecules = allPresentMoleculesInContainers(root, buildConfiguration).ToList(); var moleculesWithPhysicalContainers = presentMolecules.Where(containerIsPhysical); - moleculesWithPhysicalContainers.Each(pm => addMoleculeToContainer(buildConfiguration, pm, molecules[pm.MoleculeStartValue.MoleculeName])); + moleculesWithPhysicalContainers.Each(x => addMoleculeToContainer(buildConfiguration, x.Container, molecules[x.MoleculeStartValue.MoleculeName])); return new MoleculeBuildingBlockValidator().Validate(molecules).Messages .Concat(createValidationMessagesForPresentMolecules(presentMolecules, buildConfiguration.MoleculeStartValues)); @@ -370,10 +370,9 @@ private static bool containerIsPhysical(StartValueAndContainer startValueAndCont return startValueAndContainer.Container != null && startValueAndContainer.Container.Mode == ContainerMode.Physical; } - private void addMoleculeToContainer(IBuildConfiguration buildConfiguration, StartValueAndContainer startValueAndContainer, - IMoleculeBuilder moleculeBuilder) + private void addMoleculeToContainer(IBuildConfiguration buildConfiguration, IContainer container, IMoleculeBuilder moleculeBuilder) { - startValueAndContainer.Container.Add(_moleculeMapper.MapFrom(moleculeBuilder, buildConfiguration)); + container.Add(_moleculeMapper.MapFrom(moleculeBuilder, container, buildConfiguration)); } private IEnumerable createValidationMessagesForPresentMolecules(List presentMolecules, diff --git a/src/OSPSuite.Core/Domain/TimeParameter.cs b/src/OSPSuite.Core/Domain/TimeParameter.cs index 05edd31ab..0b52bdbad 100644 --- a/src/OSPSuite.Core/Domain/TimeParameter.cs +++ b/src/OSPSuite.Core/Domain/TimeParameter.cs @@ -27,6 +27,7 @@ internal class TimeParameter : IParameter public bool MaxIsAllowed { get; set; } public bool CanBeVariedInPopulation { get; set; } public bool IsDefault { get; set; } + public DescriptorCriteria ContainerCriteria { get; set; } public ParameterInfo Info { get; set; } public PKSimBuildingBlockType BuildingBlockType { get; set; } @@ -52,6 +53,7 @@ public void ClearRHSFormula() //nothing to do } + public string ValueDescription { get; set; } diff --git a/src/OSPSuite.Core/Serialization/Xml/QuantityAndContainerXmlSerializer.cs b/src/OSPSuite.Core/Serialization/Xml/QuantityAndContainerXmlSerializer.cs index 23ce11b71..09836720b 100644 --- a/src/OSPSuite.Core/Serialization/Xml/QuantityAndContainerXmlSerializer.cs +++ b/src/OSPSuite.Core/Serialization/Xml/QuantityAndContainerXmlSerializer.cs @@ -1,5 +1,4 @@ using OSPSuite.Core.Domain; -using OSPSuite.Serializer; namespace OSPSuite.Core.Serialization.Xml { @@ -8,7 +7,7 @@ public abstract class QuantityAndContainerXmlSerializer : QuantityXmlSerializ public override void PerformMapping() { //it is necessary to load children first before processing to further deserialization - //for instance, percentile parameter is a child of the distributedParmaeter which needs to be available before setting the isfixedvalue + //for instance, percentile parameter is a child of the distributedParameter which needs to be available before setting the isfixedvalue MapEnumerable(x => x.Children, x => x.Add); base.PerformMapping(); Map(x => x.Mode); @@ -24,7 +23,7 @@ public override void PerformMapping() } } - public abstract class DistributedParameterXmlSerializerBase : QuantityAndContainerXmlSerializer where TDistributedParamter : IDistributedParameter + public abstract class DistributedParameterXmlSerializerBase : QuantityAndContainerXmlSerializer where TDistributedParameter : IDistributedParameter { public override void PerformMapping() { @@ -32,6 +31,7 @@ public override void PerformMapping() Map(x => x.BuildMode); Map(x => x.Info); Map(x => x.IsDefault); + Map(x => x.ContainerCriteria); MapReference(x => x.RHSFormula); //no need to save origin, or default value for core parameter are those values are only used in PK-Sim diff --git a/src/OSPSuite.Core/Serialization/Xml/QuantityXmlSerializer.cs b/src/OSPSuite.Core/Serialization/Xml/QuantityXmlSerializer.cs index 98e11f20d..be8d3e0fb 100644 --- a/src/OSPSuite.Core/Serialization/Xml/QuantityXmlSerializer.cs +++ b/src/OSPSuite.Core/Serialization/Xml/QuantityXmlSerializer.cs @@ -103,8 +103,10 @@ public override void PerformMapping() Map(x => x.BuildMode); Map(x => x.Info); Map(x => x.IsDefault); + Map(x => x.ContainerCriteria); MapReference(x => x.RHSFormula); + //no need to save origin, or default value for core parameter are those values are only used in PK-Sim } } diff --git a/tests/OSPSuite.Core.IntegrationTests/ModelConstructorIntegrationTests.cs b/tests/OSPSuite.Core.IntegrationTests/ModelConstructorIntegrationTests.cs index ac18cba29..478d615b7 100644 --- a/tests/OSPSuite.Core.IntegrationTests/ModelConstructorIntegrationTests.cs +++ b/tests/OSPSuite.Core.IntegrationTests/ModelConstructorIntegrationTests.cs @@ -3,13 +3,13 @@ using OSPSuite.Assets; using OSPSuite.BDDHelper; using OSPSuite.BDDHelper.Extensions; -using OSPSuite.Utility.Container; -using OSPSuite.Utility.Extensions; using OSPSuite.Core.Domain; using OSPSuite.Core.Domain.Builder; using OSPSuite.Core.Domain.Formulas; using OSPSuite.Core.Domain.Services; using OSPSuite.Helpers; +using OSPSuite.Utility.Container; +using OSPSuite.Utility.Extensions; using IContainer = OSPSuite.Core.Domain.IContainer; namespace OSPSuite.Core @@ -21,6 +21,7 @@ public abstract class concern_for_ModelConstructor : ContextForIntegration("C"); moleculeContainer.ContainsName(observerName).ShouldBeTrue(); - } - [Observation] public void bolus_application_should_only_take_place_in_arterial_blood_plasma() { @@ -286,7 +284,7 @@ public void should_have_created_a_help_parameter_for_the_molecule_A_under_lung_p } [Observation] - public void should_have_created_a_help_parameter_for_the_molecule_A_under_boneg_plasma_with_the_value_20() + public void should_have_created_a_help_parameter_for_the_molecule_A_under_bone_plasma_with_the_value_20() { var lungPlasmaA = _model.ModelOrganCompartmentMolecule(ConstantsForSpecs.Bone, ConstantsForSpecs.Plasma, "A"); var parameterHelp = lungPlasmaA.GetSingleChildByName("HelpMe"); @@ -294,6 +292,17 @@ public void should_have_created_a_help_parameter_for_the_molecule_A_under_boneg_ parameterHelp.Value.ShouldBeEqualTo(20); } + [Observation] + public void should_have_created_a_parameter_with_criteria_in_plasma_but_not_in_cells() + { + var bone_plasma_D = _model.ModelOrganCompartmentMolecule(ConstantsForSpecs.Bone, ConstantsForSpecs.Plasma, "A"); + var localWithCriteria = bone_plasma_D.Parameter("LocalWithCriteria"); + localWithCriteria.ShouldNotBeNull(); + var bone_cells_D = _model.ModelOrganCompartmentMolecule(ConstantsForSpecs.Bone, ConstantsForSpecs.Cell, "A"); + localWithCriteria = bone_cells_D.Parameter("LocalWithCriteria"); + localWithCriteria.ShouldBeNull(); + } + [Observation] public void should_not_have_created_a_help_parameter_for_the_molecule_B_under_lung_plasma() { @@ -406,8 +415,7 @@ public void should_have_update_the_scale_factor() bone_cell_E.ScaleDivisor.ShouldBeEqualTo(2.5); } - - [Observation] + [Observation] public void should_have_removed_local_molecule_parameters_with_a_NAN_value() { var bone_cell_E = _model.ModelOrganCompartmentMolecule(ConstantsForSpecs.Bone, ConstantsForSpecs.Cell, "E"); @@ -422,7 +430,6 @@ public void should_have_not_removed_global_nan_parameters() global_container.Parameter("GlobalNaNParam").ShouldNotBeNull(); } - [Observation] public void should_have_added_the_local_transporter_process_parameters_in_the_local_transporter_process_container() { @@ -550,5 +557,4 @@ public void should_not_be_able_to_create_the_model() _result.ValidationResult.Messages.ElementAt(0).Text.ShouldBeEqualTo(Validation.ModelNameCannotBeNamedLikeATopContainer(_model.Root.GetChildren().AllNames())); } } - } \ No newline at end of file diff --git a/tests/OSPSuite.Core.Tests/Mappers/MoleculeBuilderToMoleculeAmountMapperSpecs.cs b/tests/OSPSuite.Core.Tests/Mappers/MoleculeBuilderToMoleculeAmountMapperSpecs.cs index 692de5555..5df99873f 100644 --- a/tests/OSPSuite.Core.Tests/Mappers/MoleculeBuilderToMoleculeAmountMapperSpecs.cs +++ b/tests/OSPSuite.Core.Tests/Mappers/MoleculeBuilderToMoleculeAmountMapperSpecs.cs @@ -3,10 +3,12 @@ using OSPSuite.BDDHelper.Extensions; using OSPSuite.Core.Domain; using OSPSuite.Core.Domain.Builder; +using OSPSuite.Core.Domain.Descriptors; using OSPSuite.Core.Domain.Formulas; using OSPSuite.Core.Domain.Mappers; using OSPSuite.Core.Domain.Services; using OSPSuite.Core.Domain.UnitSystem; +using OSPSuite.Helpers; namespace OSPSuite.Core.Mappers { @@ -14,7 +16,7 @@ public abstract class concern_for_MoleculeBuilderToMoleculeAmountMapper : Contex { protected IFormulaBuilderToFormulaMapper _formulaMapper; protected IObjectBaseFactory _objectBaseFactory; - protected IParameterBuilderCollectionToParameterCollectionMapper _parameterMapper; + protected IParameterBuilderToParameterMapper _parameterMapper; protected IKeywordReplacerTask _keywordReplacerTask; protected IFormulaFactory _formulaFactory; protected IDimensionFactory _dimensionFactory; @@ -24,13 +26,13 @@ protected override void Context() { _objectBaseFactory = A.Fake(); _formulaMapper = A.Fake(); - _parameterMapper = A.Fake(); + _parameterMapper = A.Fake(); _keywordReplacerTask = A.Fake(); _formulaFactory = A.Fake(); _dimensionFactory = A.Fake(); _parameterFactory = A.Fake(); sut = new MoleculeBuilderToMoleculeAmountMapper(_objectBaseFactory, _formulaMapper, _parameterMapper, _dimensionFactory, - _keywordReplacerTask, _formulaFactory, _parameterFactory); + _keywordReplacerTask, _formulaFactory, _parameterFactory); } } @@ -41,27 +43,47 @@ public class When_mapping_a_molecule_builder_to_a_molecule_amount : concern_for_ private IFormula _mappedFormula; private IParameter _para1; private IParameter _para2; + private IParameter _para3; private IBuildConfiguration _buildConfiguration; private IDimension _amountDimension; + private IContainer _targetContainer; + private IParameter _parameterBuilder1; + private IParameter _parameterBuilder2; + private IParameter _parameterBuilder3; protected override void Context() { base.Context(); _amountDimension = A.Fake(); + _targetContainer = new Container().WithName("TOTO"); A.CallTo(() => _amountDimension.Name).Returns(Constants.Dimension.MOLAR_AMOUNT); - _moleculeBuilder = A.Fake().WithName("tralala").WithDimension(_amountDimension); + _moleculeBuilder = new MoleculeBuilder().WithName("tralala").WithDimension(_amountDimension); + _parameterBuilder1 = DomainHelperForSpecs.ConstantParameterWithValue(1).WithName("P1").WithMode(ParameterBuildMode.Local); + _parameterBuilder2 = DomainHelperForSpecs.ConstantParameterWithValue(1).WithName("P2").WithMode(ParameterBuildMode.Local); + _parameterBuilder3 = DomainHelperForSpecs.ConstantParameterWithValue(1).WithName("P3").WithMode(ParameterBuildMode.Local); + + _parameterBuilder2.ContainerCriteria = Create.Criteria(x => x.With("TOTO")); + _parameterBuilder3.ContainerCriteria = Create.Criteria(x => x.With("TATA")); + + _moleculeBuilder.AddParameter(_parameterBuilder1); + _moleculeBuilder.AddParameter(_parameterBuilder2); + _moleculeBuilder.AddParameter(_parameterBuilder3); _mappedFormula = A.Fake(); _buildConfiguration = A.Fake(); - _para1 = A.Fake(); - _para2 = A.Fake(); + _para1 = new Parameter().WithName("P1"); + _para2 = new Parameter().WithName("P2"); + _para3 = new Parameter().WithName("P3"); + A.CallTo(() => _objectBaseFactory.Create()).Returns(new MoleculeAmount()); A.CallTo(() => _dimensionFactory.Dimension(Constants.Dimension.MOLAR_AMOUNT)).Returns(_amountDimension); A.CallTo(() => _formulaMapper.MapFrom(_moleculeBuilder.DefaultStartFormula, _buildConfiguration)).Returns(_mappedFormula); - A.CallTo(() => _parameterMapper.MapLocalFrom(_moleculeBuilder, _buildConfiguration)).Returns(new[] {_para1, _para2}); + A.CallTo(() => _parameterMapper.MapFrom(_parameterBuilder1, _buildConfiguration)).Returns(_para1); + A.CallTo(() => _parameterMapper.MapFrom(_parameterBuilder2, _buildConfiguration)).Returns(_para2); + A.CallTo(() => _parameterMapper.MapFrom(_parameterBuilder3, _buildConfiguration)).Returns(_para3); } protected override void Because() { - _moleculeAmount = sut.MapFrom(_moleculeBuilder, _buildConfiguration); + _moleculeAmount = sut.MapFrom(_moleculeBuilder, _targetContainer, _buildConfiguration); } [Observation] @@ -77,10 +99,10 @@ public void should_return_a_molecule_whose_name_was_set_to_the_name_of_the_build } [Observation] - public void should_have_created_all_the_local_parameters_for_the_molecule() + public void should_have_created_all_the_local_parameters_for_the_molecule_matching_the_criteria() { - A.CallTo(() => _moleculeAmount.Add(_para1)).MustHaveHappened(); - A.CallTo(() => _moleculeAmount.Add(_para2)).MustHaveHappened(); + _moleculeAmount.Children.ShouldContain(_para1, _para2); + _moleculeAmount.Children.ShouldNotContain(_para3); } [Observation] @@ -104,19 +126,21 @@ public class When_mapping_a_molecule_builder_using_concentration_to_a_molecule_a private IBuildConfiguration _buildConfiguration; private IDimension _concentrationDimension; private IFormula _startValueReferenceFormula; + private IContainer _targetContainer; protected override void Context() { base.Context(); + _targetContainer = new Container(); _concentrationDimension = A.Fake(); - _startValueReferenceFormula= A.Fake(); + _startValueReferenceFormula = A.Fake(); A.CallTo(() => _concentrationDimension.Name).Returns(Constants.Dimension.MOLAR_CONCENTRATION); _moleculeBuilder = A.Fake().WithDimension(_concentrationDimension); - _moleculeBuilder.DisplayUnit= A.Fake(); + _moleculeBuilder.DisplayUnit = A.Fake(); _mappedFormula = A.Fake(); _buildConfiguration = A.Fake(); A.CallTo(() => _formulaMapper.MapFrom(_moleculeBuilder.DefaultStartFormula, _buildConfiguration)).Returns(_mappedFormula); - A.CallTo(() => _objectBaseFactory.Create()).ReturnsLazily(()=>new MoleculeAmount()); + A.CallTo(() => _objectBaseFactory.Create()).ReturnsLazily(() => new MoleculeAmount()); var startValueParameter = new Parameter().WithName(Constants.Parameters.START_VALUE); A.CallTo(() => _parameterFactory.CreateStartValueParameter(A._, _mappedFormula, _moleculeBuilder.DisplayUnit)).Returns(startValueParameter); A.CallTo(() => _formulaFactory.CreateMoleculeAmountReferenceToStartValue(startValueParameter)).Returns(_startValueReferenceFormula); @@ -124,7 +148,7 @@ protected override void Context() protected override void Because() { - _moleculeAmount = sut.MapFrom(_moleculeBuilder, _buildConfiguration); + _moleculeAmount = sut.MapFrom(_moleculeBuilder, _targetContainer, _buildConfiguration); } [Observation] diff --git a/tests/OSPSuite.HelpersForTests/ModelHelperForSpecs.cs b/tests/OSPSuite.HelpersForTests/ModelHelperForSpecs.cs index b29c413a8..f3dd2c522 100644 --- a/tests/OSPSuite.HelpersForTests/ModelHelperForSpecs.cs +++ b/tests/OSPSuite.HelpersForTests/ModelHelperForSpecs.cs @@ -319,6 +319,13 @@ private IMoleculeBuilder createMoleculeA(IFormulaCache formulaCache) var oneGlobalParameter = newConstantParameter("oneGlobalParameter", 33).WithMode(ParameterBuildMode.Global); moleculeA.AddParameter(oneGlobalParameter); moleculeA.AddParameter(newConstantParameter(Constants.Parameters.MOL_WEIGHT, 250).WithMode(ParameterBuildMode.Global)); + + var localParameterWithCriteria = newConstantParameter("LocalWithCriteria", 0).WithMode(ParameterBuildMode.Local); + //Create a local parameter that should only be defined in Plasma + localParameterWithCriteria.ContainerCriteria = Create.Criteria(x => x.With(ConstantsForSpecs.Plasma)); + moleculeA.AddParameter(localParameterWithCriteria); + + moleculeA.AddUsedCalculationMethod(new UsedCalculationMethod("PartitionCoeff", "CM1")); var transporter1 = _objectBaseFactory.Create().WithName("D"); transporter1.TransportName = "My Transport1"; @@ -438,6 +445,7 @@ private IMoleculeBuilder createMoleculeD(IFormulaCache formulaCache) moleculeD.AddParameter(relExpNorm); moleculeD.AddParameter(relExpGlobal); moleculeD.AddParameter(relExpLocalFromGlobal); + return moleculeD; }