@@ -181,16 +181,14 @@ describe('q', function() {
181181 } ;
182182
183183
184- function exceptionHandler ( reason ) {
185- exceptionHandlerCalls . push ( reason ) ;
186- }
187-
188-
189- function exceptionHandlerStr ( ) {
190- return exceptionHandlerCalls . join ( '; ' ) ;
184+ function exceptionHandler ( exception , reason ) {
185+ if ( typeof reason === 'undefined' ) {
186+ exceptionHandlerCalls . push ( { reason : exception } ) ;
187+ } else {
188+ exceptionHandlerCalls . push ( { reason : reason , exception : exception } ) ;
189+ }
191190 }
192191
193-
194192 beforeEach ( function ( ) {
195193 q = qFactory ( mockNextTick . nextTick , exceptionHandler , true ) ;
196194 q_no_error = qFactory ( mockNextTick . nextTick , exceptionHandler , false ) ;
@@ -2167,45 +2165,98 @@ describe('q', function() {
21672165
21682166
21692167 describe ( 'when exceptionHandler is called' , function ( ) {
2170- it ( 'should log an unhandled rejected promise' , function ( ) {
2171- var defer = q . defer ( ) ;
2172- defer . reject ( 'foo' ) ;
2173- mockNextTick . flush ( ) ;
2174- expect ( exceptionHandlerStr ( ) ) . toBe ( 'Possibly unhandled rejection: foo' ) ;
2175- } ) ;
2168+ function CustomError ( ) { }
2169+ CustomError . prototype = Object . create ( Error . prototype ) ;
21762170
2171+ var errorEg = new Error ( 'Fail' ) ;
2172+ var errorStr = toDebugString ( errorEg ) ;
21772173
2178- it ( 'should not log an unhandled rejected promise if disabled' , function ( ) {
2179- var defer = q_no_error . defer ( ) ;
2180- defer . reject ( 'foo' ) ;
2181- expect ( exceptionHandlerStr ( ) ) . toBe ( '' ) ;
2182- } ) ;
2174+ var customError = new CustomError ( 'Custom' ) ;
2175+ var customErrorStr = toDebugString ( customError ) ;
21832176
2177+ var nonErrorObj = { isATest : 'this is' } ;
2178+ var nonErrorObjStr = toDebugString ( nonErrorObj ) ;
21842179
2185- it ( 'should log a handled rejected promise on a promise without rejection callbacks' , function ( ) {
2186- var defer = q . defer ( ) ;
2187- defer . promise . then ( noop ) ;
2188- defer . reject ( 'foo' ) ;
2189- mockNextTick . flush ( ) ;
2190- expect ( exceptionHandlerStr ( ) ) . toBe ( 'Possibly unhandled rejection: foo' ) ;
2191- } ) ;
2180+ var fixtures = [
2181+ {
2182+ type : 'Error object' ,
2183+ value : errorEg ,
2184+ expected : {
2185+ exception : errorEg ,
2186+ reason : 'Possibly unhandled rejection: ' + errorStr
2187+ }
2188+ } ,
2189+ {
2190+ type : 'custom Error object' ,
2191+ value : customError ,
2192+ expected : {
2193+ exception : customError ,
2194+ reason : 'Possibly unhandled rejection: ' + customErrorStr
2195+ }
2196+ } ,
2197+ {
2198+ type : 'non-Error object' ,
2199+ value : nonErrorObj ,
2200+ expected : {
2201+ reason : 'Possibly unhandled rejection: ' + nonErrorObjStr
2202+ }
2203+ } ,
2204+ {
2205+ type : 'string primitive' ,
2206+ value : 'foo' ,
2207+ expected : {
2208+ reason : 'Possibly unhandled rejection: foo'
2209+ }
2210+ }
2211+ ] ;
2212+ forEach ( fixtures , function ( fixture ) {
2213+ var type = fixture . type ;
2214+ var value = fixture . value ;
2215+ var expected = fixture . expected ;
21922216
2217+ describe ( 'with ' + type , function ( ) {
21932218
2194- it ( 'should not log a handled rejected promise' , function ( ) {
2195- var defer = q . defer ( ) ;
2196- defer . promise . catch ( noop ) ;
2197- defer . reject ( 'foo' ) ;
2198- mockNextTick . flush ( ) ;
2199- expect ( exceptionHandlerStr ( ) ) . toBe ( '' ) ;
2200- } ) ;
2219+ it ( 'should log an unhandled rejected promise' , function ( ) {
2220+ var defer = q . defer ( ) ;
2221+ defer . reject ( value ) ;
2222+ mockNextTick . flush ( ) ;
2223+ expect ( exceptionHandlerCalls ) . toEqual ( [ expected ] ) ;
2224+ } ) ;
22012225
22022226
2203- it ( 'should not log a handled rejected promise that is handled in a future tick' , function ( ) {
2204- var defer = q . defer ( ) ;
2205- defer . promise . catch ( noop ) ;
2206- defer . resolve ( q . reject ( 'foo' ) ) ;
2207- mockNextTick . flush ( ) ;
2208- expect ( exceptionHandlerStr ( ) ) . toBe ( '' ) ;
2227+ it ( 'should not log an unhandled rejected promise if disabled' , function ( ) {
2228+ var defer = q_no_error . defer ( ) ;
2229+ defer . reject ( value ) ;
2230+ expect ( exceptionHandlerCalls ) . toEqual ( [ ] ) ;
2231+ } ) ;
2232+
2233+
2234+ it ( 'should log a handled rejected promise on a promise without rejection callbacks' , function ( ) {
2235+ var defer = q . defer ( ) ;
2236+ defer . promise . then ( noop ) ;
2237+ defer . reject ( value ) ;
2238+ mockNextTick . flush ( ) ;
2239+ expect ( exceptionHandlerCalls ) . toEqual ( [ expected ] ) ;
2240+ } ) ;
2241+
2242+
2243+ it ( 'should not log a handled rejected promise' , function ( ) {
2244+ var defer = q . defer ( ) ;
2245+ defer . promise . catch ( noop ) ;
2246+ defer . reject ( value ) ;
2247+ mockNextTick . flush ( ) ;
2248+ expect ( exceptionHandlerCalls ) . toEqual ( [ ] ) ;
2249+ } ) ;
2250+
2251+
2252+ it ( 'should not log a handled rejected promise that is handled in a future tick' , function ( ) {
2253+ var defer = q . defer ( ) ;
2254+ defer . promise . catch ( noop ) ;
2255+ defer . resolve ( q . reject ( value ) ) ;
2256+ mockNextTick . flush ( ) ;
2257+ expect ( exceptionHandlerCalls ) . toEqual ( [ ] ) ;
2258+ } ) ;
2259+ } ) ;
22092260 } ) ;
22102261 } ) ;
22112262} ) ;
0 commit comments