From acd6edaa63f8a78d4f3deb90e51ad79c3aeadad4 Mon Sep 17 00:00:00 2001 From: Louis Seubert Date: Sun, 28 Apr 2024 21:36:31 +0200 Subject: [PATCH] more test commands --- .../Commands/EchoCommand.cs | 2 - .../Commands/EchoStdinCommand.cs | 9 ++-- .../Commands/GenerateBlobCommand.cs | 42 +++++++++++++++++++ .../Commands/GenerateClobCommand.cs | 41 ++++++++++++++++++ .../Commands/LengthCommand.cs | 32 ++++++++++++++ src/Process.Tests.Dummy/Program.cs | 7 ++++ 6 files changed, 126 insertions(+), 7 deletions(-) create mode 100644 src/Process.Tests.Dummy/Commands/GenerateBlobCommand.cs create mode 100644 src/Process.Tests.Dummy/Commands/GenerateClobCommand.cs create mode 100644 src/Process.Tests.Dummy/Commands/LengthCommand.cs diff --git a/src/Process.Tests.Dummy/Commands/EchoCommand.cs b/src/Process.Tests.Dummy/Commands/EchoCommand.cs index 2e9f8ed..ce55e0e 100644 --- a/src/Process.Tests.Dummy/Commands/EchoCommand.cs +++ b/src/Process.Tests.Dummy/Commands/EchoCommand.cs @@ -7,12 +7,10 @@ internal sealed class EchoCommand : Command public sealed class Settings : CommandSettings { [CommandOption("--target")] public OutputTarget Target { get; init; } = OutputTarget.StdOut; - [CommandOption("--separator ")] public string Separator { get; init; } = " "; [CommandArgument(0, "[line]")] public string[] Items { get; init; } = []; } - public override int Execute(CommandContext context, Settings settings) { foreach (var writer in settings.Target.GetWriters()) diff --git a/src/Process.Tests.Dummy/Commands/EchoStdinCommand.cs b/src/Process.Tests.Dummy/Commands/EchoStdinCommand.cs index af6aa4d..2680118 100644 --- a/src/Process.Tests.Dummy/Commands/EchoStdinCommand.cs +++ b/src/Process.Tests.Dummy/Commands/EchoStdinCommand.cs @@ -9,7 +9,6 @@ internal sealed class EchoStdinCommand : Command public sealed class Settings : CommandSettings { [CommandOption("--target")] public OutputTarget Target { get; init; } = OutputTarget.StdOut; - [CommandOption("--length")] public long Length { get; init; } = long.MaxValue; } @@ -17,10 +16,10 @@ internal sealed class EchoStdinCommand : Command { using var buffer = MemoryPool.Shared.Rent(81920); - var totalBytesRead = 0L; - while (totalBytesRead < settings.Length) + var count = 0L; + while (count < settings.Length) { - var bytesWanted = (int)Math.Min(buffer.Memory.Length, settings.Length - totalBytesRead); + var bytesWanted = (int)Math.Min(buffer.Memory.Length, settings.Length - count); var bytesRead = Console.In.Read(buffer.Memory.Span[..bytesWanted]); if (bytesRead <= 0) @@ -31,7 +30,7 @@ internal sealed class EchoStdinCommand : Command writer.Write(buffer.Memory.Span[..bytesRead]); } - totalBytesRead += bytesRead; + count += bytesRead; } return 0; diff --git a/src/Process.Tests.Dummy/Commands/GenerateBlobCommand.cs b/src/Process.Tests.Dummy/Commands/GenerateBlobCommand.cs new file mode 100644 index 0000000..a84d211 --- /dev/null +++ b/src/Process.Tests.Dummy/Commands/GenerateBlobCommand.cs @@ -0,0 +1,42 @@ +using System.Buffers; +using System.Text; + +using Spectre.Console.Cli; + +namespace Geekeey.Extensions.Process.Tests.Dummy.Commands; + +internal sealed class GenerateBlobCommand : Command +{ + private readonly Random _random = new(1234567); + + public sealed class Settings : CommandSettings + { + [CommandOption("--target")] public OutputTarget Target { get; init; } = OutputTarget.StdOut; + [CommandOption("--length")] public long Length { get; init; } = 100_000; + [CommandOption("--buffer")] public int BufferSize { get; init; } = 1024; + } + + public override int Execute(CommandContext context, Settings settings) + { + using var bytes = MemoryPool.Shared.Rent(settings.BufferSize); + using var chars = MemoryPool.Shared.Rent(settings.BufferSize); + + var total = 0L; + while (total < settings.Length) + { + _random.NextBytes(bytes.Memory.Span); + + Encoding.UTF8.GetChars(bytes.Memory.Span, chars.Memory.Span); + + var count = (int)Math.Min(chars.Memory.Length, settings.Length - total); + foreach (var writer in settings.Target.GetWriters()) + { + writer.Write(chars.Memory[..count]); + } + + total += count; + } + + return 0; + } +} \ No newline at end of file diff --git a/src/Process.Tests.Dummy/Commands/GenerateClobCommand.cs b/src/Process.Tests.Dummy/Commands/GenerateClobCommand.cs new file mode 100644 index 0000000..166182f --- /dev/null +++ b/src/Process.Tests.Dummy/Commands/GenerateClobCommand.cs @@ -0,0 +1,41 @@ +using System.Buffers; +using System.Text; + +using Spectre.Console.Cli; + +namespace Geekeey.Extensions.Process.Tests.Dummy.Commands; + +internal sealed class GenerateClobCommand : Command +{ + private readonly Random _random = new(1234567); + private readonly char[] _chars = Enumerable.Range(32, 94).Select(i => (char)i).ToArray(); + + public sealed class Settings : CommandSettings + { + [CommandOption("--target")] public OutputTarget Target { get; init; } = OutputTarget.StdOut; + [CommandOption("--length")] public int Length { get; init; } = 100_000; + [CommandOption("--lines")] public int LinesCount { get; init; } = 1; + } + + public override int Execute(CommandContext context, Settings settings) + { + var buffer = new StringBuilder(settings.Length); + + for (var line = 0; line < settings.LinesCount; line++) + { + buffer.Clear(); + + for (var i = 0; i < settings.Length; i++) + { + buffer.Append(_chars[_random.Next(0, _chars.Length)]); + } + + foreach (var writer in settings.Target.GetWriters()) + { + writer.WriteLine(buffer.ToString()); + } + } + + return 0; + } +} \ No newline at end of file diff --git a/src/Process.Tests.Dummy/Commands/LengthCommand.cs b/src/Process.Tests.Dummy/Commands/LengthCommand.cs new file mode 100644 index 0000000..728778a --- /dev/null +++ b/src/Process.Tests.Dummy/Commands/LengthCommand.cs @@ -0,0 +1,32 @@ +using System.Buffers; +using System.Globalization; + +using Spectre.Console.Cli; + +namespace Geekeey.Extensions.Process.Tests.Dummy.Commands; + +internal sealed class LengthCommand : Command +{ + public sealed class Settings : CommandSettings + { + } + + public override int Execute(CommandContext context, Settings settings) + { + using var buffer = MemoryPool.Shared.Rent(81920); + using var stdin = Console.OpenStandardInput(); + + var count = 0L; + while (true) + { + var bytesRead = stdin.Read(buffer.Memory.Span); + if (bytesRead <= 0) + break; + + count += bytesRead; + } + + Console.Out.WriteLine(count.ToString(CultureInfo.InvariantCulture)); + return 0; + } +} \ No newline at end of file diff --git a/src/Process.Tests.Dummy/Program.cs b/src/Process.Tests.Dummy/Program.cs index 06cd364..b7c4e19 100644 --- a/src/Process.Tests.Dummy/Program.cs +++ b/src/Process.Tests.Dummy/Program.cs @@ -30,7 +30,14 @@ public static class Program configuration.AddCommand("echo-stdin"); configuration.AddCommand("env"); configuration.AddCommand("cwd"); + configuration.AddCommand("cwd"); configuration.AddCommand("exit"); + configuration.AddCommand("length"); + configuration.AddBranch("generate", static generate => + { + generate.AddCommand("blob"); + generate.AddCommand("clob"); + }); } } } \ No newline at end of file