Skip to content

Commit

Permalink
add - doc - Added fixture selector TUI
Browse files Browse the repository at this point in the history
---

We've added an interactive TUI for the fixture selector

---

Type: add
Breaking: False
Doc Required: True
Backport Required: False
Part: 1/1
  • Loading branch information
AptiviCEO committed Sep 23, 2024
1 parent ab08d04 commit db63a70
Show file tree
Hide file tree
Showing 9 changed files with 345 additions and 35 deletions.
46 changes: 27 additions & 19 deletions CliTester.Demo/EntryPoint.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,32 +30,40 @@ internal class EntryPoint
private static readonly Fixture[] fixtures =
[
new FixtureUnconditional<Action>(nameof(UnconditionalFunctions.TestWrite), "Tests writing to console", UnconditionalFunctions.TestWrite),
new FixtureUnconditional<Action<string>>(nameof(UnconditionalFunctions.TestWriteArgs), "Tests writing to console with arguments", UnconditionalFunctions.TestWriteArgs),
new FixtureConditional<Func<int>>(nameof(ConditionalFunctions.TestRead), "Tests writing to console", ConditionalFunctions.TestRead, (int)'A'),
new FixtureConditional<Func<double, double, double>>(nameof(ConditionalFunctions.TestReadArgs), "Tests writing to console with arguments", ConditionalFunctions.TestReadArgs, 0d),
new FixtureUnconditional<Action<string>>(nameof(UnconditionalFunctions.TestWriteArgs), "Tests writing to console with arguments", UnconditionalFunctions.TestWriteArgs, "John"),
new FixtureConditional<Func<int>>(nameof(ConditionalFunctions.TestRead), "Tests reading from console", ConditionalFunctions.TestRead, (int)'A'),
new FixtureConditional<Func<double, double, double>>(nameof(ConditionalFunctions.TestReadArgs), "Tests reading from console with arguments", ConditionalFunctions.TestReadArgs, 0d, 4, 2),
new FixtureConditional<Func<double, double, double>>(nameof(ConditionalFunctions.TestReadArgs) + "Fail", "Tests reading from console with arguments (failure expected)", ConditionalFunctions.TestReadArgs, 0d, 5, 2),
];

static void Main()
static void Main(string[] args)
{
TextWriterColor.Write("Running fixture 1...");
bool result = FixtureRunner.RunTest((FixtureUnconditional<Action>?)fixtures[0], out var exc);
TextWriterColor.WriteColor($"Outcome: {result} [{(exc is not null ? exc.Message : "No error")}]", result ? ConsoleColors.Lime : ConsoleColors.Red);
if (args.Contains("-tui"))
{
FixtureSelector.OpenFixtureSelector(fixtures);
}
else
{
TextWriterColor.Write("Running fixture 1...");
bool result = FixtureRunner.RunTest((FixtureUnconditional<Action>?)fixtures[0], out var exc);
TextWriterColor.WriteColor($"Outcome: {result} [{(exc is not null ? exc.Message : "No error")}]", result ? ConsoleColors.Lime : ConsoleColors.Red);

TextWriterColor.Write("Running fixture 2...");
bool result2 = FixtureRunner.RunTest((FixtureUnconditional<Action<string>>?)fixtures[1], out var exc2, "John");
TextWriterColor.WriteColor($"Outcome: {result2} [{(exc2 is not null ? exc2.Message : "No error")}]", result2 ? ConsoleColors.Lime : ConsoleColors.Red);
TextWriterColor.Write("Running fixture 2...");
bool result2 = FixtureRunner.RunTest((FixtureUnconditional<Action<string>>?)fixtures[1], out var exc2, "John");
TextWriterColor.WriteColor($"Outcome: {result2} [{(exc2 is not null ? exc2.Message : "No error")}]", result2 ? ConsoleColors.Lime : ConsoleColors.Red);

TextWriterColor.Write("Running fixture 3...");
bool result3 = FixtureRunner.RunTest<Func<int>, int>((FixtureConditional<Func<int>>?)fixtures[2], out var exc3);
TextWriterColor.WriteColor($"Outcome: {result3} [{(exc3 is not null ? exc3.Message : "No error")}]", result3 ? ConsoleColors.Lime : ConsoleColors.Red);
TextWriterColor.Write("Running fixture 3...");
bool result3 = FixtureRunner.RunTest<Func<int>, int>((FixtureConditional<Func<int>>?)fixtures[2], out var exc3);
TextWriterColor.WriteColor($"Outcome: {result3} [{(exc3 is not null ? exc3.Message : "No error")}]", result3 ? ConsoleColors.Lime : ConsoleColors.Red);

TextWriterColor.Write("Running fixture 4...");
bool result4 = FixtureRunner.RunTest<Func<double, double, double>, double>((FixtureConditional<Func<double, double, double>>?)fixtures[3], out var exc4, 4, 2);
TextWriterColor.WriteColor($"Outcome: {result4} [{(exc4 is not null ? exc4.Message : "No error")}]", result4 ? ConsoleColors.Lime : ConsoleColors.Red);
TextWriterColor.Write("Running fixture 4...");
bool result4 = FixtureRunner.RunTest<Func<double, double, double>, double>((FixtureConditional<Func<double, double, double>>?)fixtures[3], out var exc4, 8, 4);
TextWriterColor.WriteColor($"Outcome: {result4} [{(exc4 is not null ? exc4.Message : "No error")}]", result4 ? ConsoleColors.Lime : ConsoleColors.Red);

TextWriterColor.Write("Running fixture 4 (expected fail)...");
bool result5 = FixtureRunner.RunTest<Func<double, double, double>, double>((FixtureConditional<Func<double, double, double>>?)fixtures[3], out var exc5, 5, 2);
TextWriterColor.WriteColor($"Outcome: {result5} [{(exc5 is not null ? exc5.Message : "No error")}]", result5 ? ConsoleColors.Lime : ConsoleColors.Red);
TextWriterColor.Write("Running fixture 4 (expected fail)...");
bool result5 = FixtureRunner.RunTest<Func<double, double, double>, double>((FixtureConditional<Func<double, double, double>>?)fixtures[3], out var exc5, 11, 4);
TextWriterColor.WriteColor($"Outcome: {result5} [{(exc5 is not null ? exc5.Message : "No error")}]", result5 ? ConsoleColors.Lime : ConsoleColors.Red);
}
}
}
}
11 changes: 11 additions & 0 deletions CliTester.Demo/Properties/launchSettings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"profiles": {
"CliTester.Demo": {
"commandName": "Project"
},
"CliTester.Demo TUI": {
"commandName": "Project",
"commandLineArgs": "-tui"
}
}
}
4 changes: 4 additions & 0 deletions CliTester/CliTester.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,8 @@
</None>
</ItemGroup>

