protected override void Context()
        {
            base.Context();

            _observerCriteria = Create.Criteria(x => x.With("Organism"));

            _obs1 = A.Fake <IContainerObserverBuilder>();
            _obs1.MoleculeList.ForAll = true;
            _obs1.ContainerCriteria   = _observerCriteria;
            _obs2 = A.Fake <IContainerObserverBuilder>();
            _obs2.MoleculeList.ForAll = false;
            A.CallTo(() => _obs2.MoleculeList.MoleculeNames).Returns(new List <string> {
                _molecule2
            });
            _obs2.ContainerCriteria = _observerCriteria;

            _molecule2Amount = new MoleculeAmount().WithName(_molecule2);
            _molecule1Amount = new MoleculeAmount().WithName(_molecule1);
            _organism.Add(_molecule2Amount);
            _organism.Add(_molecule1Amount);
            _observerBuildingBlock.Add(_obs1);
            _observerBuildingBlock.Add(_obs2);
            A.CallTo(() => _observerMapper.MapFrom(_obs1, _buildConfiguration)).Returns(A.Fake <IObserver>().WithName("obs1"));
            A.CallTo(() => _observerMapper.MapFrom(_obs2, _buildConfiguration)).Returns(A.Fake <IObserver>().WithName("obs2"));
            A.CallTo(() => _containerTask.CreateOrRetrieveSubContainerByName(_organism, _molecule1)).Returns(_molecule1Amount);
            A.CallTo(() => _containerTask.CreateOrRetrieveSubContainerByName(_organism, _molecule2)).Returns(_molecule2Amount);
        }
Пример #2
0
        /// <summary>
        ///    Creates (molecule-specific) observers, stored under
        ///    molecule container of the corresponding molecule in the spatial structure
        ///    of the model.
        ///    Typical example is average drug concentration in an organ
        /// </summary>
        private void createContainerObserver(IContainerObserverBuilder observerBuilder, IModel model, IEnumerable <IMoleculeBuilder> presentMolecules)
        {
            var moleculeBuildersForObserver = moleculeBuildersValidFor(observerBuilder.MoleculeList, presentMolecules).ToList();

            //retrieve a list here to avoid endless loop if observers criteria is not well defined
            foreach (var container in _allContainers.Where(observerBuilder.ContainerCriteria.IsSatisfiedBy).ToList())
            {
                foreach (var moleculeBuilder in moleculeBuildersForObserver)
                {
                    //get the molecule container defined for the molecule name
                    var moleculeContainer = container.GetSingleChildByName <IContainer>(moleculeBuilder.Name);
                    if (moleculeContainer == null)
                    {
                        //should only happen for a logical container.
                        moleculeContainer = _containerTask.CreateOrRetrieveSubContainerByName(container, moleculeBuilder.Name).WithContainerType(ContainerType.Molecule);
                        _buildConfiguration.AddBuilderReference(moleculeContainer, observerBuilder);
                    }
                    var observer = addObserverInContainer(observerBuilder, moleculeContainer, moleculeBuilder.QuantityType);
                    _keywordReplacerTask.ReplaceIn(observer, model.Root, moleculeBuilder.Name);
                }
            }
        }