public RunListener(IConsole console, IOutput output, TimingRunListener timer)
 {
     _console = console;
     _timer   = timer;
     _output  = output;
     _summary = new FailedSpecificationsSummary(new VerboseOutput(console), console);
 }
示例#2
0
        public TeamCityReporter(Action <string> writer, TimingRunListener listener)
        {
            this.writer = new TeamCityServiceMessageWriter(writer);

            timingListener  = listener;
            failureOccurred = false;
        }
 public XmlReportGenerator(string path,
                           Dictionary <AssemblyInfo, List <ContextInfo> > contextsByAssembly,
                           Dictionary <ContextInfo, List <SpecificationInfo> > specificationsByContext,
                           Dictionary <SpecificationInfo, Result> resultsBySpecification,
                           TimingRunListener timer,
                           bool showTimeInfo)
 {
     _path = path;
     _contextsByAssembly      = contextsByAssembly;
     _specificationsByContext = specificationsByContext;
     _resultsBySpecification  = resultsBySpecification;
     _timer        = timer;
     _showTimeInfo = showTimeInfo;
 }
 public XmlReportGenerator(string path,
                           Dictionary<AssemblyInfo, List<ContextInfo>> contextsByAssembly,
                           Dictionary<ContextInfo, List<SpecificationInfo>> specificationsByContext,
                           Dictionary<SpecificationInfo, Result> resultsBySpecification,
                           TimingRunListener timer,
                           bool showTimeInfo)
 {
   _path = path;
   _contextsByAssembly = contextsByAssembly;
   _specificationsByContext = specificationsByContext;
   _resultsBySpecification = resultsBySpecification;
   _timer = timer;
   _showTimeInfo = showTimeInfo;
 }
示例#5
0
    public ExitCode Run(string[] arguments)
    {
      ExceptionReporter reporter = new ExceptionReporter(_console);

      Options options = new Options();
      if (!options.ParseArguments(arguments))
      {
        _console.WriteLine(Options.Usage());
        return ExitCode.Failure;
      }

      var timer = new TimingRunListener();
      var listeners = new List<ISpecificationRunListener>
                      {
                        timer
                      };

      ISpecificationRunListener mainListener;
      if (options.TeamCityIntegration ||
          (!options.DisableTeamCityAutodetection &&
           Environment.GetEnvironmentVariable("TEAMCITY_PROJECT_NAME") != null))
      {
        mainListener = new TeamCityReporter(_console.WriteLine, timer);
      }
      else
      {
        mainListener = new RunListener(_console, DetermineOutput(options, _console), timer);
      }

      try
      {

        if (!String.IsNullOrEmpty(options.HtmlPath))
        {
          if (IsHtmlPathValid(options.HtmlPath))
          {
            listeners.Add(GetHtmlReportListener(options));
          }
          else
          {
            _console.WriteLine("Invalid html path: {0}", options.HtmlPath);
            _console.WriteLine(Options.Usage());
            return ExitCode.Failure;
          }

        }

        if (!String.IsNullOrEmpty(options.XmlPath))
        {
          if (IsHtmlPathValid(options.XmlPath))
          {
            listeners.Add(GetXmlReportListener(options, timer));
          }
          else
          {
            _console.WriteLine("Invalid xml path: {0}", options.XmlPath);
            _console.WriteLine(Options.Usage());
            return ExitCode.Failure;
          }
        }

        listeners.Add(mainListener);

        if (options.AssemblyFiles.Count == 0)
        {
          _console.WriteLine(Options.Usage());
          return ExitCode.Failure;
        }

        var listener = new AggregateRunListener(listeners);

        ISpecificationRunner specificationRunner = new AppDomainRunner(listener, options.GetRunOptions());
        List<Assembly> assemblies = new List<Assembly>();
        foreach (string assemblyName in options.AssemblyFiles)
        {
          if (!File.Exists(assemblyName))
          {
            throw NewException.MissingAssembly(assemblyName);
          }

          var excludedAssemblies = new[] { "Machine.Specifications.dll", "Machine.Specifications.Clr4.dll" };
          if (excludedAssemblies.Any(x => Path.GetFileName(assemblyName) == x))
          {
            _console.WriteLine("Warning: Excluded {0} from the test run because the file name matches either of these: {1}", assemblyName, String.Join(", ", excludedAssemblies));
            continue;
          }

          Assembly assembly = Assembly.LoadFrom(assemblyName);
          assemblies.Add(assembly);
        }

        if (options.WaitForDebugger)
        {
          WaitForDebugger();
          if (Debugger.IsAttached == false)
          {
            _console.WriteLine("Fatal error: Timeout while waiting for debugger to attach");
            return ExitCode.Failure;
          }
        }

        specificationRunner.RunAssemblies(assemblies);
      }
      catch (Exception ex)
      {
        reporter.ReportException(ex);
        return ExitCode.Error;
      }

      if (mainListener is ISpecificationResultProvider)
      {
        var errorProvider = (ISpecificationResultProvider)mainListener;
        if (errorProvider.FailureOccurred)
        {
          return ExitCode.Failure;
        }
      }
      return ExitCode.Success;
    }
 public RunListener(IConsole console, bool silent, TimingRunListener listener)
 {
   _console = console;
   _silent = silent;
 }
