static void Main(string[] args)
        {
            var options = ArgumentsAndOptions.Parse(args);

            if (options == null)
            {
                PrintUsage(Console.Error);
                Environment.Exit(1);
            }

            var dotnet   = new DotNet(options.DotNetHome);
            var testRoot = new DirectoryInfo(options.TestRoot);

            if (!dotnet.IsValid)
            {
                Console.Error.WriteLine(dotnet + " does not look like a .NET Core home directory");
                PrintUsage(Console.Error);
                Environment.Exit(2);
            }

            var workingDirectory = new DirectoryInfo(
                Path.Combine(Directory.GetCurrentDirectory(), "dntr." + DateTimeOffset.Now.ToUnixTimeMilliseconds()));

            if (!workingDirectory.Exists)
            {
                workingDirectory.Create();
            }
            var reportFile = new FileInfo(Path.Combine(workingDirectory.FullName, "report.txt"));

            Console.WriteLine("Testing: " + dotnet);
            Console.WriteLine("Running tests at: " + testRoot);
            Console.WriteLine("Working directory: " + workingDirectory);
            Console.WriteLine("Full report at: " + reportFile);
            Console.WriteLine();

            var tests   = FindTests(dotnet, testRoot, Console.Out);
            var results = TestRunner.ExecuteTests(dotnet,
                                                  workingDirectory,
                                                  tests,
                                                  (test) => PrintTestResult(test, Console.Out));

            PrintSummary(results, Console.Out, Console.Error);
            WriteReport(dotnet, results, reportFile);

            Environment.Exit(0);
        }
        /// <summary>
        /// Returns null if it can't parse the arguments properly
        /// </summary>
        public static ArgumentsAndOptions Parse(string[] arguments)
        {
            if (arguments == null)
            {
                throw new ArgumentNullException(nameof(arguments));
            }
            if (arguments.Count() == 0)
            {
                return(null);
            }

            var result = new ArgumentsAndOptions();

            var toProcess = arguments.ToList();

            if (toProcess.Contains("--verbose"))
            {
                result.Verbose = true;
                toProcess.Remove("--verbose");
            }

            if (toProcess.Count() < 1)
            {
                return(null);
            }

            result.TestRoot = Path.GetFullPath(toProcess[0]);
            toProcess.RemoveAt(0);

            if (toProcess.Count > 0)
            {
                result.DotNetHome = toProcess[0];
            }
            else
            {
                result.DotNetHome = DotNet.SystemDotNetPath;
            }

            return(result);
        }