private IResult EvaluateNode(ITreeNode parent) { IResult result = new Result { Type = ResultType.Pass }; foreach (var node in parent.Children) { result = node.Evaluate(result); TreeOutputList.Items.Add($"{node} Rolling Result: {result.Type}"); if (node.Outcome.Type == ResultType.Pass) { if (node.Children.Any()) { result = EvaluateNode(node); //if my children evaulated to Pass and I'm an OR, bubble up to the nearest AND ancestor if (result.Type == ResultType.Pass && node.LogicType == LogicType.Or) { break; } } else { //if I have no children and I'm an OR bubble up to the nearest ancestor if (node.LogicType == LogicType.Or) { break; } } } } return(result); }
private void EvaluateNodes() { TreeOutputList.Items.Clear(); var data = NodeData.GetNodes(); foreach (var node in data) { IResult result = new Result { Type = ResultType.Pass }; result = node.Evaluate(result); //TreeOutputList.Items.Add($"{node} Rolling Result: {result.Type}"); if (result.Type == ResultType.Pass && node.Children.Any()) { result = EvaluateNode(node); } TreeOutputList.Items.Add($"{node} Rolling Result: {result.Type}"); } }