/// <summary>
        /// Reads the configuration setup.
        /// </summary>
        /// <param name="project">The project.</param>
        /// <param name="nUnitParameters">The n unit parameters.</param>
        /// <returns></returns>
        public DistributedConfigurationSetup ReadConfigurationSetup(TestProject project, NUnitParameters nUnitParameters)
        {
            var result = new DistributedConfigurationSetup();

            var distributedConfigurationFileNames = GetDistributedConfigurationFileNames(project, nUnitParameters);

            foreach (var distributedConfigurationFileName in distributedConfigurationFileNames)
            {
                if (string.IsNullOrEmpty(distributedConfigurationFileName))
                    continue;
                FillSetupInstance(distributedConfigurationFileName, result);
            }
            return result;
        }
        /// <summary>
        /// Gets the substituted configuration file.
        /// </summary>
        /// <param name="project">The project.</param>
        /// <param name="nUnitParameters">The n unit parameters.</param>
        /// <param name="configurationSubstitutions">The configuration substitutions.</param>
        /// <returns></returns>
        public string GetSubstitutedConfigurationFile(TestProject project, NUnitParameters nUnitParameters, DistributedConfigurationSubstitutions configurationSubstitutions)
        {
            var distributedConfigurationFileNames = GetDistributedConfigurationFileNames(project, nUnitParameters);

            if (configurationSubstitutions == null || configurationSubstitutions.Variables.Count == 0)
                return distributedConfigurationFileNames.FirstOrDefault();

            string finalConfigurationFile = null;
            int hashCode = configurationSubstitutions.GetHashCode();
            foreach (var configurationFileName in distributedConfigurationFileNames)
            {
                var configurationDocument = XDocument.Load(configurationFileName);
                SubstitutePlaceHolders(configurationDocument, configurationSubstitutions);
                var substitutedFileName = Path.ChangeExtension(configurationFileName,
                                     string.Format(".{0}.config", hashCode));
                configurationDocument.Save(substitutedFileName);

                if (finalConfigurationFile == null)
                    finalConfigurationFile = substitutedFileName;
            }

            return finalConfigurationFile;
        }
 /// <summary>
 /// Initializes a new instance
 /// </summary>
 public ClientParameters()
 {
     NUnitParameters = new NUnitParameters();
     UnknownOptions = new List<ConsoleOption>();
     TimeoutPeriod = TimeSpan.FromHours(10);
 }
        private IEnumerable<string> GetDistributedConfigurationFileNames(TestProject project, NUnitParameters nUnitParameters)
        {
            if (nUnitParameters.AssembliesToTest.Count == 1)
            {
                var localName = Path.Combine(project.Path, Path.GetFileName(nUnitParameters.AssembliesToTest[0]));
                if (NUnitProject.IsNUnitProjectFile(localName) &&
                    File.Exists(localName))
                {
                    var nUnitProject = new NUnitProject(localName);
                    nUnitProject.Load();
                    var matchingConfig = nUnitProject.Configs.Cast<ProjectConfig>().Where(c => c.Name.Equals(nUnitParameters.Configuration)).FirstOrDefault();

                    if (matchingConfig == null)
                    {
                        var configFileNamedAsProject = Path.ChangeExtension(localName, ".config");
                        if (File.Exists(configFileNamedAsProject))
                            yield return configFileNamedAsProject;
                        yield break;
                    }

                    yield return matchingConfig.ConfigurationFilePath;
                    yield break;
                }
            }

            foreach (var assembly in nUnitParameters.AssembliesToTest)
            {
                var localName = Path.Combine(project.Path, Path.GetFileName(assembly));
                string possibleConfigName = null;
                if (File.Exists(possibleConfigName = localName + ".config"))
                    yield return possibleConfigName;
                else if (File.Exists(possibleConfigName = Path.ChangeExtension(localName, ".config")))
                    yield return possibleConfigName;
            }
        }
        private TestPackage GetTestPackage(string projectFileName, NUnitParameters nUnitParameters)
        {
            if (!NUnitProject.IsNUnitProjectFile(projectFileName))
                return new TestPackage(projectFileName);

            var nunitProject = new NUnitProject(projectFileName);
            nunitProject.Load();
            if (!string.IsNullOrEmpty(nUnitParameters.Configuration))
                nunitProject.SetActiveConfig(nUnitParameters.Configuration);

            return nunitProject.ActiveConfig.MakeTestPackage();
        }