<ItemGroup>
<PackageReference Include="Terminaux" Version="5.3.0.1" />
</ItemGroup>

</Project>
53 changes: 53 additions & 0 deletions CliTester/Exceptions/NoFixturesException.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
//
// CliTester Copyright (C) 2024 Aptivi
//
// This file is part of CliTester
//
// CliTester is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// CliTester is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY, without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//

using System;

namespace CliTester.Exceptions
{
/// <summary>
/// This is an exception that gets thrown when there are no fixtures
/// </summary>
[Serializable]
public class NoFixturesException : Exception
{
/// <summary>
/// Creates a new exception
/// </summary>
public NoFixturesException()
{ }

/// <summary>
/// Creates a new exception
/// </summary>
/// <param name="message">Message to describe the reason</param>
public NoFixturesException(string message) :
base(message)
{ }

/// <summary>
/// Creates a new exception
/// </summary>
/// <param name="message">Message to describe the reason</param>
/// <param name="inner">Inner exception</param>
public NoFixturesException(string message, Exception inner) :
base(message, inner)
{ }
}
}
7 changes: 5 additions & 2 deletions CliTester/Instances/Fixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,11 @@ namespace CliTester.Instances
/// Test fixture class (general)
/// </summary>
[DebuggerDisplay("{Name}: {Description}")]
public class Fixture
public abstract class Fixture
{
internal string fixtureName = "";
internal string fixtureDesc = "";
internal object?[]? initialParameters = null;

/// <summary>
/// Fixture name
Expand All @@ -47,11 +48,13 @@ public class Fixture
/// </summary>
/// <param name="fixtureName">Fixture name</param>
/// <param name="fixtureDesc">Fixture description</param>
public Fixture(string fixtureName, string fixtureDesc)
/// <param name="initialParameters">Fixture initial parameters</param>
public Fixture(string fixtureName, string fixtureDesc, params object?[]? initialParameters)
{
// Install values
this.fixtureName = fixtureName ?? "Untitled fixture";
this.fixtureDesc = fixtureDesc ?? "";
this.initialParameters = initialParameters;
}
}
}
32 changes: 26 additions & 6 deletions CliTester/Instances/FixtureConditional.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,10 @@ namespace CliTester.Instances
/// <summary>
/// Test fixture class (routines that don't return <see langword="void"/>)
/// </summary>
[DebuggerDisplay("[C: {fixtureDelegate.GetType().Name}] {Name}: {Description}")]
public class FixtureConditional<TDelegate> : Fixture
where TDelegate : Delegate
[DebuggerDisplay("[C non-generic: {fixtureDelegate.GetType().Name}] {Name}: {Description}")]
public class FixtureConditional : Fixture
{
internal TDelegate fixtureDelegate;
internal Delegate fixtureDelegate;
internal object? expectedValue;

/// <summary>
Expand All @@ -39,8 +38,9 @@ public class FixtureConditional<TDelegate> : Fixture
/// <param name="fixtureDesc">Fixture description</param>
/// <param name="fixtureDelegate">Delegate that executes this test fixture</param>
/// <param name="expectedValue">Expected value</param>
public FixtureConditional(string fixtureName, string fixtureDesc, TDelegate? fixtureDelegate, object? expectedValue) :
base(fixtureName, fixtureDesc)
/// <param name="initialParameters">Fixture initial parameters</param>
public FixtureConditional(string fixtureName, string fixtureDesc, Delegate? fixtureDelegate, object? expectedValue, params object?[]? initialParameters) :
base(fixtureName, fixtureDesc, initialParameters)
{
// Check for delegate type
if (fixtureDelegate is null)
Expand All @@ -53,4 +53,24 @@ public FixtureConditional(string fixtureName, string fixtureDesc, TDelegate? fix
this.expectedValue = expectedValue;
}
}

/// <summary>
/// Test fixture class (routines that don't return <see langword="void"/>)
/// </summary>
[DebuggerDisplay("[C generic: {fixtureDelegate.GetType().Name}] {Name}: {Description}")]
public class FixtureConditional<TDelegate> : FixtureConditional
where TDelegate : Delegate
{
/// <summary>
/// Makes a new test fixture class
/// </summary>
/// <param name="fixtureName">Fixture name</param>
/// <param name="fixtureDesc">Fixture description</param>
/// <param name="fixtureDelegate">Delegate that executes this test fixture</param>
/// <param name="expectedValue">Expected value</param>
/// <param name="initialParameters">Fixture initial parameters</param>
public FixtureConditional(string fixtureName, string fixtureDesc, TDelegate? fixtureDelegate, object? expectedValue, params object?[]? initialParameters) :
base(fixtureName, fixtureDesc, fixtureDelegate, expectedValue, initialParameters)
{ }
}
}
33 changes: 25 additions & 8 deletions CliTester/Instances/FixtureUnconditional.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,20 +25,20 @@ namespace CliTester.Instances
/// <summary>
/// Test fixture class (routines that return <see langword="void"/>)
/// </summary>
[DebuggerDisplay("[U: {fixtureDelegate.GetType().Name}] {Name}: {Description}")]
public class FixtureUnconditional<TDelegate> : Fixture
where TDelegate : Delegate
[DebuggerDisplay("[U non-generic: {fixtureDelegate.GetType().Name}] {Name}: {Description}")]
public class FixtureUnconditional : Fixture
{
internal TDelegate fixtureDelegate;
internal Delegate fixtureDelegate;

/// <summary>
/// Makes a new test fixture class
/// </summary>
/// <param name="fixtureName">Fixture name</param>
/// <param name="fixtureDesc">Fixture description</param>
/// <param name="fixtureDelegate">Delegate that executes this test fixture</param>
public FixtureUnconditional(string fixtureName, string fixtureDesc, TDelegate? fixtureDelegate) :
base(fixtureName, fixtureDesc)
/// <param name="initialParameters">Fixture initial parameters</param>
public FixtureUnconditional(string fixtureName, string fixtureDesc, Delegate? fixtureDelegate, params object?[]? initialParameters) :
base(fixtureName, fixtureDesc, initialParameters)
{
// Check for delegate type
if (fixtureDelegate is null)
Expand All @@ -47,9 +47,26 @@ public FixtureUnconditional(string fixtureName, string fixtureDesc, TDelegate? f
throw new ArgumentException("Method in this delegate needs to return void");

// Install values
this.fixtureName = fixtureName ?? "Untitled fixture";
this.fixtureDesc = fixtureDesc ?? "";
this.fixtureDelegate = fixtureDelegate;
}
}

/// <summary>
/// Test fixture class (routines that return <see langword="void"/>)
/// </summary>
[DebuggerDisplay("[U generic: {fixtureDelegate.GetType().Name}] {Name}: {Description}")]
public class FixtureUnconditional<TDelegate> : FixtureUnconditional
where TDelegate : Delegate
{
/// <summary>
/// Makes a new test fixture class
/// </summary>
/// <param name="fixtureName">Fixture name</param>
/// <param name="fixtureDesc">Fixture description</param>
/// <param name="fixtureDelegate">Delegate that executes this test fixture</param>
/// <param name="initialParameters">Fixture initial parameters</param>
public FixtureUnconditional(string fixtureName, string fixtureDesc, TDelegate? fixtureDelegate, params object?[]? initialParameters) :
base(fixtureName, fixtureDesc, fixtureDelegate, initialParameters)
{ }
}
}
Loading

0 comments on commit db63a70

Please sign in to comment.