示例#7
0
 public GenerateXmlReportListener(string xmlPath, TimingRunListener timer, bool showTimeInfo)
 {
     _xmlPath      = xmlPath;
     _showTimeInfo = showTimeInfo;
     _timer        = timer;
 }
        public ExitCode Run(string[] arguments)
        {
            ExceptionReporter reporter = new ExceptionReporter(_console);

            Options options = new Options();

            if (!options.ParseArguments(arguments))
            {
                _console.WriteLine(Options.Usage());
                return(ExitCode.Failure);
            }

            var timer     = new TimingRunListener();
            var listeners = new List <ISpecificationRunListener>
            {
                timer
            };

            ISpecificationRunListener mainListener;

            if (options.TeamCityIntegration ||
                (!options.DisableTeamCityAutodetection &&
                 Environment.GetEnvironmentVariable("TEAMCITY_PROJECT_NAME") != null))
            {
                mainListener = new TeamCityReporter(_console.WriteLine, timer);
            }
            else
            {
                mainListener = new RunListener(_console, DetermineOutput(options, _console), timer);
            }

            try
            {
                if (!String.IsNullOrEmpty(options.HtmlPath))
                {
                    if (IsHtmlPathValid(options.HtmlPath))
                    {
                        listeners.Add(GetHtmlReportListener(options));
                    }
                    else
                    {
                        _console.WriteLine("Invalid html path: {0}", options.HtmlPath);
                        _console.WriteLine(Options.Usage());
                        return(ExitCode.Failure);
                    }
                }

                if (!String.IsNullOrEmpty(options.XmlPath))
                {
                    if (IsHtmlPathValid(options.XmlPath))
                    {
                        listeners.Add(GetXmlReportListener(options, timer));
                    }
                    else
                    {
                        _console.WriteLine("Invalid xml path: {0}", options.XmlPath);
                        _console.WriteLine(Options.Usage());
                        return(ExitCode.Failure);
                    }
                }

                listeners.Add(mainListener);

                if (options.AssemblyFiles.Count == 0)
                {
                    _console.WriteLine(Options.Usage());
                    return(ExitCode.Failure);
                }

                var listener = new AggregateRunListener(listeners);

                ISpecificationRunner specificationRunner = new AppDomainRunner(listener, options.GetRunOptions());
                List <Assembly>      assemblies          = new List <Assembly>();
                foreach (string assemblyName in options.AssemblyFiles)
                {
                    if (!File.Exists(assemblyName))
                    {
                        throw NewException.MissingAssembly(assemblyName);
                    }

                    var excludedAssemblies = new[] { "Machine.Specifications.dll", "Machine.Specifications.Clr4.dll" };
                    if (excludedAssemblies.Any(x => Path.GetFileName(assemblyName) == x))
                    {
                        _console.WriteLine("Warning: Excluded {0} from the test run because the file name matches either of these: {1}", assemblyName, String.Join(", ", excludedAssemblies));
                        continue;
                    }

                    Assembly assembly = Assembly.LoadFrom(assemblyName);
                    assemblies.Add(assembly);
                }

                if (options.WaitForDebugger)
                {
                    WaitForDebugger();
                    if (Debugger.IsAttached == false)
                    {
                        _console.WriteLine("Fatal error: Timeout while waiting for debugger to attach");
                        return(ExitCode.Failure);
                    }
                }

                specificationRunner.RunAssemblies(assemblies);
            }
            catch (Exception ex)
            {
                reporter.ReportException(ex);
                return(ExitCode.Error);
            }

            if (mainListener is ISpecificationResultProvider)
            {
                var errorProvider = (ISpecificationResultProvider)mainListener;
                if (errorProvider.FailureOccurred)
                {
                    return(ExitCode.Failure);
                }
            }
            return(ExitCode.Success);
        }
 public RunListener(IConsole console, bool silent, TimingRunListener timer)
 {
   _console = console;
   _silent = silent;
   _timer = timer;
 }
    public ExitCode Run(string[] arguments)
    {
      ExceptionReporter reporter = new ExceptionReporter(_console);

      Options options = new Options();
      if (!options.ParseArguments(arguments))
      {
        _console.WriteLine(Options.Usage());
        return ExitCode.Failure;
      }

      List<ISpecificationRunListener> listeners = new List<ISpecificationRunListener>();

      var timingListener = new TimingRunListener();
      listeners.Add(timingListener);
      listeners.Add(new AssemblyLocationAwareListener());

      ISpecificationRunListener mainListener;
      if (options.TeamCityIntegration)
      {
        mainListener = new TeamCityReporter(_console.WriteLine, timingListener);
      }
      else
      {
        mainListener = new RunListener(_console, options.Silent, timingListener);
      }

      try
      {

        if (!String.IsNullOrEmpty(options.HtmlPath))
        {
          if (IsHtmlPathValid(options.HtmlPath))
          {
            listeners.Add(GetHtmlReportListener(options));
          }
          else
          {
            _console.WriteLine("Invalid html path:" + options.HtmlPath);
            _console.WriteLine(Options.Usage());
            return ExitCode.Failure;
          }

        }

        if (!String.IsNullOrEmpty(options.XmlPath))
        {
          if (IsHtmlPathValid(options.XmlPath))
          {
            listeners.Add(GetXmlReportListener(options, timingListener));
          }
          else
          {
            _console.WriteLine("Invalid xml path:" + options.XmlPath);
            _console.WriteLine(Options.Usage());
            return ExitCode.Failure;
          }
        }

        listeners.Add(mainListener);

        if (options.AssemblyFiles.Count == 0)
        {
          _console.WriteLine(Options.Usage());
          return ExitCode.Failure;
        }

        var listener = new AggregateRunListener(listeners);

        ISpecificationRunner specificationRunner = new AppDomainRunner(listener, options.GetRunOptions());
        List<Assembly> assemblies = new List<Assembly>();
        foreach (string assemblyName in options.AssemblyFiles)
        {
          if (!File.Exists(assemblyName))
          {
            throw NewException.MissingAssembly(assemblyName);
          }

          Assembly assembly = Assembly.LoadFrom(assemblyName);
          assemblies.Add(assembly);
        }

        specificationRunner.RunAssemblies(assemblies);
      }
      catch (Exception ex)
      {
        reporter.ReportException(ex);
        return ExitCode.Error;
      }

      if (mainListener is ISpecificationResultProvider)
      {
        var errorProvider = (ISpecificationResultProvider)mainListener;
        if (errorProvider.FailureOccurred)
        {
          return ExitCode.Failure;
        }
      }
      return ExitCode.Success;
    }
    //string _failures;

    public TeamCityReporter(Action<string> writer, TimingRunListener listener)
    {
      _timingListener = listener;
      _failureOccured = false;
      _writer = new TeamCityServiceMessageWriter(writer);
    }
 public JUnitReportGenerator(string path, Dictionary<AssemblyInfo, List<ContextInfo>> contextsByAssembly, Dictionary<ContextInfo, List<SpecificationInfo>> specificationsByContext, Dictionary<SpecificationInfo, Result> resultsBySpecification, TimingRunListener timer, bool showTimeInfo)
     : base(path, contextsByAssembly, specificationsByContext, resultsBySpecification, timer, showTimeInfo)
 {
 }
    private static ISpecificationRunListener GetXmlReportListener(Options options, TimingRunListener timer)
    {
      var listener = new GenerateXmlReportListener(options.XmlPath, timer, options.ShowTimeInformation);

      return listener;
    }
