gdUnit4.api 5.0.0

dotnet add package gdUnit4.api --version 5.0.0
                    
NuGet\Install-Package gdUnit4.api -Version 5.0.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="gdUnit4.api" Version="5.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="gdUnit4.api" Version="5.0.0" />
                    
Directory.Packages.props
<PackageReference Include="gdUnit4.api" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add gdUnit4.api --version 5.0.0
                    
#r "nuget: gdUnit4.api, 5.0.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package gdUnit4.api@5.0.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=gdUnit4.api&version=5.0.0
                    
Install as a Cake Addin
#tool nuget:?package=gdUnit4.api&version=5.0.0
                    
Install as a Cake Tool

The C# GdUnit4 API

What is GdUnit4.Api

gdUnit4.api is the C# package to enable GdUnit4 to run/write unit tests in C#.

Features

  • Writing And Executing Tests in C# for Net8.0 and Net9.0 C#12
  • Convenient interface for running test-suites directly from Godot<br> One of the main features of GdUnit4 is the ability to run test-suites directly from the Godot editor using the context menu. You can run test-suites from the FileSystem panel, the ScriptEditor, or the GdUnit Inspector. To do this, simply right-click on the desired test-suite or test-case and select "Run Test(s)" from the context menu. This will run the selected tests and display the results in the GdUnit Inspector.<br> You can create new test cases directly from the ScriptEditor by right-clicking on the function you want to test and selecting "Create TestCase" from the context menu.
  • Fluent Syntax for writing test cases that's easy to read and understand
  • Wide range of Assertions for verifying the behavior and output of your code
  • Test Fuzzing support: for generating random inputs to test edge cases and boundary conditions
  • Parameterized Tests: (Test Cases) for testing functions with multiple sets of inputs and expected outputs
  • Dynamic Tests Data: 'DataPoint' attribute to define test data sets
  • Scene runner: for simulating different kinds of inputs and actions, such as mouse clicks and keyboard inputs<br> For example, you can simulate mouse clicks and keyboard inputs by calling the appropriate methods on the runner instance. Additionally, you can wait for a specific signal to be emitted by the scene, or you can wait for a specific function to return a certain value.
  • Integration with Test Adapter: Works seamlessly with the gdUnit4.test.adapter for running tests in Visual Studio, VS Code, and JetBrains Rider

Installation

You can install the GdUnit4 API by adding it as a package reference to your project:

<PackageReference Include="gdUnit4.api" Version="5.0.0"/>

Short Example

namespace GdUnit4.Tests
{
    using static Assertions;

    [TestSuite]
    public class StringAssertTest
    {
        [TestCase]
        public void IsEqual()
        {
            AssertThat("This is a test message").IsEqual("This is a test message");
        }
        
        [TestCase] 
        [RequireGodotRuntime] // ← Add this for Godot-dependent tests
        public void IsEqual()
        {
             AssertThat(new Node2D()).IsNotNull();
        }
        
        [Test]
        [RequireGodotRuntime]
        [GodotExceptionMonitor]  // ← Monitor Godot exceptions
        public void TestNodeCallback()
        {
            var node = new MyNode(); // Will catch exceptions in _Ready()
            AddChild(node);
        }
        
        [Test]
        [DataPoint(nameof(TestData))]  // ← Data-driven tests
        public void TestCalculations(int a, int b, int expected)
        {
            AssertThat(Calculator.Add(a, b)).IsEqual(expected);
        }
        
        [Test]
        [ThrowsException(typeof(ArgumentNullException), "Value cannot be null")]
        public void TestValidation()
        {
            Calculator.Add(null, 5); // Expects specific exception
        }
        
        // Data source for parameterized tests
        public static IEnumerable<object[]> TestData => new[]
        {
            new object[] { 1, 2, 3 },
            new object[] { 5, 7, 12 }
        };
    }
 }

Documentation

For more information, check out the complete API documentation.


You are welcome to

Thank you for supporting my project


License

This project is licensed under the MIT License - see the LICENSE file for details.

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on gdUnit4.api:

Package Downloads
gdUnit4.test.adapter

GdUnit4 Test Adapter is the test adapter to run GdUnit4 tests in C#.

