Skip to content

Commit d9e759f

Browse files
authored
Make public api and tests the same for all TFMs (#885)
* Unify public api among TFMs and run the same tests for all platforms * Hotfix release_packages.yml
1 parent fcce009 commit d9e759f

File tree

5 files changed

+52
-7
lines changed

5 files changed

+52
-7
lines changed

.github/workflows/release_packages.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ jobs:
1515
dotnet-version: 9.0.x
1616

1717
- name: Build package
18-
run: dotnet pack src/NSubstitute/NSubstitute.csproj -p:CI=true
18+
run: dotnet pack src/NSubstitute/NSubstitute.csproj -o bin -p:CI=true
1919

2020
- name: Upload packages
2121
uses: actions/upload-artifact@v4
2222
with:
2323
name: packages
2424
path: |
25-
bin/Release/NSubstitute/*.nupkg
26-
bin/Release/NSubstitute/*.snupkg
25+
bin/*.nupkg
26+
bin/*.snupkg
2727
retention-days: 7

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
* [UPDATE] Migrate to slnx format for solution file
1212
* [UPDATE] Migrate documentation validation from build.fsproj to Roslyn code generator
1313
* [NEW] Added NuGet Package README file.
14+
* [UPDATE] Make public api and tests the same for all TFMs
1415

1516
### 5.3.0 (October 2024)
1617

src/NSubstitute/Extensions/ExceptionExtensions.cs

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,15 +161,18 @@ public static ConfiguredCall ThrowsAsyncForAnyArgs(this Task value, Func<CallInf
161161
public static ConfiguredCall ThrowsAsyncForAnyArgs<T>(this Task<T> value, Func<CallInfo, Exception> createException) =>
162162
value.ReturnsForAnyArgs(ci => Task.FromException<T>(createException(ci)));
163163

164-
#if NET5_0_OR_GREATER
165164
/// <summary>
166165
/// Throw an exception for this call.
167166
/// </summary>
168167
/// <param name="value"></param>
169168
/// <param name="ex">Exception to throw</param>
170169
/// <returns></returns>
171170
public static ConfiguredCall ThrowsAsync<T>(this ValueTask<T> value, Exception ex) =>
171+
#if NETSTANDARD2_0
172+
value.Returns(_ => new ValueTask<T>(Task.FromException<T>(ex)));
173+
#else
172174
value.Returns(_ => ValueTask.FromException<T>(ex));
175+
#endif
173176

174177
/// <summary>
175178
/// Throw an exception of the given type for this call.
@@ -181,7 +184,11 @@ public static ConfiguredCall ThrowsAsync<T>(this ValueTask<T> value, Exception e
181184
public static ConfiguredCall ThrowsAsync<TResult, TException>(this ValueTask<TResult> value)
182185
where TException : notnull, Exception, new()
183186
{
187+
#if NETSTANDARD2_0
188+
return value.Returns(_ => new ValueTask<TResult>(Task.FromException<TResult>(new TException())));
189+
#else
184190
return value.Returns(_ => ValueTask.FromException<TResult>(new TException()));
191+
#endif
185192
}
186193

187194
/// <summary>
@@ -191,7 +198,11 @@ public static ConfiguredCall ThrowsAsync<TResult, TException>(this ValueTask<TRe
191198
/// <param name="createException">Func creating exception object</param>
192199
/// <returns></returns>
193200
public static ConfiguredCall ThrowsAsync<T>(this ValueTask<T> value, Func<CallInfo, Exception> createException) =>
201+
#if NETSTANDARD2_0
202+
value.Returns(ci => new ValueTask<T>(Task.FromException<T>(createException(ci))));
203+
#else
194204
value.Returns(ci => ValueTask.FromException<T>(createException(ci)));
205+
#endif
195206

196207
/// <summary>
197208
/// Throws an exception of the given type for this call made with any arguments.
@@ -203,7 +214,11 @@ public static ConfiguredCall ThrowsAsync<T>(this ValueTask<T> value, Func<CallIn
203214
public static ConfiguredCall ThrowsAsyncForAnyArgs<T, TException>(this ValueTask<T> value)
204215
where TException : notnull, Exception, new()
205216
{
217+
#if NETSTANDARD2_0
218+
return value.ReturnsForAnyArgs(_ => new ValueTask<T>(Task.FromException<T>(new TException())));
219+
#else
206220
return value.ReturnsForAnyArgs(_ => ValueTask.FromException<T>(new TException()));
221+
#endif
207222
}
208223

209224
/// <summary>
@@ -213,7 +228,11 @@ public static ConfiguredCall ThrowsAsyncForAnyArgs<T, TException>(this ValueTask
213228
/// <param name="ex">Exception to throw</param>
214229
/// <returns></returns>
215230
public static ConfiguredCall ThrowsAsyncForAnyArgs<T>(this ValueTask<T> value, Exception ex) =>
231+
#if NETSTANDARD2_0
232+
value.ReturnsForAnyArgs(_ => new ValueTask<T>(Task.FromException<T>(ex)));
233+
#else
216234
value.ReturnsForAnyArgs(_ => ValueTask.FromException<T>(ex));
235+
#endif
217236

218237
/// <summary>
219238
/// Throws an exception for this call made with any arguments, as generated by the specified function.
@@ -222,7 +241,11 @@ public static ConfiguredCall ThrowsAsyncForAnyArgs<T>(this ValueTask<T> value, E
222241
/// <param name="createException">Func creating exception object</param>
223242
/// <returns></returns>
224243
public static ConfiguredCall ThrowsAsyncForAnyArgs<T>(this ValueTask<T> value, Func<CallInfo, Exception> createException) =>
244+
#if NETSTANDARD2_0
245+
value.ReturnsForAnyArgs(ci => new ValueTask<T>(Task.FromException<T>(createException(ci))));
246+
#else
225247
value.ReturnsForAnyArgs(ci => ValueTask.FromException<T>(createException(ci)));
248+
#endif
226249

227250
/// <summary>
228251
/// Throw an exception for this call.
@@ -231,7 +254,11 @@ public static ConfiguredCall ThrowsAsyncForAnyArgs<T>(this ValueTask<T> value, F
231254
/// <param name="ex">Exception to throw</param>
232255
/// <returns></returns>
233256
public static ConfiguredCall ThrowsAsync(this ValueTask value, Exception ex) =>
257+
#if NETSTANDARD2_0
258+
value.Returns(_ => new ValueTask(Task.FromException(ex)));
259+
#else
234260
value.Returns(_ => ValueTask.FromException(ex));
261+
#endif
235262

236263
/// <summary>
237264
/// Throw an exception of the given type for this call.
@@ -242,7 +269,11 @@ public static ConfiguredCall ThrowsAsync(this ValueTask value, Exception ex) =>
242269
public static ConfiguredCall ThrowsAsync<TException>(this ValueTask value)
243270
where TException : notnull, Exception, new()
244271
{
272+
#if NETSTANDARD2_0
273+
return value.Returns(_ => new ValueTask(Task.FromException(new TException())));
274+
#else
245275
return value.Returns(_ => ValueTask.FromException(new TException()));
276+
#endif
246277
}
247278

248279
/// <summary>
@@ -252,7 +283,11 @@ public static ConfiguredCall ThrowsAsync<TException>(this ValueTask value)
252283
/// <param name="createException">Func creating exception object</param>
253284
/// <returns></returns>
254285
public static ConfiguredCall ThrowsAsync(this ValueTask value, Func<CallInfo, Exception> createException) =>
286+
#if NETSTANDARD2_0
287+
value.Returns(ci => new ValueTask(Task.FromException(createException(ci))));
288+
#else
255289
value.Returns(ci => ValueTask.FromException(createException(ci)));
290+
#endif
256291

257292
/// <summary>
258293
/// Throws an exception of the given type for this call made with any arguments.
@@ -263,7 +298,11 @@ public static ConfiguredCall ThrowsAsync(this ValueTask value, Func<CallInfo, Ex
263298
public static ConfiguredCall ThrowsAsyncForAnyArgs<TException>(this ValueTask value)
264299
where TException : notnull, Exception, new()
265300
{
301+
#if NETSTANDARD2_0
302+
return value.ReturnsForAnyArgs(_ => new ValueTask(Task.FromException(new TException())));
303+
#else
266304
return value.ReturnsForAnyArgs(_ => ValueTask.FromException(new TException()));
305+
#endif
267306
}
268307

269308
/// <summary>
@@ -273,7 +312,11 @@ public static ConfiguredCall ThrowsAsyncForAnyArgs<TException>(this ValueTask va
273312
/// <param name="ex">Exception to throw</param>
274313
/// <returns></returns>
275314
public static ConfiguredCall ThrowsAsyncForAnyArgs(this ValueTask value, Exception ex) =>
315+
#if NETSTANDARD2_0
316+
value.ReturnsForAnyArgs(_ => new ValueTask(Task.FromException(ex)));
317+
#else
276318
value.ReturnsForAnyArgs(_ => ValueTask.FromException(ex));
319+
#endif
277320

278321
/// <summary>
279322
/// Throws an exception for this call made with any arguments, as generated by the specified function.
@@ -282,6 +325,9 @@ public static ConfiguredCall ThrowsAsyncForAnyArgs(this ValueTask value, Excepti
282325
/// <param name="createException">Func creating exception object</param>
283326
/// <returns></returns>
284327
public static ConfiguredCall ThrowsAsyncForAnyArgs(this ValueTask value, Func<CallInfo, Exception> createException) =>
328+
#if NETSTANDARD2_0
329+
value.ReturnsForAnyArgs(ci => new ValueTask(Task.FromException(createException(ci))));
330+
#else
285331
value.ReturnsForAnyArgs(ci => ValueTask.FromException(createException(ci)));
286332
#endif
287333

src/NSubstitute/NSubstitute.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
</ItemGroup>
5555

5656
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
57-
<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.3.0-*" />
57+
<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.4" />
5858
</ItemGroup>
5959

6060
</Project>

tests/NSubstitute.Acceptance.Specs/ThrowingAsyncExceptions.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,6 @@ public void TearDown()
207207
}
208208
}
209209

210-
#if NET5_0_OR_GREATER
211210
public class ForValueTask
212211
{
213212

@@ -421,7 +420,6 @@ public static void AssertDoesNotThrow(Func<ValueTask> act)
421420
Assert.That(actual.IsFaulted, Is.False);
422421
}
423422
}
424-
#endif
425423

426424
public static TException AssertFaultedTaskException<TException>(Func<Task> act)
427425
where TException : Exception

0 commit comments

Comments
 (0)