public void RepeatTaskTest(TaskInfo repeatChildTask, TaskInputInfo input, int iterations, int expectedIterations, TaskEngineEvent <TaskInfo> childTaskCallback = null, Action pass = null) { Assert.DoesNotThrow(() => { BeginTest(TestEnv0, 4); }); ExpressionInfo setToZero = ExpressionInfo.Val(PrimitiveContract.Create(0)); ExpressionInfo add = ExpressionInfo.Add( ExpressionInfo.Val(input), ExpressionInfo.Val(PrimitiveContract.Create(1))); ExpressionInfo lessThanValue = ExpressionInfo.Lt( ExpressionInfo.Val(input), ExpressionInfo.Val(PrimitiveContract.Create(iterations))); TaskInfo setToZeroTask = new TaskInfo { TaskType = TaskType.EvalExpression, OutputsCount = 1, Expression = setToZero, }; input.OutputTask = setToZeroTask; ExpressionInfo increment = ExpressionInfo.Assign(setToZeroTask, add); TaskInfo incrementTask = new TaskInfo { TaskType = TaskType.EvalExpression, Expression = increment, OutputsCount = 1, Inputs = new[] { input }, }; TaskInfo repeatTask = new TaskInfo(); repeatTask.TaskType = TaskType.Repeat; repeatTask.Expression = lessThanValue; repeatTask.Children = new[] { repeatChildTask, incrementTask }; TaskInfo task = new TaskInfo { TaskType = TaskType.Sequence, Children = new[] { setToZeroTask, repeatTask } }; task.SetParents(); const int playerId = 1; task.Initialize(playerId); // //input.SetScope(); bool isIncremented = false; BeginCleanupCheck(playerId); FinializeTest(playerId, task, result => { Assert.IsTrue(isIncremented); Assert.AreEqual(TaskState.Completed, result.State); Assert.IsFalse(result.IsFailed); CleanupCheck(playerId); if (pass != null) { pass(); } Assert.Pass(); }, childTask => { if (childTask.TaskId == repeatTask.TaskId && childTask.State == TaskState.Completed) { ITaskMemory memory = m_engine.GetTaskEngine(playerId).Memory; Assert.AreEqual(expectedIterations, memory.ReadOutput(setToZeroTask.Parent.TaskId, setToZeroTask.TaskId, 0)); isIncremented = true; } else { if (childTaskCallback != null) { childTaskCallback(childTask); } } }); }