示例#14
0
 public RunListener(IConsole console, bool silent, TimingRunListener timer)
 {
     _console = console;
     _silent  = silent;
     _timer   = timer;
 }
        private static ISpecificationRunListener GetXmlReportListener(Options options, TimingRunListener timer)
        {
            var listener = new GenerateXmlReportListener(options.XmlPath, timer, options.ShowTimeInformation);

            return(listener);
        }
示例#16
0
        public ExitCode Run(string[] arguments)
        {
            ExceptionReporter reporter = new ExceptionReporter(_console);

            Options options = new Options();

            if (!options.ParseArguments(arguments))
            {
                _console.WriteLine(Options.Usage());
                return(ExitCode.Failure);
            }

            List <ISpecificationRunListener> listeners = new List <ISpecificationRunListener>();

            var timingListener = new TimingRunListener();

            listeners.Add(timingListener);
            listeners.Add(new AssemblyLocationAwareListener());

            ISpecificationRunListener mainListener;

            if (options.TeamCityIntegration)
            {
                mainListener = new TeamCityReporter(_console.WriteLine, timingListener);
            }
            else
            {
                mainListener = new RunListener(_console, options.Silent, timingListener);
            }

            try
            {
                if (!String.IsNullOrEmpty(options.HtmlPath))
                {
                    if (IsHtmlPathValid(options.HtmlPath))
                    {
                        listeners.Add(GetHtmlReportListener(options));
                    }
                    else
                    {
                        _console.WriteLine("Invalid html path:" + options.HtmlPath);
                        _console.WriteLine(Options.Usage());
                        return(ExitCode.Failure);
                    }
                }

                if (!String.IsNullOrEmpty(options.XmlPath))
                {
                    if (IsHtmlPathValid(options.XmlPath))
                    {
                        listeners.Add(GetXmlReportListener(options, timingListener));
                    }
                    else
                    {
                        _console.WriteLine("Invalid xml path:" + options.XmlPath);
                        _console.WriteLine(Options.Usage());
                        return(ExitCode.Failure);
                    }
                }

                listeners.Add(mainListener);

                if (options.AssemblyFiles.Count == 0)
                {
                    _console.WriteLine(Options.Usage());
                    return(ExitCode.Failure);
                }

                var listener = new AggregateRunListener(listeners);

                ISpecificationRunner specificationRunner = new AppDomainRunner(listener, options.GetRunOptions());
                List <Assembly>      assemblies          = new List <Assembly>();
                foreach (string assemblyName in options.AssemblyFiles)
                {
                    if (!File.Exists(assemblyName))
                    {
                        throw NewException.MissingAssembly(assemblyName);
                    }

                    Assembly assembly = Assembly.LoadFrom(assemblyName);
                    assemblies.Add(assembly);
                }

                specificationRunner.RunAssemblies(assemblies);
            }
            catch (Exception ex)
            {
                reporter.ReportException(ex);
                return(ExitCode.Error);
            }

            if (mainListener is ISpecificationResultProvider)
            {
                var errorProvider = (ISpecificationResultProvider)mainListener;
                if (errorProvider.FailureOccurred)
                {
                    return(ExitCode.Failure);
                }
            }
            return(ExitCode.Success);
        }
