diff --git a/bunit.sln b/bunit.sln
index 07a425cf2..2a6f50753 100644
--- a/bunit.sln
+++ b/bunit.sln
@@ -64,10 +64,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "bunit.web.query.tests", "te
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "bunit.generators.internal", "src\bunit.generators.internal\bunit.generators.internal.csproj", "{AE3DFB52-2BF4-4806-AD82-7FB7B38AC17F}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "bunit.generators.tests", "tests\bunit.generators.tests\bunit.generators.tests.csproj", "{09046981-D9EC-4295-8502-721AC54E1F12}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "bunit.generators", "src\bunit.generators\bunit.generators.csproj", "{A7C6A2AA-FF8F-4ED1-8590-5324FC566059}"
-EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -110,14 +106,6 @@ Global
{AE3DFB52-2BF4-4806-AD82-7FB7B38AC17F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AE3DFB52-2BF4-4806-AD82-7FB7B38AC17F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AE3DFB52-2BF4-4806-AD82-7FB7B38AC17F}.Release|Any CPU.Build.0 = Release|Any CPU
- {09046981-D9EC-4295-8502-721AC54E1F12}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {09046981-D9EC-4295-8502-721AC54E1F12}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {09046981-D9EC-4295-8502-721AC54E1F12}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {09046981-D9EC-4295-8502-721AC54E1F12}.Release|Any CPU.Build.0 = Release|Any CPU
- {A7C6A2AA-FF8F-4ED1-8590-5324FC566059}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {A7C6A2AA-FF8F-4ED1-8590-5324FC566059}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {A7C6A2AA-FF8F-4ED1-8590-5324FC566059}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {A7C6A2AA-FF8F-4ED1-8590-5324FC566059}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -133,8 +121,6 @@ Global
{0FF92169-7D8F-46A2-8327-A2F028CB426F} = {9A2B3B34-D41C-43E8-BC7D-246BEBE48D59}
{DE975A0C-0672-4248-913E-D267C1001801} = {6EA09ED4-B714-4E6F-B0E1-4D987F8AE520}
{AE3DFB52-2BF4-4806-AD82-7FB7B38AC17F} = {9A2B3B34-D41C-43E8-BC7D-246BEBE48D59}
- {09046981-D9EC-4295-8502-721AC54E1F12} = {6EA09ED4-B714-4E6F-B0E1-4D987F8AE520}
- {A7C6A2AA-FF8F-4ED1-8590-5324FC566059} = {9A2B3B34-D41C-43E8-BC7D-246BEBE48D59}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {24106918-1C86-4769-BDA6-9C80E64CD260}
diff --git a/docs/site/docs/interaction/index.md b/docs/site/docs/interaction/index.md
index 96e06fdde..9967c90ea 100644
--- a/docs/site/docs/interaction/index.md
+++ b/docs/site/docs/interaction/index.md
@@ -11,3 +11,4 @@ This section covers the various ways to interact with a component under test, e.
- **:** This covers how to manually trigger a render cycle for a component under test.
- **:** This covers how to await one or more asynchronous changes to the state of a component under test before continuing the test.
- **:** This covers how to dispose components and their children.
+- **:** This covers the different render modes and their interaction with bUnit.
diff --git a/docs/site/docs/interaction/render-modes.md b/docs/site/docs/interaction/render-modes.md
new file mode 100644
index 000000000..fc40eee6d
--- /dev/null
+++ b/docs/site/docs/interaction/render-modes.md
@@ -0,0 +1,157 @@
+---
+uid: render-modes
+title: Render modes and RendererInfo
+---
+
+# Support for render modes and `RendererInfo`
+This article explains how to emulate different render modes and `RendererInfo` in bUnit tests.
+
+Render modes in Blazor Web Apps determine the hosting model and interactivity of components. A render mode can be applied to a component using the `@rendermode` directive. The [`RendererInfo`](https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.components.rendererinfo?view=aspnetcore-9.0) allows the application to determine the interactivity and location of the component. For more details, see the [Blazor render modes](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-9.0) documentation.
+
+## Setting the render mode for a component under test
+Setting the render mode can be done via the method when writing in a C# file. In a razor file use the `@rendermode` directive. Both take an [`IComponentRenderMode`](https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.components.icomponentrendermode?view=aspnetcore-9.0) object as a parameter. Normally this is one of the following types:
+ * [`InteractiveAutoRenderMode`](https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.components.web.interactiveautorendermode?view=aspnetcore-9.0)
+ * [`InteractiveServerRendeMode`](https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.components.web.interactiveserverrendermode?view=aspnetcore-9.0)
+ * [`InteractiveWebAssemblyRenderMode`](https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.components.web.interactivewebassemblyrendermode?view=aspnetcore-9.0)
+
+For ease of use the [`RenderMode`](https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.components.web.rendermode?view=aspnetcore-9.0) class defines all three of them.
+
+For example `MovieComponent.razor`:
+```razor
+@if (AssignedRenderMode is null)
+{
+ // The render mode is Static Server
+
+}
+else
+{
+ // The render mode is Interactive Server, WebAssembly, or Auto
+
+
+}
+```
+
+The following example shows how to test the above component to check both render modes:
+
+# [C# test code](#tab/csharp)
+
+```csharp
+[Fact]
+public void InteractiveServer()
+{
+ // Act
+ var cut = RenderComponent(ps => ps
+ .SetAssignedRenderMode(RenderMode.InteractiveServer));
+
+ // Assert
+ cut.MarkupMatches("""
+
+
+ """);
+}
+
+[Fact]
+public void StaticRendering()
+{
+ // Act
+ var cut = RenderComponent();
+ // This is the same behavior as:
+ // var cut = RenderComponent(ps => ps
+ // .SetAssignedRenderMode(null));
+
+ // Assert
+ cut.MarkupMatches("""
+
+ """);
+}
+```
+
+# [Razor test code](#tab/razor)
+
+```razor
+@inherits TestContext
+@code {
+ [Fact]
+ public void InteractiveServer()
+ {
+ // Act
+ var cut = Render(@);
+
+ // Assert
+ cut.MarkupMatches(@
+
+
+ );
+ }
+
+ [Fact]
+ public void StaticRendering()
+ {
+ // Act
+ var cut = Render(@);
+
+ // Assert
+ cut.MarkupMatches(@);
+ }
+}
+```
+
+***
+
+## Setting the `RendererInfo` during testing
+To control the `ComponentBase.RendererInfo` property during testing, use the method on the `TestContext` class. The `SetRendererInfo` method takes an nullable `RendererInfo` object as a parameter. Passing `null` will set the `ComponentBase.RendererInfo` to `null`.
+
+A component (`AssistentComponent.razor`) might check if interactivity is given to enable a button:
+
+```razor
+@if (RendererInfo.IsInteractive)
+{
+
Hey I am your assistant
+}
+else
+{
+
Loading...
+}
+```
+
+In the test, you can set the `RendererInfo` to enable or disable the button:
+
+```csharp
+[Fact]
+public void SimulatingPreRenderingOnBlazorServer()
+{
+ // Arrange
+ SetRendererInfo(new RendererInfo(rendererName: "Static", isInteractive: false));
+
+ // Act
+ var cut = RenderComponent();
+
+ // Assert
+ cut.MarkupMatches("
");
+}
+```
+
+> [!NOTE]
+> If a component under test uses the `ComponentBase.RendererInfo` property and the `SetRendererInfo` on `TestContext` hasn't been passed in a `RendererInfo` object, the renderer will throw an exception.
\ No newline at end of file
diff --git a/docs/site/docs/toc.md b/docs/site/docs/toc.md
index 327afde06..8d937b05c 100644
--- a/docs/site/docs/toc.md
+++ b/docs/site/docs/toc.md
@@ -14,6 +14,7 @@
## [Trigger renders](xref:trigger-renders)
## [Awaiting an async state change](xref:awaiting-async-state)
## [Disposing components](xref:dispose-components)
+## [Render modes and RendererInfo](xref:render-modes)
# [Verifying output](xref:verification)
## [Verify markup](xref:verify-markup)
diff --git a/docs/site/docs/verification/semantic-html-comparison.md b/docs/site/docs/verification/semantic-html-comparison.md
index 0ef9bd5d0..f03fa02f3 100644
--- a/docs/site/docs/verification/semantic-html-comparison.md
+++ b/docs/site/docs/verification/semantic-html-comparison.md
@@ -105,7 +105,7 @@ Here are the customization options you have available to you:
```html
HeLLo world
-
```
To perform case insensitive comparison of the text inside the `id` attribute, do the following:
diff --git a/docs/site/index.md b/docs/site/index.md
index aa7eef8bf..c10804d1e 100644
--- a/docs/site/index.md
+++ b/docs/site/index.md
@@ -50,19 +50,19 @@ bUnit is available on NuGet in various incarnations. Most users should just pick
## Sponsors
-A huge thank you to the [sponsors of my work with bUnit](https://github.com/sponsors/egil). The higher tier sponsors are:
+A huge thank you to the [sponsors of bUnit](https://github.com/sponsors/egil). The higher tier sponsors are: