public void Battle(BattleTestCase testCase) { TestCaseFactory.SaveToDisk(testCase); RobotSpecification[] robots = _robocode.GetLocalRepository(testCase.AllRobotsCsv); var battle = new BattleSpecification( testCase.NumberOfRounds, testCase.BattlefieldSpecification, robots); _battleErrorEvents.Clear(); _battleCompletedEvent = null; using (_wait = new AutoResetEvent(false)) { _robocode.RunBattle(battle, false); _wait.WaitOne(testCase.TimeOut); } bool finished = _battleCompletedEvent != null; var adapter = new BattleResultAdapter(); var outcomes = adapter.RecordOutcomes( testCase, finished ? _battleCompletedEvent.SortedResults : null, _battleErrorEvents.Select(e => e.Error), finished); TestCaseFactory.AddResult(outcomes); TestCaseFactory.ForgetAnyUnfinishedBusiness(); var grouped = outcomes.GroupBy(o => o.OutcomeType).ToDictionary(g => g.Key); if (grouped.ContainsKey(OutcomeType.Lost)) { var robotsThatBeatMe = grouped[OutcomeType.Lost]; Assert.Fail("Lost to: " + robotsThatBeatMe.Select(e => e.EnemyName).Aggregate((n1, n2) => n1 + ", " + n2)); } else if (grouped.ContainsKey(OutcomeType.Won)) { var robotsThatIBeat = grouped[OutcomeType.Won]; Console.WriteLine("Beat: " + robotsThatIBeat.Select(e => e.EnemyName).Aggregate((n1, n2) => n1 + ", " + n2)); } else { Assert.Inconclusive(); } }