├── .config
└── dotnet-tools.json
├── .devcontainer
├── devcontainer.json
└── post-install.sh
├── .editorconfig
├── .gitattributes
├── .github
├── FUNDING.yml
├── ISSUE_TEMPLATE
│ ├── bug_report.md
│ ├── config.yml
│ └── feature_request.md
├── codeql
│ └── codeql-config.yml
├── dependabot.yml
├── pull_request_template.md
└── workflows
│ ├── ci.yml
│ ├── docs-deploy.yml
│ ├── prepare-release.yml
│ └── release.yml
├── .gitignore
├── .vscode
└── tasks.json
├── CHANGELOG.md
├── CODE-OF-CONDUCT.md
├── CONTRIBUTING.md
├── Directory.Build.props
├── Directory.Packages.props
├── LICENSE
├── MIGRATION.md
├── NOTICE.md
├── NuGet.Config
├── README.md
├── bunit-logo.png
├── bunit.sln
├── docs
├── .editorconfig
├── Directory.Build.props
├── README.md
├── samples
│ ├── .editorconfig
│ ├── components
│ │ ├── Alert.razor
│ │ ├── AlertType.cs
│ │ ├── AsyncComponentLoader.razor
│ │ ├── AsyncData.razor
│ │ ├── AsyncDisposableComponent.razor
│ │ ├── Bar.razor
│ │ ├── Calc.razor
│ │ ├── CalcWithLoading.razor
│ │ ├── CalcWithReturnValue.razor
│ │ ├── CascadingParams.razor
│ │ ├── CheckList.razor
│ │ ├── ChildContentParams.cs
│ │ ├── ClickMe.razor
│ │ ├── Counter.razor
│ │ ├── CounterWithFancyParagraph.razor
│ │ ├── DisposableComponent.razor
│ │ ├── EventCallbackParams.cs
│ │ ├── ExceptionInDisposeAsyncComponent.razor
│ │ ├── ExceptionInDisposeComponent.razor
│ │ ├── FancyParagraph.razor
│ │ ├── FancyTable.razor
│ │ ├── Foo.razor
│ │ ├── Heading.razor
│ │ ├── HelloWorld.razor
│ │ ├── InjectAuthService.razor
│ │ ├── Item.razor
│ │ ├── ListItem.razor
│ │ ├── NonBlazorTypesParams.cs
│ │ ├── PrintCascadingValue.razor
│ │ ├── RenderFragmentParams.cs
│ │ ├── SimpleTodo.razor
│ │ ├── TemplateParams.razor
│ │ ├── TwoWayBinding.razor
│ │ ├── UnmatchedParams.cs
│ │ ├── UserInfo.razor
│ │ ├── UserRights.razor
│ │ ├── WeatherForecastService.cs
│ │ ├── WeatherForecastTabel.razor
│ │ ├── WeatherForecasts.razor
│ │ ├── Wrapper.razor
│ │ ├── _Imports.razor
│ │ └── bunit.docs.samples.csproj
│ ├── samples.sln
│ └── tests
│ │ ├── Directory.Build.props
│ │ ├── mstest
│ │ ├── HelloWorldExplicitContextTest.cs
│ │ ├── HelloWorldRazorTest.razor
│ │ ├── HelloWorldTest.cs
│ │ ├── _Imports.razor
│ │ └── bunit.docs.mstest.samples.csproj
│ │ ├── nunit
│ │ ├── HelloWorldExplicitContextTest.cs
│ │ ├── HelloWorldInstancePerTestCase.cs
│ │ ├── HelloWorldRazorInstancePerTestCase.razor
│ │ ├── HelloWorldRazorTest.razor
│ │ ├── HelloWorldTest.cs
│ │ ├── _Imports.razor
│ │ └── bunit.docs.nunit.samples.csproj
│ │ ├── razor
│ │ ├── CascadingParams1Test.razor
│ │ ├── CascadingParams2Test.razor
│ │ ├── CascadingParams3Test.razor
│ │ ├── ChildContentParams1Test.razor
│ │ ├── ChildContentParams2Test.razor
│ │ ├── ChildContentParams3Test.razor
│ │ ├── ChildContentParams4Test.razor
│ │ ├── ClickMeTest.razor
│ │ ├── CounterTest.razor
│ │ ├── EventCallbackParamsTest.razor
│ │ ├── NestedComponentTest.razor
│ │ ├── NonBlazorTypesParamsTest.razor
│ │ ├── RenderFragmentParams1Test.razor
│ │ ├── RenderFragmentParams2Test.razor
│ │ ├── RenderFragmentParams3Test.razor
│ │ ├── RenderFragmentParams4Test.razor
│ │ ├── TemplateParams1Test.razor
│ │ ├── TemplateParams2Test.razor
│ │ ├── TwoWayBindingTest.razor
│ │ ├── UnmatchedParamsTest.razor
│ │ ├── _Imports.razor
│ │ └── bunit.docs.razor.samples.csproj
│ │ └── xunit
│ │ ├── AsyncDataTest.cs
│ │ ├── CascadingParams1Test.cs
│ │ ├── CascadingParams2Test.cs
│ │ ├── CascadingParams3Test.cs
│ │ ├── ChildContentParams1Test.cs
│ │ ├── ChildContentParams2Test.cs
│ │ ├── ChildContentParams3Test.cs
│ │ ├── ChildContentParams4Test.cs
│ │ ├── ClickMeTest.cs
│ │ ├── ComponentFactoryExampleTest.cs
│ │ ├── CounterTest.cs
│ │ ├── CounterTestWithCtx.cs
│ │ ├── CounterWithFancyParagraphTest.cs
│ │ ├── CustomServiceProviderFactory.cs
│ │ ├── CustomServiceProviderFactoryUsage.cs
│ │ ├── DisposeComponentsTest.cs
│ │ ├── EventCallbackParamsTest.cs
│ │ ├── FallBackServiceProviderUsage.cs
│ │ ├── FallbackServiceProvider.cs
│ │ ├── FooBarComponentFactory.cs
│ │ ├── HelloWorldExplicitContextRazorTest.razor
│ │ ├── HelloWorldExplicitContextTest.cs
│ │ ├── HelloWorldImplicitContextRazorTest.razor
│ │ ├── HelloWorldRazorTest.razor
│ │ ├── HelloWorldTest.cs
│ │ ├── InjectAuthServiceTest.cs
│ │ ├── MockHttpClientBunitHelpers.cs
│ │ ├── NestedComponentTest.cs
│ │ ├── NonBlazorTypesParamsTest.cs
│ │ ├── ReRenderTest.cs
│ │ ├── RenderFragmentParams1Test.cs
│ │ ├── RenderFragmentParams2Test.cs
│ │ ├── RenderFragmentParams3Test.cs
│ │ ├── RenderFragmentParams4Test.cs
│ │ ├── RenderTreeTest.cs
│ │ ├── SemanticHtmlTest.cs
│ │ ├── TemplateParams1Test.cs
│ │ ├── TemplateParams2Test.cs
│ │ ├── TwoWayBindingTest.cs
│ │ ├── UnmatchedParamsTest.cs
│ │ ├── UserInfoTest.cs
│ │ ├── UserRightsTest.cs
│ │ ├── VerifyMarkupExamples.cs
│ │ ├── WaitForComponentTest.cs
│ │ ├── WeatherForecastsTest.cs
│ │ ├── _Imports.razor
│ │ └── bunit.docs.xunit.samples.csproj
└── site
│ ├── .gitignore
│ ├── Properties
│ └── launchsettings.json
│ ├── android-chrome-192x192.png
│ ├── android-chrome-256x256.png
│ ├── api
│ └── .gitignore
│ ├── apple-touch-icon.png
│ ├── browserconfig.xml
│ ├── docfx.json
│ ├── docs
│ ├── code-of-conduct.md
│ ├── contribute.md
│ ├── extensions
│ │ ├── bunit-generators.md
│ │ └── index.md
│ ├── external-resources.md
│ ├── getting-started
│ │ ├── create-test-project.md
│ │ ├── index.md
│ │ └── writing-tests.md
│ ├── interaction
│ │ ├── awaiting-async-state.md
│ │ ├── dispose-components.md
│ │ ├── index.md
│ │ ├── render-modes.md
│ │ ├── trigger-event-handlers.md
│ │ └── trigger-renders.md
│ ├── migrations
│ │ ├── 1to2.md
│ │ └── index.md
│ ├── misc-test-tips.md
│ ├── providing-input
│ │ ├── configure-3rd-party-libs.md
│ │ ├── controlling-component-instantiation.md
│ │ ├── index.md
│ │ ├── inject-services-into-components.md
│ │ ├── passing-parameters-to-components.md
│ │ ├── root-render-tree.md
│ │ └── substituting-components.md
│ ├── test-doubles
│ │ ├── auth.md
│ │ ├── emulating-ijsruntime.md
│ │ ├── fake-webassemblyhostenvironment.md
│ │ ├── index.md
│ │ ├── input-file.md
│ │ ├── mocking-httpclient.md
│ │ ├── mocking-localizer.md
│ │ ├── navigation-manager.md
│ │ └── persistentcomponentstate.md
│ ├── toc.md
│ └── verification
│ │ ├── async-assertion.md
│ │ ├── index.md
│ │ ├── semantic-html-comparison.md
│ │ ├── verify-component-state.md
│ │ └── verify-markup.md
│ ├── favicon-16x16.png
│ ├── favicon-32x32.png
│ ├── favicon.ico
│ ├── images
│ ├── bunit-logo.png
│ ├── github-logo.svg
│ ├── rendered-fragment-diagram.png
│ ├── test-context-rendered-fragment-diagram.png
│ └── testcontext-diagram.png
│ ├── index.md
│ ├── mstile-150x150.png
│ ├── site.webmanifest
│ ├── sponsors
│ ├── dotnetfoundation_v4_purple.svg
│ ├── packt-retina-logo.png
│ ├── progress-ad-2022-dark-mode.svg
│ ├── progress-ad-2022-light-mode.svg
│ ├── progress-blazor-2022-300x300.png
│ ├── progress-blazor-2022-dec-300x300.png
│ ├── progress-blazor-300x250.png
│ └── telerik-ad-site.svg
│ ├── templates
│ └── bunit
│ │ ├── layout
│ │ └── _master.tmpl
│ │ └── public
│ │ ├── cshtml-razor.js
│ │ ├── cshtml-razor.min.js
│ │ ├── main.css
│ │ └── main.js
│ └── toc.md
├── global.json
├── key.snk
├── src
├── .editorconfig
├── Directory.Build.props
├── bunit.generators.internal
│ ├── Blazor
│ │ └── EventDispatcherExtensionGenerator.cs
│ ├── Directory.Build.props
│ ├── README.md
│ ├── Web.AngleSharp
│ │ ├── GeneratorConfig.cs
│ │ ├── IElementWrapper.cs
│ │ ├── IElementWrapperFactory.cs
│ │ ├── WrapperBase.cs
│ │ ├── WrapperElementGenerator.cs
│ │ └── WrapperElementsGenerator.cs
│ └── bunit.generators.internal.csproj
├── bunit.generators
│ ├── README.md
│ ├── Web.Stubs
│ │ ├── AddStubMethodStubGenerator
│ │ │ └── AddStubGenerator.cs
│ │ ├── AttributeLineGenerator.cs
│ │ ├── AttributeStubGenerator
│ │ │ ├── ComponentStubAttribute.cs
│ │ │ └── ComponentStubAttributeGenerator.cs
│ │ ├── HeaderProvider.cs
│ │ ├── MemberRetriever.cs
│ │ └── SupportedAttributes.cs
│ └── bunit.generators.csproj
├── bunit.template
│ ├── bunit.template.csproj
│ └── template
│ │ ├── .template.config
│ │ ├── dotnetcli.host.json
│ │ └── template.json
│ │ ├── Company.BlazorTests1.csproj
│ │ ├── Counter.razor
│ │ ├── CounterCSharpTest.cs
│ │ ├── CounterRazorTests.razor
│ │ └── _Imports.razor
├── bunit.web.query
│ ├── ByLabelTextElementFactory.cs
│ ├── Labels
│ │ ├── ByLabelTextOptions.cs
│ │ ├── LabelElementExtensions.cs
│ │ ├── LabelNotFoundException.cs
│ │ ├── LabelQueryExtensions.cs
│ │ └── Strategies
│ │ │ ├── ILabelTextQueryStrategy.cs
│ │ │ ├── LabelTextUsingAriaLabelStrategy.cs
│ │ │ ├── LabelTextUsingAriaLabelledByStrategy.cs
│ │ │ ├── LabelTextUsingForAttributeStrategy.cs
│ │ │ └── LabelTextUsingWrappedElementStrategy.cs
│ ├── NodeListExtensions.cs
│ └── bunit.web.query.csproj
└── bunit
│ ├── Asserting
│ ├── ActualExpectedAssertException.cs
│ ├── AssertionMethodAttribute.cs
│ ├── CompareToExtensions.cs
│ ├── FocusAsyncAssertJSInteropExtensions.cs
│ ├── FocusOnNavigateAssertJSInteropExtensions.cs
│ ├── HtmlEqualException.cs
│ ├── JSInvokeCountExpectedException.cs
│ ├── JSRuntimeAssertExtensions.cs
│ ├── MarkupMatchesAssertExtensions.cs
│ └── XUnitExceptions
│ │ ├── IAssertionException.cs
│ │ └── ITestTimeoutException.cs
│ ├── BunitContext.Obsoletes.cs
│ ├── BunitContext.cs
│ ├── BunitServiceProvider.cs
│ ├── ComponentFactories
│ ├── ConditionalComponentFactory.cs
│ ├── GenericComponentFactory{TComponent,TSubstituteComponent}.cs
│ ├── InstanceComponentFactory{TComponent}.cs
│ ├── StubComponentFactory.cs
│ └── TypeBasedComponentFactory{TComponent}.cs
│ ├── ComponentFactoryCollection.cs
│ ├── ComponentParameter.cs
│ ├── ComponentParameterCollection.cs
│ ├── ComponentParameterCollectionBuilder.cs
│ ├── Diffing
│ ├── BlazorDiffingHelpers.cs
│ ├── DiffMarkupFormatter.cs
│ └── HtmlComparer.cs
│ ├── EventDispatchExtensions
│ ├── InputEventDispatchExtensions.cs
│ ├── Key.cs
│ ├── KeyboardEventDispatchExtensions.cs
│ ├── MissingEventHandlerException.cs
│ └── TriggerEventDispatchExtensions.cs
│ ├── Extensions
│ ├── BlazorExtensions.cs
│ ├── BunitServiceProviderExtensions.cs
│ ├── ComponentFactoryCollectionExtensions.cs
│ ├── ElementNotFoundException.cs
│ ├── ElementRemovedFromDomException.cs
│ ├── EnumerableExtensions.cs
│ ├── InputFile
│ │ ├── BUnitBrowserFile.cs
│ │ ├── InputFileContent.cs
│ │ └── InputFileExtensions.cs
│ ├── Internal
│ │ ├── AngleSharpExtensions.cs
│ │ ├── AngleSharpWrapperExtensions.cs
│ │ └── CssSelectorElementFactory.cs
│ ├── LoggerHelperExtensions.cs
│ ├── NodePrintExtensions.cs
│ ├── RenderedComponentExtensions.cs
│ ├── RenderedComponentInvokeAsyncExtensions.cs
│ ├── RenderedComponentRenderExtensions.cs
│ ├── StubComponentFactoryCollectionExtensions.cs
│ └── WaitForHelpers
│ │ ├── RenderedComponentWaitForHelperExtensions.WaitForElement.cs
│ │ ├── RenderedComponentWaitForHelperExtensions.WaitForState.cs
│ │ ├── RenderedComponentWaitForhelperExtensions.WaitForComponent.cs
│ │ ├── WaitForAssertionHelper.cs
│ │ ├── WaitForElementHelper.cs
│ │ ├── WaitForElementsHelper.cs
│ │ ├── WaitForFailedException.cs
│ │ ├── WaitForHelper.cs
│ │ ├── WaitForHelperLoggerExtensions.cs
│ │ └── WaitForStateHelper.cs
│ ├── IComponentFactory.cs
│ ├── InternalsVisibleTo.cs
│ ├── JSInterop
│ ├── BunitJSInterop.cs
│ ├── BunitJSInteropSetupExtensions.cs
│ ├── BunitJSModuleInterop.cs
│ ├── Implementation
│ │ ├── BunitJSObjectReference.cs
│ │ ├── BunitJSRuntime.cs
│ │ ├── BunitJSRuntime.net8.cs
│ │ └── JSRuntimeExtensions.cs
│ ├── InvocationHandlers
│ │ ├── Implementation
│ │ │ ├── FocusAsyncInvocationHandler.cs
│ │ │ ├── FocusOnNavigateHandler.cs
│ │ │ ├── InputFileInvocationHandler.cs
│ │ │ ├── JSObjectReferenceInvocationHandler.cs
│ │ │ ├── LooseModeJSObjectReferenceInvocationHandler.cs
│ │ │ ├── NavigationLockDisableNavigationPromptInvocationHandler.cs
│ │ │ ├── NavigationLockEnableNavigationPromptInvocationHandler.cs
│ │ │ └── VirtualizeJSRuntimeInvocationHandler.cs
│ │ ├── JSRuntimeInvocationHandler.cs
│ │ ├── JSRuntimeInvocationHandlerBase{TResult}.cs
│ │ └── JSRuntimeInvocationHandler{TResult}.cs
│ ├── InvocationMatcher.cs
│ ├── JSRuntimeInvocation.cs
│ ├── JSRuntimeInvocationDictionary.cs
│ ├── JSRuntimeInvocationNotSetException.cs
│ ├── JSRuntimeMode.cs
│ └── JSRuntimeUnhandledInvocationException.cs
│ ├── Rendering
│ ├── BunitComponentActivator.cs
│ ├── BunitHtmlParser.cs
│ ├── BunitRenderer.cs
│ ├── BunitRendererLoggerExtensions.cs
│ ├── BunitRootComponent.cs
│ ├── ComponentDisposedException.cs
│ ├── ComponentNotFoundException.cs
│ ├── IRenderedComponent.cs
│ ├── IRenderedComponent{TComponent}.cs
│ ├── Internal
│ │ ├── BunitHtmlParserHelpers.cs
│ │ └── Htmlizer.cs
│ ├── MissingRendererInfoException.cs
│ ├── RenderModeMisMatchException.cs
│ ├── RenderedComponent.cs
│ ├── RootComponent.cs
│ ├── RootRenderTree.cs
│ ├── RootRenderTreeRegistration.cs
│ └── UnknownEventHandlerIdException.cs
│ ├── TestContext.cs
│ ├── TestDoubles
│ ├── Authorization
│ │ ├── AuthorizationState.cs
│ │ ├── BunitAuthenticationStateProvider.cs
│ │ ├── BunitAuthorizationContext.cs
│ │ ├── BunitAuthorizationExtensions.cs
│ │ ├── BunitAuthorizationPolicyProvider.cs
│ │ ├── BunitAuthorizationService.cs
│ │ ├── MissingBunitAuthorizationException.cs
│ │ ├── PlaceholderAuthenticationStateProvider.cs
│ │ ├── PlaceholderAuthorizationService.cs
│ │ └── TestPolicyRequirement.cs
│ ├── Components
│ │ ├── CapturedParameterView{TComponent}.cs
│ │ ├── ComponentDoubleBase{TComponent}.cs
│ │ ├── ParameterNotFoundException.cs
│ │ └── Stub{TComponent}.cs
│ ├── ErrorBoundary
│ │ └── BunitErrorBoundaryLogger.cs
│ ├── HttpClient
│ │ ├── MissingMockHttpClientException.cs
│ │ └── PlaceholderHttpClient.cs
│ ├── Localization
│ │ ├── MissingMockStringLocalizationException.cs
│ │ └── PlaceholderStringLocalization.cs
│ ├── NavigationInterception
│ │ └── BunitNavigationInterception.cs
│ ├── NavigationManager
│ │ ├── BunitNavigationManager.cs
│ │ ├── BunitSignOutSessionStateManager.cs
│ │ ├── NavigationHistory.cs
│ │ └── NavigationState.cs
│ ├── PersistentComponentState
│ │ ├── BunitPersistentComponentState.cs
│ │ ├── BunitPersistentComponentStateStore.cs
│ │ └── TestContextExtensions.cs
│ ├── ScrollToLocationHash
│ │ └── BunitScrollToLocationHash.cs
│ └── WebAssemblyHostEnvironment
│ │ └── BunitWebAssemblyHostEnvironment.cs
│ └── bunit.csproj
├── tests
├── .editorconfig
├── Directory.Build.props
├── bunit.generators.tests
│ ├── VerifyInitializer.cs
│ ├── Web.AngleSharp
│ │ ├── WrapperElementsGeneratorTest.Generator#ElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlAnchorElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlAreaElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlAudioElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlBaseElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlBodyElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlBreakRowElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlButtonElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlCanvasElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlCommandElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlDataElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlDataListElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlDetailsElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlDialogElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlDivElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlEmbedElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlFieldSetElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlFormElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlHeadElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlHeadingElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlHrElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlHtmlElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlImageElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlInlineFrameElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlInputElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlKeygenElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlLabelElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlLegendElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlLinkElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlListItemElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlMapElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlMarqueeElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlMediaElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlMenuElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlMenuItemElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlMetaElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlMeterElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlModElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlObjectElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlOptionElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlOptionsGroupElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlOrderedListElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlOutputElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlParagraphElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlParamElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlPictureElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlPreElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlProgressElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlQuoteElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlScriptElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlSelectElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlSlotElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlSourceElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlSpanElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlStyleElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlTableCaptionElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlTableCellElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlTableColumnElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlTableDataCellElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlTableElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlTableHeaderCellElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlTableRowElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlTableSectionElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlTemplateElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlTextAreaElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlTimeElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlTitleElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlTrackElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlUnknownElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlUnorderedListElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#HtmlVideoElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#IElementWrapper.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#IElementWrapperFactory.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#WrapperBase.g.verified.cs
│ │ ├── WrapperElementsGeneratorTest.Generator#WrapperExtensions.g.verified.cs
│ │ └── WrapperElementsGeneratorTest.cs
│ ├── Web.Stub
│ │ ├── AddStubGeneratorTest.cs
│ │ └── Components
│ │ │ ├── ButtonComponent.cs
│ │ │ ├── ContainerComponent.cs
│ │ │ ├── CounterComponent.cs
│ │ │ └── ParentComponent.cs
│ └── bunit.generators.tests.csproj
├── bunit.testassets
│ ├── AssertExtensions
│ │ └── CollectionAssertExtensions.cs
│ ├── BlazorE2E
│ │ ├── AddRemoveChildComponents.razor
│ │ ├── AsyncEventHandlerComponent.razor
│ │ ├── ComponentRefComponent.razor
│ │ ├── ComponentWithEscapableCharacters.razor
│ │ ├── ConcurrentRenderChild.razor
│ │ ├── ConcurrentRenderParent.razor
│ │ ├── CounterComponent.razor
│ │ ├── CounterComponentUsingChild.razor
│ │ ├── CounterComponentWrapper.razor
│ │ ├── DataDashComponent.razor
│ │ ├── DispatchingComponent.razor
│ │ ├── DuplicateAttributesComponent.razor
│ │ ├── DuplicateAttributesOnElementChildComponent.razor
│ │ ├── ElementRefComponent.razor
│ │ ├── HierarchicalImportsTest
│ │ │ ├── Subdir
│ │ │ │ ├── ComponentUsingImports.razor
│ │ │ │ └── _Imports.razor
│ │ │ └── _Imports.razor
│ │ ├── HtmlBlockChildContent.razor
│ │ ├── HtmlEncodedChildContent.razor
│ │ ├── HtmlMixedChildContent.razor
│ │ ├── KeyPressEventComponent.razor
│ │ ├── LabelQueryCounter.razor
│ │ ├── LogicalElementInsertionCases.razor
│ │ ├── MarkupBlockComponent.razor
│ │ ├── MessageComponent.razor
│ │ ├── MovingCheckboxesComponent.razor
│ │ ├── MultipleChildContent.razor
│ │ ├── NOTICE.md
│ │ ├── OrderedList.razor
│ │ ├── ParentChildComponent.razor
│ │ ├── PassThroughContentComponent.razor
│ │ ├── PropertiesChangedHandlerChild.razor
│ │ ├── PropertiesChangedHandlerParent.razor
│ │ ├── RazorTemplates.razor
│ │ ├── RedTextComponent.razor
│ │ ├── RenderFragmentToggler.razor
│ │ ├── SvgCircleComponent.razor
│ │ ├── SvgComponent.razor
│ │ ├── SvgWithChildComponent.razor
│ │ ├── TemplatedTable.razor
│ │ ├── TextOnlyComponent.razor
│ │ └── _Imports.razor
│ ├── ComponentWithButton.razor
│ ├── DumpCapture.cs
│ ├── ExcludeFromCodeCoverage.cs
│ ├── RenderModes
│ │ ├── ComponentThatPrintsAssignedRenderMode.razor
│ │ ├── ComponentWithChildContent.razor
│ │ ├── ComponentWithServerRenderMode.razor
│ │ ├── ComponentWithWebAssemblyRenderMode.razor
│ │ ├── ComponentWithoutRenderMode.razor
│ │ ├── InteractiveAutoComponent.razor
│ │ ├── InteractiveServerComponent.razor
│ │ ├── InteractiveWebAssemblyComponent.razor
│ │ ├── RendererInfoComponent.cs
│ │ └── SectionOutletComponent.cs
│ ├── SampleComponents
│ │ ├── AllTypesOfParams.cs
│ │ ├── App.razor
│ │ ├── AsyncRenderChangesProperty.razor
│ │ ├── AsyncRenderOfSubComponentDuringInit.razor
│ │ ├── AuthCascading.razor
│ │ ├── BasicComponent.cs
│ │ ├── BubbleEventsRemoveTriggers.razor
│ │ ├── BubbleEventsThrows.razor
│ │ ├── ButtonsInsideForm.razor
│ │ ├── ClickAddsLi.razor
│ │ ├── ClickCounter.razor
│ │ ├── ClickEventBubbling.razor
│ │ ├── ClickRemovesEventHandler.razor
│ │ ├── ComponentWithRelativeUnitAsWidth.razor
│ │ ├── ConstructorInjectionComponent.cs
│ │ ├── CounterComponentDynamic.razor
│ │ ├── CustomElement.razor
│ │ ├── CustomPasteSample.razor
│ │ ├── CustomPasteSample.razor.cs
│ │ ├── Data
│ │ │ ├── AsyncNameDep.cs
│ │ │ ├── Cars.cs
│ │ │ ├── Foo.cs
│ │ │ ├── FooTypeConverter.cs
│ │ │ ├── IAsyncTestDep.cs
│ │ │ ├── ITestDep.cs
│ │ │ └── ThemeInfo.cs
│ │ ├── DelayRemovedRenderFragment.razor
│ │ ├── DelayRenderFragment.razor
│ │ ├── DispatcherException.razor
│ │ ├── DisposeComponents
│ │ │ ├── ChildDispose.razor
│ │ │ ├── DisposeFragments.razor
│ │ │ └── ParentDispose.razor
│ │ ├── EventBubbles.cs
│ │ ├── EventHandlerThrows.razor
│ │ ├── FormNameComponent.razor
│ │ ├── FormWithButton.razor
│ │ ├── FormWithValidation.razor
│ │ ├── FullBind.cs
│ │ ├── HidesButton.razor
│ │ ├── InputChangeEventSample.razor
│ │ ├── InvokeAsyncInsideContinueWith.razor
│ │ ├── LifeCycleTracker.razor
│ │ ├── LoadingComponent.razor
│ │ ├── MainLayout.razor
│ │ ├── MultipleStateHasChangedInOnParametersSet.cs
│ │ ├── NoArgs.razor
│ │ ├── OnChangeBindSample.razor
│ │ ├── OnChangeMultipleBindSample.razor
│ │ ├── OnsubmitButton.razor
│ │ ├── PersistentComponentStateSample.razor
│ │ ├── PersistentComponentStateSample.razor.cs
│ │ ├── PrintCascadingValue.razor
│ │ ├── PrintCurrentUrl.razor
│ │ ├── RefToSimple1Child.razor
│ │ ├── RenderCounter.razor
│ │ ├── RenderOnClick.razor
│ │ ├── ScopedCssElements.razor
│ │ ├── ScopedCssElements.razor.css
│ │ ├── SignOutSessionManagerLoginDisplay.razor
│ │ ├── Simple1.cs
│ │ ├── SimpleAuthView.razor
│ │ ├── SimpleAuthViewWithClaims.razor
│ │ ├── SimpleAuthViewWithCustomAuthType.razor
│ │ ├── SimpleAuthViewWithPolicy.razor
│ │ ├── SimpleAuthViewWithRole.razor
│ │ ├── SimpleBind.cs
│ │ ├── SimplePage.razor
│ │ ├── SimpleSvg.razor
│ │ ├── SimpleUsingLocalizer.razor
│ │ ├── SimpleUsingWebAssemblyHostEnvironment.razor
│ │ ├── SimpleWithAyncDeps.razor
│ │ ├── SimpleWithDeps.razor
│ │ ├── SimpleWithHttpClient.razor
│ │ ├── SimpleWithJSRuntimeDep.razor
│ │ ├── SimpleWithTemplate.razor
│ │ ├── SubmitFormOnClick.razor
│ │ ├── ThemedButton.razor
│ │ ├── ThrowsOnParameterSet.cs
│ │ ├── ToggleChildComponent.razor
│ │ ├── ToggleClickHandler.razor
│ │ ├── ToggleableDetails.razor
│ │ ├── TriggerChildContentRerenderViaClick.razor
│ │ ├── TriggerTester.cs
│ │ ├── TwoChildren.razor
│ │ ├── TwoComponentWrapper.cs
│ │ ├── TwoRendersTwoChanges.razor
│ │ ├── Wrapper.cs
│ │ └── WrapperDiv.cs
│ ├── Serilog.Sinks.XUnit
│ │ ├── NOTICE.md
│ │ ├── TestOutputSink.cs
│ │ └── XUnitLoggerConfigurationExtensions.cs
│ ├── ServiceCollectionLoggingExtensions.cs
│ ├── XunitExtensions
│ │ ├── RepeatAttribute.cs
│ │ ├── TheoryDataExtensions.cs
│ │ └── UseCultureAttribute.cs
│ ├── _Imports.razor
│ └── bunit.testassets.csproj
├── bunit.tests
│ ├── Assembly.cs
│ ├── Asserting
│ │ ├── CompareToDiffingExtensionsTest.cs
│ │ ├── JSRuntimeAssertExtensionsTest.cs
│ │ ├── MarkupMatchesAssertExtensionsTest.cs
│ │ └── MarkupMatchesTest.razor
│ ├── BlazorE2E
│ │ └── ComponentRenderingTest.cs
│ ├── BunitContextTest.cs
│ ├── BunitServiceProviderTest.cs
│ ├── ComponentFactories
│ │ ├── ConditionalComponentFactoryTest.cs
│ │ ├── GenericComponentFactoryTest.cs
│ │ ├── InstanceComponentFactoryTest.cs
│ │ ├── StubComponentFactoryTest.cs
│ │ └── TypeBasedComponentFactoryTest.cs
│ ├── ComponentParameterCollectionBuilderTest.cs
│ ├── ComponentParameterCollectionBuilderTests.razor
│ ├── ComponentParameterCollectionTest.cs
│ ├── EventDispatchExtensions
│ │ ├── ClipboardEventDispatchExtensionsTest.cs
│ │ ├── DetailsElementEventDispatcherExtensionsTest.cs
│ │ ├── DragEventDispatchExtensionsTest.cs
│ │ ├── EventDispatchExtensionsTest.cs
│ │ ├── FocusEventDispatchExtensionsTest.cs
│ │ ├── FormDispatchExtensionTest.cs
│ │ ├── GeneralEventDispatchExtensionsTest.cs
│ │ ├── InputEventDispatchExtensionsTest.cs
│ │ ├── KeyTest.cs
│ │ ├── KeyboardEventDispatchExtensionsTest.cs
│ │ ├── MouseEventDispatchExtensionsTest.cs
│ │ ├── PointerEventDispatchExtensionsTest.cs
│ │ ├── ProgressEventDispatchExtensionsTest.cs
│ │ ├── TouchEventDispatchExtensionsTest.cs
│ │ ├── TriggerEventSpy.cs
│ │ └── WheelEventDispatchExtensionsTest.cs
│ ├── Extensions
│ │ ├── InputFile
│ │ │ └── InputFileTest.cs
│ │ ├── RefreshingWrappedElementTest.cs
│ │ ├── RenderedComponentRenderExtensionsTest.cs
│ │ └── WaitForHelpers
│ │ │ ├── RenderedComponentWaitForElementsHelperExtensions.Test.cs
│ │ │ ├── RenderedComponentWaitForElementsHelperExtensionsTest.cs
│ │ │ └── RenderedComponentWaitForHelperExtensions.cs
│ ├── JSInterop
│ │ ├── BunitJSInteropTest.cs
│ │ ├── BunitJsObjectReferenceTest.cs
│ │ ├── InvocationHandlers
│ │ │ ├── FocusAsyncInvocationHandlerTest.cs
│ │ │ ├── FocusOnNavigateHandlerTest.cs
│ │ │ └── VirtualizeJsRuntimeInvocationHandlerTest.cs
│ │ ├── JSRuntimeInvocationTest.cs
│ │ └── JSRuntimeUnhandledInvocationExceptionTest.cs
│ ├── Rendering
│ │ ├── BunitComponentActivatorTest.cs
│ │ ├── BunitHtmlParserTest.cs
│ │ ├── BunitRendererTest.cs
│ │ ├── ComponentParameterTest.cs
│ │ ├── Internal
│ │ │ └── HtmlizerTest.cs
│ │ ├── RenderModeTest.razor
│ │ ├── RenderedComponentTest.cs
│ │ └── RootRenderTreeTest.cs
│ ├── ShouldlyExtensions.cs
│ ├── TestDoubles
│ │ ├── Authorization
│ │ │ ├── AuthorizationTest.cs
│ │ │ ├── BunitAuthenticationStateProviderTest.cs
│ │ │ ├── BunitAuthorizationContextTest.cs
│ │ │ ├── BunitAuthorizationPolicyProviderTest.cs
│ │ │ └── BunitAuthorizationServiceTest.cs
│ │ ├── BunitSignOutSessionStateManagerTest.cs
│ │ ├── BunitWebAssemblyHostEnvironmentTest.cs
│ │ ├── Components
│ │ │ ├── CapturedParameterViewTest.cs
│ │ │ ├── ComponentDoubleBaseTest.cs
│ │ │ └── StubTest.cs
│ │ ├── NavigationManager
│ │ │ ├── BunitNavigationInterceptionTest.cs
│ │ │ └── BunitNavigationManagerTest.cs
│ │ └── PersistentComponentState
│ │ │ └── BunitPersistentComponentStateTest.cs
│ ├── TestUtilities
│ │ └── JSRuntimeInvocationAssertionHelpers.cs
│ ├── _Imports.razor
│ ├── bunit.tests.csproj
│ └── xunit.runner.json
├── bunit.web.query.tests
│ ├── Labels
│ │ └── LabelQueryExtensionsTest.cs
│ └── bunit.web.query.tests.csproj
├── run-tests.ps1
└── xunit.runner.json
└── version.json
/.config/dotnet-tools.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": 1,
3 | "isRoot": true,
4 | "tools": {
5 | "dotnet-serve": {
6 | "version": "1.10.175",
7 | "commands": [
8 | "dotnet-serve"
9 | ],
10 | "rollForward": false
11 | },
12 | "docfx": {
13 | "version": "2.78.2",
14 | "commands": [
15 | "docfx"
16 | ],
17 | "rollForward": false
18 | },
19 | "dotnet-dump": {
20 | "version": "9.0.553101",
21 | "commands": [
22 | "dotnet-dump"
23 | ],
24 | "rollForward": false
25 | }
26 | }
27 | }
--------------------------------------------------------------------------------
/.devcontainer/post-install.sh:
--------------------------------------------------------------------------------
1 | #/bin/bash
2 |
3 | # Install docfx (should be aligned with docs-deploy.yml)
4 | dotnet tool restore
5 |
6 | # Trust dotnet developer certs
7 | dotnet dev-certs https --check --trust
8 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | * text=auto
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: [bUnit-dev] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
4 | #patreon: # Replace with a single Patreon username
5 | #open_collective: # Replace with a single Open Collective username
6 | #ko_fi: # Replace with a single Ko-fi username
7 | #tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8 | #community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9 | #liberapay: # Replace with a single Liberapay username
10 | #issuehunt: # Replace with a single IssueHunt username
11 | #otechie: # Replace with a single Otechie username
12 | #custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
13 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/config.yml:
--------------------------------------------------------------------------------
1 | blank_issues_enabled: true
2 | contact_links:
3 | - name: Questions and Discussions
4 | url: https://github.com/egil/bUnit/discussions/new
5 | about: Is your issue perhaps more of a discussion or question? Please open topics for discussion or questions using the new GitHub Discussions feature. Remember to choose the right category.
6 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: Suggest an idea or enhancement for this project
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 |
11 |
12 | **Is the feature request related to a problem? Please elaborate.**
13 |
14 |
15 |
16 | **The suggested solution**
17 |
18 |
19 |
20 | **Describe any alternative solutions**
21 |
22 |
23 |
24 | **Additional context**
25 |
26 |
27 |
--------------------------------------------------------------------------------
/.github/codeql/codeql-config.yml:
--------------------------------------------------------------------------------
1 | queries:
2 | - uses: security-and-quality
3 |
4 | paths:
5 | - src
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | # To get started with Dependabot version updates, you'll need to specify which
2 | # package ecosystems to update and where the package manifests are located.
3 | # Please see the documentation for all configuration options:
4 | # https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
5 |
6 | version: 2
7 | updates:
8 | - package-ecosystem: "nuget" # See documentation for possible values
9 | directory: "/" # Location of package manifests
10 | schedule:
11 | interval: "daily"
12 | - package-ecosystem: "github-actions"
13 | directory: "/"
14 | schedule:
15 | interval: "daily"
--------------------------------------------------------------------------------
/.github/pull_request_template.md:
--------------------------------------------------------------------------------
1 | ## Pull request description
2 |
6 |
7 | ### PR meta checklist
8 | - [ ] Pull request is targeted at `main` branch for code
9 | or targeted at `stable` branch for documentation that is live on bunit.dev.
10 | - [ ] Pull request is linked to all related issues, if any.
11 | - [ ] I have read the _CONTRIBUTING.md_ document.
12 |
13 | ### Code PR specific checklist
14 | - [ ] My code follows the code style of this project and AspNetCore coding guidelines.
15 | - [ ] My change requires a change to the documentation.
16 | - [ ] I have updated the documentation accordingly.
17 | - [ ] I have updated the appropriate sub section in the _CHANGELOG.md_.
18 | - [ ] I have added, updated or removed tests to according to my changes.
19 | - [ ] All tests passed.
20 |
--------------------------------------------------------------------------------
/.vscode/tasks.json:
--------------------------------------------------------------------------------
1 | {
2 | // See https://go.microsoft.com/fwlink/?LinkId=733558
3 | // for the documentation about the tasks.json format
4 | "version": "2.0.0",
5 | "tasks": [
6 | {
7 | "label": "Serve Docs (Without Build)",
8 | "type": "shell",
9 | "command": "dotnet docfx metadata docs/site/docfx.json && dotnet docfx docs/site/docfx.json --serve"
10 | },
11 | {
12 | "label": "Serve Docs (With Build for API Documentation)",
13 | "type": "shell",
14 | "command": "dotnet build -c Release && dotnet docfx metadata docs/site/docfx.json && docfx docs/site/docfx.json --serve"
15 | },
16 | {
17 | "label": "Run all tests (Release Mode)",
18 | "type": "shell",
19 | "command": "dotnet test -c Release"
20 | }
21 | ]
22 | }
--------------------------------------------------------------------------------
/CODE-OF-CONDUCT.md:
--------------------------------------------------------------------------------
1 | This project has adopted the code of conduct defined by the Contributor Covenant to clarify expected behavior in our community.
2 | For more information see the [.NET Foundation Code of Conduct](https://dotnetfoundation.org/code-of-conduct).
3 |
--------------------------------------------------------------------------------
/NuGet.Config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/bunit-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bUnit-dev/bUnit/f1cb385597097f6883731c99cecdd2ea3d9efb37/bunit-logo.png
--------------------------------------------------------------------------------
/docs/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | tab_size = 2
5 | indent_style = space
6 | indent_size = 2
7 | indent_width = 2
8 | charset = utf-8
9 | trim_trailing_whitespace = true
10 | insert_final_newline = false
11 |
12 | [*.md]
13 | trim_trailing_whitespace = false
14 |
15 | [*.{cs,razor}]
16 | tab_size = 2
17 | indent_style = space
18 | indent_size = 2
19 | indent_width = 2
20 |
21 | dotnet_diagnostic.BL0001.severity = none
22 | dotnet_diagnostic.BL0002.severity = none
23 | dotnet_diagnostic.BL0003.severity = none
24 | dotnet_diagnostic.BL0004.severity = none
25 | dotnet_diagnostic.BL0005.severity = none
26 | dotnet_diagnostic.BL0006.severity = none
--------------------------------------------------------------------------------
/docs/Directory.Build.props:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/docs/samples/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | indent_style = space
5 | tab_size = 2
6 | indent_size = 2
7 | indent_width = 2
8 | charset = utf-8
9 | trim_trailing_whitespace = true
10 | insert_final_newline = false
11 |
12 | [*.md]
13 | trim_trailing_whitespace = false
14 |
15 | [*.{cs,razor}]
16 | tab_size = 2
17 | indent_style = space
18 | indent_size = 2
19 | indent_width = 2
20 |
21 | dotnet_diagnostic.BL0001.severity = none
22 | dotnet_diagnostic.BL0002.severity = none
23 | dotnet_diagnostic.BL0003.severity = none
24 | dotnet_diagnostic.BL0004.severity = none
25 | dotnet_diagnostic.BL0005.severity = none
26 | dotnet_diagnostic.BL0006.severity = none
27 | dotnet_diagnostic.BL0007.severity = none
--------------------------------------------------------------------------------
/docs/samples/components/Alert.razor:
--------------------------------------------------------------------------------
1 | @code {
2 | [Parameter] public string Heading { get; set; }
3 | [Parameter] public AlertType Type { get; set; }
4 | [Parameter] public RenderFragment ChildContent { get; set; }
5 | }
6 |
7 | @if (!string.IsNullOrWhiteSpace(Heading))
8 | {
9 |
@Heading
10 | }
11 |
12 | @ChildContent
13 |
14 |
17 |
--------------------------------------------------------------------------------
/docs/samples/components/AlertType.cs:
--------------------------------------------------------------------------------
1 | namespace Bunit.Docs.Samples
2 | {
3 | public enum AlertType
4 | {
5 | Info,
6 | Warning,
7 | Error
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/docs/samples/components/AsyncComponentLoader.razor:
--------------------------------------------------------------------------------
1 | @if (isLoading)
2 | {
3 | Loading...
4 | }
5 | else
6 | {
7 | @foreach (var item in Items)
8 | {
9 |
10 | }
11 | }
12 |
13 | @code {
14 | [Parameter] public List Items { get; set; } = new();
15 |
16 | private bool isLoading = true;
17 |
18 | protected override async Task OnInitializedAsync()
19 | {
20 | // Simulate async loading
21 | await Task.Delay(100);
22 | isLoading = false;
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/docs/samples/components/AsyncData.razor:
--------------------------------------------------------------------------------
1 | @text
2 |
3 | @code
4 | {
5 | string text = string.Empty;
6 | [Parameter] public Task TextService { get; set; }
7 |
8 | protected override async Task OnInitializedAsync()
9 | {
10 | text = await TextService;
11 | }
12 | }
--------------------------------------------------------------------------------
/docs/samples/components/AsyncDisposableComponent.razor:
--------------------------------------------------------------------------------
1 | @using Microsoft.JSInterop
2 | @implements IAsyncDisposable
3 | @inject IJSRuntime JSRuntime
4 | @code {
5 |
6 | public async ValueTask DisposeAsync()
7 | {
8 | await JSRuntime.InvokeVoidAsync("dispose");
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/docs/samples/components/Bar.razor:
--------------------------------------------------------------------------------
1 | Bar
--------------------------------------------------------------------------------
/docs/samples/components/Calc.razor:
--------------------------------------------------------------------------------
1 |
2 |
3 | @code
4 | {
5 | int result = 0;
6 |
7 | public void Calculate(int x, int y)
8 | {
9 | result = x + y;
10 | StateHasChanged();
11 | }
12 | }
--------------------------------------------------------------------------------
/docs/samples/components/CalcWithLoading.razor:
--------------------------------------------------------------------------------
1 |
2 |
3 | @code
4 | {
5 | int? result = 0;
6 |
7 | public async Task Calculate(int x, int y)
8 | {
9 | result = null;
10 | StateHasChanged();
11 | // Simulate an asynchronous operation, like fetching data.
12 | await Task.Delay(500);
13 | result = x + y;
14 | StateHasChanged();
15 | }
16 | }
--------------------------------------------------------------------------------
/docs/samples/components/CalcWithReturnValue.razor:
--------------------------------------------------------------------------------
1 |
2 |
3 | @code
4 | {
5 | int result = 0;
6 |
7 | public int Calculate(int x, int y)
8 | {
9 | result = x + y;
10 | StateHasChanged();
11 | return result;
12 | }
13 | }
--------------------------------------------------------------------------------
/docs/samples/components/CascadingParams.razor:
--------------------------------------------------------------------------------
1 | @code
2 | {
3 | [CascadingParameter]
4 | public bool IsDarkTheme { get; set; }
5 |
6 | [CascadingParameter(Name = "LoggedInUser")]
7 | public string UserName { get; set; }
8 |
9 | [CascadingParameter(Name = "LoggedInEmail")]
10 | public string Email { get; set; }
11 | }
--------------------------------------------------------------------------------
/docs/samples/components/CheckList.razor:
--------------------------------------------------------------------------------
1 |
4 |
5 | @foreach (var item in items)
6 | {
7 | - items.Remove(item)">@item
8 | }
9 |
10 | @code
11 | {
12 | private string newItemValue = string.Empty;
13 | private List items = new List();
14 |
15 | private void OnTextInput(KeyboardEventArgs args)
16 | {
17 | if(args.Key == "Enter")
18 | {
19 | items.Add(newItemValue);
20 | newItemValue = string.Empty;
21 | }
22 | }
23 | }
--------------------------------------------------------------------------------
/docs/samples/components/ChildContentParams.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Threading.Tasks;
5 | using Microsoft.AspNetCore.Components;
6 | using Microsoft.AspNetCore.Components.Web;
7 |
8 | namespace Bunit.Docs.Samples
9 | {
10 | public class ChildContentParams : ComponentBase
11 | {
12 | [Parameter]
13 | public RenderFragment ChildContent { get; set; }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/docs/samples/components/ClickMe.razor:
--------------------------------------------------------------------------------
1 |
2 | @code
3 | {
4 | void ClickHandler(MouseEventArgs args)
5 | {
6 | // ...
7 | }
8 | }
--------------------------------------------------------------------------------
/docs/samples/components/Counter.razor:
--------------------------------------------------------------------------------
1 | Counter
2 |
3 |
4 | Current count: @currentCount
5 |
6 |
7 |
8 |
9 | @code {
10 | int currentCount = 0;
11 |
12 | void IncrementCount()
13 | {
14 | currentCount++;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/docs/samples/components/CounterWithFancyParagraph.razor:
--------------------------------------------------------------------------------
1 | Counter
2 |
3 |
4 |
5 |
6 |
7 | @code {
8 | int currentCount = 0;
9 |
10 | void IncrementCount()
11 | {
12 | currentCount++;
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/docs/samples/components/DisposableComponent.razor:
--------------------------------------------------------------------------------
1 | @using Microsoft.AspNetCore.Components.Routing
2 | @implements IDisposable
3 | @inject NavigationManager NavigationManager
4 | @code {
5 | [Parameter] public Action LocationChangedCallback { get; set; }
6 |
7 | protected override void OnInitialized()
8 | {
9 | NavigationManager.LocationChanged += OnLocationChanged;
10 | }
11 |
12 | public void Dispose()
13 | {
14 | NavigationManager.LocationChanged -= OnLocationChanged;
15 | }
16 |
17 | private void OnLocationChanged(object sender, LocationChangedEventArgs e)
18 | {
19 | LocationChangedCallback(e.Location);
20 | }
21 | }
--------------------------------------------------------------------------------
/docs/samples/components/EventCallbackParams.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Threading.Tasks;
5 | using Microsoft.AspNetCore.Components;
6 | using Microsoft.AspNetCore.Components.Web;
7 |
8 | namespace Bunit.Docs.Samples
9 | {
10 | public class EventCallbackParams : ComponentBase
11 | {
12 | [Parameter]
13 | public EventCallback OnClick { get; set; }
14 |
15 | [Parameter]
16 | public EventCallback OnSomething { get; set; }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/docs/samples/components/ExceptionInDisposeAsyncComponent.razor:
--------------------------------------------------------------------------------
1 | @implements IAsyncDisposable
2 | @code {
3 | public async ValueTask DisposeAsync()
4 | {
5 | await Task.Delay(10);
6 | throw new NotSupportedException();
7 | }
8 | }
--------------------------------------------------------------------------------
/docs/samples/components/ExceptionInDisposeComponent.razor:
--------------------------------------------------------------------------------
1 | @implements IDisposable
2 | @code {
3 | public void Dispose()
4 | {
5 | throw new NotSupportedException();
6 | }
7 | }
--------------------------------------------------------------------------------
/docs/samples/components/FancyParagraph.razor:
--------------------------------------------------------------------------------
1 | @Text
2 | @code {
3 | [Parameter]
4 | public string Text { get; set; }
5 | }
--------------------------------------------------------------------------------
/docs/samples/components/FancyTable.razor:
--------------------------------------------------------------------------------
1 |
2 | Lorem lipsum captium
3 |
4 |
5 | | Foo |
6 | Bar |
7 |
8 |
9 | | Baz |
10 | Boo |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/docs/samples/components/Foo.razor:
--------------------------------------------------------------------------------
1 | Foo
--------------------------------------------------------------------------------
/docs/samples/components/Heading.razor:
--------------------------------------------------------------------------------
1 |
2 | Heading text
3 |
4 | Secondary text
5 |
6 |
--------------------------------------------------------------------------------
/docs/samples/components/HelloWorld.razor:
--------------------------------------------------------------------------------
1 | Hello world from Blazor
--------------------------------------------------------------------------------
/docs/samples/components/InjectAuthService.razor:
--------------------------------------------------------------------------------
1 | @using Microsoft.AspNetCore.Components.Authorization
2 | @inject AuthenticationStateProvider AuthenticationStateProvider
3 |
4 | Test Component
5 |
6 | @if (isAuthenticated)
7 | {
8 | User: @userName
9 | }
10 |
11 | @code{
12 | bool isAuthenticated = false;
13 | string userName;
14 |
15 | protected override async Task OnInitializedAsync()
16 | {
17 | var state = await AuthenticationStateProvider.GetAuthenticationStateAsync().ConfigureAwait(false);
18 | if (state != null)
19 | {
20 | this.isAuthenticated = state.User.Identity.IsAuthenticated;
21 | this.userName = state.User.Identity.Name;
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/docs/samples/components/Item.razor:
--------------------------------------------------------------------------------
1 | @Value
2 | @code
3 | {
4 | [Parameter]
5 | public string Value { get; set; }
6 | }
--------------------------------------------------------------------------------
/docs/samples/components/ListItem.razor:
--------------------------------------------------------------------------------
1 | @Value
2 |
3 | @code {
4 | [Parameter] public string Value { get; set; } = string.Empty;
5 | }
6 |
--------------------------------------------------------------------------------
/docs/samples/components/NonBlazorTypesParams.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Threading.Tasks;
5 | using Microsoft.AspNetCore.Components;
6 | using Microsoft.AspNetCore.Components.Web;
7 |
8 | namespace Bunit.Docs.Samples
9 | {
10 | public class NonBlazorTypesParams : ComponentBase
11 | {
12 | [Parameter]
13 | public int Numbers { get; set; }
14 |
15 | [Parameter]
16 | public List Lines { get; set; }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/docs/samples/components/PrintCascadingValue.razor:
--------------------------------------------------------------------------------
1 | Cascading value: @Value
2 | @code
3 | {
4 | [CascadingParameter]
5 | public string Value { get; set; }
6 | }
--------------------------------------------------------------------------------
/docs/samples/components/RenderFragmentParams.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Linq;
3 | using System.Threading.Tasks;
4 | using Microsoft.AspNetCore.Components;
5 | using Microsoft.AspNetCore.Components.Web;
6 |
7 | namespace Bunit.Docs.Samples
8 | {
9 | public class RenderFragmentParams : ComponentBase
10 | {
11 | [Parameter]
12 | public RenderFragment Content { get; set; }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/docs/samples/components/SimpleTodo.razor:
--------------------------------------------------------------------------------
1 | @inject List Tasks
2 |
3 |
7 |
8 | @foreach (var task in Tasks)
9 | {
10 | - @task
11 | }
12 |
13 | @code {
14 | [CascadingParameter(Name = "Theme")]
15 | public string ThemeClass { get; set; } = string.Empty;
16 |
17 | private string newTaskValue = string.Empty;
18 |
19 | private void HandleTaskAdded()
20 | {
21 | if (!string.IsNullOrWhiteSpace(newTaskValue))
22 | Tasks.Add(newTaskValue);
23 |
24 | newTaskValue = string.Empty;
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/docs/samples/components/TemplateParams.razor:
--------------------------------------------------------------------------------
1 | @typeparam TItem
2 |
3 |
4 | @foreach (var item in Items)
5 | {
6 | @Template(item)
7 | }
8 |
9 |
10 | @code
11 | {
12 | [Parameter]
13 | public IEnumerable Items { get; set; }
14 |
15 | [Parameter]
16 | public RenderFragment Template { get; set; }
17 | }
18 |
--------------------------------------------------------------------------------
/docs/samples/components/TwoWayBinding.razor:
--------------------------------------------------------------------------------
1 | @code {
2 | [Parameter] public string Value { get; set; } = string.Empty;
3 | [Parameter] public EventCallback ValueChanged { get; set; }
4 | }
--------------------------------------------------------------------------------
/docs/samples/components/UnmatchedParams.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Threading.Tasks;
5 | using Microsoft.AspNetCore.Components;
6 | using Microsoft.AspNetCore.Components.Web;
7 |
8 | namespace Bunit.Docs.Samples
9 | {
10 | public class UnmatchedParams : ComponentBase
11 | {
12 | [Parameter(CaptureUnmatchedValues = true)]
13 | public Dictionary InputAttributes { get; set; }
14 | }
15 | }
--------------------------------------------------------------------------------
/docs/samples/components/UserInfo.razor:
--------------------------------------------------------------------------------
1 | @using Microsoft.AspNetCore.Components.Authorization
2 | @inject AuthenticationStateProvider AuthenticationStateProvider
3 |
4 | @if (isAuthenticated)
5 | {
6 | Welcome @userName
7 | }
8 | @if (!isAuthenticated)
9 | {
10 | Please log in!
11 | }
12 |
13 |
14 | State: Authorized
15 |
16 |
17 | State: Authorizing
18 |
19 |
20 | State: Not authorized
21 |
22 |
23 | @code
24 | {
25 | bool isAuthenticated = false;
26 | string userName;
27 |
28 | protected override async Task OnParametersSetAsync()
29 | {
30 | var state = await AuthenticationStateProvider.GetAuthenticationStateAsync();
31 | isAuthenticated = state.User.Identity.IsAuthenticated;
32 | userName = state.User.Identity.Name;
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/docs/samples/components/WeatherForecastService.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Linq;
3 | using System.Threading.Tasks;
4 |
5 | namespace Bunit.Docs.Samples
6 | {
7 | public interface IWeatherForecastService
8 | {
9 | Task GetForecastAsync(DateTime startDate);
10 | }
11 |
12 | public class WeatherForecast
13 | {
14 | public DateTime Date { get; set; }
15 |
16 | public int TemperatureC { get; set; }
17 |
18 | public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
19 |
20 | public string Summary { get; set; }
21 | }
22 |
23 | public class WeatherForecastService : IWeatherForecastService
24 | {
25 | public Task GetForecastAsync(DateTime startDate)
26 | => Task.FromResult(Array.Empty());
27 | }
28 | }
--------------------------------------------------------------------------------
/docs/samples/components/WeatherForecastTabel.razor:
--------------------------------------------------------------------------------
1 | @code
2 | {
3 | [Parameter] public IEnumerable Forecasts { get; set; }
4 | }
--------------------------------------------------------------------------------
/docs/samples/components/WeatherForecasts.razor:
--------------------------------------------------------------------------------
1 | @inject IWeatherForecastService ForecastService
2 |
3 | Weather forecast
4 |
5 | This component demonstrates fetching data from a service.
6 |
7 | @if (Forecasts is null)
8 | {
9 | Loading...
10 | }
11 | else
12 | {
13 |
14 | }
15 |
16 | @code
17 | {
18 | public WeatherForecast[] Forecasts { get; private set; }
19 |
20 | protected override async Task OnInitializedAsync()
21 | {
22 | Forecasts = await ForecastService.GetForecastAsync(DateTime.Now);
23 | }
24 | }
--------------------------------------------------------------------------------
/docs/samples/components/Wrapper.razor:
--------------------------------------------------------------------------------
1 | @ChildContent
2 |
3 | @code
4 | {
5 | [Parameter]
6 | public RenderFragment ChildContent { get; set; }
7 | }
--------------------------------------------------------------------------------
/docs/samples/components/_Imports.razor:
--------------------------------------------------------------------------------
1 | @namespace Bunit.Docs.Samples
2 | @using Microsoft.AspNetCore.Components
3 | @using Microsoft.AspNetCore.Components.Web
4 |
--------------------------------------------------------------------------------
/docs/samples/components/bunit.docs.samples.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | net8.0;net9.0;net10.0
5 | Bunit.Docs.Samples
6 | enable
7 | CA1014,NU5104
8 | false
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/docs/samples/tests/Directory.Build.props:
--------------------------------------------------------------------------------
1 |
2 |
3 | net8.0;net9.0;net10.0
4 | false
5 | true
6 | false
7 | true
8 | latest
9 | enable
10 | CA1014,NU5104,xUnit1031
11 | false
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/docs/samples/tests/mstest/HelloWorldExplicitContextTest.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.VisualStudio.TestTools.UnitTesting;
2 | using Bunit;
3 |
4 | namespace Bunit.Docs.Samples;
5 |
6 | [TestClass]
7 | public class HelloWorldExplicitContext
8 | {
9 | [TestMethod]
10 | public void HelloWorldComponentRendersCorrectly()
11 | {
12 | // Arrange
13 | using var ctx = new Bunit.BunitContext();
14 |
15 | // Act
16 | var cut = ctx.Render();
17 |
18 | // Assert
19 | cut.MarkupMatches("Hello world from Blazor
");
20 | }
21 | }
--------------------------------------------------------------------------------
/docs/samples/tests/mstest/HelloWorldRazorTest.razor:
--------------------------------------------------------------------------------
1 | @attribute [TestClass]
2 | @inherits BunitContext
3 | @code
4 | {
5 | [TestMethod]
6 | public void HelloWorldComponentRendersCorrectly()
7 | {
8 | // Act
9 | var cut = Render(@);
10 |
11 | // Assert
12 | cut.MarkupMatches(@Hello world from Blazor
);
13 | }
14 | }
--------------------------------------------------------------------------------
/docs/samples/tests/mstest/HelloWorldTest.cs:
--------------------------------------------------------------------------------
1 | namespace Bunit.Docs.Samples;
2 |
3 | using Microsoft.VisualStudio.TestTools.UnitTesting;
4 | using Bunit;
5 |
6 | [TestClass]
7 | public class HelloWorldTest : BunitContext
8 | {
9 | [TestMethod]
10 | public void HelloWorldComponentRendersCorrectly()
11 | {
12 | // Act
13 | var cut = Render();
14 |
15 | // Assert
16 | cut.MarkupMatches("Hello world from Blazor
");
17 | }
18 | }
--------------------------------------------------------------------------------
/docs/samples/tests/mstest/_Imports.razor:
--------------------------------------------------------------------------------
1 | @using Microsoft.AspNetCore.Components.Forms
2 | @using Microsoft.AspNetCore.Components.Web
3 | @using Microsoft.JSInterop
4 | @using Microsoft.Extensions.DependencyInjection
5 | @using AngleSharp.Dom
6 | @using Bunit
7 | @using Bunit.TestDoubles
8 | @using Microsoft.VisualStudio.TestTools.UnitTesting
--------------------------------------------------------------------------------
/docs/samples/tests/mstest/bunit.docs.mstest.samples.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Bunit.Docs.Samples
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 | all
15 | runtime; build; native; contentfiles; analyzers; buildtransitive
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/docs/samples/tests/nunit/HelloWorldExplicitContextTest.cs:
--------------------------------------------------------------------------------
1 | using Bunit;
2 | using NUnit.Framework;
3 |
4 | namespace Bunit.Docs.Samples;
5 |
6 | public class HelloWorldExplicitContext
7 | {
8 | [Test]
9 | public void HelloWorldComponentRendersCorrectly()
10 | {
11 | // Arrange
12 | using var ctx = new Bunit.BunitContext();
13 |
14 | // Act
15 | var cut = ctx.Render();
16 |
17 | // Assert
18 | cut.MarkupMatches("Hello world from Blazor
");
19 | }
20 | }
--------------------------------------------------------------------------------
/docs/samples/tests/nunit/HelloWorldInstancePerTestCase.cs:
--------------------------------------------------------------------------------
1 | using NUnit.Framework;
2 |
3 | namespace Bunit.Docs.Samples;
4 |
5 | [FixtureLifeCycle(LifeCycle.InstancePerTestCase)]
6 | public class HelloWorldInstancePerTestCase : Bunit.BunitContext
7 | {
8 | [Test]
9 | public void HelloWorldComponentRendersCorrectly()
10 | {
11 | // Act
12 | var cut = Render();
13 |
14 | // Assert
15 | cut.MarkupMatches("Hello world from Blazor
");
16 | }
17 | }
--------------------------------------------------------------------------------
/docs/samples/tests/nunit/HelloWorldRazorInstancePerTestCase.razor:
--------------------------------------------------------------------------------
1 | @attribute [FixtureLifeCycle(LifeCycle.InstancePerTestCase)]
2 | @inherits Bunit.BunitContext
3 |
4 | @code {
5 | [Test]
6 | public void HelloWorldComponentRendersCorrectly()
7 | {
8 | // Act
9 | var cut = Render(@);
10 |
11 | // Assert
12 | cut.MarkupMatches(@Hello world from Blazor
);
13 | }
14 | }
--------------------------------------------------------------------------------
/docs/samples/tests/nunit/HelloWorldRazorTest.razor:
--------------------------------------------------------------------------------
1 | @inherits BunitContext
2 | @code
3 | {
4 | [Test]
5 | public void HelloWorldComponentRendersCorrectly()
6 | {
7 | // Act
8 | var cut = Render(@);
9 |
10 | // Assert
11 | cut.MarkupMatches(@Hello world from Blazor
);
12 | }
13 | }
--------------------------------------------------------------------------------
/docs/samples/tests/nunit/HelloWorldTest.cs:
--------------------------------------------------------------------------------
1 | namespace Bunit.Docs.Samples;
2 |
3 | using Bunit;
4 | using NUnit.Framework;
5 |
6 | public class HelloWorldTest : BunitContext
7 | {
8 | [Test]
9 | public void HelloWorldComponentRendersCorrectly()
10 | {
11 | // Act
12 | var cut = Render();
13 |
14 | // Assert
15 | cut.MarkupMatches("Hello world from Blazor
");
16 | }
17 | }
--------------------------------------------------------------------------------
/docs/samples/tests/nunit/_Imports.razor:
--------------------------------------------------------------------------------
1 | @using Microsoft.AspNetCore.Components.Forms
2 | @using Microsoft.AspNetCore.Components.Web
3 | @using Microsoft.JSInterop
4 | @using Microsoft.Extensions.DependencyInjection
5 | @using AngleSharp.Dom
6 | @using Bunit
7 | @using Bunit.TestDoubles
8 | @using NUnit.Framework
--------------------------------------------------------------------------------
/docs/samples/tests/nunit/bunit.docs.nunit.samples.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Bunit.Docs.Samples
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/docs/samples/tests/razor/CascadingParams1Test.razor:
--------------------------------------------------------------------------------
1 | @inherits BunitContext
2 |
3 | @code
4 | {
5 | [Fact]
6 | public void Test()
7 | {
8 | var isDarkTheme = true;
9 |
10 | var cut = Render(@
11 |
12 | );
13 | }
14 | }
--------------------------------------------------------------------------------
/docs/samples/tests/razor/CascadingParams2Test.razor:
--------------------------------------------------------------------------------
1 | @inherits BunitContext
2 |
3 | @code
4 | {
5 | [Fact]
6 | public void Test()
7 | {
8 | var cut = Render(@
9 |
10 | );
11 | }
12 | }
--------------------------------------------------------------------------------
/docs/samples/tests/razor/CascadingParams3Test.razor:
--------------------------------------------------------------------------------
1 | @inherits BunitContext
2 |
3 | @code
4 | {
5 | [Fact]
6 | public void Test()
7 | {
8 | var isDarkTheme = true;
9 |
10 | var cut = Render(@
11 |
12 |
13 |
14 |
15 |
16 | );
17 | }
18 | }
--------------------------------------------------------------------------------
/docs/samples/tests/razor/ChildContentParams1Test.razor:
--------------------------------------------------------------------------------
1 | @inherits BunitContext
2 |
3 | @code
4 | {
5 | [Fact]
6 | public void Test()
7 | {
8 | var cut = Render(@
9 | Hello World
10 | );
11 | }
12 | }
--------------------------------------------------------------------------------
/docs/samples/tests/razor/ChildContentParams2Test.razor:
--------------------------------------------------------------------------------
1 | @inherits BunitContext
2 |
3 | @code
4 | {
5 | [Fact]
6 | public void Test()
7 | {
8 | var cut = Render(@
9 |
10 | );
11 | }
12 | }
--------------------------------------------------------------------------------
/docs/samples/tests/razor/ChildContentParams3Test.razor:
--------------------------------------------------------------------------------
1 | @inherits BunitContext
2 |
3 | @code
4 | {
5 | [Fact]
6 | public void Test()
7 | {
8 | var cut = Render(@
9 |
10 | Hello World
11 |
12 | );
13 | }
14 | }
--------------------------------------------------------------------------------
/docs/samples/tests/razor/ChildContentParams4Test.razor:
--------------------------------------------------------------------------------
1 | @inherits BunitContext
2 |
3 | @code
4 | {
5 | [Fact]
6 | public void Test()
7 | {
8 | var cut = Render(@
9 | Below you will find a most interesting alert!
10 |
11 | Hello World
12 |
13 | );
14 | }
15 | }
--------------------------------------------------------------------------------
/docs/samples/tests/razor/ClickMeTest.razor:
--------------------------------------------------------------------------------
1 | @inherits BunitContext
2 |
3 | @code
4 | {
5 | [Fact]
6 | public void Test()
7 | {
8 | // Arrange
9 | var cut = Render(@);
10 | var buttonElement = cut.Find("button");
11 |
12 | // Act
13 | buttonElement.Click();
14 | buttonElement.Click(new MouseEventArgs { Detail = 3, CtrlKey = true });
15 | buttonElement.Click(new MouseEventArgs());
16 |
17 | // Assert
18 | // ...
19 | }
20 | }
--------------------------------------------------------------------------------
/docs/samples/tests/razor/CounterTest.razor:
--------------------------------------------------------------------------------
1 | @inherits BunitContext
2 | @code {
3 | [Fact]
4 | public void CounterShouldIncrementWhenClicked()
5 | {
6 | // Arrange: render the Counter.razor component
7 | var cut = Render(@);
8 |
9 | // Act: find and click the