From e15b3594aa735621c81bcd23743ddd4546c65ade Mon Sep 17 00:00:00 2001 From: Erik Schierboom Date: Sun, 16 Feb 2025 10:54:10 +0100 Subject: [PATCH 1/2] Add xunit.v3 package --- .github/workflows/publish.yml | 5 ++ Exercism.Tests.sln | 14 +++++ .../Exercism.Tests.xunit.v3.csproj | 31 +++++++++++ src/Exercism.Tests.xunit.v3/TaskAttribute.cs | 14 +++++ .../UseCultureAttribute.cs | 51 ++++++++++++++++++ src/Exercism.Tests.xunit.v3/images/icon.png | Bin 0 -> 2097 bytes .../UseCultureAttributeTests.cs | 4 +- .../Exercism.Tests.xunit.v3.Tests.csproj | 39 ++++++++++++++ .../TaskAttributeTests.cs | 27 ++++++++++ .../UseCultureAttributeTests.cs | 39 ++++++++++++++ .../xunit.runner.json | 3 ++ 11 files changed, 225 insertions(+), 2 deletions(-) create mode 100644 src/Exercism.Tests.xunit.v3/Exercism.Tests.xunit.v3.csproj create mode 100644 src/Exercism.Tests.xunit.v3/TaskAttribute.cs create mode 100644 src/Exercism.Tests.xunit.v3/UseCultureAttribute.cs create mode 100644 src/Exercism.Tests.xunit.v3/images/icon.png create mode 100644 tests/Exercism.Tests.xunit.v3.Tests/Exercism.Tests.xunit.v3.Tests.csproj create mode 100644 tests/Exercism.Tests.xunit.v3.Tests/TaskAttributeTests.cs create mode 100644 tests/Exercism.Tests.xunit.v3.Tests/UseCultureAttributeTests.cs create mode 100644 tests/Exercism.Tests.xunit.v3.Tests/xunit.runner.json diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 5d483e2..db3da23 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -20,3 +20,8 @@ jobs: PROJECT_FILE_PATH: src/Exercism.Tests/Exercism.Tests.csproj NUGET_KEY: ${{ secrets.NUGET_API_KEY }} INCLUDE_SYMBOLS: true + - uses: rohith/publish-nuget@c12b8546b67672ee38ac87bea491ac94a587f7cc # 2.5.5 + with: + PROJECT_FILE_PATH: src/Exercism.Tests.xunit.v3/Exercism.Tests.xunit.v3.csproj + NUGET_KEY: ${{ secrets.NUGET_API_KEY }} + INCLUDE_SYMBOLS: true diff --git a/Exercism.Tests.sln b/Exercism.Tests.sln index a06d260..b50abae 100644 --- a/Exercism.Tests.sln +++ b/Exercism.Tests.sln @@ -11,6 +11,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{14AF2F5A EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Exercism.Tests.Tests", "tests\Exercism.Tests.Tests\Exercism.Tests.Tests.csproj", "{900E6F72-8D50-466D-A6C4-DA9714F4048C}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Exercism.Tests.xunit.v3", "src\Exercism.Tests.xunit.v3\Exercism.Tests.xunit.v3.csproj", "{90C6D541-8975-4176-A164-3C119CDE56C1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Exercism.Tests.xunit.v3.Tests", "tests\Exercism.Tests.xunit.v3.Tests\Exercism.Tests.xunit.v3.Tests.csproj", "{B3A9A059-8D28-4841-9CF8-323EFBFF41C9}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -28,9 +32,19 @@ Global {900E6F72-8D50-466D-A6C4-DA9714F4048C}.Debug|Any CPU.Build.0 = Debug|Any CPU {900E6F72-8D50-466D-A6C4-DA9714F4048C}.Release|Any CPU.ActiveCfg = Release|Any CPU {900E6F72-8D50-466D-A6C4-DA9714F4048C}.Release|Any CPU.Build.0 = Release|Any CPU + {90C6D541-8975-4176-A164-3C119CDE56C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {90C6D541-8975-4176-A164-3C119CDE56C1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {90C6D541-8975-4176-A164-3C119CDE56C1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {90C6D541-8975-4176-A164-3C119CDE56C1}.Release|Any CPU.Build.0 = Release|Any CPU + {B3A9A059-8D28-4841-9CF8-323EFBFF41C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B3A9A059-8D28-4841-9CF8-323EFBFF41C9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B3A9A059-8D28-4841-9CF8-323EFBFF41C9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B3A9A059-8D28-4841-9CF8-323EFBFF41C9}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution {3FD7D5E5-05AC-4B9D-8062-63430962A4BE} = {2DA5F395-76DA-446D-99AC-4F56ED0AFE01} {900E6F72-8D50-466D-A6C4-DA9714F4048C} = {14AF2F5A-6AB7-480D-9790-7A00C9A72C20} + {90C6D541-8975-4176-A164-3C119CDE56C1} = {2DA5F395-76DA-446D-99AC-4F56ED0AFE01} + {B3A9A059-8D28-4841-9CF8-323EFBFF41C9} = {14AF2F5A-6AB7-480D-9790-7A00C9A72C20} EndGlobalSection EndGlobal diff --git a/src/Exercism.Tests.xunit.v3/Exercism.Tests.xunit.v3.csproj b/src/Exercism.Tests.xunit.v3/Exercism.Tests.xunit.v3.csproj new file mode 100644 index 0000000..f3dea61 --- /dev/null +++ b/src/Exercism.Tests.xunit.v3/Exercism.Tests.xunit.v3.csproj @@ -0,0 +1,31 @@ + + + + net6.0 + enable + enable + Exercism.Tests + + + + Exercism.Tests.xunit.v3 + 0.1.0-beta1 + Exercism Testing + This library adds Exercism-specific functionality related to testing solutions using xUnit v3. + Erik Schierboom + Exercism + Exercism;Testing + AGPL-3.0-or-later + icon.png + https://github.com/exercism/dotnet-tests + + + + + + + + + + + diff --git a/src/Exercism.Tests.xunit.v3/TaskAttribute.cs b/src/Exercism.Tests.xunit.v3/TaskAttribute.cs new file mode 100644 index 0000000..10073fd --- /dev/null +++ b/src/Exercism.Tests.xunit.v3/TaskAttribute.cs @@ -0,0 +1,14 @@ +namespace Exercism.Tests; + +[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] +public class TaskAttribute : Attribute +{ + public int Number { get; } + + public TaskAttribute(int number) + { + if (number <= 0) throw new ArgumentOutOfRangeException(nameof(number), number, "Number must be greater than zero"); + + Number = number; + } +} diff --git a/src/Exercism.Tests.xunit.v3/UseCultureAttribute.cs b/src/Exercism.Tests.xunit.v3/UseCultureAttribute.cs new file mode 100644 index 0000000..222abb7 --- /dev/null +++ b/src/Exercism.Tests.xunit.v3/UseCultureAttribute.cs @@ -0,0 +1,51 @@ +using System.Globalization; +using System.Reflection; +using Xunit.v3; + +namespace Exercism.Tests; + +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] +public class UseCultureAttribute : BeforeAfterTestAttribute +{ + private readonly CultureInfo _culture; + private readonly CultureInfo _uiCulture; + + private CultureInfo _originalCulture; + private CultureInfo _originalUiCulture; + + public UseCultureAttribute() + : this(CultureInfo.InvariantCulture, CultureInfo.InvariantCulture) + { + } + + public UseCultureAttribute(string culture) + : this(culture, culture) + { + } + + public UseCultureAttribute(string culture, string uiCulture) + : this(new CultureInfo(culture, false), new CultureInfo(uiCulture, false)) + { + } + + public UseCultureAttribute(CultureInfo culture, CultureInfo uiCulture) + { + _culture = culture; + _uiCulture = uiCulture; + } + + public override void Before(MethodInfo methodUnderTest, IXunitTest test) + { + _originalCulture = CultureInfo.CurrentCulture; + _originalUiCulture = CultureInfo.CurrentUICulture; + + CultureInfo.CurrentCulture = _culture; + CultureInfo.CurrentUICulture = _uiCulture; + } + + public override void After(MethodInfo methodUnderTest, IXunitTest test) + { + CultureInfo.CurrentCulture = _originalCulture; + CultureInfo.CurrentUICulture = _originalUiCulture; + } +} \ No newline at end of file diff --git a/src/Exercism.Tests.xunit.v3/images/icon.png b/src/Exercism.Tests.xunit.v3/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e72ba289fb73c1c689e0877babaf694075d1845b GIT binary patch literal 2097 zcmV-12+sG3P)ii1B$WpWaA(6nO0(1cKE(s8C=8e);9 zQYjk#fyiJLV?~}Tcinc71kZn&BdiT72(j1{;H%k)lB4pn+2blx4 zdgflY08z0M&p}Mv*JdDV1A)|-8mkbImGuGAeXf~+OanrbTC8N07#0b=X+7i_Kdk>eGh{C;l4w1nEXQE| zVXTmUfXk8312Plq+i9a44YCA49_9hL0|cmKgj@?W&hvmg1_EqhgnS1}1Q?o9d1{RS zay=tt29_AWgHe{jNV$p;avqi#&Ib~_8sA`qoP#CC@_`(LBfMfBasnU7VU|Kp;R89w zQpl-%AY%lifE17dQa}nw0VyB_BpYP1Hz8kSgq)5grg4Xy%Lq9QOC<1t9FHT+W`qRi znZyTj3XTxZ2-(lrZEeDy!4V#2gLDL7iENjnt#wEDR@62bV!2YizwCIun**=n2z}Tf zk7EUCn~J|A?Ow$nFgfp{4q^4OXq(bDVv$QyY8{SXqhyjPkXryGQ5k6~9t;k3d#jOx z_-hI*GfY+`=k|eP-!Va^V1Y20uev%zBCW4>Ua%;bY--DFg@><#r2G;V$fllHAQkxk zd`MDTz*Y^7beE=5Jdwhmgbxg6fdu!9REFJ+9jTGf@iV3lyz{qznOlkMJBRHf;}c>! zNYRrv@6+2uK8eHiW@1#};Gx~7yl(0{+D2PyyF?XKXs)A_)JuTviE>qSGHUDtpn z*Fjo7`nJcAv%op-!ER>;Ie61Qj%sJ<6jz02=jWVoxx>-o9C1SGG_KbQPa#)=&M#nh zTLg0W?FKC`D)*?Z%0v6gaGSmJ@A{+L15a zMPn3l_qzdIZL!GL11>!{8-XKrE%yX63w(~rP*TZI_qsv0PE}~sS@jyF_s68ud6Go= zt8N6273BW2bPKrzFfJy7Ped;DtZI+a@Gq5jn=&|ER(X}&ZWiIXHWgg)V#APNW+9z& zjq!o1dA-t5eN*Nlr%R!0mine_w`veB(lBH>s0s`_4Ugo#*KXD7_BqH~s}@1d&(ux7 zMcxv^)$j<8=D*W0q+E3$?iYSc=4v(I$?0C|wu#2m{Tmp{dsoXGt@eH#spnDmZM4S8 zst|C+Ih2t*tT`IT3Dg*YwBI=Jtx8{fV9Hj3Fa=tTv?myG;8roP3X09HbjML9YSu5c zArFFcsnH2?cFSrzk z_&}C|5C@qcF93x?K9IRMf{pTU(vkzASYoM8wBo|TLe=#DY`d%QAidiH9HB3z84YqM zmY}7RkfBMqDyg*(^?RA#4SesURn%#aVA4F359DMV;VDMQcq~CnCm}D>H?e;jeY+&Sdn@m&;X2*CTzx z7_+x7c&LfLNX z1AuYDPX>B)Ms2aVV4U6gDJJeV)S;6KpcnQPZ74Zpta9@IsnQBa0qMh#oU#L>ErlG% z2Qtz;WGa@R`PXDx6sM=7l(719BBl4e;A znGM7rbTC5_TR;Q8v6itCZYHMhIHW_ifJa9P+F>PQMGqhyLETELx4*jzJb;pvY*{I^ zF#{AwB)YyGh>fjD=YUTs77hY?CtzYrkVlS~zDZ)Jq4 z1iO5w*GK;+CQihvM5Xu5K<2B}hF0qKG4f*_r89yE*-y+st{@RdZ`4Z<8ibVPrUUC2 z&rh1!ZfWz=KXn-DqhSrNKM^-38d==*MVn6<>hs_EZI;e90VyDT%><-?^feQZ0@Bw^ zKnh4-GXZIp{SA@Q-q{q9lnMX<03~!qSaf7zbY(hYa%Ew3WdJfTGBGVMH7zhUR53F; zFf=+bG%GMLIxsM2WbY#Y001R)MObuXVRU6WZEs|0W_bWIFfuVMFf}bOHdHY)IxsXk bF*GYMFgh?W7CBd+00000NkvXXu0mjf!C + + + enable + enable + Exe + Exercism.Tests.xunit.v3.Tests + net8.0 + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/Exercism.Tests.xunit.v3.Tests/TaskAttributeTests.cs b/tests/Exercism.Tests.xunit.v3.Tests/TaskAttributeTests.cs new file mode 100644 index 0000000..a1b5844 --- /dev/null +++ b/tests/Exercism.Tests.xunit.v3.Tests/TaskAttributeTests.cs @@ -0,0 +1,27 @@ +namespace Exercism.Tests.xunit.v3.Tests; + +public class TaskAttributeTests +{ + [Fact] + public void CanBeUsedOnMethod() + { + [Task(1)] + string TestMethod() => "One"; + } + + [Fact] + public void ThrowsArgumentOutOfRangeExceptionWhenNumberIsZero() + { + Assert.Throws(() => new TaskAttribute(0)); + } + + [Theory] + [InlineData(-1)] + [InlineData(-2)] + [InlineData(-82)] + [InlineData(-123_832_991)] + public void ThrowsArgumentOutOfRangeExceptionWhenNumberIsNegative(int number) + { + Assert.Throws(() => new TaskAttribute(number)); + } +} \ No newline at end of file diff --git a/tests/Exercism.Tests.xunit.v3.Tests/UseCultureAttributeTests.cs b/tests/Exercism.Tests.xunit.v3.Tests/UseCultureAttributeTests.cs new file mode 100644 index 0000000..84c4165 --- /dev/null +++ b/tests/Exercism.Tests.xunit.v3.Tests/UseCultureAttributeTests.cs @@ -0,0 +1,39 @@ +using System.Globalization; + +namespace Exercism.Tests.xunit.v3.Tests; + +// Uncomment once xUnit issue is fixed +// [UseCulture("en-US")] +public class UseCultureAttributeTests +{ + [Fact] + [UseCulture("nl-NL")] + public void SpecifyCulture() + { + Assert.Equal("nl-NL", CultureInfo.CurrentCulture.Name); + Assert.Equal("nl-NL", CultureInfo.CurrentUICulture.Name); + } + + [Fact] + [UseCulture("nl-NL", "nl-BE")] + public void SpecifyCultureAndUiCulture() + { + Assert.Equal("nl-NL", CultureInfo.CurrentCulture.Name); + Assert.Equal("nl-BE", CultureInfo.CurrentUICulture.Name); + } + + [Fact] + [UseCulture] + public void DontSpecifyCulture() + { + Assert.Equal(CultureInfo.InvariantCulture.Name, CultureInfo.CurrentCulture.Name); + Assert.Equal(CultureInfo.InvariantCulture.Name, CultureInfo.CurrentUICulture.Name); + } + + [Fact(Skip = "Unskip once xUnit issue is fixed")] + public void InheritCultureFromClass() + { + Assert.Equal("en-US", CultureInfo.CurrentCulture.Name); + Assert.Equal("en-US", CultureInfo.CurrentUICulture.Name); + } +} \ No newline at end of file diff --git a/tests/Exercism.Tests.xunit.v3.Tests/xunit.runner.json b/tests/Exercism.Tests.xunit.v3.Tests/xunit.runner.json new file mode 100644 index 0000000..86c7ea0 --- /dev/null +++ b/tests/Exercism.Tests.xunit.v3.Tests/xunit.runner.json @@ -0,0 +1,3 @@ +{ + "$schema": "https://xunit.net/schema/current/xunit.runner.schema.json" +} From 0d2edfd3ca37542a7c2ab839c7262a43942c9f35 Mon Sep 17 00:00:00 2001 From: Erik Schierboom Date: Sun, 16 Feb 2025 20:50:50 +0100 Subject: [PATCH 2/2] Rebased --- src/Directory.Build.props | 10 + .../Exercism.Tests.xunit.v3.csproj | 10 +- .../UseCultureAttribute.cs | 8 +- .../packages.lock.json | 29 +++ src/Exercism.Tests/Exercism.Tests.csproj | 8 +- .../Exercism.Tests.xunit.v3.Tests.csproj | 12 +- .../packages.lock.json | 175 ++++++++++++++++++ 7 files changed, 222 insertions(+), 30 deletions(-) create mode 100644 src/Directory.Build.props create mode 100644 src/Exercism.Tests.xunit.v3/packages.lock.json create mode 100644 tests/Exercism.Tests.xunit.v3.Tests/packages.lock.json diff --git a/src/Directory.Build.props b/src/Directory.Build.props new file mode 100644 index 0000000..59e2887 --- /dev/null +++ b/src/Directory.Build.props @@ -0,0 +1,10 @@ + + + Erik Schierboom + Exercism + Exercism;Testing + AGPL-3.0-or-later + icon.png + https://github.com/exercism/dotnet-tests + + diff --git a/src/Exercism.Tests.xunit.v3/Exercism.Tests.xunit.v3.csproj b/src/Exercism.Tests.xunit.v3/Exercism.Tests.xunit.v3.csproj index f3dea61..e287baa 100644 --- a/src/Exercism.Tests.xunit.v3/Exercism.Tests.xunit.v3.csproj +++ b/src/Exercism.Tests.xunit.v3/Exercism.Tests.xunit.v3.csproj @@ -10,14 +10,8 @@ Exercism.Tests.xunit.v3 0.1.0-beta1 - Exercism Testing - This library adds Exercism-specific functionality related to testing solutions using xUnit v3. - Erik Schierboom - Exercism - Exercism;Testing - AGPL-3.0-or-later - icon.png - https://github.com/exercism/dotnet-tests + Exercism Testing using xUnit v3 + This library adds Exercism-specific functionality related to testing solutions using xUnit v3. diff --git a/src/Exercism.Tests.xunit.v3/UseCultureAttribute.cs b/src/Exercism.Tests.xunit.v3/UseCultureAttribute.cs index 222abb7..43d7d23 100644 --- a/src/Exercism.Tests.xunit.v3/UseCultureAttribute.cs +++ b/src/Exercism.Tests.xunit.v3/UseCultureAttribute.cs @@ -10,8 +10,8 @@ public class UseCultureAttribute : BeforeAfterTestAttribute private readonly CultureInfo _culture; private readonly CultureInfo _uiCulture; - private CultureInfo _originalCulture; - private CultureInfo _originalUiCulture; + private CultureInfo? _originalCulture; + private CultureInfo? _originalUiCulture; public UseCultureAttribute() : this(CultureInfo.InvariantCulture, CultureInfo.InvariantCulture) @@ -45,7 +45,7 @@ public override void Before(MethodInfo methodUnderTest, IXunitTest test) public override void After(MethodInfo methodUnderTest, IXunitTest test) { - CultureInfo.CurrentCulture = _originalCulture; - CultureInfo.CurrentUICulture = _originalUiCulture; + CultureInfo.CurrentCulture = _originalCulture!; + CultureInfo.CurrentUICulture = _originalUiCulture!; } } \ No newline at end of file diff --git a/src/Exercism.Tests.xunit.v3/packages.lock.json b/src/Exercism.Tests.xunit.v3/packages.lock.json new file mode 100644 index 0000000..9bbdc85 --- /dev/null +++ b/src/Exercism.Tests.xunit.v3/packages.lock.json @@ -0,0 +1,29 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "xunit.v3.extensibility.core": { + "type": "Direct", + "requested": "[1.1.0, )", + "resolved": "1.1.0", + "contentHash": "AeQbbYN001x0c+B9pqwml6jZPovHz8O/sOp7jmrjz90rUzz/QPal12SlHLKYszR44CMnW4MsDam3RYT5pkYUxw==", + "dependencies": { + "xunit.v3.common": "[1.1.0]" + } + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" + }, + "xunit.v3.common": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "Cq55z8pC7fOkfj+3TB/YQ6OW96qWqxKiMd15CtkIl37VtV9EsiUL4B4HsR6VLJCzkk7cBiXQ1ABVIcp3TCm6HQ==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + } + } + } +} \ No newline at end of file diff --git a/src/Exercism.Tests/Exercism.Tests.csproj b/src/Exercism.Tests/Exercism.Tests.csproj index b3836ff..3302925 100644 --- a/src/Exercism.Tests/Exercism.Tests.csproj +++ b/src/Exercism.Tests/Exercism.Tests.csproj @@ -5,13 +5,7 @@ Exercism.Tests 0.1.0-beta1 Exercism Testing - This library adds Exercism-specific functionality related to testing solutions. - Erik Schierboom - Exercism - Exercism;Testing - AGPL-3.0-or-later - icon.png - https://github.com/exercism/dotnet-tests + This library adds Exercism-specific functionality related to testing solutions. diff --git a/tests/Exercism.Tests.xunit.v3.Tests/Exercism.Tests.xunit.v3.Tests.csproj b/tests/Exercism.Tests.xunit.v3.Tests/Exercism.Tests.xunit.v3.Tests.csproj index d0bf9e9..04d42b4 100644 --- a/tests/Exercism.Tests.xunit.v3.Tests/Exercism.Tests.xunit.v3.Tests.csproj +++ b/tests/Exercism.Tests.xunit.v3.Tests/Exercism.Tests.xunit.v3.Tests.csproj @@ -5,17 +5,7 @@ enable Exe Exercism.Tests.xunit.v3.Tests - net8.0 - + net6.0 diff --git a/tests/Exercism.Tests.xunit.v3.Tests/packages.lock.json b/tests/Exercism.Tests.xunit.v3.Tests/packages.lock.json new file mode 100644 index 0000000..6c48094 --- /dev/null +++ b/tests/Exercism.Tests.xunit.v3.Tests/packages.lock.json @@ -0,0 +1,175 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "[17.13.0, )", + "resolved": "17.13.0", + "contentHash": "W19wCPizaIC9Zh47w8wWI/yxuqR7/dtABwOrc8r2jX/8mUNxM2vw4fXDh+DJTeogxV+KzKwg5jNNGQVwf3LXyA==", + "dependencies": { + "Microsoft.CodeCoverage": "17.13.0", + "Microsoft.TestPlatform.TestHost": "17.13.0" + } + }, + "xunit.runner.visualstudio": { + "type": "Direct", + "requested": "[3.0.2, )", + "resolved": "3.0.2", + "contentHash": "oXbusR6iPq0xlqoikjdLvzh+wQDkMv9If58myz9MEzldS4nIcp442Btgs2sWbYWV+caEluMe2pQCZ0hUZgPiow==" + }, + "xunit.v3": { + "type": "Direct", + "requested": "[1.1.0, )", + "resolved": "1.1.0", + "contentHash": "1ckSz5GVswlM9TCk5bGdHOjnYwqAWjkeqxckoHawQIA8sTeuN+RCBUypCi5A/Um0XlczRx5TjAK5W6BbN0HLcQ==", + "dependencies": { + "xunit.analyzers": "1.20.0", + "xunit.v3.assert": "[1.1.0]", + "xunit.v3.core": "[1.1.0]" + } + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "17.13.0", + "contentHash": "9LIUy0y+DvUmEPtbRDw6Bay3rzwqFV8P4efTrK4CZhQle3M/QwLPjISghfcolmEGAPWxuJi6m98ZEfk4VR4Lfg==" + }, + "Microsoft.Testing.Extensions.TrxReport.Abstractions": { + "type": "Transitive", + "resolved": "1.5.3", + "contentHash": "h34zKNpGyni66VH738mRHeXSnf3klSShUdavUWNhSfWICUUi5aXeI0LBvoX/ad93N0+9xBDU3Fyi6WfxrwKQGw==", + "dependencies": { + "Microsoft.Testing.Platform": "1.5.3" + } + }, + "Microsoft.Testing.Platform": { + "type": "Transitive", + "resolved": "1.5.3", + "contentHash": "WqJydnJ99dEKtquR9HwINz104ehWJKTXbQQrydGatlLRw14bmsx0pa8+E6KUXMYXZAimN0swWlDmcJGjjW4TIg==" + }, + "Microsoft.Testing.Platform.MSBuild": { + "type": "Transitive", + "resolved": "1.5.3", + "contentHash": "bOtpRMSPeT5YLQo+NNY8EtdNTphAUcmALjW4ABU7P0rb6yR2XAZau3TzNieLmR3lRuwudguWzzBhgcLRXwZh0A==", + "dependencies": { + "Microsoft.Testing.Platform": "1.5.3" + } + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "17.13.0", + "contentHash": "bt0E0Dx+iqW97o4A59RCmUmz/5NarJ7LRL+jXbSHod72ibL5XdNm1Ke+UO5tFhBG4VwHLcSjqq9BUSblGNWamw==", + "dependencies": { + "System.Reflection.Metadata": "1.6.0" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "17.13.0", + "contentHash": "9GGw08Dc3AXspjekdyTdZ/wYWFlxbgcF0s7BKxzVX+hzAwpifDOdxM+ceVaaJSQOwqt3jtuNlHn3XTpKUS9x9Q==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.13.0", + "Newtonsoft.Json": "13.0.1" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.6.0", + "contentHash": "OEkbBQoklHngJ8UD8ez2AERSk2g+/qpAaSWWCBFbpH727HxDq5ydVkuncBaKcKfwRqXGWx64dS6G1SUScMsitg==" + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "1.6.0", + "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "1.20.0", + "contentHash": "HElev2E9vFbPxwKRQtpCSSzLOu8M/N9EWBCB37v7SRx6z4Lbj19FxfLEig3v9jiI6s4b0l2uena91nEsTWl9jA==" + }, + "xunit.v3.assert": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "4D+eM08ImfhA+zLbRzi8HA4qsT98zDxgaCD7vCg8yFesokKsgSsqWsAmImHFjVymGVhVS7WFGb19d6v1k9i0xQ==", + "dependencies": { + "System.Collections.Immutable": "8.0.0", + "System.Memory": "4.6.0" + } + }, + "xunit.v3.common": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "Cq55z8pC7fOkfj+3TB/YQ6OW96qWqxKiMd15CtkIl37VtV9EsiUL4B4HsR6VLJCzkk7cBiXQ1ABVIcp3TCm6HQ==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, + "xunit.v3.core": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kXP/1d3jnQ2m4skcdM3gSMmubI6P747D6KVswzeedysgFkLj2xJlfo7p7slsmtEnp8BZb8X6D92Hssd/UtVPMw==", + "dependencies": { + "Microsoft.Testing.Platform.MSBuild": "1.5.3", + "xunit.v3.extensibility.core": "[1.1.0]", + "xunit.v3.runner.inproc.console": "[1.1.0]" + } + }, + "xunit.v3.extensibility.core": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "AeQbbYN001x0c+B9pqwml6jZPovHz8O/sOp7jmrjz90rUzz/QPal12SlHLKYszR44CMnW4MsDam3RYT5pkYUxw==", + "dependencies": { + "xunit.v3.common": "[1.1.0]" + } + }, + "xunit.v3.runner.common": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "Q81J0VPuu8fpF+/1CIjThqKKUjnqh0TQrLlD0iORkF75KdsOV+iGWT8c3AVuY96kDoxXxkTf0ZvJsK6o9osc1A==", + "dependencies": { + "xunit.v3.common": "[1.1.0]" + } + }, + "xunit.v3.runner.inproc.console": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "lX/4TwIJe9ysCd5dqLk/Doq8ieYaZGivgf95xR59wRuSV+nHzHnyhpjXfaPUp8nkncUH1rOmJ85o1KebipisXQ==", + "dependencies": { + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "1.5.3", + "Microsoft.Testing.Platform": "1.5.3", + "xunit.v3.extensibility.core": "[1.1.0]", + "xunit.v3.runner.common": "[1.1.0]" + } + }, + "exercism.tests.xunit.v3": { + "type": "Project", + "dependencies": { + "xunit.v3.extensibility.core": "[1.1.0, )" + } + } + } + } +} \ No newline at end of file