PageRenderTime 47ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/src/NUnit/util/DefaultTestRunnerFactory.cs

#
C# | 82 lines | 53 code | 11 blank | 18 comment | 11 complexity | 914c9f89e0151b63f8b8ad966ae5e006 MD5 | raw file
Possible License(s): GPL-2.0
  1. // ****************************************************************
  2. // Copyright 2010, Charlie Poole
  3. // This is free software licensed under the NUnit license. You may
  4. // obtain a copy of the license at http://nunit.org
  5. // ****************************************************************
  6. using System;
  7. using NUnit.Core;
  8. namespace NUnit.Util
  9. {
  10. /// <summary>
  11. /// DefaultTestRunnerFactory handles creation of a suitable test
  12. /// runner for a given package to be loaded and run either in a
  13. /// separate process or within the same process.
  14. /// </summary>
  15. public class DefaultTestRunnerFactory : InProcessTestRunnerFactory, ITestRunnerFactory
  16. {
  17. private RuntimeFrameworkSelector selector = new RuntimeFrameworkSelector();
  18. /// <summary>
  19. /// Returns a test runner based on the settings in a TestPackage.
  20. /// Any setting that is "consumed" by the factory is removed, so
  21. /// that downstream runners using the factory will not repeatedly
  22. /// create the same type of runner.
  23. /// </summary>
  24. /// <param name="package">The TestPackage to be loaded and run</param>
  25. /// <returns>A TestRunner</returns>
  26. public override TestRunner MakeTestRunner(TestPackage package)
  27. {
  28. ProcessModel processModel = GetTargetProcessModel(package);
  29. switch (processModel)
  30. {
  31. case ProcessModel.Multiple:
  32. package.Settings.Remove("ProcessModel");
  33. return new MultipleTestProcessRunner();
  34. case ProcessModel.Separate:
  35. package.Settings.Remove("ProcessModel");
  36. return new ProcessRunner();
  37. default:
  38. return base.MakeTestRunner(package);
  39. }
  40. }
  41. public override bool CanReuse(TestRunner runner, TestPackage package)
  42. {
  43. RuntimeFramework currentFramework = RuntimeFramework.CurrentFramework;
  44. RuntimeFramework targetFramework = selector.SelectRuntimeFramework(package);
  45. ProcessModel processModel = (ProcessModel)package.GetSetting("ProcessModel", ProcessModel.Default);
  46. if (processModel == ProcessModel.Default)
  47. if (!targetFramework.Matches(currentFramework))
  48. processModel = ProcessModel.Separate;
  49. switch (processModel)
  50. {
  51. case ProcessModel.Multiple:
  52. return runner is MultipleTestProcessRunner;
  53. case ProcessModel.Separate:
  54. ProcessRunner processRunner = runner as ProcessRunner;
  55. return processRunner != null && processRunner.RuntimeFramework == targetFramework;
  56. default:
  57. return base.CanReuse(runner, package);
  58. }
  59. }
  60. private ProcessModel GetTargetProcessModel(TestPackage package)
  61. {
  62. RuntimeFramework currentFramework = RuntimeFramework.CurrentFramework;
  63. RuntimeFramework targetFramework = selector.SelectRuntimeFramework(package);
  64. ProcessModel processModel = (ProcessModel)package.GetSetting("ProcessModel", ProcessModel.Default);
  65. if (processModel == ProcessModel.Default)
  66. if (!targetFramework.Matches(currentFramework))
  67. processModel = ProcessModel.Separate;
  68. return processModel;
  69. }
  70. }
  71. }