();
+
+ cut.MarkupMatches(@Assigned render mode: InteractiveServerRenderMode
);
+ }
+
+ [Fact(DisplayName = "The AssignedRenderMode is based on the RenderModeAttribute in the component hierarchy where parent component has no RenderMode")]
+ public void Test004()
+ {
+ var cut = Render(
+ @
+
+ );
+
+ cut.MarkupMatches(
+ @
+ Parent assigned render mode:
+ Assigned render mode: InteractiveWebAssemblyRenderMode
+ );
+ }
+
+ [Fact(DisplayName = "Parent and child render mode is specified")]
+ public void Test005()
+ {
+ var cut = Render(
+ @
+
+ );
+
+ cut.MarkupMatches(
+ @
+ Parent assigned render mode: InteractiveServerRenderMode
+ Assigned render mode: InteractiveServerRenderMode
+ );
+ }
+
+ [Fact(DisplayName = "Parent and child render mode is not specified")]
+ public void Test006()
+ {
+ var cut = Render(
+ @
+
+ );
+
+ cut.MarkupMatches(
+ @
+ Parent assigned render mode:
+ Assigned render mode:
+ );
+ }
+
+ [Fact(DisplayName = "Rendermode specified on child")]
+ public void Test007()
+ {
+ var cut = Render(
+ @
+
+ );
+
+ cut.MarkupMatches(@Assigned Render Mode: InteractiveServerRenderMode
);
+ }
+
+ [Fact(DisplayName = "Assigned Render Mode is inherited all the way down the component hierarchy")]
+ public void Test008()
+ {
+ var cut = Render(
+ @
+
+
+
+ );
+
+ cut.MarkupMatches(@Assigned Render Mode: InteractiveServerRenderMode
);
+ }
+
+ [Fact(DisplayName = "Having a component with section outlet and RenderMode is specifying for child component")]
+ public void Test009()
+ {
+ // See: https://learn.microsoft.com/en-us/aspnet/core/blazor/components/sections?view=aspnetcore-8.0#section-interaction-with-other-blazor-features
+ var cut = Render(@);
+
+ cut.MarkupMatches(@Assigned Render Mode: InteractiveWebAssemblyRenderMode
);
+ }
+
+ [Fact(DisplayName = "Assigned Render Mode on siblings")]
+ public void Test010()
+ {
+ var cut = Render(
+ @
+
+
+ );
+
+ cut.MarkupMatches(
+ @
+ Assigned Render Mode: InteractiveServerRenderMode
+ Assigned Render Mode: InteractiveWebAssemblyRenderMode
+ );
+ }
+
+ [Fact(DisplayName = "SetAssignedRenderMode on root component")]
+ public void Test011()
+ {
+ var cut = RenderComponent(ps => ps.SetAssignedRenderMode(RenderMode.InteractiveServer));
+ cut.MarkupMatches(@Assigned Render Mode: InteractiveServerRenderMode
);
+ }
+
+ [Fact(DisplayName = "SetAssignedRenderMode on parent component cascades to children")]
+ public void Test012()
+ {
+ var cut = RenderComponent(ps => ps
+ .SetAssignedRenderMode(RenderMode.InteractiveWebAssembly)
+ .AddChildContent());
+
+ cut.MarkupMatches(@Assigned Render Mode: InteractiveWebAssemblyRenderMode
);
+ }
+
+ [Fact(DisplayName = "SetAssignedRenderMode child components")]
+ public void Test013()
+ {
+ var cut = RenderComponent(ps => ps
+ .AddChildContent(pps => pps.SetAssignedRenderMode(RenderMode.InteractiveServer))
+ .AddChildContent(pps => pps.SetAssignedRenderMode(RenderMode.InteractiveWebAssembly)));
+
+ cut.MarkupMatches(
+ @
+ Assigned Render Mode: InteractiveServerRenderMode
+ Assigned Render Mode: InteractiveWebAssemblyRenderMode
+ );
+ }
+
+ [Fact(DisplayName = "Different assigned RenderMode between child and parent throws")]
+ public void Test020()
+ {
+ var act = () => Render(
+ @
+
+
+
+ );
+
+ act.ShouldThrow(); // todo: figure out good exception to use
+ }
+}
+@code{
+ #endif
+}
diff --git a/tests/bunit.testassets/RenderModes/ComponentThatPrintsAssignedRenderMode.razor b/tests/bunit.testassets/RenderModes/ComponentThatPrintsAssignedRenderMode.razor
new file mode 100644
index 000000000..effe0ff2c
--- /dev/null
+++ b/tests/bunit.testassets/RenderModes/ComponentThatPrintsAssignedRenderMode.razor
@@ -0,0 +1,9 @@
+@{
+#if NET9_0_OR_GREATER
+}
+
+Assigned Render Mode: @AssignedRenderMode?.GetType().Name
+
+@{
+#endif
+}
diff --git a/tests/bunit.testassets/RenderModes/ComponentWithChildContent.razor b/tests/bunit.testassets/RenderModes/ComponentWithChildContent.razor
new file mode 100644
index 000000000..c8b0cd4e1
--- /dev/null
+++ b/tests/bunit.testassets/RenderModes/ComponentWithChildContent.razor
@@ -0,0 +1,6 @@
+@ChildContent
+@code {
+
+ [Parameter] public RenderFragment ChildContent { get; set; } = default!;
+
+}
\ No newline at end of file
diff --git a/tests/bunit.testassets/RenderModes/ComponentWithServerRenderMode.razor b/tests/bunit.testassets/RenderModes/ComponentWithServerRenderMode.razor
new file mode 100644
index 000000000..dd008df6c
--- /dev/null
+++ b/tests/bunit.testassets/RenderModes/ComponentWithServerRenderMode.razor
@@ -0,0 +1,15 @@
+@{
+#if NET9_0_OR_GREATER
+}
+
+@rendermode Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer
+@(ChildContent is not null ? "Parent assigned" : "Assigned") render mode: @AssignedRenderMode?.GetType().Name
+@ChildContent
+
+@code {
+ [Parameter] public RenderFragment? ChildContent { get; set; }
+}
+
+@{
+#endif
+}
diff --git a/tests/bunit.testassets/RenderModes/ComponentWithWebAssemblyRenderMode.razor b/tests/bunit.testassets/RenderModes/ComponentWithWebAssemblyRenderMode.razor
new file mode 100644
index 000000000..af0888317
--- /dev/null
+++ b/tests/bunit.testassets/RenderModes/ComponentWithWebAssemblyRenderMode.razor
@@ -0,0 +1,15 @@
+@{
+#if NET9_0_OR_GREATER
+}
+
+@rendermode Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveWebAssembly
+@(ChildContent is not null ? "Parent assigned" : "Assigned") render mode: @AssignedRenderMode?.GetType().Name
+@ChildContent
+
+@code {
+ [Parameter] public RenderFragment? ChildContent { get; set; }
+}
+
+@{
+#endif
+}
\ No newline at end of file
diff --git a/tests/bunit.testassets/RenderModes/ComponentWithoutRenderMode.razor b/tests/bunit.testassets/RenderModes/ComponentWithoutRenderMode.razor
new file mode 100644
index 000000000..6d5f7f9b7
--- /dev/null
+++ b/tests/bunit.testassets/RenderModes/ComponentWithoutRenderMode.razor
@@ -0,0 +1,14 @@
+@{
+#if NET9_0_OR_GREATER
+}
+
+@(ChildContent is not null ? "Parent assigned" : "Assigned") render mode: @AssignedRenderMode?.GetType().Name
+@ChildContent
+
+@code {
+ [Parameter] public RenderFragment? ChildContent { get; set; }
+}
+
+@{
+#endif
+}
\ No newline at end of file
diff --git a/tests/bunit.testassets/RenderModes/RendererInfoComponent.cs b/tests/bunit.testassets/RenderModes/RendererInfoComponent.cs
new file mode 100644
index 000000000..9393ab3eb
--- /dev/null
+++ b/tests/bunit.testassets/RenderModes/RendererInfoComponent.cs
@@ -0,0 +1,20 @@
+#if NET9_0_OR_GREATER
+
+namespace Bunit.TestAssets.RenderModes;
+
+public class RendererInfoComponent : ComponentBase
+{
+ protected override void BuildRenderTree(RenderTreeBuilder builder)
+ {
+ builder.OpenElement(0, "p");
+ builder.AddContent(1, "Is interactive: ");
+ builder.AddContent(2, RendererInfo.IsInteractive);
+ builder.CloseElement();
+
+ builder.OpenElement(3, "p");
+ builder.AddContent(4, "Rendermode: ");
+ builder.AddContent(5, RendererInfo.Name);
+ builder.CloseElement();
+ }
+}
+#endif
\ No newline at end of file
diff --git a/tests/bunit.testassets/RenderModes/SectionOutletComponent.cs b/tests/bunit.testassets/RenderModes/SectionOutletComponent.cs
new file mode 100644
index 000000000..70dd7d9a1
--- /dev/null
+++ b/tests/bunit.testassets/RenderModes/SectionOutletComponent.cs
@@ -0,0 +1,30 @@
+using Microsoft.AspNetCore.Components.Web;
+
+#if NET8_0_OR_GREATER
+using Microsoft.AspNetCore.Components.Sections;
+#endif
+
+namespace Bunit.TestAssets.RenderModes;
+
+public class SectionOutletComponent : ComponentBase
+{
+#if NET8_0_OR_GREATER
+ private static readonly Guid SectionId = Guid.NewGuid();
+#endif
+
+ [Parameter] public RenderFragment ChildContent { get; set; }
+
+ protected override void BuildRenderTree(RenderTreeBuilder builder)
+ {
+#if NET8_0_OR_GREATER
+ builder.OpenComponent(0);
+ builder.AddComponentParameter(1, nameof(SectionOutlet.SectionId), SectionId);
+ builder.AddComponentRenderMode(RenderMode.InteractiveWebAssembly);
+ builder.CloseComponent();
+ builder.OpenComponent(10);
+ builder.AddComponentParameter(11, nameof(SectionContent.SectionId), SectionId);
+ builder.AddAttribute(12, nameof(SectionContent.ChildContent), ChildContent);
+ builder.CloseComponent();
+#endif
+ }
+}
diff --git a/tests/bunit.testassets/bunit.testassets.csproj b/tests/bunit.testassets/bunit.testassets.csproj
index 424468974..183551378 100644
--- a/tests/bunit.testassets/bunit.testassets.csproj
+++ b/tests/bunit.testassets/bunit.testassets.csproj
@@ -20,6 +20,7 @@
+
diff --git a/version.json b/version.json
index 1b260cc7a..4c937cfb9 100644
--- a/version.json
+++ b/version.json
@@ -1,6 +1,6 @@
{
"$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/main/src/NerdBank.GitVersioning/version.schema.json",
- "version": "1.36",
+ "version": "1.37",
"assemblyVersion": {
"precision": "revision"
},