示例#17
0
    public ExitCode Run(string[] arguments)
    {
      ExceptionReporter reporter = new ExceptionReporter(_console);

      Options options = new Options();
      if (!options.ParseArguments(arguments))
      {
        _console.WriteLine(Options.Usage());
        return ExitCode.Failure;
      }

      List<ISpecificationRunListener> listeners = new List<ISpecificationRunListener>();

      var timingListener = new TimingRunListener();
      listeners.Add(timingListener);
      listeners.Add(new AssemblyLocationAwareListener());

      ISpecificationRunListener mainListener;
      if (options.TeamCityIntegration || Environment.GetEnvironmentVariable("TEAMCITY_PROJECT_NAME") != null)
      {
        mainListener = new TeamCityReporter(_console.WriteLine, timingListener);
      }
      else if(options.TerseOutput)
      {
          mainListener = new TerseSpecFormatter(Console.Write, timingListener);
      }
      else
      {
        mainListener = new RunListener(_console, options.Silent, timingListener);
      }

      try
      {

        if (!String.IsNullOrEmpty(options.HtmlPath))
        {
          if (IsHtmlPathValid(options.HtmlPath))
          {
            listeners.Add(GetHtmlReportListener(options));
          }
          else
          {
            _console.WriteLine("Invalid html path:" + options.HtmlPath);
            _console.WriteLine(Options.Usage());
            return ExitCode.Failure;
          }

        }

        if (!String.IsNullOrEmpty(options.XmlPath))
        {
          if (IsHtmlPathValid(options.XmlPath))
          {
            listeners.Add(GetXmlReportListener(options, timingListener));
          }
          else
          {
            _console.WriteLine("Invalid xml path:" + options.XmlPath);
            _console.WriteLine(Options.Usage());
            return ExitCode.Failure;
          }
        }

        listeners.Add(mainListener);

        if (options.AssemblyFiles.Count == 0)
        {
          _console.WriteLine(Options.Usage());
          return ExitCode.Failure;
        }

        var listener = new AggregateRunListener(listeners);

        ISpecificationRunner specificationRunner = new AppDomainRunner(listener, options.GetRunOptions());
        List<Assembly> assemblies = new List<Assembly>();
        foreach (string assemblyName in options.AssemblyFiles)
        {
          if (!File.Exists(assemblyName))
          {
            throw NewException.MissingAssembly(assemblyName);
          }

          Assembly assembly = Assembly.LoadFrom(assemblyName);
          assemblies.Add(assembly);
        }

        if (options.WaitForDebugger)
        {
          WaitForDebugger();
          if (Debugger.IsAttached == false)
          {
            _console.WriteLine("Fatal error: Timeout while waiting for debugger to attach");
            return ExitCode.Failure;
          }
        }

        specificationRunner.RunAssemblies(assemblies);
      }
      catch (Exception ex)
      {
        reporter.ReportException(ex);
        return ExitCode.Error;
      }

      if (mainListener is ISpecificationResultProvider)
      {
        var errorProvider = (ISpecificationResultProvider)mainListener;
        if (errorProvider.FailureOccurred)
        {
          return ExitCode.Failure;
        }
      }
      return ExitCode.Success;
    }
示例#18
0
 private bool SetupCustomListeners(Options options, List<ISpecificationRunListener> listeners, TimingRunListener timingListener)
 {
     return !SetupHtmlListener(options, listeners) ||
            !SetupXmlListener(options, listeners, timingListener) ||
            !SetupJUnitListener(options, listeners, timingListener);
 }
示例#19
0
 private bool SetupXmlListener(Options options, List<ISpecificationRunListener> listeners, TimingRunListener timingListener)
 {
     var path = options.XmlPath;
     Func<ISpecificationRunListener> generate = () => GetXmlReportListener(options, timingListener);
     return AddPathBasedListener(path, listeners, generate, "Invalid xml path: {0}");
 }
示例#20
0
 private bool SetupJUnitListener(Options options, List<ISpecificationRunListener> listeners, TimingRunListener timingListener)
 {
     var path = options.JUnitPath;
     Func<ISpecificationRunListener> generate = () => new GenerateJUnitReportListener(path, timingListener, options.ShowTimeInformation);
     return AddPathBasedListener(path, listeners, generate, "Invalid junit results path: {0}");
 }
        public ExitCode Run(string[] arguments)
        {
            ExceptionReporter reporter = new ExceptionReporter(_console);

            Options options = new Options();

            if (!options.ParseArguments(arguments))
            {
                _console.WriteLine(Options.Usage());
                return(ExitCode.Failure);
            }

            List <ISpecificationRunListener> listeners = new List <ISpecificationRunListener>();

            var timingListener = new TimingRunListener();

            listeners.Add(timingListener);
            listeners.Add(new AssemblyLocationAwareListener());

            ISpecificationRunListener mainListener;

            if (options.TeamCityIntegration ||
                (!options.DisableTeamCityAutodetection &&
                 Environment.GetEnvironmentVariable("TEAMCITY_PROJECT_NAME") != null))
            {
                mainListener = new TeamCityReporter(_console.WriteLine, timingListener);
            }
            else
            {
                mainListener = new RunListener(_console, options.Silent, timingListener);
            }

            try
            {
                if (!String.IsNullOrEmpty(options.HtmlPath))
                {
                    if (IsHtmlPathValid(options.HtmlPath))
                    {
                        listeners.Add(GetHtmlReportListener(options));
                    }
                    else
                    {
                        _console.WriteLine("Invalid html path:" + options.HtmlPath);
                        _console.WriteLine(Options.Usage());
                        return(ExitCode.Failure);
                    }
                }

                if (!String.IsNullOrEmpty(options.XmlPath))
                {
                    if (IsHtmlPathValid(options.XmlPath))
                    {
                        listeners.Add(GetXmlReportListener(options, timingListener));
                    }
                    else
                    {
                        _console.WriteLine("Invalid xml path:" + options.XmlPath);
                        _console.WriteLine(Options.Usage());
                        return(ExitCode.Failure);
                    }
                }

                listeners.Add(mainListener);

                if (options.AssemblyFiles.Count == 0)
                {
                    _console.WriteLine(Options.Usage());
                    return(ExitCode.Failure);
                }

                var listener = new AggregateRunListener(listeners);

                ISpecificationRunner specificationRunner = new AppDomainRunner(listener, options.GetRunOptions());
                List <Assembly>      assemblies          = new List <Assembly>();
                foreach (string assemblyName in options.AssemblyFiles)
                {
                    if (!File.Exists(assemblyName))
                    {
                        throw NewException.MissingAssembly(assemblyName);
                    }

                    Assembly assembly = Assembly.LoadFrom(assemblyName);
                    assemblies.Add(assembly);
                }

                if (options.WaitForDebugger)
                {
                    WaitForDebugger();
                    if (Debugger.IsAttached == false)
                    {
                        _console.WriteLine("Fatal error: Timeout while waiting for debugger to attach");
                        return(ExitCode.Failure);
                    }
                }

                specificationRunner.RunAssemblies(assemblies);
            }
            catch (Exception ex)
            {
                reporter.ReportException(ex);
                return(ExitCode.Error);
            }

            if (mainListener is ISpecificationResultProvider)
            {
                var errorProvider = (ISpecificationResultProvider)mainListener;
                if (errorProvider.FailureOccurred)
                {
                    return(ExitCode.Failure);
                }
            }
            return(ExitCode.Success);
        }