GitHub repositories (1)

Showing the top 1 popular GitHub repositories that depend on gdUnit4.api:

Repository Stars
Revolutionary-Games/Thrive
The main repository for the development of the evolution game Thrive.
Version Downloads Last Updated
5.0.0 828 6/21/2025
4.3.1 23,935 7/30/2024
4.3.0 2,185 7/9/2024
4.2.5 8,385 6/24/2024
4.2.4 840 6/4/2024
4.2.3 2,883 4/17/2024
4.2.2 643 4/12/2024
4.2.1.1 851 3/10/2024
4.2.1 1,861 2/24/2024

v5.0.0

## Major Architecture Overhaul

**BREAKING CHANGES:**
* Test Engine Redesign: Complete rework of the test engine that no longer requires Godot runtime by default
* Migration Required: Tests using Godot features (scenes, nodes, resources) must now be marked with `[RequireGodotRuntime]` attribute
* Significant performance improvements for logic-only tests (up to 10x faster)

✨ New Features
GD-138: Add capture test case execution stdout to the test report by @MikeSchulze in #139
GD-144: Add AwaitInputProcessed to SceneRunner by @MikeSchulze in #145
GD-46: Added support of DataPoint attributes, which make it possible to define parameterized tests with dynamic test data by @MikeSchulze in #147
GD-153: Add Roslyn Analyzer to validate TestCase and DataPoint attribute combinations by @MikeSchulze in #154
GD-156: Add an exception hook to report exceptions as test failures that are caught by Godot by @MikeSchulze in #157
GD-160: Apply runsettings environment variables to the test execution context by @MikeSchulze in #161
GD-163: Collect the Godot log file into test report by @MikeSchulze in #164
GD-156: Install Godot exception handler and forward uncaught exceptions as test failure. by @MikeSchulze in #162
GD-682: Rework on GdUnit4Net API Godot bridge by @MikeSchulze in #197
GD-27: Add VSTest filter support with test categories and traits by @MikeSchulze in #201
GD-240: Add GDUNIT4NET_API_V5 Conditional Compilation Constant by @MikeSchulze in #241
Upgrade to .NET 8/9 with C# 12 support by @MikeSchulze in #267
GD-211: Implement missing AwaitSignalOn by @MikeSchulze in #282

🪲 Bug Fixes
GD-149: Add error to the execution log when the test session timeout occurs by @MikeSchulze in #150
GD-152: Fix test case display name for dynamic test data driven tests by @MikeSchulze in #176
Fixes Godot exception monitoring issues by @MikeSchulze in #187
Make WithTimeout public by @MikeSchulze in #189
GD-199: TestRunner install ends with abnormal exit on large projects by @MikeSchulze in #200
GD-203: Handle failure reporting for test stages [Before] and [After] by @MikeSchulze in #204
GD-212: Fix vector assertion IsEqualApprox by @MikeSchulze in #214
GD-284: Fix test failure causes the entire test execution if it is executed in the Godot Editor by @MikeSchulze in #285

🧹 Maintenance
GD-140: GdUnit4 API: code cleanup and formatting by @MikeSchulze in https://github.com/MikeSchulze/gdUni...

## 📋 Migration Guide:

**Before v5.0.0:**
```csharp
[Test]
public void MyTest()
{
   // All tests ran in Godot runtime
   var node = new Node();
   AddChild(node);
}
```

**v5.0.0:**
```csharp
[Test]
public void MyLogicTest()
{
   // Runs fast without Godot runtime
   var result = Calculator.Add(1, 2);
   AssertThat(result).IsEqual(3);
}

[Test]
[RequireGodotRuntime]  // Required for Godot-dependent tests
public void MyGodotTest()
{
   var node = new Node();
   AddChild(node);
}

[Test]
[DataPoint(nameof(TestData))]  // Data-driven tests
public void TestCalculations(int a, int b, int expected)
{
   AssertThat(Calculator.Add(a, b)).IsEqual(expected);
}

[Test]
[ThrowsException(typeof(ArgumentNullException), "Value cannot be null")]
public void TestValidation()
{
   Calculator.Add(null, 5); // Expects specific exception
}

public static IEnumerable<object[]> TestData => new[]
{
   new object[] { 1, 2, 3 },
   new object[] { 5, 7, 12 }
};
```

