@@ -280,7 +280,7 @@ fn test_local_vars() {
280280 let frame = & trace. frames [ 0 ] ;
281281 let locals = frame. locals . as_ref ( ) . unwrap ( ) ;
282282
283- assert_eq ! ( locals. len( ) , 9 ) ;
283+ assert_eq ! ( locals. len( ) , 27 ) ;
284284
285285 let arg1 = & locals[ 0 ] ;
286286 assert_eq ! ( arg1. name, "arg1" ) ;
@@ -326,6 +326,95 @@ fn test_local_vars() {
326326 assert_eq ! ( local6. name, "local6" ) ;
327327 assert ! ( !local6. arg) ;
328328
329+ // Numpy scalars
330+ let local7 = & locals[ 9 ] ;
331+ assert_eq ! ( local7. name, "local7" ) ;
332+ assert_eq ! ( local7. repr, Some ( "true" . to_string( ) ) ) ;
333+
334+ let local8 = & locals[ 10 ] ;
335+ assert_eq ! ( local8. name, "local8" ) ;
336+ assert_eq ! ( local8. repr, Some ( "2" . to_string( ) ) ) ;
337+
338+ let local9 = & locals[ 11 ] ;
339+ assert_eq ! ( local9. name, "local9" ) ;
340+ assert_eq ! ( local9. repr, Some ( "3" . to_string( ) ) ) ;
341+
342+ let local10 = & locals[ 12 ] ;
343+ assert_eq ! ( local10. name, "local10" ) ;
344+ assert_eq ! ( local10. repr, Some ( "42" . to_string( ) ) ) ;
345+
346+ let local11 = & locals[ 13 ] ;
347+ assert_eq ! ( local11. name, "local11" ) ;
348+ assert_eq ! ( local11. repr, Some ( "43" . to_string( ) ) ) ;
349+
350+ let local12 = & locals[ 14 ] ;
351+ assert_eq ! ( local12. name, "local12" ) ;
352+ assert_eq ! ( local12. repr, Some ( "44" . to_string( ) ) ) ;
353+
354+ let local13 = & locals[ 15 ] ;
355+ assert_eq ! ( local13. name, "local13" ) ;
356+ assert_eq ! ( local13. repr, Some ( "45" . to_string( ) ) ) ;
357+
358+ let local14 = & locals[ 16 ] ;
359+ assert_eq ! ( local14. name, "local14" ) ;
360+ assert_eq ! ( local14. repr, Some ( "46" . to_string( ) ) ) ;
361+
362+ let local15 = & locals[ 17 ] ;
363+ assert_eq ! ( local15. name, "local15" ) ;
364+ assert_eq ! ( local15. repr, Some ( "7" . to_string( ) ) ) ;
365+
366+ let local16 = & locals[ 18 ] ;
367+ assert_eq ! ( local16. name, "local16" ) ;
368+ assert_eq ! ( local16. repr, Some ( "8" . to_string( ) ) ) ;
369+
370+ fn test_repr_prefix ( local : & py_spy:: stack_trace:: LocalVariable , expected : & str ) {
371+ assert ! (
372+ local
373+ . repr
374+ . as_ref( )
375+ . map( |result| result. starts_with( expected) )
376+ . unwrap_or( false ) ,
377+ "local '{}' repr = '{:?}' doesn't start with '{}'" ,
378+ & local. name,
379+ & local. repr,
380+ expected
381+ ) ;
382+ }
383+
384+ let local17 = & locals[ 19 ] ;
385+ assert_eq ! ( local17. name, "local17" ) ;
386+
387+ #[ cfg( not( windows) ) ]
388+ test_repr_prefix ( local17, "<numpy.ulonglong at" ) ;
389+
390+ let local18 = & locals[ 20 ] ;
391+ assert_eq ! ( local18. name, "local18" ) ;
392+ test_repr_prefix ( local18, "<numpy.float16 at" ) ;
393+
394+ let local19 = & locals[ 21 ] ;
395+ assert_eq ! ( local19. name, "local19" ) ;
396+ assert_eq ! ( local19. repr, Some ( "0.5" . to_string( ) ) ) ;
397+
398+ let local20 = & locals[ 22 ] ;
399+ assert_eq ! ( local20. name, "local20" ) ;
400+ assert_eq ! ( local20. repr, Some ( "0.7" . to_string( ) ) ) ;
401+
402+ let local21 = & locals[ 23 ] ;
403+ assert_eq ! ( local21. name, "local21" ) ;
404+ test_repr_prefix ( local21, "<numpy.longdouble at" ) ;
405+
406+ let local22 = & locals[ 24 ] ;
407+ assert_eq ! ( local22. name, "local22" ) ;
408+ test_repr_prefix ( local22, "<numpy.complex64 at" ) ;
409+
410+ let local23 = & locals[ 25 ] ;
411+ assert_eq ! ( local23. name, "local23" ) ;
412+ test_repr_prefix ( local23, "<numpy.complex128 at" ) ;
413+
414+ let local24 = & locals[ 26 ] ;
415+ assert_eq ! ( local24. name, "local24" ) ;
416+ test_repr_prefix ( local24, "<numpy.clongdouble at" ) ;
417+
329418 // we only support dictionary lookup on python 3.6+ right now
330419 if runner. spy . version . major == 3 && runner. spy . version . minor >= 6 {
331420 assert_eq ! (
0 commit comments