@@ -10,7 +10,35 @@ const slice = arrayProto.slice;
1010const useLeftMostCallback = - 1 ;
1111const useRightMostCallback = - 2 ;
1212
13+ /**
14+ * Resets all mutually exclusive "return behavior" flags so that the most
15+ * recently called behavior setter always takes effect ("last call wins").
16+ *
17+ * Without this, flags like `returnArgAt` (set by `returnsArg()`) can silently
18+ * persist and override a later `.returns()` call because `returnArgAt` is
19+ * checked first in behavior.invoke().
20+ *
21+ * @param {object } fake - the stub behavior object
22+ */
23+ function resetReturnBehavior ( fake ) {
24+ fake . returnArgAt = undefined ;
25+ fake . returnThis = false ;
26+ fake . throwArgAt = undefined ;
27+ fake . fakeFn = undefined ;
28+ fake . returnValue = undefined ;
29+ fake . returnValueDefined = false ;
30+ fake . resolve = false ;
31+ fake . reject = false ;
32+ fake . resolveArgAt = undefined ;
33+ fake . resolveThis = false ;
34+ fake . exception = undefined ;
35+ fake . exceptionCreator = undefined ;
36+ fake . callsThrough = false ;
37+ fake . callsThroughWithNew = false ;
38+ }
39+
1340function throwsException ( fake , error , message ) {
41+ resetReturnBehavior ( fake ) ;
1442 if ( typeof error === "function" ) {
1543 fake . exceptionCreator = error ;
1644 } else if ( typeof error === "string" ) {
@@ -32,10 +60,8 @@ function throwsException(fake, error, message) {
3260
3361const defaultBehaviors = {
3462 callsFake : function callsFake ( fake , fn ) {
63+ resetReturnBehavior ( fake ) ;
3564 fake . fakeFn = fn ;
36- fake . exception = undefined ;
37- fake . exceptionCreator = undefined ;
38- fake . callsThrough = false ;
3965 } ,
4066
4167 callsArg : function callsArg ( fake , index ) {
@@ -143,65 +169,46 @@ const defaultBehaviors = {
143169 throwsException : throwsException ,
144170
145171 returns : function returns ( fake , value ) {
146- fake . callsThrough = false ;
172+ resetReturnBehavior ( fake ) ;
147173 fake . returnValue = value ;
148- fake . resolve = false ;
149- fake . reject = false ;
150174 fake . returnValueDefined = true ;
151- fake . exception = undefined ;
152- fake . exceptionCreator = undefined ;
153- fake . fakeFn = undefined ;
154175 } ,
155176
156177 returnsArg : function returnsArg ( fake , index ) {
157178 if ( typeof index !== "number" ) {
158179 throw new TypeError ( "argument index is not number" ) ;
159180 }
160- fake . callsThrough = false ;
161-
181+ resetReturnBehavior ( fake ) ;
162182 fake . returnArgAt = index ;
163183 } ,
164184
165185 throwsArg : function throwsArg ( fake , index ) {
166186 if ( typeof index !== "number" ) {
167187 throw new TypeError ( "argument index is not number" ) ;
168188 }
169- fake . callsThrough = false ;
170-
189+ resetReturnBehavior ( fake ) ;
171190 fake . throwArgAt = index ;
172191 } ,
173192
174193 returnsThis : function returnsThis ( fake ) {
194+ resetReturnBehavior ( fake ) ;
175195 fake . returnThis = true ;
176- fake . callsThrough = false ;
177196 } ,
178197
179198 resolves : function resolves ( fake , value ) {
199+ resetReturnBehavior ( fake ) ;
180200 fake . returnValue = value ;
181201 fake . resolve = true ;
182- fake . resolveThis = false ;
183- fake . reject = false ;
184202 fake . returnValueDefined = true ;
185- fake . exception = undefined ;
186- fake . exceptionCreator = undefined ;
187- fake . fakeFn = undefined ;
188- fake . callsThrough = false ;
189203 } ,
190204
191205 resolvesArg : function resolvesArg ( fake , index ) {
192206 if ( typeof index !== "number" ) {
193207 throw new TypeError ( "argument index is not number" ) ;
194208 }
209+ resetReturnBehavior ( fake ) ;
195210 fake . resolveArgAt = index ;
196- fake . returnValue = undefined ;
197211 fake . resolve = true ;
198- fake . resolveThis = false ;
199- fake . reject = false ;
200- fake . returnValueDefined = false ;
201- fake . exception = undefined ;
202- fake . exceptionCreator = undefined ;
203- fake . fakeFn = undefined ;
204- fake . callsThrough = false ;
205212 } ,
206213
207214 rejects : function rejects ( fake , error , message ) {
@@ -214,29 +221,17 @@ const defaultBehaviors = {
214221 } else {
215222 reason = error ;
216223 }
224+ resetReturnBehavior ( fake ) ;
217225 fake . returnValue = reason ;
218- fake . resolve = false ;
219- fake . resolveThis = false ;
220226 fake . reject = true ;
221227 fake . returnValueDefined = true ;
222- fake . exception = undefined ;
223- fake . exceptionCreator = undefined ;
224- fake . fakeFn = undefined ;
225- fake . callsThrough = false ;
226228
227229 return fake ;
228230 } ,
229231
230232 resolvesThis : function resolvesThis ( fake ) {
231- fake . returnValue = undefined ;
232- fake . resolve = false ;
233+ resetReturnBehavior ( fake ) ;
233234 fake . resolveThis = true ;
234- fake . reject = false ;
235- fake . returnValueDefined = false ;
236- fake . exception = undefined ;
237- fake . exceptionCreator = undefined ;
238- fake . fakeFn = undefined ;
239- fake . callsThrough = false ;
240235 } ,
241236
242237 callThrough : function callThrough ( fake ) {
0 commit comments