@@ -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