Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 53 additions & 0 deletions csharp/Platform.IO.Tests/ConsoleHelpersTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
using System;
using System.IO;
using Xunit;

namespace Platform.IO.Tests
{
public class ConsoleHelpersTests
{
[Fact]
public void GetOrReadArgument_WithValidArgumentIndex_ReturnsArgument()
{
var args = new[] { "value1", "value2", "value3" };
var result = ConsoleHelpers.GetOrReadArgument(1, args);
Assert.Equal("value2", result);
}

[Fact]
public void GetOrReadArgumentOrDefault_WithValidArgumentIndexAndDefaultValue_ReturnsArgument()
{
var args = new[] { "value1", "value2", "value3" };
var result = ConsoleHelpers.GetOrReadArgumentOrDefault(1, "default", args);
Assert.Equal("value2", result);
}

// Note: Tests involving Console.ReadLine() are omitted as they require user interaction

// Test cases that involve Console.ReadLine() are omitted for automated testing

[Fact]
public void GetOrReadArgument_WithQuotedInput_RemovesQuotes()
{
var args = new[] { "\"quoted value\"" };
var result = ConsoleHelpers.GetOrReadArgument(0, args);
Assert.Equal("quoted value", result);
}

[Fact]
public void GetOrReadArgument_WithWhitespaceInput_TrimsWhitespace()
{
var args = new[] { " spaced value " };
var result = ConsoleHelpers.GetOrReadArgument(0, args);
Assert.Equal("spaced value", result);
}

[Fact]
public void GetOrReadArgumentWithDefault_WithNullDefaultValue_CompileCheck()
{
// This test verifies that the method compiles with null default value
// Actual testing with Console.ReadLine() is omitted for automated testing
Assert.True(true);
}
}
}
65 changes: 65 additions & 0 deletions csharp/Platform.IO/ConsoleHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,29 @@ public static void PressAnyKeyToContinue()
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static string GetOrReadArgument(int index, params string[] args) => GetOrReadArgument(index, $"{index + 1} argument", args);

/// <summary>
/// <para>Gets an argument's value with the specified <paramref name="index"/> from the <paramref name="args"/> array and if it's absent requests a user to input it in the console. If user input is empty, returns the specified <paramref name="defaultValue"/>.</para>
/// <para>Получает значение аргумента с указанным <paramref name="index"/> из массива <paramref name="args"/>, a если оно отсутствует запрашивает его ввод в консоли у пользователя. Если ввод пользователя пустой, возвращает указанное <paramref name="defaultValue"/>.</para>
/// </summary>
/// <param name="index">
/// <para>The ordinal number of the argument in the array.</para>
/// <para>Порядковый номер аргумента в массиве.</para>
/// </param>
/// <param name="defaultValue">
/// <para>The default value to return if the argument is not found and user input is empty.</para>
/// <para>Значение по умолчанию, которое возвращается, если аргумент не найден и ввод пользователя пустой.</para>
/// </param>
/// <param name="args">
/// <para>The argument array passed to the application.</para>
/// <para>Массив аргументов переданных приложению.</para>
/// </param>
/// <returns>
/// <para>The value with the specified <paramref name="index"/> extracted from the <paramref name="args"/> array, entered by a user in the console, or the <paramref name="defaultValue"/> if user input is empty.</para>
/// <para>Значение с указанным <paramref name="index"/>, извлечённое из массива <paramref name="args"/>, введённое пользователем в консоли, или <paramref name="defaultValue"/>, если ввод пользователя пустой.</para>
/// </returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static string GetOrReadArgumentOrDefault(int index, string defaultValue, params string[] args) => GetOrReadArgumentWithDefault(index, $"{index + 1} argument", defaultValue, args);

/// <summary>
/// <para>Gets an argument's value with the specified <paramref name="index"/> from the <paramref name="args"/> array and if it's absent requests a user to input it in the console.</para>
/// <para>Получает значение аргумента с указанным <paramref name="index"/> из массива <paramref name="args"/>, a если оно отсутствует запрашивает его ввод в консоли у пользователя.</para>
Expand Down Expand Up @@ -80,6 +103,48 @@ public static string GetOrReadArgument(int index, string readMessage, params str
}
}

