public void Add(TestResult result)
 {
     results.Add(result);
 }
        /// <summary>
        /// A background worker, used to run testing on a background thread.
        /// </summary>
        protected override void OnDoWork(DoWorkEventArgs e)
        {
            base.OnDoWork(e);

            // Assign a random start position
            Coord2 startPos;
            do
            {
                startPos.X = rand.Next(0, LevelHandler.Level.Map.GridSize);
                startPos.Y = rand.Next(0, LevelHandler.Level.Map.GridSize);
            } while (!LevelHandler.Level.Map.ValidPosition(startPos));

            // Find the possible spawn points
            List<Coord2> possibleTargets = new List<Coord2>();
            Coord2 topLeft = new Coord2(startPos.X - config.PathDistance, startPos.Y - config.PathDistance);
            for(int x = 0; x < (config.PathDistance*2); x++)
            {
                possibleTargets.Add(new Coord2(topLeft.X + x, topLeft.Y));
                possibleTargets.Add(new Coord2(topLeft.X + x, topLeft.Y + (config.PathDistance*2)));
            }
            for(int y = 0; y < (config.PathDistance*2); y++)
            {
                possibleTargets.Add(new Coord2(topLeft.X, topLeft.Y + y));
                possibleTargets.Add(new Coord2(topLeft.X + (config.PathDistance*2), topLeft.Y + y));
            }

            for (int i = 0; i < config.NumberOfTestRuns; i++)
            {
                if (!CheckCancellation())
                {
                    // Find a random position
                    Coord2 targetPos = possibleTargets[rand.Next(0, possibleTargets.Count)];

                    // Run test on the loaded level
                    TestResult result = new TestResult();
                    do
                    {
                        result = LevelHandler.RunTest(config.Algorithm, startPos, possibleTargets);
                    } while (result.Failed == true); // If the result reported a failure, run it again

                    // Add the result
                    results.Add(result);

                    // Report the thread's current progress
                    ReportProgress((int)(((float)100 / (float)config.NumberOfTestRuns) * (i + 1)), new TestProgress(i + 1, config.NumberOfTestRuns,
                        new TimeSpan(results.AverageTicksForPath)));
                }
                else
                {
                    results.Cancel();
                    break;
                }
            }
        }