public void ColorTextBuilder_ColorTextBuilder_ShouldInterlaceWithSpacing() { var builder = new ColorTextBuilder(); var builder2 = new ColorTextBuilder(); builder.AppendLine("Left side:1"); builder.AppendLine("Left side:2"); builder2.AppendLine("Right side:1"); builder2.AppendLine("Right side:2"); var spacing = 10; var interlaced = builder.Interlace(builder2, spacing); var str = interlaced.ToString(); Assert.AreEqual($"Left side:1{new string(' ', spacing)}Right side:1{Environment.NewLine}Left side:2{new string(' ', spacing)}Right side:2{Environment.NewLine}", str); }
private ColorTextBuilder StackGraph(ColorTextBuilder existingChart, ColorTextBuilder newChart, int chartSpacing, out bool isNewRow) { isNewRow = false; if (newChart.Length > 0) { if (!_console.IsOutputRedirected && _console.WindowWidth > existingChart.Width + newChart.Width + chartSpacing) { existingChart = existingChart.Interlace(newChart, chartSpacing); } else { isNewRow = true; } } return(existingChart); }
public void ColorTextBuilder_MoreRightColorTextBuilder_ShouldInterlaceInColumnsAndTruncate() { var builder = new ColorTextBuilder(); var builder2 = new ColorTextBuilder(); builder.AppendLine("Left"); builder.AppendLine("Left side:2"); builder2.AppendLine("Right"); builder2.AppendLine("Right side:2"); builder2.Append("Right"); builder2.AppendLine(" side:3"); builder2.AppendLine("Right side:4 is too long"); var interlaced = builder.Interlace(builder2, 2, 15); var str = interlaced.ToString(); // data should be seperated into 2 columns 15 chars wide, plus 2 char padding Assert.AreEqual($"Left Right{Environment.NewLine}Left side:2 Right side:2{Environment.NewLine} Right side:3{Environment.NewLine} Right side:4 is{Environment.NewLine}", str); }
public void Draw(ViewContext context, long ticks) { if (_startTicks == 0) { _startTicks = ticks; context.Console.Clear(); } if (!context.Console.IsOutputRedirected) { // if the user has scrolled the page don't perform any drawing if (Console.WindowTop > 0) { return; } Console.CursorVisible = false; _performFullDraw = (_startTicks - ticks) % DefaultTickWait == 0; var windowWidth = Console.WindowWidth; var windowHeight = Console.WindowHeight; if (windowHeight != _previousWindowHeight) { _performFullDraw = true; } _previousWindowHeight = windowHeight; if (_performFullDraw) { ClearScreen(context); } var lineSeparator = DisplayUtil.Pad(Console.WindowWidth - 1, UTF8Constants.HorizontalLine); var yPos = 0; // figure out how many tests we can fit on screen var maxActiveTestsToDisplay = Console.WindowHeight - yPos - 2; var totalActiveTests = context.ActiveTests.Count(x => !x.IsQueuedForRemoval); var totalActiveTestFixtures = context.ActiveTestFixtures.Count(x => !x.IsQueuedForRemoval); var totalActiveAssemblies = context.ActiveAssemblies.Count(x => !x.IsQueuedForRemoval); if (totalActiveTests > 0 && totalActiveTestFixtures == 0) { // fix for older versions of nUnit that don't send the start test fixture event // it will still be incorrect, as it will treat parents of tests with multiple cases as a testfixture var parentIds = context.ActiveTests .Where(x => !x.IsQueuedForRemoval && !string.IsNullOrEmpty(x.Event.ParentId)) .Select(x => x.Event.ParentId) .Distinct(); totalActiveTestFixtures = context.ActiveTestSuites.Count(x => !x.IsQueuedForRemoval && parentIds.Contains(x.Event.Id)); } var totalPasses = context.EventLog.Count(x => x.Event.Event == EventNames.EndTest && x.Event.TestStatus == TestStatus.Pass); var totalFails = context.EventLog.Count(x => x.Event.Event == EventNames.EndTest && x.Event.TestStatus == TestStatus.Fail); var totalIgnored = context.EventLog.Count(x => x.Event.Event == EventNames.EndTest && x.Event.TestStatus == TestStatus.Skipped); var totalTestsProcessed = context.EventLog.Count(x => x.Event.Event == EventNames.EndTest); WriteHeader(context); // write the summary of all test state context.Console.WriteAt(ColorTextBuilder.Create .Append("Tests state: ", context.ColorScheme.Bright) .Append($"Tests=", context.ColorScheme.Default) .Append($"{totalActiveTests} ", context.ColorScheme.Highlight) .Append($"Fixtures=", context.ColorScheme.Default) .Append($"{totalActiveTestFixtures} ", context.ColorScheme.Highlight) .Append($"Assemblies=", context.ColorScheme.Default) .Append($"{totalActiveAssemblies} ", context.ColorScheme.Highlight) .Append($"Pass="******"{totalPasses} ", context.ColorScheme.Success) .AppendIf(totalPasses == 0, $"{totalPasses} ", context.ColorScheme.Default) .Append($"Fail=", context.ColorScheme.Default) .AppendIf(totalFails > 0, $"{totalFails} ", context.ColorScheme.DarkError) .AppendIf(totalFails == 0, $"{totalFails} ", context.ColorScheme.Default) .AppendIf(!context.Console.IsOutputRedirected, $"Ignored=", context.ColorScheme.Default) .AppendIf(!context.Console.IsOutputRedirected, $"{totalIgnored} ", context.ColorScheme.DarkDefault) .Append($"Total=", context.ColorScheme.Default) .Append($"{totalTestsProcessed} ", context.ColorScheme.DarkDefault) .AppendIf(context.TotalTestsQueued > 0, $"of ", context.ColorScheme.Default) .AppendIf(context.TotalTestsQueued > 0, $"{context.TotalTestsQueued} ", context.ColorScheme.DarkDefault) .AppendIf(context.TotalTestsQueued > 0, $"{UTF8Constants.LeftBracket}", context.ColorScheme.Bright) .AppendIf(context.TotalTestsQueued > 0, $"{((totalTestsProcessed / (double)context.TotalTestsQueued) * 100.0):F0}%", context.ColorScheme.DarkDuration) .AppendIf(context.TotalTestsQueued > 0, $"{UTF8Constants.RightBracket}", context.ColorScheme.Bright) //.Append(context.Client.IsWaitingForConnection ? $"{UTF8Constants.LeftBracket}waiting{UTF8Constants.RightBracket}" : "", context.ColorScheme.DarkDuration) .AppendIf(!context.Console.IsOutputRedirected, (length) => DisplayUtil.Pad(windowWidth - length)), 0, yPos + 1, DirectOutputMode.Static); // don't display this as often as its expensive to write if (_performFullDraw) { context.Console.SetCursorPosition(0, 2); var allCompletedAssemblies = context.EventLog .Where(x => x.Event.Event == EventNames.EndAssembly) .GroupBy(x => x.Event.TestSuite) .Select(x => x.FirstOrDefault()) .OrderByDescending(x => x.Event.Duration); var allPendingAssemblies = context.EventLog .Where(x => x.Event.Event == EventNames.StartAssembly && !allCompletedAssemblies.Select(y => y.Event.TestSuite).Contains(x.Event.TestSuite)) .GroupBy(x => x.Event.TestSuite) .Select(x => x.FirstOrDefault()) .OrderByDescending(x => x.DateAdded); var completedAssemblies = allCompletedAssemblies.Take(20); var pendingAssemblies = allPendingAssemblies.Take(20); var completedAssembliesBuilder = new ColorTextBuilder(); completedAssembliesBuilder.Append($"Completed Assemblies ", context.ColorScheme.Bright) .Append("[").Append($"{allCompletedAssemblies.Count()}", context.ColorScheme.Duration).Append("]") .AppendLine(); if (completedAssemblies.Any()) { foreach (var assembly in completedAssemblies) { var entryOutput = new ColorTextBuilder(); var completionTime = assembly.DateAdded; var duration = DateTime.Now.Subtract(assembly.Event.StartTime); if (assembly.Event.EndTime != DateTime.MinValue) { duration = assembly.Event.Duration; } var prettyTestName = DisplayUtil.GetPrettyTestName(assembly.Event.TestSuite, context.ColorScheme.DarkDefault, context.ColorScheme.Default, context.ColorScheme.DarkDefault, context.MaxTestCaseArgumentLength); // print out this test name and duration entryOutput .Append($"[{completionTime.ToString(TimeFormat)}] ", context.ColorScheme.DarkDuration) .Append(prettyTestName) .Append($" {duration.ToTotalElapsedTime()}", context.ColorScheme.Duration); completedAssembliesBuilder.AppendLine(entryOutput); } } var activeAssembliesBuilder = new ColorTextBuilder(); activeAssembliesBuilder.Append($"Running Assemblies", context.ColorScheme.Bright) .Append("[").Append($"{allPendingAssemblies.Count()}", context.ColorScheme.Duration).Append("]") .AppendLine(); if (pendingAssemblies.Any()) { foreach (var assembly in pendingAssemblies) { var entryOutput = new ColorTextBuilder(); var completionTime = assembly.DateAdded; var duration = DateTime.Now.Subtract(assembly.Event.StartTime); if (assembly.Event.EndTime != DateTime.MinValue) { duration = assembly.Event.Duration; } var prettyTestName = DisplayUtil.GetPrettyTestName(assembly.Event.TestSuite, context.ColorScheme.DarkDefault, context.ColorScheme.Default, context.ColorScheme.DarkDefault, context.MaxTestCaseArgumentLength); // print out this test name and duration entryOutput .Append(prettyTestName) .Append($" {duration.ToTotalElapsedTime()}", context.ColorScheme.Duration); activeAssembliesBuilder.AppendLine(entryOutput); } } // write builders side-by-side var columnSpacing = 2; var columnWidth = (context.Console.WindowWidth / 2) - (columnSpacing * 2); var output = completedAssembliesBuilder.Interlace(activeAssembliesBuilder, columnSpacing, columnWidth); context.Console.WriteLine(output); // output complete context.Console.SetCursorPosition(0, 0); } } }