示例#22
0
    public ExitCode Run(string[] arguments)
    {
      ExceptionReporter reporter = new ExceptionReporter(_console);

      Options options = new Options();
      if (!options.ParseArguments(arguments))
      {
        _console.WriteLine(Resources.UsageStatement);
        return ExitCode.Failure;
      }

          ISpecificationRunListener mainListener = null;
      do
      {
          List<ISpecificationRunListener> listeners = new List<ISpecificationRunListener>();

          var timingListener = new TimingRunListener();
          listeners.Add(timingListener);

          if (options.TeamCityIntegration)
          {
              mainListener = new TeamCityReporter(_console.WriteLine, timingListener);
          }
          else
          {
              mainListener = new RunListener(_console, options.Silent, timingListener);
          }

          try
          {

              if (!String.IsNullOrEmpty(options.HtmlPath))
              {
                  if (IsHtmlPathValid(options.HtmlPath))
                  {
                      listeners.Add(GetHtmlReportListener(options));
                  }
                  else
                  {
                      _console.WriteLine("Invalid html path:" + options.HtmlPath);
                      _console.WriteLine(Resources.UsageStatement);
                      return ExitCode.Failure;
                  }

              }

              if (!String.IsNullOrEmpty(options.XmlPath))
              {
                  if (IsHtmlPathValid(options.XmlPath))
                  {
                      listeners.Add(GetXmlReportListener(options));
                  }
                  else
                  {
                      _console.WriteLine("Invalid xml path:" + options.XmlPath);
                      _console.WriteLine(Resources.UsageStatement);
                      return ExitCode.Failure;
                  }
              }

              listeners.Add(mainListener);

              if (options.AssemblyFiles.Count == 0)
              {
                  _console.WriteLine(Resources.UsageStatement);
                  return ExitCode.Failure;
              }

              _console.WriteLine("Files Count: {0} Name: {1}", options.AssemblyFiles.Count, options.AssemblyFiles.Count > 0?options.AssemblyFiles[options.AssemblyFiles.Count-1]:"none");
              bool runXap = options.AssemblyFiles.Count > 0 && options.AssemblyFiles[options.AssemblyFiles.Count-1].EndsWith(".xap", StringComparison.OrdinalIgnoreCase);

              if (!options.WcfListen && !runXap)
              {
                  listeners.Add(new AssemblyLocationAwareListener());
                  var listener = new AggregateRunListener(listeners);

                  ISpecificationRunner specificationRunner = new AppDomainRunner(listener, options.GetRunOptions());
                  List<Assembly> assemblies = new List<Assembly>();
                  foreach (string assemblyName in options.AssemblyFiles)
                  {
                      if (!File.Exists(assemblyName))
                      {
                          throw NewException.MissingAssembly(assemblyName);
                      }

                      Assembly assembly = Assembly.LoadFrom(assemblyName);
                      assemblies.Add(assembly);
                  }

                  specificationRunner.RunAssemblies(assemblies);
              }
              else
              {
                  var completionListener = new CompletionListener();
                  listeners.Add(completionListener);

                  var listener = new AggregateRunListener(listeners);

                  var proxy = new WcfRunnerProxy(listener);
                  ServiceHost host = null;
                  try
                  {
                      host = new ServiceHost(proxy);

                      host.AddServiceEndpoint(typeof(ISpecificationRunListener), new BasicHttpBinding(), new Uri("http://localhost:5931/MSpecListener"));

                      ((System.ServiceModel.Description.ServiceDebugBehavior)host.Description.Behaviors[typeof(System.ServiceModel.Description.ServiceDebugBehavior)]).IncludeExceptionDetailInFaults = true;

                      var smb = new System.ServiceModel.Description.ServiceMetadataBehavior();
                      smb.MetadataExporter.PolicyVersion = System.ServiceModel.Description.PolicyVersion.Policy15;
                      host.Description.Behaviors.Add(smb);

                      host.AddServiceEndpoint(typeof(System.ServiceModel.Description.IMetadataExchange),
                          System.ServiceModel.Description.MetadataExchangeBindings.CreateMexHttpBinding(), "http://localhost:5931/MSpecListener/MEX");

                      host.Open();

                      _console.WriteLine("=========================================================================");
                      _console.WriteLine("Waiting for test results via WCF at http://localhost:5931/MSpecListener");

                      if (runXap)
                      {
                          var xap = options.AssemblyFiles[options.AssemblyFiles.Count-1];
                          if (!File.Exists(xap))
                          {
                              throw NewException.MissingAssembly(xap);
                          }

                          var runner = new Wp7DeviceRunner(true);
                          runner.RunXap(xap);
                      }

                      completionListener.WaitForRunCompletion();
                      System.Threading.Thread.Sleep(1000);
                  }
                  finally
                  {
                      if (host != null && host.State != CommunicationState.Faulted)
                          host.Close();
                  }
              }
          }
          catch (Exception ex)
          {
              if (System.Diagnostics.Debugger.IsAttached)
                  System.Diagnostics.Debugger.Break();

              reporter.ReportException(ex);
              return ExitCode.Error;
          }
      } while (options.Loop);

      if (mainListener != null && mainListener is ISpecificationResultProvider)
      {
        var errorProvider = (ISpecificationResultProvider)mainListener;
        if (errorProvider.FailureOccured)
        {
          Console.WriteLine("Generic failure occurred, no idea what this is");
          return ExitCode.Failure;
        }
      }
      return ExitCode.Success;
    }