1
- using System . Collections . Concurrent ;
2
- using NSubstitute . Callbacks ;
1
+ using NSubstitute . Callbacks ;
3
2
using NSubstitute . Core ;
3
+ using System . Collections . Concurrent ;
4
4
5
5
// Disable nullability for client API, so it does not affect clients.
6
6
#nullable disable annotations
7
7
8
- namespace NSubstitute
8
+ namespace NSubstitute ;
9
+
10
+ /// <summary>
11
+ /// Perform this chain of callbacks and/or always callback when called.
12
+ /// </summary>
13
+ public class Callback
9
14
{
10
15
/// <summary>
11
- /// Perform this chain of callbacks and/or always callback when called.
16
+ /// Perform as first in chain of callback when called.
12
17
/// </summary>
13
- public class Callback
18
+ /// <param name="doThis"></param>
19
+ /// <returns></returns>
20
+ public static ConfiguredCallback First ( Action < CallInfo > doThis )
14
21
{
15
- /// <summary>
16
- /// Perform as first in chain of callback when called.
17
- /// </summary>
18
- /// <param name="doThis"></param>
19
- /// <returns></returns>
20
- public static ConfiguredCallback First ( Action < CallInfo > doThis )
21
- {
22
- return new ConfiguredCallback ( ) . Then ( doThis ) ;
23
- }
22
+ return new ConfiguredCallback ( ) . Then ( doThis ) ;
23
+ }
24
24
25
- /// <summary>
26
- /// Perform this action always when callback is called.
27
- /// </summary>
28
- /// <param name="doThis"></param>
29
- /// <returns></returns>
30
- public static Callback Always ( Action < CallInfo > doThis )
31
- {
32
- return new ConfiguredCallback ( ) . AndAlways ( doThis ) ;
33
- }
25
+ /// <summary>
26
+ /// Perform this action always when callback is called.
27
+ /// </summary>
28
+ /// <param name="doThis"></param>
29
+ /// <returns></returns>
30
+ public static Callback Always ( Action < CallInfo > doThis )
31
+ {
32
+ return new ConfiguredCallback ( ) . AndAlways ( doThis ) ;
33
+ }
34
34
35
- /// <summary>
36
- /// Throw exception returned by function as first callback in chain of callback when called.
37
- /// </summary>
38
- /// <param name="throwThis"></param>
39
- /// <returns></returns>
40
- public static ConfiguredCallback FirstThrow < TException > ( Func < CallInfo , TException > throwThis ) where TException : Exception
41
- {
42
- return new ConfiguredCallback ( ) . ThenThrow ( throwThis ) ;
43
- }
35
+ /// <summary>
36
+ /// Throw exception returned by function as first callback in chain of callback when called.
37
+ /// </summary>
38
+ /// <param name="throwThis"></param>
39
+ /// <returns></returns>
40
+ public static ConfiguredCallback FirstThrow < TException > ( Func < CallInfo , TException > throwThis ) where TException : Exception
41
+ {
42
+ return new ConfiguredCallback ( ) . ThenThrow ( throwThis ) ;
43
+ }
44
44
45
- /// <summary>
46
- /// Throw this exception as first callback in chain of callback when called.
47
- /// </summary>
48
- /// <param name="exception"></param>
49
- /// <returns></returns>
50
- public static ConfiguredCallback FirstThrow < TException > ( TException exception ) where TException : Exception
51
- {
52
- return new ConfiguredCallback ( ) . ThenThrow ( info => exception ) ;
53
- }
45
+ /// <summary>
46
+ /// Throw this exception as first callback in chain of callback when called.
47
+ /// </summary>
48
+ /// <param name="exception"></param>
49
+ /// <returns></returns>
50
+ public static ConfiguredCallback FirstThrow < TException > ( TException exception ) where TException : Exception
51
+ {
52
+ return new ConfiguredCallback ( ) . ThenThrow ( info => exception ) ;
53
+ }
54
54
55
- /// <summary>
56
- /// Throw exception returned by function always when callback is called.
57
- /// </summary>
58
- /// <typeparam name="TException">The type of the exception.</typeparam>
59
- /// <param name="throwThis">The throw this.</param>
60
- /// <returns></returns>
61
- public static Callback AlwaysThrow < TException > ( Func < CallInfo , TException > throwThis ) where TException : Exception
62
- {
63
- return new ConfiguredCallback ( ) . AndAlways ( ToCallback ( throwThis ) ) ;
64
- }
55
+ /// <summary>
56
+ /// Throw exception returned by function always when callback is called.
57
+ /// </summary>
58
+ /// <typeparam name="TException">The type of the exception.</typeparam>
59
+ /// <param name="throwThis">The throw this.</param>
60
+ /// <returns></returns>
61
+ public static Callback AlwaysThrow < TException > ( Func < CallInfo , TException > throwThis ) where TException : Exception
62
+ {
63
+ return new ConfiguredCallback ( ) . AndAlways ( ToCallback ( throwThis ) ) ;
64
+ }
65
65
66
- /// <summary>
67
- /// Throw this exception always when callback is called.
68
- /// </summary>
69
- /// <typeparam name="TException">The type of the exception.</typeparam>
70
- /// <param name="exception">The exception.</param>
71
- /// <returns></returns>
72
- public static Callback AlwaysThrow < TException > ( TException exception ) where TException : Exception
73
- {
74
- return AlwaysThrow ( _ => exception ) ;
75
- }
66
+ /// <summary>
67
+ /// Throw this exception always when callback is called.
68
+ /// </summary>
69
+ /// <typeparam name="TException">The type of the exception.</typeparam>
70
+ /// <param name="exception">The exception.</param>
71
+ /// <returns></returns>
72
+ public static Callback AlwaysThrow < TException > ( TException exception ) where TException : Exception
73
+ {
74
+ return AlwaysThrow ( _ => exception ) ;
75
+ }
76
76
77
- protected static Action < CallInfo > ToCallback < TException > ( Func < CallInfo , TException > throwThis )
78
- where TException : notnull , Exception
79
- {
80
- return ci => { if ( throwThis != null ) throw throwThis ( ci ) ; } ;
81
- }
77
+ protected static Action < CallInfo > ToCallback < TException > ( Func < CallInfo , TException > throwThis )
78
+ where TException : notnull , Exception
79
+ {
80
+ return ci => { if ( throwThis != null ) throw throwThis ( ci ) ; } ;
81
+ }
82
82
83
- internal Callback ( ) { }
84
- private readonly ConcurrentQueue < Action < CallInfo > > callbackQueue = new ConcurrentQueue < Action < CallInfo > > ( ) ;
85
- private Action < CallInfo > alwaysDo = x => { } ;
86
- private Action < CallInfo > keepDoing = x => { } ;
83
+ internal Callback ( ) { }
84
+ private readonly ConcurrentQueue < Action < CallInfo > > callbackQueue = new ConcurrentQueue < Action < CallInfo > > ( ) ;
85
+ private Action < CallInfo > alwaysDo = x => { } ;
86
+ private Action < CallInfo > keepDoing = x => { } ;
87
87
88
- protected void AddCallback ( Action < CallInfo > doThis )
89
- {
90
- callbackQueue . Enqueue ( doThis ) ;
91
- }
88
+ protected void AddCallback ( Action < CallInfo > doThis )
89
+ {
90
+ callbackQueue . Enqueue ( doThis ) ;
91
+ }
92
92
93
- protected void SetAlwaysDo ( Action < CallInfo > always )
93
+ protected void SetAlwaysDo ( Action < CallInfo > always )
94
+ {
95
+ alwaysDo = always ?? ( _ => { } ) ;
96
+ }
97
+
98
+ protected void SetKeepDoing ( Action < CallInfo > keep )
99
+ {
100
+ keepDoing = keep ?? ( _ => { } ) ;
101
+ }
102
+
103
+ public void Call ( CallInfo callInfo )
104
+ {
105
+ try
94
106
{
95
- alwaysDo = always ?? ( _ => { } ) ;
107
+ CallFromStack ( callInfo ) ;
96
108
}
97
-
98
- protected void SetKeepDoing ( Action < CallInfo > keep )
109
+ finally
99
110
{
100
- keepDoing = keep ?? ( _ => { } ) ;
111
+ alwaysDo ( callInfo ) ;
101
112
}
113
+ }
102
114
103
- public void Call ( CallInfo callInfo )
115
+ private void CallFromStack ( CallInfo callInfo )
116
+ {
117
+ if ( callbackQueue . TryDequeue ( out var callback ) )
104
118
{
105
- try
106
- {
107
- CallFromStack ( callInfo ) ;
108
- }
109
- finally
110
- {
111
- alwaysDo ( callInfo ) ;
112
- }
119
+ callback ( callInfo ) ;
113
120
}
114
-
115
- private void CallFromStack ( CallInfo callInfo )
121
+ else
116
122
{
117
- if ( callbackQueue . TryDequeue ( out var callback ) )
118
- {
119
- callback ( callInfo ) ;
120
- }
121
- else
122
- {
123
- keepDoing ( callInfo ) ;
124
- }
123
+ keepDoing ( callInfo ) ;
125
124
}
126
125
}
127
126
}
0 commit comments