/// <summary>
/// <para>Gets an argument's value with the specified <paramref name="index"/> from the <paramref name="args"/> array and if it's absent requests a user to input it in the console. If user input is empty, returns the specified <paramref name="defaultValue"/>.</para>
/// <para>Получает значение аргумента с указанным <paramref name="index"/> из массива <paramref name="args"/>, a если оно отсутствует запрашивает его ввод в консоли у пользователя. Если ввод пользователя пустой, возвращает указанное <paramref name="defaultValue"/>.</para>
/// </summary>
/// <param name="index">
/// <para>The ordinal number of the argument in the array.</para>
/// <para>Порядковый номер аргумента в массиве.</para>
/// </param>
/// <param name="readMessage">
/// <para>The message's text to a user describing which argument is being entered at the moment. If the <paramref name="args"/> array doesn't contain the element with the specified <paramref name="index"/>, then this message is used.</para>
/// <para>Текст сообщения пользователю описывающее какой аргумент вводится в данный момент. Это сообщение используется только если массив <paramref name="args"/> не содержит аргумента с указанным <paramref name="index"/>.</para>
/// </param>
/// <param name="defaultValue">
/// <para>The default value to return if the argument is not found and user input is empty.</para>
/// <para>Значение по умолчанию, которое возвращается, если аргумент не найден и ввод пользователя пустой.</para>
/// </param>
/// <param name="args">
/// <para>The argument array passed to the application.</para>
/// <para>Массив аргументов переданных приложению.</para>
/// </param>
/// <returns>
/// <para>The value with the specified <paramref name="index"/> extracted from the <paramref name="args"/> array, entered by a user in the console, or the <paramref name="defaultValue"/> if user input is empty.</para>
/// <para>Значение с указанным <paramref name="index"/>, извлечённое из массива <paramref name="args"/>, введённое пользователем в консоли, или <paramref name="defaultValue"/>, если ввод пользователя пустой.</para>
/// </returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static string GetOrReadArgumentWithDefault(int index, string readMessage, string defaultValue, params string[] args)
{
if (!args.TryGetElement(index, out string result))
{
Console.Write($"{readMessage}: ");
result = Console.ReadLine();
}
if (string.IsNullOrEmpty(result))
{
return defaultValue ?? "";
}
else
{
return result.Trim().TrimSingle('"').Trim();
}
}

/// <summary>
/// <para>Outputs the <paramref name="string"/> to the console.</para>
/// <para>Выводит <paramref name="string"/> в консоль.</para>
Expand Down
34 changes: 34 additions & 0 deletions examples/DefaultValueDemo.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
using System;
using Platform.IO;

namespace Platform.IO.Examples
{
class DefaultValueDemo
{
static void Main(string[] args)
{
Console.WriteLine("=== ConsoleHelpers Default Value Demo ===");

// Example 1: GetOrReadArgument without default value (existing functionality)
Console.WriteLine("\n1. GetOrReadArgument(0, args) with args = ['hello', 'world']:");
var testArgs = new[] { "hello", "world" };
var result1 = ConsoleHelpers.GetOrReadArgument(0, testArgs);
Console.WriteLine($" Result: '{result1}'");

// Example 2: GetOrReadArgument without default value for non-existent argument
Console.WriteLine("\n2. GetOrReadArgument(3, args) - non-existent index:");
Console.WriteLine(" (This would normally prompt for console input, skipped in demo)");

// Example 3: GetOrReadArgumentOrDefault with existing argument
Console.WriteLine("\n3. GetOrReadArgumentOrDefault(1, 'defaultValue', args):");
var result3 = ConsoleHelpers.GetOrReadArgumentOrDefault(1, "defaultValue", testArgs);
Console.WriteLine($" Result: '{result3}' (should be 'world')");

// Example 4: GetOrReadArgumentWithDefault with custom message and default
Console.WriteLine("\n4. GetOrReadArgumentWithDefault with custom message:");
Console.WriteLine(" (This would normally prompt for console input with custom message, skipped in demo)");

Console.WriteLine("\n=== Demo completed successfully ===");
}
}
}
Loading