public void AddItemDefinition_Valid_ElseThenClauseUnSkipsItem() { var rule = new ItemSkippingRule <object>("1", "Rule"); var itemDefinition = new ItemDefinition(new CodedConcept(new CodeSystem("1", "1", "Test"), "1", "Test"), ItemType.Question, null) { ItemMetadata = new ItemMetadata { MetadataItems = new List <IMetadataItem> { new RequiredForCompletenessMetadataItem("Report") } } }; rule.AddItemDefinitionToSkip(itemDefinition); var itemInstance = new ItemInstance("1", "Test", true); var assessmentInstance = Substitute.For <AssessmentInstance>(); assessmentInstance.AssessmentName.Returns("Test"); var skippingContext = new SkippingContext(); var context = new RuleEngineContext <AssessmentInstance>(assessmentInstance); context.WorkingMemory.AddContextObject(itemInstance, itemInstance.ItemDefinitionCode); context.WorkingMemory.AddContextObject(skippingContext); rule.ElseThenClauses.First().Invoke(context); CollectionAssert.Contains(skippingContext.UnSkippedItemDefinitions, itemDefinition); }
private void Apply(ItemUpdatedEvent itemUpdatedEvent) { var itemInstance = ItemInstances.FirstOrDefault(ii => ii.ItemDefinitionCode == itemUpdatedEvent.ItemDefinitionCode); var isNull = itemUpdatedEvent.Value == null || string.IsNullOrEmpty(itemUpdatedEvent.Value.ToString()); if (itemInstance != null && isNull) { _itemInstances.Remove(itemInstance); } if (itemInstance == null) { itemInstance = new ItemInstance(itemUpdatedEvent.ItemDefinitionCode, itemUpdatedEvent.Value, itemUpdatedEvent.IsRequired); if (!isNull) { _itemInstances.Add(itemInstance); } } else { itemInstance.Apply(itemUpdatedEvent); } var skippingContext = new SkippingContext(); if (_cachedRuleEngineExecutor == null) { var assessmentRuleCollectionFactory = new AssessmentRuleCollectionFactory(); _cachedRuleEngineExecutor = new RuleEngineExecutor <AssessmentInstance> ( this, assessmentRuleCollectionFactory.CreateRuleCollection(this.AssessmentName)); } _cachedRuleEngineExecutor .ForRuleSet("ItemUpdatedRuleSet" + itemInstance.ItemDefinitionCode) .WithContext(itemInstance, itemInstance.ItemDefinitionCode) .WithContext(skippingContext) .Execute(); skippingContext.SkippedItemDefinitions.ForEach( item => { if (item.GetIsRequired() && !_skippedItemDefinitions.Contains(item)) { _skippedItemDefinitions.Add(item); } if (ItemInstances.Any(i => i.ItemDefinitionCode == item.CodedConcept.Code)) { UpdateItem(item, null); } }); skippingContext.UnSkippedItemDefinitions.ForEach(item => _skippedItemDefinitions.Remove(item)); }
private bool CheckSkip(TestAssessmentRuleCollection assessmentRuleCollection, IItemSkippingRule rule, ItemInstance itemInstance) { var ruleEngine = new RuleEngine <AssessmentInstance>(assessmentRuleCollection, new RuleProcessor()); var assessmentInstance = Substitute.For <AssessmentInstance>(); var ruleEngineContext = new RuleEngineContext <AssessmentInstance>( assessmentInstance, new SingleRuleSelector(rule)); var skippingContext = new SkippingContext(); ruleEngineContext .WorkingMemory .AddContextObject(itemInstance, itemInstance.ItemDefinitionCode); ruleEngineContext.WorkingMemory.AddContextObject(skippingContext); ruleEngine.ExecuteRules(ruleEngineContext); return(skippingContext.SkippedItemDefinitions.Any( )); }