## ⚙️ Configuration:

New `.runsettings` options:
```xml
<RunSettings>
 <GdUnit4>
   <CaptureStdOut>true</CaptureStdOut>
   <Parameters>--verbose --headless</Parameters>
   <DisplayName>FullyQualifiedName</DisplayName>
   <CompileProcessTimeout>30000</CompileProcessTimeout>
 </GdUnit4>
</RunSett>
```

This release represents a major evolution in GdUnit4's architecture, providing developers with the flexibility to write fast, efficient tests while maintaining full Godot integration capabilities when required.
-------------------------------------------------------------------------------------------------------

v4.3.1

Bug Fixes:
* GD-135: Cannot test signals on non-node classes

-------------------------------------------------------------------------------------------------------

v4.3.0

Improvements:
* GD-127: Replace stdout based TestEventProcessor by IPC implementation
* GD-124: Use LaunchProcessWithDebuggerAttached instead of AttachDebuggerIfNeed for Rider 2024.2

-------------------------------------------------------------------------------------------------------

v4.2.5

Bug Fixes:
* GD-110: Allow a Node to be passed in to SceneRunner.Load as the root of the scene.
* GD-121: Improve AssertSignal by adding a StartMonitoring method

-------------------------------------------------------------------------------------------------------

V4.2.4

Improvements:
* GD-89: Add input action support to the `SceneRunner` by @MikeSchulze in https://github.com/MikeSchulze/gdUnit4Net/pull/92
   - Added input action handling to the SceneRunner
   - `SimulateActionPressed(string action)`
   - `SimulateActionPress(string action)`
   - `SimulateActionRelease(string action)`
* GD-94: Improve assertions error message when comparing objects by @MikeSchulze in https://github.com/MikeSchulze/gdUnit4Net/pull/95
* GD-99: Add support to load a scene by `uid://` path to the Scene Runner by @MikeSchulze in https://github.com/MikeSchulze/gdUnit4Net/pull/100


Bug Fixes:
* GD-90: Cleanup old runner configuration before run new tests by @MikeSchulze in https://github.com/MikeSchulze/gdUnit4Net/pull/93
* GD-96: Fix methods with a single parameterized test case are not executed by @MikeSchulze in https://github.com/MikeSchulze/gdUnit4Net/pull/97
* GD-101: Respect the GdUnit4 settings to notify about orphan nodes by @MikeSchulze in https://github.com/MikeSchulze/gdUnit4Net/pull/102
* GD-103: Trim MSTest assert stack trace by @MikeSchulze in https://github.com/MikeSchulze/gdUnit4Net/pull/105
* GD-104: Fix exception failure message propagation by @MikeSchulze in https://github.com/MikeSchulze/gdUnit4Net/pull/108


-------------------------------------------------------------------------------------------------------

v4.2.3

Bug Fixes:
- Fix `AssertThat` for dynamic assert type resolving

-------------------------------------------------------------------------------------------------------

v4.2.2

What's Changed:

- Rename repository from `gdUnit4Mono` to `gdUnit4Net`
- Update project to GodotSharp v4.1.0
- Format and fix warnings according to C# standards
- Format the tests according to the C# Formatting rules
- Format the code to C# standard
- Support both net7 and net8 at once
- Add full .NET8 support
- Provide generic vector assert to support all Godot vector types
- Revision of the stack trace collection for failed tests
- Complete missing features for `IDictionaryAssert`
- Complete missing features for `IEnumerableAssert`
- Complete missing features for `INumberAssert`
- Add missing `SimulateMouseMoveRelative` and `SimulateMouseMoveAbsolute` to `ISceneRunner`

Bug Fixes:
- SceneRunner: Fix InputEvent handling
- Calling Invoke on `SceneRunner` must propagate exceptions
- Fix GdUnit4MonoAPI `IsTestSuite` cannot run TestSuite
- Fix test run stops at some point
- Parameterized test cases are not run from Godot Editor GdUnit4 inspector

-------------------------------------------------------------------------------------------------------

v4.2.0

- gdUnit4 API initial version.