From e71cc020cb3376f3e56c2ce244eddc1189e9f882 Mon Sep 17 00:00:00 2001 From: Fabio Gemignani Date: Tue, 6 Oct 2020 11:01:54 -0300 Subject: [PATCH] Refactoring the ListInput method to change the color of the selected item --- src/Inquirer/Console/ConsoleManager.cs | 15 ++++++++++ src/Inquirer/Console/ConsoleMessage.cs | 30 ++++++++++++++++++++ src/Inquirer/Console/IConsole.cs | 2 ++ src/Inquirer/Prompts/IScreenManager.cs | 1 + src/Inquirer/Prompts/ListInput.cs | 22 +++++++++++++-- test/InquirerUnitTest/InputListUnitTest.cs | 33 +++++++++++++++++++++- 6 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 src/Inquirer/Console/ConsoleMessage.cs diff --git a/src/Inquirer/Console/ConsoleManager.cs b/src/Inquirer/Console/ConsoleManager.cs index c079b3b..e8ebc43 100644 --- a/src/Inquirer/Console/ConsoleManager.cs +++ b/src/Inquirer/Console/ConsoleManager.cs @@ -24,6 +24,21 @@ public int[] Render(string[] content, string[] bottomContent) return new [] { content.Length, bottomContent.Length }; } + public int[] Render(ConsoleMessage[] content, ConsoleMessage[] bottomContent) + { + content.ToList().ForEach(item => + { + if (item.ConsoleColor.HasValue) + console.ForegroundColor = item.ConsoleColor.Value; + + console.WriteLine(item.Message); + }); + Newline(); + console.ResetColor(); + bottomContent.ToList().ForEach(item => console.WriteLine(item.Message)); + console.CursorTop = console.CursorTop - (bottomContent.Length + 1); + return new[] { content.Length, bottomContent.Length }; + } public void Clean(int initialPos, int endPos) { diff --git a/src/Inquirer/Console/ConsoleMessage.cs b/src/Inquirer/Console/ConsoleMessage.cs new file mode 100644 index 0000000..8a44551 --- /dev/null +++ b/src/Inquirer/Console/ConsoleMessage.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace InquirerCore.Console +{ + public class ConsoleMessage + { + public ConsoleMessage(string message) + { + Message = message; + } + + public ConsoleMessage(string message, ConsoleColor consoleColor) + { + Message = message; + ConsoleColor = consoleColor; + } + + public string Message { get; private set; } + + public ConsoleColor? ConsoleColor { get; private set; } + + public void SetMessage(string message) + => Message = message; + + public void SetConsoleColor(ConsoleColor consoleColor) + => ConsoleColor = consoleColor; + } +} diff --git a/src/Inquirer/Console/IConsole.cs b/src/Inquirer/Console/IConsole.cs index 7db618d..b8be464 100644 --- a/src/Inquirer/Console/IConsole.cs +++ b/src/Inquirer/Console/IConsole.cs @@ -15,5 +15,7 @@ public interface IConsole int CursorTop { get; set; } int WindowWidth { get; set; } bool KeyAvailable { get; } + ConsoleColor ForegroundColor { get; set; } + void ResetColor(); } } diff --git a/src/Inquirer/Prompts/IScreenManager.cs b/src/Inquirer/Prompts/IScreenManager.cs index fcc845b..d4066a7 100644 --- a/src/Inquirer/Prompts/IScreenManager.cs +++ b/src/Inquirer/Prompts/IScreenManager.cs @@ -7,6 +7,7 @@ public interface IScreenManager { int[,] RenderMultipleMessages(string[] messages); int[] Render(string[] content, string[] bottomContent); + int[] Render(ConsoleMessage[] content, ConsoleMessage[] bottomContent); void Clean(int initialPos, int endPos); string ReadLine(); IInputObservable GetInputObservable(); diff --git a/src/Inquirer/Prompts/ListInput.cs b/src/Inquirer/Prompts/ListInput.cs index b3676a5..a912bd7 100644 --- a/src/Inquirer/Prompts/ListInput.cs +++ b/src/Inquirer/Prompts/ListInput.cs @@ -1,4 +1,5 @@ -using System; +using InquirerCore.Console; +using System; using System.Collections.Generic; using System.Reactive.Linq; using System.Text; @@ -57,7 +58,24 @@ public override string[] GetQuestion() public override int[] Render() { - return consoleRender.Render(GetQuestion(), new string[] {}); + ConsoleMessage[] messages = ProcessInputMessages(GetQuestion()); + return consoleRender.Render(messages, new ConsoleMessage[] { }); + } + + public ConsoleMessage[] ProcessInputMessages(string[] questions) + { + var messages = new ConsoleMessage[questions.Length]; + + for (int i = 0; i < questions.Length; i++) + { + messages[i] = new ConsoleMessage(questions[i]); + if ((selectedOption + 1) == i) + messages[i].SetConsoleColor(ConsoleColor.Cyan); + else + messages[i].SetConsoleColor(ConsoleColor.Gray); + } + + return messages; } } } diff --git a/test/InquirerUnitTest/InputListUnitTest.cs b/test/InquirerUnitTest/InputListUnitTest.cs index 78358ea..d925e1b 100644 --- a/test/InquirerUnitTest/InputListUnitTest.cs +++ b/test/InquirerUnitTest/InputListUnitTest.cs @@ -62,8 +62,39 @@ public void ShouldCallConsoleWriteLine() var input = new ListInput(name, message, new string[] { "option1", "option2" }, consoleRender); input.Render(); - consoleRender.Received().Render(Arg.Any(), Arg.Any()); + consoleRender.Received().Render(Arg.Any(), Arg.Any()); } + [Fact] + public void FirstQuestionShoulBeADifferentColor() + { + var message = "Which option?"; + var name = "option"; + var options = new string[] { "option1", "option2" }; + var consoleRender = Substitute.For(); + var input = new ListInput(name, message, options, consoleRender); + + var questions = input.GetQuestion(); + var inputMessages = input.ProcessInputMessages(questions); + + inputMessages[1].Message.Should().Be("> option1"); + inputMessages[1].ConsoleColor.Should().Be(ConsoleColor.Cyan); + } + + [Fact] + public void SecondQuestionNotShoulBeADifferentColor() + { + var message = "Which option?"; + var name = "Name"; + var options = new string[] { "option1", "option2" }; + var consoleRender = Substitute.For(); + var input = new ListInput(name, message, options, consoleRender); + + var questions = input.GetQuestion(); + var inputMessages = input.ProcessInputMessages(questions); + + inputMessages[2].Message.Should().Be("option2"); + inputMessages[2].ConsoleColor.Should().NotBe(ConsoleColor.Cyan); + } } }