From 0195da924913c745df9c79523a10fc4eff55281a Mon Sep 17 00:00:00 2001 From: m-akinc <7282195+m-akinc@users.noreply.github.com> Date: Wed, 8 May 2024 14:06:17 -0500 Subject: [PATCH] Refactor common Blazor acceptance test code (#2074) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Pull Request ## 🤨 Rationale Part of #1976 ## 👩‍💻 Implementation I've created a new project in `blazor-workspace` to contain code shared between the Nimble and Spright acceptance test projects. I ran into issues with the page components not being found when running tests from the VS Test Explorer. Through trial and error, I discovered that the `Setup` instance needed to be created in the same assembly as the page components for them to be discovered. Normally this is governed by the `AppAssembly` property of the `Router` component (in `App.razor`), but that is not used by the test runner. ## 🧪 Testing Tests pass. ## ✅ Checklist - [x] I have updated the project documentation to reflect my changes or determined no changes are needed. --------- Co-authored-by: Milan Raj --- packages/blazor-workspace/BlazorWorkspace.sln | 7 + packages/blazor-workspace/CONTRIBUTING.md | 9 + .../AcceptanceTestsBase.cs | 52 + .../BlazorWorkspace.Testing.Acceptance.csproj | 38 + .../MainLayout.razor | 3 +- .../MainLayout.razor.cs | 2 +- .../MainLayout.razor.css | 0 .../PlaywrightFixture.cs | 2 +- .../Properties/launchSettings.json | 12 + .../Startup.cs | 9 +- .../WebHostServerFixture.cs | 15 +- .../packages.lock.json | 1069 +++++++++++++++++ .../BlazorServerWebHostFixture.cs | 18 - .../NimbleBlazor.Tests.Acceptance.csproj | 1 + .../NimbleBlazorWebHostServerFixture.cs | 15 + .../NimbleBlazor.Tests.Acceptance/Program.cs | 6 +- .../Shared/MainLayout.razor.cs | 23 - .../SharedPlaywrightCollectionDefinition.cs | 3 +- .../Tests/AcceptanceTestsBase.cs | 61 - .../Tests/DialogTests.cs | 7 +- .../Tests/DrawerTests.cs | 7 +- .../Tests/NimbleAcceptanceTestsBase.cs | 18 + .../Tests/TableColumnMappingTests.cs | 5 +- .../Tests/TableColumnNumberTextTests.cs | 7 +- .../Tests/TableTests.cs | 7 +- .../Tests/ThemeProviderTests.cs | 7 +- .../Tests/WaferMapTests.cs | 7 +- .../WebHostServerFixture.cs | 46 - .../_Imports.razor | 2 +- .../packages.lock.json | 14 + .../wwwroot/css/site.css | 18 +- .../BlazorServerWebHostFixture.cs | 18 - .../PlaywrightFixture.cs | 44 - .../SprightBlazor.Tests.Acceptance/Program.cs | 6 +- .../Shared/MainLayout.razor | 20 - .../Shared/MainLayout.razor.css | 6 - .../SharedPlaywrightCollectionDefinition.cs | 3 +- .../SprightBlazor.Tests.Acceptance.csproj | 1 + .../SprightBlazorWebHostServerFixture.cs | 15 + .../SprightBlazor.Tests.Acceptance/Startup.cs | 32 - .../Tests/AcceptanceTestsBase.cs | 61 - .../Tests/RectangleTests.cs | 7 +- .../Tests/SprightAcceptanceTestsBase.cs | 18 + .../_Imports.razor | 2 +- .../packages.lock.json | 14 + .../wwwroot/css/site.css | 18 +- 46 files changed, 1364 insertions(+), 391 deletions(-) create mode 100644 packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/AcceptanceTestsBase.cs create mode 100644 packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/BlazorWorkspace.Testing.Acceptance.csproj rename packages/blazor-workspace/Tests/{NimbleBlazor.Tests.Acceptance/Shared => BlazorWorkspace.Testing.Acceptance}/MainLayout.razor (85%) rename packages/blazor-workspace/Tests/{SprightBlazor.Tests.Acceptance/Shared => BlazorWorkspace.Testing.Acceptance}/MainLayout.razor.cs (90%) rename packages/blazor-workspace/Tests/{NimbleBlazor.Tests.Acceptance/Shared => BlazorWorkspace.Testing.Acceptance}/MainLayout.razor.css (100%) rename packages/blazor-workspace/Tests/{NimbleBlazor.Tests.Acceptance => BlazorWorkspace.Testing.Acceptance}/PlaywrightFixture.cs (96%) create mode 100644 packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/Properties/launchSettings.json rename packages/blazor-workspace/Tests/{NimbleBlazor.Tests.Acceptance => BlazorWorkspace.Testing.Acceptance}/Startup.cs (74%) rename packages/blazor-workspace/Tests/{SprightBlazor.Tests.Acceptance => BlazorWorkspace.Testing.Acceptance}/WebHostServerFixture.cs (67%) create mode 100644 packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/packages.lock.json delete mode 100644 packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/BlazorServerWebHostFixture.cs create mode 100644 packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/NimbleBlazorWebHostServerFixture.cs delete mode 100644 packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Shared/MainLayout.razor.cs delete mode 100644 packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/AcceptanceTestsBase.cs create mode 100644 packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/NimbleAcceptanceTestsBase.cs delete mode 100644 packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/WebHostServerFixture.cs delete mode 100644 packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/BlazorServerWebHostFixture.cs delete mode 100644 packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/PlaywrightFixture.cs delete mode 100644 packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Shared/MainLayout.razor delete mode 100644 packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Shared/MainLayout.razor.css create mode 100644 packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/SprightBlazorWebHostServerFixture.cs delete mode 100644 packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Startup.cs delete mode 100644 packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Tests/AcceptanceTestsBase.cs create mode 100644 packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Tests/SprightAcceptanceTestsBase.cs diff --git a/packages/blazor-workspace/BlazorWorkspace.sln b/packages/blazor-workspace/BlazorWorkspace.sln index 312f365a41..dfb3b4027e 100644 --- a/packages/blazor-workspace/BlazorWorkspace.sln +++ b/packages/blazor-workspace/BlazorWorkspace.sln @@ -27,6 +27,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SprightBlazor.Tests", "Test EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SprightBlazor.Tests.Acceptance", "Tests\SprightBlazor.Tests.Acceptance\SprightBlazor.Tests.Acceptance.csproj", "{8E335572-CD8B-4879-8760-73416CF103B1}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlazorWorkspace.Testing.Acceptance", "Tests\BlazorWorkspace.Testing.Acceptance\BlazorWorkspace.Testing.Acceptance.csproj", "{D94A4535-51B3-4E70-9582-3F3A44C7A798}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -73,6 +75,10 @@ Global {8E335572-CD8B-4879-8760-73416CF103B1}.Debug|Any CPU.Build.0 = Debug|Any CPU {8E335572-CD8B-4879-8760-73416CF103B1}.Release|Any CPU.ActiveCfg = Release|Any CPU {8E335572-CD8B-4879-8760-73416CF103B1}.Release|Any CPU.Build.0 = Release|Any CPU + {D94A4535-51B3-4E70-9582-3F3A44C7A798}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D94A4535-51B3-4E70-9582-3F3A44C7A798}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D94A4535-51B3-4E70-9582-3F3A44C7A798}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D94A4535-51B3-4E70-9582-3F3A44C7A798}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -86,6 +92,7 @@ Global {7C65AEA1-8CA2-48DC-81FE-CE39295BDD4B} = {E5C31FAF-7DEF-494F-A0D2-C9A4875F2132} {CEA7A89F-CF8E-4128-927E-24CBBF2C8C63} = {E5C31FAF-7DEF-494F-A0D2-C9A4875F2132} {8E335572-CD8B-4879-8760-73416CF103B1} = {E5C31FAF-7DEF-494F-A0D2-C9A4875F2132} + {D94A4535-51B3-4E70-9582-3F3A44C7A798} = {E5C31FAF-7DEF-494F-A0D2-C9A4875F2132} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {38E2A588-0714-41E7-9BA3-D89622560FF9} diff --git a/packages/blazor-workspace/CONTRIBUTING.md b/packages/blazor-workspace/CONTRIBUTING.md index 35b9bf13a5..7662468497 100644 --- a/packages/blazor-workspace/CONTRIBUTING.md +++ b/packages/blazor-workspace/CONTRIBUTING.md @@ -107,6 +107,15 @@ Visual Studio Code commands are included to build and run the example projects. - `blazor-wasm-example:build`: Build the `Demo.Client` project - `blazor-wasm-example:watch`: Run the `Demo.Client` project in watch mode (to automatically pick up code changes) +## Creating a New Project + +When creating a new project in the Blazor workspace, ensure it includes the following configuration: + +- .NET version matches other projects in the workspace +- `true` +- `true` +- Package reference to `NI.CSharp.Analyzers` with same version spec as other projects + ## Additional Tips ### Enabling IIS diff --git a/packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/AcceptanceTestsBase.cs b/packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/AcceptanceTestsBase.cs new file mode 100644 index 0000000000..6615fd406d --- /dev/null +++ b/packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/AcceptanceTestsBase.cs @@ -0,0 +1,52 @@ +using Microsoft.Playwright; +using Xunit; + +namespace BlazorWorkspace.Testing.Acceptance; + +[Collection(nameof(PlaywrightFixture))] +public abstract class AcceptanceTestsBase +{ + private readonly PlaywrightFixture _playwrightFixture; + + protected abstract Uri ServerAddress { get; } + protected abstract string ComponentLibraryInitializationTestJavaScript { get; } + + protected AcceptanceTestsBase(PlaywrightFixture playwrightFixture) + { + _playwrightFixture = playwrightFixture; + } + + protected async Task NewPageForRouteAsync(string route) + { + var page = await _playwrightFixture.BrowserContext!.NewPageAsync(); + await NavigateToPageAsync(page, route); + await WaitForComponentsInitializationAsync(page); + return new AsyncDisposablePage(page); + } + + private async Task NavigateToPageAsync(IPage page, string route) + { + var address = new Uri(ServerAddress!, route).AbsoluteUri; + await page.GotoAsync(address); + } + + private async Task WaitForComponentsInitializationAsync(IPage page) + { + await page.WaitForFunctionAsync(ComponentLibraryInitializationTestJavaScript); + } + + protected sealed class AsyncDisposablePage : IAsyncDisposable + { + public IPage Page { get; private set; } + + public AsyncDisposablePage(IPage page) + { + Page = page; + } + + public async ValueTask DisposeAsync() + { + await Page.CloseAsync(); + } + } +} diff --git a/packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/BlazorWorkspace.Testing.Acceptance.csproj b/packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/BlazorWorkspace.Testing.Acceptance.csproj new file mode 100644 index 0000000000..20099d0c08 --- /dev/null +++ b/packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/BlazorWorkspace.Testing.Acceptance.csproj @@ -0,0 +1,38 @@ + + + net6.0 + enable + enable + true + true + + + + CA1716 + Properties + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + diff --git a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Shared/MainLayout.razor b/packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/MainLayout.razor similarity index 85% rename from packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Shared/MainLayout.razor rename to packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/MainLayout.razor index 708f84232b..c1fca87f02 100644 --- a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Shared/MainLayout.razor +++ b/packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/MainLayout.razor @@ -1,6 +1,7 @@ @using Microsoft.AspNetCore.Components +@using Microsoft.AspNetCore.Components.Web @using NimbleBlazor -@namespace NimbleBlazor.Tests.Acceptance.Shared +@namespace BlazorWorkspace.Testing.Acceptance @inherits LayoutComponentBase Nimble Blazor tests diff --git a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Shared/MainLayout.razor.cs b/packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/MainLayout.razor.cs similarity index 90% rename from packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Shared/MainLayout.razor.cs rename to packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/MainLayout.razor.cs index 5d7ec2d0e4..d8afda74a0 100644 --- a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Shared/MainLayout.razor.cs +++ b/packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/MainLayout.razor.cs @@ -3,7 +3,7 @@ using Microsoft.JSInterop; using NimbleBlazor; -namespace SprightBlazor.Tests.Acceptance.Shared; +namespace BlazorWorkspace.Testing.Acceptance; /// /// The MainLayout Component. diff --git a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Shared/MainLayout.razor.css b/packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/MainLayout.razor.css similarity index 100% rename from packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Shared/MainLayout.razor.css rename to packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/MainLayout.razor.css diff --git a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/PlaywrightFixture.cs b/packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/PlaywrightFixture.cs similarity index 96% rename from packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/PlaywrightFixture.cs rename to packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/PlaywrightFixture.cs index f8706d87e8..5d0751c0fe 100644 --- a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/PlaywrightFixture.cs +++ b/packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/PlaywrightFixture.cs @@ -1,7 +1,7 @@ using Microsoft.Playwright; using Xunit; -namespace NimbleBlazor.Tests.Acceptance; +namespace BlazorWorkspace.Testing.Acceptance; /// /// Fixture to handle Playwright initialization for acceptance tests. diff --git a/packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/Properties/launchSettings.json b/packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/Properties/launchSettings.json new file mode 100644 index 0000000000..22fa40c924 --- /dev/null +++ b/packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/Properties/launchSettings.json @@ -0,0 +1,12 @@ +{ + "profiles": { + "BlazorWorkspace.Testing.Acceptance": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:64440;http://localhost:64441" + } + } +} \ No newline at end of file diff --git a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Startup.cs b/packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/Startup.cs similarity index 74% rename from packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Startup.cs rename to packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/Startup.cs index 7f518500a0..82366cc3c8 100644 --- a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Startup.cs +++ b/packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/Startup.cs @@ -1,17 +1,10 @@ -namespace NimbleBlazor.Tests.Acceptance; +namespace BlazorWorkspace.Testing.Acceptance; /// /// Web server initialization for Blazor Server /// public sealed class Startup { - public Startup(IConfiguration configuration) - { - Configuration = configuration; - } - - public IConfiguration Configuration { get; } - public void ConfigureServices(IServiceCollection services) { services.AddRazorPages(); diff --git a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/WebHostServerFixture.cs b/packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/WebHostServerFixture.cs similarity index 67% rename from packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/WebHostServerFixture.cs rename to packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/WebHostServerFixture.cs index 1e6bb3f290..b71187d819 100644 --- a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/WebHostServerFixture.cs +++ b/packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/WebHostServerFixture.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Hosting.Server.Features; using Xunit; -namespace SprightBlazor.Tests.Acceptance; +namespace BlazorWorkspace.Testing.Acceptance; public abstract class WebHostServerFixture : IAsyncLifetime, IDisposable { @@ -20,6 +20,8 @@ public async Task InitializeAsync() ServerAddress = new Uri(addressFeature!.Addresses.First()); } + protected abstract Startup StartupFactory(WebHostBuilderContext context); + public async Task DisposeAsync() { if (_host != null) @@ -42,5 +44,14 @@ protected virtual void Dispose(bool disposing) } } - protected abstract IHost CreateWebHost(); + private IHost CreateWebHost() + { + return new HostBuilder() + .ConfigureWebHost(webHostBuilder => webHostBuilder + .UseKestrel() + .UseStartup(StartupFactory) + .UseStaticWebAssets() + .UseUrls("http://127.0.0.1:0")) // Pick a port dynamically + .Build(); + } } diff --git a/packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/packages.lock.json b/packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/packages.lock.json new file mode 100644 index 0000000000..fa7e824863 --- /dev/null +++ b/packages/blazor-workspace/Tests/BlazorWorkspace.Testing.Acceptance/packages.lock.json @@ -0,0 +1,1069 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.AspNetCore.Mvc.Testing": { + "type": "Direct", + "requested": "[6.0.29, )", + "resolved": "6.0.29", + "contentHash": "SafR+jYhWN61mCy+FJIaU/YUSGy7BtMrdc+vsRQQB5ars5qLB0Z1iNtAiFgDLd9tO5s+EQa88tAmXjzwCnpK0A==", + "dependencies": { + "Microsoft.AspNetCore.TestHost": "6.0.29", + "Microsoft.Extensions.DependencyModel": "6.0.0", + "Microsoft.Extensions.Hosting": "6.0.1" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Direct", + "requested": "[7.0.0, )", + "resolved": "7.0.0", + "contentHash": "tldQUBWt/xeH2K7/hMPPo5g8zuLc3Ro9I5d4o/XrxvxOCA2EZBtW7bCHHTc49fcBtvB8tLAb/Qsmfrq+2SJ4vA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "[16.11.0, )", + "resolved": "16.11.0", + "contentHash": "f4mbG1SUSkNWF5p7B3Y8ZxMsvKhxCmpZhdl+w6tMtLSUGE7Izi1syU6TkmKOvB2BV66pdbENConFAISOix4ohQ==", + "dependencies": { + "Microsoft.CodeCoverage": "16.11.0", + "Microsoft.TestPlatform.TestHost": "16.11.0" + } + }, + "Microsoft.Playwright": { + "type": "Direct", + "requested": "[1.42.0, 1.42.0]", + "resolved": "1.42.0", + "contentHash": "vH4dIqJFDRB8+qsoy6vWJwemXwTMDo51aYoDTNrlz+mVqbfZaeEReVdHvwbtIBwm4iADpFQf0xWRoR2pHVKbWQ==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0", + "System.ComponentModel.Annotations": "5.0.0", + "System.Text.Json": "6.0.0" + } + }, + "NI.CSharp.Analyzers": { + "type": "Direct", + "requested": "[2.0.21, 2.0.21]", + "resolved": "2.0.21", + "contentHash": "PST6c0bUeoCVmXG7raQmPZPYQlt0I1/2IFNc7KLetoG0CIxa30A21LUMPi2FLy4e5SrdEqGnLtC0D8O9MFxI6A==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.3", + "Microsoft.CodeAnalysis.CSharp": "4.2.0", + "Microsoft.CodeAnalysis.NetAnalyzers": "8.0.0", + "Microsoft.VisualStudio.Threading.Analyzers": "17.2.32", + "Roslynator.Analyzers": "4.1.1", + "StyleCop.Analyzers": "1.2.0-beta.435" + } + }, + "System.ComponentModel": { + "type": "Direct", + "requested": "[4.3.0, )", + "resolved": "4.3.0", + "contentHash": "VyGn1jGRZVfxnh8EdvDCi71v3bMXrsu8aYJOwoV7SNDLVhiEqwP86pPMyRGsDsxhXAm2b3o9OIqeETfN5qfezw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "xunit": { + "type": "Direct", + "requested": "[2.8.0, )", + "resolved": "2.8.0", + "contentHash": "US3a3twJziAif1kFPGdk9fALwILHxV0n1roX5j67bN/d3o4DGNLHnV3tr5ZX+uinVrzfkf0avH3zGX8JPBC0qA==", + "dependencies": { + "xunit.analyzers": "1.13.0", + "xunit.assert": "2.8.0", + "xunit.core": "[2.8.0]" + } + }, + "xunit.extensibility.execution": { + "type": "Direct", + "requested": "[2.8.0, )", + "resolved": "2.8.0", + "contentHash": "TyyrZesHB9ODZMS9c73OqiBz4x0vL944JCkSPBWW5w6PF2LlUfdfXRjjOhoIOuY6lTmEgl07rS4/Jot9mCYnpg==", + "dependencies": { + "xunit.extensibility.core": "[2.8.0]" + } + }, + "xunit.runner.visualstudio": { + "type": "Direct", + "requested": "[2.8.0, )", + "resolved": "2.8.0", + "contentHash": "mqQbS2zr8dfgSWxkNOC6UTzO8JoqpTmM5+FFn2XR/2nVmx2JvEY0YbM5pt2FmXVg9YVe+jKUPHd6KrroyCl67w==" + }, + "Microsoft.AspNetCore.Authorization": { + "type": "Transitive", + "resolved": "6.0.29", + "contentHash": "1GbePh5YLbjNJjluHPiD2Nc3Y6TSPxWIa6zDxq4vsHrFESspXwRlMD73pd/9LYwQra9+4BgWz3qUFYiBHbBKKQ==", + "dependencies": { + "Microsoft.AspNetCore.Metadata": "6.0.29", + "Microsoft.Extensions.Logging.Abstractions": "6.0.4", + "Microsoft.Extensions.Options": "6.0.0" + } + }, + "Microsoft.AspNetCore.Components": { + "type": "Transitive", + "resolved": "6.0.29", + "contentHash": "gKxEKtF2Yo0BxOALqb/C9fKAMWid69bv1wB3Gfq+ZJ+738rEg745aTgH8cYZVE+quEu+srZWJQV9HiLsgu45xA==", + "dependencies": { + "Microsoft.AspNetCore.Authorization": "6.0.29", + "Microsoft.AspNetCore.Components.Analyzers": "6.0.29" + } + }, + "Microsoft.AspNetCore.Components.Analyzers": { + "type": "Transitive", + "resolved": "6.0.29", + "contentHash": "XxaP69TMJojgBNfp0HkQXr1i2ulhxb1Snf8w1Cp2dSFMD0J+77308hNH5QD8HLkasKwTjd/ECTwKyVTO8y9ngg==" + }, + "Microsoft.AspNetCore.Components.Forms": { + "type": "Transitive", + "resolved": "6.0.29", + "contentHash": "HU+wgWqDybHYVo0d0xmj0HnsyQXUjlm5wSDjWy83XD1SxQ6bkHP51uhFOLOA8rEzCon9T5MdbTENwLQAR+j6NQ==", + "dependencies": { + "Microsoft.AspNetCore.Components": "6.0.29" + } + }, + "Microsoft.AspNetCore.Components.Web": { + "type": "Transitive", + "resolved": "6.0.29", + "contentHash": "NjOkG9RIETtEK/oQetPsXEPfONvc8yM8bW/JPWrO7bhX36Klq3U7eodQXfCe2hLhz3R16hopQ7AzfsQal6Fnlw==", + "dependencies": { + "Microsoft.AspNetCore.Components": "6.0.29", + "Microsoft.AspNetCore.Components.Forms": "6.0.29", + "Microsoft.Extensions.DependencyInjection": "6.0.1", + "Microsoft.JSInterop": "6.0.29", + "System.IO.Pipelines": "6.0.3" + } + }, + "Microsoft.AspNetCore.Metadata": { + "type": "Transitive", + "resolved": "6.0.29", + "contentHash": "NKIduYKzggjJPh00AjhTEJ9MWRUf3y67zwRVy08mB/QtctwcYS1i5Nx3u7UurcudH1J0l904IY8SXnJJ/PMszQ==" + }, + "Microsoft.AspNetCore.TestHost": { + "type": "Transitive", + "resolved": "6.0.29", + "contentHash": "5uo89gT+Zt+Dj2qQRNpLl1WwA00GQUcTYio8oGV6j5KaWnawvhqltWQm6Xd6pbfRiVyLeIP7MhqB7/5um06O8Q==", + "dependencies": { + "System.IO.Pipelines": "6.0.3" + } + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" + }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Transitive", + "resolved": "3.3.3", + "contentHash": "j/rOZtLMVJjrfLRlAMckJLPW/1rze9MT1yfWqSIbUPGRu1m1P0fuo9PmqapwsmePfGB5PJrudQLvmUOAMF0DqQ==" + }, + "Microsoft.CodeAnalysis.Common": { + "type": "Transitive", + "resolved": "4.2.0", + "contentHash": "lbusGcuE7D8FtZawQ4G++UFsRQArPzZN1GGXjPQwu3gvCbw7FXDcBq1zDZrZN1vRzPTVe1qyZMvfGhVUzs1TDg==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.3", + "System.Collections.Immutable": "5.0.0", + "System.Memory": "4.5.4", + "System.Reflection.Metadata": "5.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encoding.CodePages": "6.0.0", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Transitive", + "resolved": "4.2.0", + "contentHash": "5IDwr8zGNBmDpxtzxxZj9IHwoA6HJ1/WWT/JacqPQJ4Vz/oZXaHNlzcBPVCZRGWUw+QvVdAhCKwEyJyuAuH/wg==", + "dependencies": { + "Microsoft.CodeAnalysis.Common": "[4.2.0]" + } + }, + "Microsoft.CodeAnalysis.NetAnalyzers": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "DxiTgkCl3CGq1rYmBX2wjY7XGbxiBdL4J+/AJIAFLKy5z70NxhnVRnPghnicXZ8oF6JKVXlW3xwznRbI3ioEKg==" + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "16.11.0", + "contentHash": "wf6lpAeCqP0KFfbDVtfL50lr7jY1gq0+0oSphyksfLOEygMDXqnaxHK5LPFtMEhYSEtgXdNyXNnEddOqQQUdlQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "17h8b5mXa87XYKrrVqdgZ38JefSUqLChUQpXgSnpzsM0nDOhE40FTeNWOJ/YmySGV6tG6T8+hjz6vxbknHJr6A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "f34u2eaqIjNO9YLHBz8rozVZ+TcFiFs0F3r7nUJd7FRkVSxk8u4OpoK226mi49MwexHOR2ibP9MFvRUaLilcQQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.CommandLine": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "3nL1qCkZ1Oxx14ZTzgo4MmlO7tso7F+TtMZAY2jUAtTLyAcDp+EDjk3RqafoKiNaePyPvvlleEcBxh3b2Hzl1g==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.EnvironmentVariables": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "pnyXV1LFOsYjGveuC07xp0YHIyGq7jRq5Ncb5zrrIieMLWVwgMyYxcOH0jTnBedDT4Gh1QinSqsjqzcieHk1og==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.FileExtensions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "V4Dth2cYMZpw3HhGw9XUDIijpI6gN+22LDt0AhufIgOppCUfpWX4483OmN+dFXRJkJLc8Tv0Q8QK+1ingT2+KQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.Json": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "GJGery6QytCzS/BxJ96klgG9in3uH26KcUBbiVG/coNDXCRq6LGVVlUT4vXq34KPuM+R2av+LeYdX9h4IZOCUg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.UserSecrets": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "Fy8yr4V6obi7ZxvKYI1i85jqtwMq8tqyxQVZpRSkgeA8enqy/KvBIMdcuNdznlxQMZa72mvbHqb7vbg4Pyx95w==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "vWXPg3HJQIpZkENn1KWq8SfbqVujVD7S7vIAyFXXqK5xkf1Vho+vG0bLBCHxU36lD1cLLtmGpfYf0B3MYFi9tQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "TD5QHg98m3+QhgEV1YVoNMl5KtBw/4rjfxLHO0e/YV9bPUBDKntApP4xdrVtGgCeQZHVfC2EXIGsdpRNrr87Pg==", + "dependencies": { + "System.Buffers": "4.5.1", + "System.Memory": "4.5.4", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Physical": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "QvkL7l0nM8udt3gfyu0Vw8bbCXblxaKOl7c2oBfgGy4LCURRaL9XWZX1FWJrQc43oMokVneVxH38iz+bY1sbhg==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" + }, + "Microsoft.Extensions.Hosting": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "hbmizc9KPWOacLU8Z8YMaBG6KWdZFppczYV/KwnPGU/8xebWxQxdDeJmLOgg968prb7g2oQgnp6JVLX6lgby8g==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Binder": "6.0.0", + "Microsoft.Extensions.Configuration.CommandLine": "6.0.0", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1", + "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1", + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Configuration": "6.0.0", + "Microsoft.Extensions.Logging.Console": "6.0.0", + "Microsoft.Extensions.Logging.Debug": "6.0.0", + "Microsoft.Extensions.Logging.EventLog": "6.0.0", + "Microsoft.Extensions.Logging.EventSource": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.DiagnosticSource": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "6.0.4", + "contentHash": "K14wYgwOfKVELrUh5eBqlC8Wvo9vvhS3ZhIvcswV2uS/ubkTRPSQsN557EZiYUSSoZNxizG+alN4wjtdyLdcyw==" + }, + "Microsoft.Extensions.Logging.Configuration": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "ZDskjagmBAbv+K8rYW9VhjPplhbOE63xUD0DiuydZJwt15dRyoqicYklLd86zzeintUc7AptDkHn+YhhYkYo8A==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Binder": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Console": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "gsqKzOEdsvq28QiXFxagmn1oRB9GeI5GgYCkoybZtQA0IUb7QPwf1WmN3AwJeNIsadTvIFQCiVK0OVIgKfOBGg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Configuration": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Debug": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "M9g/JixseSZATJE9tcMn9uzoD4+DbSglivFqVx8YkRJ7VVPmnvCEbOZ0AAaxsL1EKyI4cz07DXOOJExxNsUOHw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "rlo0RxlMd0WtLG3CHI0qOTp6fFn7MvQjlrCjucA31RqmiMFCZkF8CHNbe8O7tbBIyyoLGWB1he9CbaA5iyHthg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.EventSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "BeDyyqt7nkm/nr+Gdk+L8n1tUT/u33VkbXAOesgYSNsxDM9hJ1NOBGoZfj9rCbeD2+9myElI6JOVVFmnzgeWQA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "bXWINbTn0vC0FYc9GaQTISbxhQLAMrvtbuvD9N6JelEaIS/Pr62wUCinrq5bf1WRBGczt1v4wDhxFtVFNcMdUQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Binder": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "um1KU5kxcRp3CNuI8o/GrZtD4AIOXDk+RLsytjZ9QPok3ttLUelLKpilVPuaFT3TFjOhSibUAso0odbOaCDj3Q==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.JSInterop": { + "type": "Transitive", + "resolved": "6.0.29", + "contentHash": "SOGezowQCY3bxL4lMFk18EbC1OlZ8ea8XJ2e+/eCKapLrarI47XqoGN9WVfAeB0QiT+dynOhAxrMWpTi2fpZPg==" + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "16.11.0", + "contentHash": "EiknJx9N9Z30gs7R+HHhki7fA8EiiM3pwD1vkw3bFsBC8kdVq/O7mHf1hrg5aJp+ASO6BoOzQueD2ysfTOy/Bg==", + "dependencies": { + "NuGet.Frameworks": "5.0.0", + "System.Reflection.Metadata": "1.6.0" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "16.11.0", + "contentHash": "/Q+R0EcCJE8JaYCk+bGReicw/xrB0HhecrYrUcLbn95BnAlaTJrZhoLkUhvtKTAVtqX/AIKWXYtutiU/Q6QUgg==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "16.11.0", + "Newtonsoft.Json": "9.0.1" + } + }, + "Microsoft.VisualStudio.Threading.Analyzers": { + "type": "Transitive", + "resolved": "17.2.32", + "contentHash": "izJIEScEIBe8m96gMkox9vZE6r/Unk6giifbfRroqYJR3yESJqTkaQ707pE+jkJMqxHNT/lqBensuex90vPfPw==" + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", + "dependencies": { + "Microsoft.CSharp": "4.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11" + } + }, + "NuGet.Frameworks": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "c5JVjuVAm4f7E9Vj+v09Z9s2ZsqFDjBpcsyS3M9xRo0bEdm/LVZSzLxxNvfvAwRiiE8nwe1h2G4OwiwlzFKXlA==" + }, + "Roslynator.Analyzers": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "3cPVlrB1PytlO1ztZZBOExDKQWpMZgI15ZDa0BqLu0l6xv+xIRfEpqjNRcpvUy3aLxWTkPgSKZbbaO+VoFEJ1g==" + }, + "StyleCop.Analyzers": { + "type": "Transitive", + "resolved": "1.2.0-beta.435", + "contentHash": "TADk7vdGXtfTnYCV7GyleaaRTQjfoSfZXprQrVMm7cSJtJbFc1QIbWPyLvrgrfGdfHbGmUPvaN4ODKNxg2jgPQ==", + "dependencies": { + "StyleCop.Analyzers.Unstable": "1.2.0.435" + } + }, + "StyleCop.Analyzers.Unstable": { + "type": "Transitive", + "resolved": "1.2.0.435", + "contentHash": "ouwPWZxbOV3SmCZxIRqHvljkSzkCyi1tDoMzQtDb/bRP8ctASV/iRJr+A2Gdj0QLaLmWnqTWDrH82/iP+X80Lg==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "YUJGz6eFKqS0V//mLt25vFGrrCvOnsXjlvFQs+KimpwNxug9x0Pzy4PlFMU3Q2IzqAa9G2L4LsK3+9vCBK7oTg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g==" + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "w5U95fVKHY4G8ASs/K5iK3J5LY+/dLFd4vKejsnI/ZhBsWS9hQakfx3Zr7lRWKg4tAw9r4iktyvsTagWkqYCiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "xBfJ8pnd4C17dWaC9FM6aShzbJcRNMChUMD42I6772KGGrqaFdumwhn9OdM68erj1ueNo3xdQ1EwiFjK5k8p0g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "B95h0YLEL2oSnwF/XjqSWKnwKOy/01VWkNlsCeMTFJLLabflpGV26nK164eRs5GiaRSBGpOxQ3pKoSnnyZN5pg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "3KlTJceQc3gnGIaHZ7UBZO26SHL1SHE4ddrmiwumFnId+CEHP+O8r386tZKaE6zlk5/mF8vifMBzHj9SaXN+mQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "IBErlVq5jOggAD69bg1t0pJcHaDbJbWNUZTPI96fkYWzwYbN6D9wRHMULLDd9dHsl7C2YsxXL31LMfPI1SWt8w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.IO": "4.1.0", + "System.IO.FileSystem.Primitives": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Text.Encoding": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "kWkKD203JJKxJeE74p8aF8y4Qc9r9WQx4C0cHzHPrY3fv/L/IhWnyCHaFJ3H1QPOH6A93whlQ2vG5nHlBDvzWQ==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "6.0.3", + "contentHash": "ryTgF+iFkpGZY1vRQhfCzX0xTdlV3pyaTTqRu2ETbEv+HlV7O6y7hyQURnghNIXvctl5DuZ//Dpks6HdL/Txgw==" + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "bQ0iYFOQI0nuTnt+NQADns6ucV4DUvMdwN6CbkB1yj8i7arTGiTN5eok1kQwdnnNWSDZfIUySQY+J3d5KjWn0g==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "I+y02iqkgmCAyfbqOmSDOgqdZQ5tTj80Akm5BPSS8EeB0VGWdy6X1KCoYe8Pk6pwDoAKZUOdLVxnTJcExiv5zw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.0.12", + "contentHash": "tAgJM1xt3ytyMoW4qn4wIqgJYm7L7TShRZG4+Q4Qsi2PCcj96pXN7nRywS9KkB3p/xDUjc2HSwP9SROyPYDYKQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "JCKANJ0TI7kzoQzuwB/OoJANy1Lg338B6+JVacPl4TpUwi3cReg3nMLplMq2uqYfHFQpKIlHAUVAJlImZz/4ng==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.IO": "4.1.0", + "System.Reflection.Primitives": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "P2wqAj72fFjpP6wb9nSfDqNBMab+2ovzSDzUZK7MVIm54tBJEPr9jWfSjjoTpPwj1LeKcmX3vr0ttyjSSFM47g==", + "dependencies": { + "System.IO": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Ov6dU8Bu15Bc7zuqttgHF12J5lwSWyTf1S+FJouUXVMSqImLZzYaQ+vRr1rQ0OZ0HqsrwWl4dsKHELckQkVpgA==", + "dependencies": { + "System.Reflection": "4.1.0", + "System.Reflection.Primitives": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "sSzHHXueZ5Uh0OLpUQprhr+ZYJrLPA2Cmr4gn0wj9+FftNKXx8RIMKvO9qnjk2ebPYUjZ+F2ulGdPOsvj+MEjA==", + "dependencies": { + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "GYrtRsZcMuHF3sbmRHfMYpvxZoIN2bQGrYGerUiWLEkqdEUQZhH3TRSaC/oI4wO0II1RKBPlpIa1TOMxIcOOzQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Reflection": "4.1.0", + "System.Runtime": "4.1.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "4inTox4wTBaDhB7V3mPvp9XlCbeGYWVEM9/fXALd52vNEAVisc1BoVWQPuUuD0Ga//dNbA/WeMy9u9mzLxGTHQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "tsQ/ptQ3H5FYfON8lL4MxRk/8kFyE0A+tGPXmVP967cT/gzLHYxIejIYSxp4JmIeFHVP78g/F2FE1mUUTbDtrg==", + "dependencies": { + "System.Reflection": "4.1.0", + "System.Runtime": "4.1.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "TxwVeUNoTgUOdQ09gfTjvW411MF+w9MBYL7AtNVc+HtBCFlutPLhUCdZjNkjbhj3bNQWMdHboF0KIWEOjJssbA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Globalization": "4.0.11", + "System.Reflection": "4.1.0", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "CUOHjTT/vgP0qGW22U4/hDlOqXmcPq5YicBaXdUR2UiUoLwBT+olO6we4DVbq57jeX5uXH2uerVZhf0qGj+sVQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "nCJvEKguXEvk2ymk1gqj625vVnlK3/xdGzx0vOKicQkoquaTBJTP13AIYkocSUwHCLNBwUbXTqTWGDxBTWpt7g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "16eu3kjHS633yYdkjwShDHZLRNMKVi/s0bY8ODiqJ2RfMhDMAwxZaUaWVnZ2P71kr/or+X9o/xFWtNqz8ivieQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Reflection": "4.1.0", + "System.Reflection.Primitives": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Handles": "4.0.1" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "U3gGeMlDZXxCEiY4DwVLSacg+DFWCvoiX+JThA/rvw37Sqrku7sEFeVBBBMBnfB6FeZHsyDx85HlKL19x0HtZA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "ZFCILZuOvtKPauZ/j/swhvw68ZRi9ATCfvGbk1QfydmcXBkIWecWKn/250UH7rahZ5OoDBaiAudJtPvLwzw85A==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "jtbiTDtvfLYgXn8PTfWI+SiBs51rrmO4AAckx4KR6vFK9Wzf6tI8kcRdsYQNwriUeQ1+CtQbM1W4cMbLXnj/OQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0", + "System.Text.Encoding": "4.0.11" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "zaJsHfESQvJ11vbXnNlkrR46IaMULk/gHxYsJphzSF+07kTjPHv+Oc14w6QEOfo3Q4hqLJgStUaYB9DBl0TmWg==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "i88YCXpRTjCnoSQZtdlHkAOx4KNNik4hMy83n0+Ftlb7jvV6ZiZWMpnEZHhjBp6hQVh8gWd/iKNPzlPF7iyA2g==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "N+3xqIcg3VDKyjwwCGaZ9HawG9aC6cSDI+s7ROma310GQo8vilFZa86hqKppwTHleR/G0sfOzhvgnUxWCR/DrQ==", + "dependencies": { + "System.Runtime": "4.1.0", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "k1S4Gc6IGwtHGT8188RSeGaX86Qw/wnrgNLshJvsdNUOPP9etMmo8S07c+UlOAx4K/xLuN9ivA1bD0LVurtIxQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "ZIiLPsf67YZ9zgr31vzrFaYQqxRPX9cVHjtPSnmx4eN6lbS/yEyYNr2vs1doGDEscF0tjCZFsk9yUg1sC9e8tg==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.IO.FileSystem.Primitives": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading.Tasks": "4.0.11", + "System.Threading.Tasks.Extensions": "4.0.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "Mk2mKmPi0nWaoiYeotq1dgeNK1fqWh61+EK+w4Wu8SWuTYLzpUnschb59bJtGywaPq7SmTuPf44wrXRwbIrukg==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.Tools": "4.0.1", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Reflection": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "xunit.abstractions": { + "type": "Transitive", + "resolved": "2.0.3", + "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" + }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "1.13.0", + "contentHash": "Pai9YnDV71/Ox14nBHB6/f62iyPyLbmUG/YYMiA4dfdFZvr0gIYE9yGxSr0i5Tr3INK75wgL2MCUNEKpeiZ2Fw==" + }, + "xunit.assert": { + "type": "Transitive", + "resolved": "2.8.0", + "contentHash": "lwf7Dy5/5HbDkaPx1YrGXCByytCEEcIn+KPI74jh2BD/RU/7RhO8c+S3k0Ph+Mr7+cLf338fl+o6UcgPCLa6PA==" + }, + "xunit.core": { + "type": "Transitive", + "resolved": "2.8.0", + "contentHash": "McSTFGTETCxLpmJKE9TWi9FtFthrRbpRrjz2V2g8sK2wRt1+JHs15vwi+B+nfftFkV9aFWIXZfzZM95TIGZNIA==", + "dependencies": { + "xunit.extensibility.core": "[2.8.0]", + "xunit.extensibility.execution": "[2.8.0]" + } + }, + "xunit.extensibility.core": { + "type": "Transitive", + "resolved": "2.8.0", + "contentHash": "eBJv9xQeY0p5z+C/L1tFjUFYqtl5pQqIEYCGTMl+MbRzA7sOlgYKwJE//vEePBp+mgBh7NjD0Qhz0liZBYM27w==", + "dependencies": { + "xunit.abstractions": "2.0.3" + } + }, + "nimbleblazor": { + "type": "Project", + "dependencies": { + "Microsoft.AspNetCore.Components.Web": "[6.0.29, )" + } + } + } + } +} \ No newline at end of file diff --git a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/BlazorServerWebHostFixture.cs b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/BlazorServerWebHostFixture.cs deleted file mode 100644 index 10206871f1..0000000000 --- a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/BlazorServerWebHostFixture.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace NimbleBlazor.Tests.Acceptance; - -/// -/// Test fixture which starts up a Blazor Server web server -/// -public class BlazorServerWebHostFixture : WebHostServerFixture -{ - protected override IHost CreateWebHost() - { - return new HostBuilder() - .ConfigureWebHost(webHostBuilder => webHostBuilder - .UseKestrel() - .UseStartup() - .UseStaticWebAssets() - .UseUrls("http://127.0.0.1:0")) // Pick a port dynamically - .Build(); - } -} diff --git a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/NimbleBlazor.Tests.Acceptance.csproj b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/NimbleBlazor.Tests.Acceptance.csproj index 6ad6e83bbd..9487c4f12e 100644 --- a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/NimbleBlazor.Tests.Acceptance.csproj +++ b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/NimbleBlazor.Tests.Acceptance.csproj @@ -47,6 +47,7 @@ + diff --git a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/NimbleBlazorWebHostServerFixture.cs b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/NimbleBlazorWebHostServerFixture.cs new file mode 100644 index 0000000000..17d70f8e45 --- /dev/null +++ b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/NimbleBlazorWebHostServerFixture.cs @@ -0,0 +1,15 @@ +using BlazorWorkspace.Testing.Acceptance; + +namespace NimbleBlazor.Tests.Acceptance; + +/// +/// Test fixture which starts up a Blazor Server web server +/// +public class NimbleBlazorWebHostServerFixture : WebHostServerFixture +{ + // In order for components in this assembly to be discoverable, the Startup instance must be created in this assembly. + protected override Startup StartupFactory(WebHostBuilderContext context) + { + return new Startup(); + } +} diff --git a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Program.cs b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Program.cs index bba031e698..7cdd5d1688 100644 --- a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Program.cs +++ b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Program.cs @@ -1,4 +1,6 @@ -namespace NimbleBlazor.Tests.Acceptance; +using BlazorWorkspace.Testing.Acceptance; + +namespace NimbleBlazor.Tests.Acceptance; /// /// Main entry point which spins up the web server and allows loading the Razor fixtures/pages in a browser @@ -10,7 +12,7 @@ public static void Main(string[] arguments) { var builder = WebApplication.CreateBuilder(arguments); - var startup = new Startup(builder.Configuration); + var startup = new Startup(); startup.ConfigureServices(builder.Services); var app = builder.Build(); startup.Configure(app); diff --git a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Shared/MainLayout.razor.cs b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Shared/MainLayout.razor.cs deleted file mode 100644 index df933abeb2..0000000000 --- a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Shared/MainLayout.razor.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Microsoft.AspNetCore.Components; -using Microsoft.AspNetCore.Components.Web; -using Microsoft.JSInterop; - -namespace NimbleBlazor.Tests.Acceptance.Shared; - -/// -/// The MainLayout Component. -/// -public partial class MainLayout -{ - private Theme Theme { get; set; } = Theme.Light; - - public ErrorBoundary? ErrorBoundary { get; set; } - - [Inject] - public IJSRuntime? JSRuntime { get; set; } - - protected override void OnParametersSet() - { - ErrorBoundary?.Recover(); - } -} \ No newline at end of file diff --git a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/SharedPlaywrightCollectionDefinition.cs b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/SharedPlaywrightCollectionDefinition.cs index f3019290aa..ca50ead8b7 100644 --- a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/SharedPlaywrightCollectionDefinition.cs +++ b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/SharedPlaywrightCollectionDefinition.cs @@ -1,4 +1,5 @@ -using Xunit; +using BlazorWorkspace.Testing.Acceptance; +using Xunit; namespace NimbleBlazor.Tests.Acceptance; diff --git a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/AcceptanceTestsBase.cs b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/AcceptanceTestsBase.cs deleted file mode 100644 index 528cabb19f..0000000000 --- a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/AcceptanceTestsBase.cs +++ /dev/null @@ -1,61 +0,0 @@ -using Microsoft.Playwright; -using Xunit; - -namespace NimbleBlazor.Tests.Acceptance; - -[Collection(nameof(PlaywrightFixture))] -public abstract class AcceptanceTestsBase : IClassFixture -{ - private readonly PlaywrightFixture _playwrightFixture; - private readonly BlazorServerWebHostFixture _blazorServerClassFixture; - - protected AcceptanceTestsBase( - PlaywrightFixture playwrightFixture, - BlazorServerWebHostFixture blazorServerClassFixture) - { - _playwrightFixture = playwrightFixture; - _blazorServerClassFixture = blazorServerClassFixture; - } - - private IBrowserContext BrowserContext - { - get - { - return _playwrightFixture.BrowserContext!; - } - } - - protected async Task NewPageForRouteAsync(string route) - { - var page = await BrowserContext.NewPageAsync(); - await NavigateToPageAsync(page, route); - await WaitForNimbleBlazorInitializationAsync(page); - return new AsyncDisposablePage(page); - } - - private async Task NavigateToPageAsync(IPage page, string route) - { - var address = new Uri(_blazorServerClassFixture.ServerAddress!, route).AbsoluteUri; - await page.GotoAsync(address); - } - - private async Task WaitForNimbleBlazorInitializationAsync(IPage page) - { - await page.WaitForFunctionAsync("window.NimbleBlazor && window.NimbleBlazor.calledAfterStarted === true"); - } - - protected sealed class AsyncDisposablePage : IAsyncDisposable - { - public IPage Page { get; private set; } - - public AsyncDisposablePage(IPage page) - { - Page = page; - } - - public async ValueTask DisposeAsync() - { - await Page.CloseAsync(); - } - } -} diff --git a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/DialogTests.cs b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/DialogTests.cs index 0706576629..b50f1b8074 100644 --- a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/DialogTests.cs +++ b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/DialogTests.cs @@ -1,11 +1,12 @@ -using Microsoft.Playwright; +using BlazorWorkspace.Testing.Acceptance; +using Microsoft.Playwright; using Xunit; namespace NimbleBlazor.Tests.Acceptance; -public class DialogTests : AcceptanceTestsBase +public class DialogTests : NimbleAcceptanceTestsBase { - public DialogTests(PlaywrightFixture playwrightFixture, BlazorServerWebHostFixture blazorServerClassFixture) + public DialogTests(PlaywrightFixture playwrightFixture, NimbleBlazorWebHostServerFixture blazorServerClassFixture) : base(playwrightFixture, blazorServerClassFixture) { } diff --git a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/DrawerTests.cs b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/DrawerTests.cs index 464c2f3f14..cad89ae218 100644 --- a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/DrawerTests.cs +++ b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/DrawerTests.cs @@ -1,11 +1,12 @@ -using Microsoft.Playwright; +using BlazorWorkspace.Testing.Acceptance; +using Microsoft.Playwright; using Xunit; namespace NimbleBlazor.Tests.Acceptance; -public class DrawerTests : AcceptanceTestsBase +public class DrawerTests : NimbleAcceptanceTestsBase { - public DrawerTests(PlaywrightFixture playwrightFixture, BlazorServerWebHostFixture blazorServerClassFixture) + public DrawerTests(PlaywrightFixture playwrightFixture, NimbleBlazorWebHostServerFixture blazorServerClassFixture) : base(playwrightFixture, blazorServerClassFixture) { } diff --git a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/NimbleAcceptanceTestsBase.cs b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/NimbleAcceptanceTestsBase.cs new file mode 100644 index 0000000000..b70ba17885 --- /dev/null +++ b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/NimbleAcceptanceTestsBase.cs @@ -0,0 +1,18 @@ +using BlazorWorkspace.Testing.Acceptance; +using Xunit; + +namespace NimbleBlazor.Tests.Acceptance; + +public abstract class NimbleAcceptanceTestsBase : AcceptanceTestsBase, IClassFixture +{ + protected NimbleAcceptanceTestsBase( + PlaywrightFixture playwrightFixture, + NimbleBlazorWebHostServerFixture blazorServerClassFixture) + : base(playwrightFixture) + { + ServerAddress = blazorServerClassFixture.ServerAddress!; + } + + protected override Uri ServerAddress { get; } + protected override string ComponentLibraryInitializationTestJavaScript => "window.NimbleBlazor && window.NimbleBlazor.calledAfterStarted === true"; +} diff --git a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/TableColumnMappingTests.cs b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/TableColumnMappingTests.cs index 6c220dc348..5aed48fee6 100644 --- a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/TableColumnMappingTests.cs +++ b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/TableColumnMappingTests.cs @@ -1,11 +1,12 @@ +using BlazorWorkspace.Testing.Acceptance; using Microsoft.Playwright; using Xunit; namespace NimbleBlazor.Tests.Acceptance; -public class TableColumnMappingTests : AcceptanceTestsBase +public class TableColumnMappingTests : NimbleAcceptanceTestsBase { - public TableColumnMappingTests(PlaywrightFixture playwrightFixture, BlazorServerWebHostFixture blazorServerClassFixture) + public TableColumnMappingTests(PlaywrightFixture playwrightFixture, NimbleBlazorWebHostServerFixture blazorServerClassFixture) : base(playwrightFixture, blazorServerClassFixture) { } diff --git a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/TableColumnNumberTextTests.cs b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/TableColumnNumberTextTests.cs index dcab13fd97..1fe63801f5 100644 --- a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/TableColumnNumberTextTests.cs +++ b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/TableColumnNumberTextTests.cs @@ -1,11 +1,12 @@ -using Microsoft.Playwright; +using BlazorWorkspace.Testing.Acceptance; +using Microsoft.Playwright; using Xunit; namespace NimbleBlazor.Tests.Acceptance; -public class TableColumnNumberTextTests : AcceptanceTestsBase +public class TableColumnNumberTextTests : NimbleAcceptanceTestsBase { - public TableColumnNumberTextTests(PlaywrightFixture playwrightFixture, BlazorServerWebHostFixture blazorServerClassFixture) + public TableColumnNumberTextTests(PlaywrightFixture playwrightFixture, NimbleBlazorWebHostServerFixture blazorServerClassFixture) : base(playwrightFixture, blazorServerClassFixture) { } diff --git a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/TableTests.cs b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/TableTests.cs index c2279f79f5..7db867c826 100644 --- a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/TableTests.cs +++ b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/TableTests.cs @@ -1,11 +1,12 @@ -using Microsoft.Playwright; +using BlazorWorkspace.Testing.Acceptance; +using Microsoft.Playwright; using Xunit; namespace NimbleBlazor.Tests.Acceptance; -public class TableTests : AcceptanceTestsBase +public class TableTests : NimbleAcceptanceTestsBase { - public TableTests(PlaywrightFixture playwrightFixture, BlazorServerWebHostFixture blazorServerClassFixture) + public TableTests(PlaywrightFixture playwrightFixture, NimbleBlazorWebHostServerFixture blazorServerClassFixture) : base(playwrightFixture, blazorServerClassFixture) { } diff --git a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/ThemeProviderTests.cs b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/ThemeProviderTests.cs index 9d5055c982..63a8a90b65 100644 --- a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/ThemeProviderTests.cs +++ b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/ThemeProviderTests.cs @@ -1,11 +1,12 @@ -using Microsoft.Playwright; +using BlazorWorkspace.Testing.Acceptance; +using Microsoft.Playwright; using Xunit; namespace NimbleBlazor.Tests.Acceptance; -public class ThemeProviderTests : AcceptanceTestsBase +public class ThemeProviderTests : NimbleAcceptanceTestsBase { - public ThemeProviderTests(PlaywrightFixture playwrightFixture, BlazorServerWebHostFixture blazorServerClassFixture) + public ThemeProviderTests(PlaywrightFixture playwrightFixture, NimbleBlazorWebHostServerFixture blazorServerClassFixture) : base(playwrightFixture, blazorServerClassFixture) { } diff --git a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/WaferMapTests.cs b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/WaferMapTests.cs index fafd258c95..e00d47ecf9 100644 --- a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/WaferMapTests.cs +++ b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/Tests/WaferMapTests.cs @@ -1,12 +1,13 @@ -using Microsoft.Playwright; +using BlazorWorkspace.Testing.Acceptance; +using Microsoft.Playwright; using Xunit; namespace NimbleBlazor.Tests.Acceptance; -public class WaferMapTests : AcceptanceTestsBase +public class WaferMapTests : NimbleAcceptanceTestsBase { private const int RenderingTimeout = 200; - public WaferMapTests(PlaywrightFixture playwrightFixture, BlazorServerWebHostFixture blazorServerClassFixture) + public WaferMapTests(PlaywrightFixture playwrightFixture, NimbleBlazorWebHostServerFixture blazorServerClassFixture) : base(playwrightFixture, blazorServerClassFixture) { } diff --git a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/WebHostServerFixture.cs b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/WebHostServerFixture.cs deleted file mode 100644 index f4a209509d..0000000000 --- a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/WebHostServerFixture.cs +++ /dev/null @@ -1,46 +0,0 @@ -using Microsoft.AspNetCore.Hosting.Server; -using Microsoft.AspNetCore.Hosting.Server.Features; -using Xunit; - -namespace NimbleBlazor.Tests.Acceptance; - -public abstract class WebHostServerFixture : IAsyncLifetime, IDisposable -{ - private IHost? _host; - - public Uri? ServerAddress { get; set; } - - public async Task InitializeAsync() - { - _host = CreateWebHost(); - await _host.StartAsync(); - - var server = _host.Services.GetRequiredService(); - var addressFeature = server.Features.Get(); - ServerAddress = new Uri(addressFeature!.Addresses.First()); - } - - public async Task DisposeAsync() - { - if (_host != null) - { - await _host.StopAsync(); - _host.Dispose(); - } - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - protected virtual void Dispose(bool disposing) - { - if (disposing) - { - _host?.Dispose(); - } - } - - protected abstract IHost CreateWebHost(); -} diff --git a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/_Imports.razor b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/_Imports.razor index 27670ad173..12c3f0bdf5 100644 --- a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/_Imports.razor +++ b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/_Imports.razor @@ -7,5 +7,5 @@ @using Microsoft.AspNetCore.Components.Web.Virtualization @using Microsoft.JSInterop @using NimbleBlazor.Tests.Acceptance -@using NimbleBlazor.Tests.Acceptance.Shared +@using BlazorWorkspace.Testing.Acceptance @using NimbleBlazor.Tests.Acceptance.Pages diff --git a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/packages.lock.json b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/packages.lock.json index fa7e824863..30c7ab756b 100644 --- a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/packages.lock.json +++ b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/packages.lock.json @@ -1058,6 +1058,20 @@ "xunit.abstractions": "2.0.3" } }, + "blazorworkspace.testing.acceptance": { + "type": "Project", + "dependencies": { + "Microsoft.AspNetCore.Mvc.Testing": "[6.0.29, )", + "Microsoft.Extensions.Configuration": "[7.0.0, )", + "Microsoft.NET.Test.Sdk": "[16.11.0, )", + "Microsoft.Playwright": "[1.42.0, 1.42.0]", + "NI.CSharp.Analyzers": "[2.0.21, 2.0.21]", + "NimbleBlazor": "[1.0.0, )", + "System.ComponentModel": "[4.3.0, )", + "xunit": "[2.8.0, )", + "xunit.extensibility.execution": "[2.8.0, )" + } + }, "nimbleblazor": { "type": "Project", "dependencies": { diff --git a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/wwwroot/css/site.css b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/wwwroot/css/site.css index 3afadc202e..10c6ea115e 100644 --- a/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/wwwroot/css/site.css +++ b/packages/blazor-workspace/Tests/NimbleBlazor.Tests.Acceptance/wwwroot/css/site.css @@ -10,12 +10,12 @@ z-index: 1000; } - #blazor-error-ui .dismiss { - cursor: pointer; - position: absolute; - right: 0.75rem; - top: 0.5rem; - } +#blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; +} .blazor-error-boundary { background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; @@ -23,6 +23,6 @@ color: white; } - .blazor-error-boundary::after { - content: "An error has occurred." - } +.blazor-error-boundary::after { + content: "An error has occurred." +} diff --git a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/BlazorServerWebHostFixture.cs b/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/BlazorServerWebHostFixture.cs deleted file mode 100644 index 21d5a31127..0000000000 --- a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/BlazorServerWebHostFixture.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace SprightBlazor.Tests.Acceptance; - -/// -/// Test fixture which starts up a Blazor Server web server -/// -public class BlazorServerWebHostFixture : WebHostServerFixture -{ - protected override IHost CreateWebHost() - { - return new HostBuilder() - .ConfigureWebHost(webHostBuilder => webHostBuilder - .UseKestrel() - .UseStartup() - .UseStaticWebAssets() - .UseUrls("http://127.0.0.1:0")) // Pick a port dynamically - .Build(); - } -} diff --git a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/PlaywrightFixture.cs b/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/PlaywrightFixture.cs deleted file mode 100644 index 703c6c42e5..0000000000 --- a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/PlaywrightFixture.cs +++ /dev/null @@ -1,44 +0,0 @@ -using Microsoft.Playwright; -using Xunit; - -namespace SprightBlazor.Tests.Acceptance; - -/// -/// Fixture to handle Playwright initialization for acceptance tests. -/// -public class PlaywrightFixture : IAsyncLifetime -{ - private IBrowser? _browser; - private IPlaywright? _playwright; - public IBrowserContext? BrowserContext { get; private set; } - - public async Task InitializeAsync() - { - _playwright = await Playwright.CreateAsync(); - _browser = await _playwright.Chromium.LaunchAsync( - new BrowserTypeLaunchOptions() - { -#if DEBUG - Headless = false, - SlowMo = 1000 -#endif - }); - BrowserContext = await _browser.NewContextAsync(new BrowserNewContextOptions { IgnoreHTTPSErrors = true }); -#if DEBUG - BrowserContext.SetDefaultTimeout(30000); -#endif - } - - public async Task DisposeAsync() - { - if (BrowserContext != null) - { - await BrowserContext.DisposeAsync(); - } - if (_browser != null) - { - await _browser.DisposeAsync(); - } - _playwright?.Dispose(); - } -} \ No newline at end of file diff --git a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Program.cs b/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Program.cs index e90d7781ce..2163e04022 100644 --- a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Program.cs +++ b/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Program.cs @@ -1,4 +1,6 @@ -namespace SprightBlazor.Tests.Acceptance; +using BlazorWorkspace.Testing.Acceptance; + +namespace SprightBlazor.Tests.Acceptance; /// /// Main entry point which spins up the web server and allows loading the Razor fixtures/pages in a browser @@ -10,7 +12,7 @@ public static void Main(string[] arguments) { var builder = WebApplication.CreateBuilder(arguments); - var startup = new Startup(builder.Configuration); + var startup = new Startup(); startup.ConfigureServices(builder.Services); var app = builder.Build(); startup.Configure(app); diff --git a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Shared/MainLayout.razor b/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Shared/MainLayout.razor deleted file mode 100644 index b9118a8dba..0000000000 --- a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Shared/MainLayout.razor +++ /dev/null @@ -1,20 +0,0 @@ -@using Microsoft.AspNetCore.Components -@using NimbleBlazor -@namespace SprightBlazor.Tests.Acceptance.Shared -@inherits LayoutComponentBase - -Spright Blazor tests - -
- - -
- @Body -
-
- -

@ex.Message

-
-
-
-
diff --git a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Shared/MainLayout.razor.css b/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Shared/MainLayout.razor.css deleted file mode 100644 index 9c95a98781..0000000000 --- a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Shared/MainLayout.razor.css +++ /dev/null @@ -1,6 +0,0 @@ -.root { - display: flex; - flex-direction: column; - height: 100%; - background-color: var(--ni-nimble-application-background-color); -} diff --git a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/SharedPlaywrightCollectionDefinition.cs b/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/SharedPlaywrightCollectionDefinition.cs index ab0b7cf038..dd7360736a 100644 --- a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/SharedPlaywrightCollectionDefinition.cs +++ b/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/SharedPlaywrightCollectionDefinition.cs @@ -1,4 +1,5 @@ -using Xunit; +using BlazorWorkspace.Testing.Acceptance; +using Xunit; namespace SprightBlazor.Tests.Acceptance; diff --git a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/SprightBlazor.Tests.Acceptance.csproj b/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/SprightBlazor.Tests.Acceptance.csproj index 4f7c3fa9d0..af9f9692f3 100644 --- a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/SprightBlazor.Tests.Acceptance.csproj +++ b/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/SprightBlazor.Tests.Acceptance.csproj @@ -48,6 +48,7 @@ + diff --git a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/SprightBlazorWebHostServerFixture.cs b/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/SprightBlazorWebHostServerFixture.cs new file mode 100644 index 0000000000..53f1cb0499 --- /dev/null +++ b/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/SprightBlazorWebHostServerFixture.cs @@ -0,0 +1,15 @@ +using BlazorWorkspace.Testing.Acceptance; + +namespace SprightBlazor.Tests.Acceptance; + +/// +/// Test fixture which starts up a Blazor Server web server +/// +public class SprightBlazorWebHostServerFixture : WebHostServerFixture +{ + // In order for components in this assembly to be discoverable, the Startup instance must be created in this assembly. + protected override Startup StartupFactory(WebHostBuilderContext context) + { + return new Startup(); + } +} diff --git a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Startup.cs b/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Startup.cs deleted file mode 100644 index 856e6472fb..0000000000 --- a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Startup.cs +++ /dev/null @@ -1,32 +0,0 @@ -namespace SprightBlazor.Tests.Acceptance; - -/// -/// Web server initialization for Blazor Server -/// -public sealed class Startup -{ - public Startup(IConfiguration configuration) - { - Configuration = configuration; - } - - public IConfiguration Configuration { get; } - - public void ConfigureServices(IServiceCollection services) - { - services.AddRazorPages(); - services.AddServerSideBlazor(); - } - - public void Configure(IApplicationBuilder app) - { - app.UseDeveloperExceptionPage(); - app.UseStaticFiles(); - app.UseRouting(); - app.UseEndpoints(endpoints => - { - endpoints.MapBlazorHub(); - endpoints.MapFallbackToPage("/_Host"); - }); - } -} \ No newline at end of file diff --git a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Tests/AcceptanceTestsBase.cs b/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Tests/AcceptanceTestsBase.cs deleted file mode 100644 index 78d30c4fdc..0000000000 --- a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Tests/AcceptanceTestsBase.cs +++ /dev/null @@ -1,61 +0,0 @@ -using Microsoft.Playwright; -using Xunit; - -namespace SprightBlazor.Tests.Acceptance; - -[Collection(nameof(PlaywrightFixture))] -public abstract class AcceptanceTestsBase : IClassFixture -{ - private readonly PlaywrightFixture _playwrightFixture; - private readonly BlazorServerWebHostFixture _blazorServerClassFixture; - - protected AcceptanceTestsBase( - PlaywrightFixture playwrightFixture, - BlazorServerWebHostFixture blazorServerClassFixture) - { - _playwrightFixture = playwrightFixture; - _blazorServerClassFixture = blazorServerClassFixture; - } - - private IBrowserContext BrowserContext - { - get - { - return _playwrightFixture.BrowserContext!; - } - } - - protected async Task NewPageForRouteAsync(string route) - { - var page = await BrowserContext.NewPageAsync(); - await NavigateToPageAsync(page, route); - await WaitForSprightBlazorInitializationAsync(page); - return new AsyncDisposablePage(page); - } - - private async Task NavigateToPageAsync(IPage page, string route) - { - var address = new Uri(_blazorServerClassFixture.ServerAddress!, route).AbsoluteUri; - await page.GotoAsync(address); - } - - private async Task WaitForSprightBlazorInitializationAsync(IPage page) - { - await page.WaitForFunctionAsync("window.SprightBlazor && window.SprightBlazor.calledAfterStarted === true"); - } - - protected sealed class AsyncDisposablePage : IAsyncDisposable - { - public IPage Page { get; private set; } - - public AsyncDisposablePage(IPage page) - { - Page = page; - } - - public async ValueTask DisposeAsync() - { - await Page.CloseAsync(); - } - } -} diff --git a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Tests/RectangleTests.cs b/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Tests/RectangleTests.cs index c49dd21557..6c2f8e908e 100644 --- a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Tests/RectangleTests.cs +++ b/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Tests/RectangleTests.cs @@ -1,11 +1,12 @@ -using Microsoft.Playwright; +using BlazorWorkspace.Testing.Acceptance; +using Microsoft.Playwright; using Xunit; namespace SprightBlazor.Tests.Acceptance; -public class RectangleTests : AcceptanceTestsBase +public class RectangleTests : SprightAcceptanceTestsBase { - public RectangleTests(PlaywrightFixture playwrightFixture, BlazorServerWebHostFixture blazorServerClassFixture) + public RectangleTests(PlaywrightFixture playwrightFixture, SprightBlazorWebHostServerFixture blazorServerClassFixture) : base(playwrightFixture, blazorServerClassFixture) { } diff --git a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Tests/SprightAcceptanceTestsBase.cs b/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Tests/SprightAcceptanceTestsBase.cs new file mode 100644 index 0000000000..027ce124cb --- /dev/null +++ b/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/Tests/SprightAcceptanceTestsBase.cs @@ -0,0 +1,18 @@ +using BlazorWorkspace.Testing.Acceptance; +using Xunit; + +namespace SprightBlazor.Tests.Acceptance; + +public abstract class SprightAcceptanceTestsBase : AcceptanceTestsBase, IClassFixture +{ + protected SprightAcceptanceTestsBase( + PlaywrightFixture playwrightFixture, + SprightBlazorWebHostServerFixture blazorServerClassFixture) + : base(playwrightFixture) + { + ServerAddress = blazorServerClassFixture.ServerAddress!; + } + + protected override Uri ServerAddress { get; } + protected override string ComponentLibraryInitializationTestJavaScript => "window.SprightBlazor && window.SprightBlazor.calledAfterStarted === true"; +} diff --git a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/_Imports.razor b/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/_Imports.razor index 4983bda494..5d1ba94e54 100644 --- a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/_Imports.razor +++ b/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/_Imports.razor @@ -7,6 +7,6 @@ @using Microsoft.AspNetCore.Components.Web.Virtualization @using Microsoft.JSInterop @using NimbleBlazor +@using BlazorWorkspace.Testing.Acceptance @using SprightBlazor.Tests.Acceptance -@using SprightBlazor.Tests.Acceptance.Shared @using SprightBlazor.Tests.Acceptance.Pages diff --git a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/packages.lock.json b/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/packages.lock.json index 1bef860d9c..c8939a6687 100644 --- a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/packages.lock.json +++ b/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/packages.lock.json @@ -1058,6 +1058,20 @@ "xunit.abstractions": "2.0.3" } }, + "blazorworkspace.testing.acceptance": { + "type": "Project", + "dependencies": { + "Microsoft.AspNetCore.Mvc.Testing": "[6.0.29, )", + "Microsoft.Extensions.Configuration": "[7.0.0, )", + "Microsoft.NET.Test.Sdk": "[16.11.0, )", + "Microsoft.Playwright": "[1.42.0, 1.42.0]", + "NI.CSharp.Analyzers": "[2.0.21, 2.0.21]", + "NimbleBlazor": "[1.0.0, )", + "System.ComponentModel": "[4.3.0, )", + "xunit": "[2.8.0, )", + "xunit.extensibility.execution": "[2.8.0, )" + } + }, "nimbleblazor": { "type": "Project", "dependencies": { diff --git a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/wwwroot/css/site.css b/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/wwwroot/css/site.css index 3afadc202e..10c6ea115e 100644 --- a/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/wwwroot/css/site.css +++ b/packages/blazor-workspace/Tests/SprightBlazor.Tests.Acceptance/wwwroot/css/site.css @@ -10,12 +10,12 @@ z-index: 1000; } - #blazor-error-ui .dismiss { - cursor: pointer; - position: absolute; - right: 0.75rem; - top: 0.5rem; - } +#blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; +} .blazor-error-boundary { background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; @@ -23,6 +23,6 @@ color: white; } - .blazor-error-boundary::after { - content: "An error has occurred." - } +.blazor-error-boundary::after { + content: "An error has occurred." +}