public void Solve_should_solve_solvable_problem() { var action1 = new ActionMock("action 1"); var action2 = new ActionMock("action 2"); var initialState = new StateMock("initial state"); var state1 = new StateMock("state 1"); var state2 = new StateMock("state 2"); var problem = A.Fake <ISearchProblem <StateMock, ActionMock> >(); A.CallTo(() => problem.InitialState).Returns(initialState); A.CallTo(() => problem.GetActions(initialState)).Returns(new [] { action1 }); A.CallTo(() => problem.DoAction(initialState, action1)).Returns(state1); A.CallTo(() => problem.GetActions(state1)).Returns(new [] { action2 }); A.CallTo(() => problem.DoAction(state1, action2)).Returns(state2); A.CallTo(() => problem.IsGoal(state2)).Returns(true); var bfs = new BreadthFirstSearch <StateMock, ActionMock>(problem); bfs.Solve(); Assert.IsTrue(bfs.IsFinished); Assert.IsTrue(bfs.IsSolved); var solution = bfs.GetSolutionTo(state2).ToList(); Assert.AreEqual(new[] { action1, action2 }, solution); }