private IExecutionStrategy CreateExecutionStrategy(ExecutionStrategyType type)
        {
            IExecutionStrategy executionStrategy;

            switch (type)
            {
            case ExecutionStrategyType.CompileExecuteAndCheck:
                executionStrategy = new CompileExecuteAndCheckExecutionStrategy(GetCompilerPath);
                break;

            case ExecutionStrategyType.CSharpTestRunner:
                executionStrategy = new CSharpTestRunnerExecutionStrategy(GetCompilerPath);
                break;

            case ExecutionStrategyType.CSharpUnitTestsExecutionStrategy:
                executionStrategy = new CSharpUnitTestsRunnerExecutionStrategy(Settings.NUnitConsoleRunnerPath);
                break;

            case ExecutionStrategyType.CSharpProjectTestsExecutionStrategy:
                executionStrategy = new CSharpProjectTestsExecutionStrategy(Settings.NUnitConsoleRunnerPath);
                break;

            case ExecutionStrategyType.JavaPreprocessCompileExecuteAndCheck:
                executionStrategy = new JavaPreprocessCompileExecuteAndCheckExecutionStrategy(
                    Settings.JavaExecutablePath,
                    GetCompilerPath);
                break;

            case ExecutionStrategyType.JavaZipFileCompileExecuteAndCheck:
                executionStrategy = new JavaZipFileCompileExecuteAndCheckExecutionStrategy(
                    Settings.JavaExecutablePath,
                    GetCompilerPath);
                break;

            case ExecutionStrategyType.JavaProjectTestsExecutionStrategy:
                executionStrategy = new JavaProjectTestsExecutionStrategy(
                    Settings.JavaExecutablePath,
                    GetCompilerPath,
                    Settings.JavaLibsPath);
                break;

            case ExecutionStrategyType.NodeJsPreprocessExecuteAndCheck:
                executionStrategy = new NodeJsPreprocessExecuteAndCheckExecutionStrategy(
                    Settings.NodeJsExecutablePath,
                    Settings.UnderscoreModulePath,
                    Settings.NodeJsBaseTimeUsedInMilliseconds,
                    Settings.NodeJsBaseMemoryUsedInBytes);
                break;

            case ExecutionStrategyType.NodeJsPreprocessExecuteAndRunUnitTestsWithMocha:
                executionStrategy = new NodeJsPreprocessExecuteAndRunUnitTestsWithMochaExecutionStrategy(
                    Settings.NodeJsExecutablePath,
                    Settings.MochaModulePath,
                    Settings.ChaiModulePath,
                    Settings.UnderscoreModulePath,
                    Settings.NodeJsBaseTimeUsedInMilliseconds,
                    Settings.NodeJsBaseMemoryUsedInBytes);
                break;

            case ExecutionStrategyType.NodeJsZipPreprocessExecuteAndRunUnitTestsWithDomAndMocha:
                executionStrategy = new NodeJsZipPreprocessExecuteAndRunUnitTestsWithDomAndMochaExecutionStrategy(
                    Settings.NodeJsExecutablePath,
                    Settings.MochaModulePath,
                    Settings.ChaiModulePath,
                    Settings.JsDomModulePath,
                    Settings.JQueryModulePath,
                    Settings.HandlebarsModulePath,
                    Settings.SinonModulePath,
                    Settings.SinonChaiModulePath,
                    Settings.UnderscoreModulePath,
                    Settings.BrowserifyModulePath,
                    Settings.BabelifyModulePath,
                    Settings.Es2015ImportPluginPath,
                    Settings.NodeJsBaseTimeUsedInMilliseconds,
                    Settings.NodeJsBaseMemoryUsedInBytes);
                break;

            case ExecutionStrategyType.NodeJsPreprocessExecuteAndRunJsDomUnitTests:
                executionStrategy = new NodeJsPreprocessExecuteAndRunJsDomUnitTestsExecutionStrategy(
                    Settings.NodeJsExecutablePath,
                    Settings.MochaModulePath,
                    Settings.ChaiModulePath,
                    Settings.JsDomModulePath,
                    Settings.JQueryModulePath,
                    Settings.HandlebarsModulePath,
                    Settings.SinonModulePath,
                    Settings.SinonChaiModulePath,
                    Settings.UnderscoreModulePath,
                    Settings.NodeJsBaseTimeUsedInMilliseconds,
                    Settings.NodeJsBaseMemoryUsedInBytes);
                break;

            case ExecutionStrategyType.NodeJsPreprocessExecuteAndRunCodeAgainstUnitTestsWithMochaExecutionStrategy:
                executionStrategy = new NodeJsPreprocessExecuteAndRunCodeAgainstUnitTestsWithMochaExecutionStrategy(
                    Settings.NodeJsExecutablePath,
                    Settings.MochaModulePath,
                    Settings.ChaiModulePath,
                    Settings.JsDomModulePath,
                    Settings.JQueryModulePath,
                    Settings.HandlebarsModulePath,
                    Settings.SinonModulePath,
                    Settings.SinonChaiModulePath,
                    Settings.UnderscoreModulePath,
                    Settings.NodeJsBaseTimeUsedInMilliseconds,
                    Settings.NodeJsBaseMemoryUsedInBytes);
                break;

            case ExecutionStrategyType.NodeJsExecuteAndRunAsyncJsDomTestsWithReactExecutionStrategy:
                executionStrategy = new NodeJsExecuteAndRunAsyncJsDomTestsWithReactExecutionStrategy(
                    Settings.NodeJsExecutablePath,
                    Settings.MochaModulePath,
                    Settings.ChaiModulePath,
                    Settings.JsDomModulePath,
                    Settings.JQueryModulePath,
                    Settings.HandlebarsModulePath,
                    Settings.SinonJsDomModulePath,
                    Settings.SinonModulePath,
                    Settings.SinonChaiModulePath,
                    Settings.UnderscoreModulePath,
                    Settings.BabelCoreModulePath,
                    Settings.ReactJsxPluginPath,
                    Settings.ReactModulePath,
                    Settings.ReactDomModulePath,
                    Settings.NodeJsBaseTimeUsedInMilliseconds,
                    Settings.NodeJsBaseMemoryUsedInBytes);
                break;

            case ExecutionStrategyType.NodeJsZipExecuteHtmlAndCssStrategy:
                executionStrategy = new NodeJsZipExecuteHtmlAndCssStrategy(
                    Settings.NodeJsExecutablePath,
                    Settings.MochaModulePath,
                    Settings.ChaiModulePath,
                    Settings.JsDomModulePath,
                    Settings.JQueryModulePath,
                    Settings.UnderscoreModulePath,
                    Settings.BootstrapModulePath,
                    Settings.BootstrapCssPath,
                    Settings.NodeJsBaseTimeUsedInMilliseconds,
                    Settings.NodeJsBaseMemoryUsedInBytes);
                break;

            case ExecutionStrategyType.PythonExecuteAndCheck:
                executionStrategy = new PythonExecuteAndCheckExecutionStrategy(Settings.PythonExecutablePath);
                break;

            case ExecutionStrategyType.PhpCgiExecuteAndCheck:
                executionStrategy = new PhpCgiExecuteAndCheckExecutionStrategy(Settings.PhpCgiExecutablePath);
                break;

            case ExecutionStrategyType.PhpCliExecuteAndCheck:
                executionStrategy = new PhpCliExecuteAndCheckExecutionStrategy(Settings.PhpCliExecutablePath);
                break;

            case ExecutionStrategyType.SqlServerLocalDbPrepareDatabaseAndRunQueries:
                executionStrategy = new SqlServerLocalDbPrepareDatabaseAndRunQueriesExecutionStrategy(
                    Settings.SqlServerLocalDbMasterDbConnectionString,
                    Settings.SqlServerLocalDbRestrictedUserId,
                    Settings.SqlServerLocalDbRestrictedUserPassword);
                break;

            case ExecutionStrategyType.SqlServerLocalDbRunQueriesAndCheckDatabase:
                executionStrategy = new SqlServerLocalDbRunQueriesAndCheckDatabaseExecutionStrategy(
                    Settings.SqlServerLocalDbMasterDbConnectionString,
                    Settings.SqlServerLocalDbRestrictedUserId,
                    Settings.SqlServerLocalDbRestrictedUserPassword);
                break;

            case ExecutionStrategyType.SqlServerLocalDbRunSkeletonRunQueriesAndCheckDatabase:
                executionStrategy = new SqlServerLocalDbRunSkeletonRunQueriesAndCheckDatabaseExecutionStrategy(
                    Settings.SqlServerLocalDbMasterDbConnectionString,
                    Settings.SqlServerLocalDbRestrictedUserId,
                    Settings.SqlServerLocalDbRestrictedUserPassword);
                break;

            case ExecutionStrategyType.MySqlPrepareDatabaseAndRunQueries:
                executionStrategy = new MySqlPrepareDatabaseAndRunQueriesExecutionStrategy(
                    Settings.MySqlSysDbConnectionString,
                    Settings.MySqlRestrictedUserId,
                    Settings.MySqlRestrictedUserPassword);
                break;

            case ExecutionStrategyType.MySqlRunQueriesAndCheckDatabase:
                executionStrategy = new MySqlRunQueriesAndCheckDatabaseExecutionStrategy(
                    Settings.MySqlSysDbConnectionString,
                    Settings.MySqlRestrictedUserId,
                    Settings.MySqlRestrictedUserPassword);
                break;

            case ExecutionStrategyType.MySqlRunSkeletonRunQueriesAndCheckDatabase:
                executionStrategy = new MySqlRunSkeletonRunQueriesAndCheckDatabaseExecutionStrategy(
                    Settings.MySqlSysDbConnectionString,
                    Settings.MySqlRestrictedUserId,
                    Settings.MySqlRestrictedUserPassword);
                break;

            case ExecutionStrategyType.DoNothing:
                executionStrategy = new DoNothingExecutionStrategy();
                break;

            case ExecutionStrategyType.RemoteExecution:
                executionStrategy = new RemoteExecutionStrategy();
                break;

            case ExecutionStrategyType.CheckOnly:
                executionStrategy = new CheckOnlyExecutionStrategy();
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            return(executionStrategy);
        }