using System;
using System.Collections.Generic;
namespace Spectre.Console.Testing
{
///
/// Represents a testable console input mechanism.
///
public sealed class TestConsoleInput : IAnsiConsoleInput
{
private readonly Queue _input;
///
/// Initializes a new instance of the class.
///
public TestConsoleInput()
{
_input = new Queue();
}
///
/// Pushes the specified text to the input queue.
///
/// The input string.
public void PushText(string input)
{
if (input is null)
{
throw new ArgumentNullException(nameof(input));
}
foreach (var character in input)
{
PushCharacter(character);
}
}
///
/// Pushes the specified text followed by 'Enter' to the input queue.
///
/// The input.
public void PushTextWithEnter(string input)
{
PushText(input);
PushKey(ConsoleKey.Enter);
}
///
/// Pushes the specified character to the input queue.
///
/// The input.
public void PushCharacter(char input)
{
var control = char.IsUpper(input);
_input.Enqueue(new ConsoleKeyInfo(input, (ConsoleKey)input, false, false, control));
}
///
/// Pushes the specified key to the input queue.
///
/// The input.
public void PushKey(ConsoleKey input)
{
_input.Enqueue(new ConsoleKeyInfo((char)input, input, false, false, false));
}
///
public ConsoleKeyInfo ReadKey(bool intercept)
{
if (_input.Count == 0)
{
throw new InvalidOperationException("No input available.");
}
return _input.Dequeue();
}
}
}