Plugin-registerable self tests

The goal of this change is to let plugins register their own self-tests. 

We do this through the `ISelfTestRegistry` interface. For a plugin it
would look like this:

```csharp
[PluginService]
public ISelfTestRegistry SelfTestRegistry

// Somewhere that gets called by your plugin
SelfTestRegistry.RegisterTestSteps([
  new MySelfTestStep(),
  new MyOtherSelfTestStep()
])
```

Where `MySelfTest` and `MyOtherSelfTest` are instances of
the existing `ISelfTestStep` interface.

The biggest changes are to `SelfTestWindow` and the introduction of
`SelfTestWithResults`. I wanted to make sure test state wasn't lost when
changing the dropdown state and I was finding it a bit annoying to work
with the Dictionary now that we can't just rely on the index of the
item.

To fix this I moved all the "test run" state into `SelfTestWithResults`,
most of the changes to `SelfTestWindow` are derived from that, other
then the addition of the combo box.

The documentation for this service is a bit sparse, but I wanted to put
it up for review first before I invest a bunch of time making nice
documentation. 

I'm keen to hear if we think this is useful or if any changes are
needed.
This commit is contained in:
GrittyFrog 2025-10-11 16:50:29 +11:00
parent 4ac4505d72
commit ae777000e2
41 changed files with 674 additions and 133 deletions

View file

@ -0,0 +1,54 @@
using System.Collections.Generic;
namespace Dalamud.Plugin.SelfTest;
/// <summary>
/// Interface for registering and unregistering self-test steps from plugins.
/// </summary>
/// <example>
/// Registering custom self-test steps for your plugin:
/// <code>
/// [PluginService]
/// public ISelfTestRegistry SelfTestRegistry { get; init; }
///
/// // In your plugin initialization
/// this.SelfTestRegistry.RegisterTestSteps([
/// new MyCustomSelfTestStep(),
/// new AnotherSelfTestStep()
/// ]);
/// </code>
///
/// Creating a custom self-test step:
/// <code>
/// public class MyCustomSelfTestStep : ISelfTestStep
/// {
/// public string Name => "My Custom Test";
///
/// public SelfTestStepResult RunStep()
/// {
/// // Your test logic here
/// if (/* test condition passes */)
/// return SelfTestStepResult.Pass;
///
/// if (/* test condition fails */)
/// return SelfTestStepResult.Fail;
///
/// // Still waiting for test to complete
/// return SelfTestStepResult.Waiting;
/// }
///
/// public void CleanUp()
/// {
/// // Clean up any resources used by the test
/// }
/// }
/// </code>
/// </example>
public interface ISelfTestRegistry
{
/// <summary>
/// Registers the self-test steps for this plugin.
/// </summary>
/// <param name="steps">The test steps to register.</param>
public void RegisterTestSteps(IEnumerable<ISelfTestStep> steps);
}