@@ -3124,6 +3124,231 @@ defmodule ElixirLS.DebugAdapter.ServerTest do
31243124 end )
31253125 end
31263126
3127+ test "next steps through multi-stage dbg pipeline" , % { server: server } do
3128+ in_fixture ( __DIR__ , "mix_project" , fn ->
3129+ abs_path = Path . absname ( "lib/dbg.ex" )
3130+ Server . receive_packet ( server , initialize_req_ ( 1 ) )
3131+ assert_receive ( response ( _ , 1 , "initialize" , _ ) )
3132+
3133+ Server . receive_packet (
3134+ server ,
3135+ launch_req ( 2 , % {
3136+ "request" => "launch" ,
3137+ "type" => "mix_task" ,
3138+ "task" => "run" ,
3139+ "taskArgs" => [ "-e" , "MixProject.Dbg.pipe_multi_stage()" ] ,
3140+ "projectDir" => File . cwd! ( )
3141+ } )
3142+ )
3143+
3144+ assert_receive ( response ( _ , 2 , "launch" ) , 3000 )
3145+ assert_receive ( event ( _ , "initialized" , _ ) , 5000 )
3146+
3147+ Process . sleep ( 100 )
3148+
3149+ assert MixProject.Dbg in :int . interpreted ( )
3150+
3151+ Server . receive_packet ( server , request ( 5 , "configurationDone" , % { } ) )
3152+ assert_receive ( response ( _ , 5 , "configurationDone" ) )
3153+
3154+ Server . receive_packet ( server , request ( 6 , "threads" , % { } ) )
3155+ assert_receive ( response ( _ , 6 , "threads" , % { "threads" => threads } ) )
3156+ assert Enum . count ( Enum . uniq ( Enum . map ( threads , & & 1 [ "id" ] ) ) ) == Enum . count ( threads )
3157+
3158+ assert_receive event ( _ , "stopped" , % {
3159+ "allThreadsStopped" => false ,
3160+ "reason" => "breakpoint" ,
3161+ "threadId" => thread_id
3162+ } ) ,
3163+ 5_000
3164+
3165+ Server . receive_packet ( server , stacktrace_req ( 7 , thread_id ) )
3166+
3167+ assert_receive response ( _ , 7 , "stackTrace" , % {
3168+ "stackFrames" => [
3169+ % {
3170+ "name" => "MixProject.Dbg.pipe_multi_stage/0" ,
3171+ "source" => % { "path" => ^ abs_path }
3172+ }
3173+ ] ,
3174+ "totalFrames" => 1
3175+ } )
3176+
3177+ Server . receive_packet ( server , next_req ( 14 , thread_id ) )
3178+ assert_receive response ( _ , 14 , "next" )
3179+
3180+ assert_receive event ( _ , "stopped" , % {
3181+ "allThreadsStopped" => false ,
3182+ "reason" => "breakpoint" ,
3183+ "threadId" => ^ thread_id
3184+ } ) ,
3185+ 5_000
3186+
3187+ Server . receive_packet ( server , stacktrace_req ( 141 , thread_id ) )
3188+
3189+ assert_receive response ( _ , 141 , "stackTrace" , % {
3190+ "stackFrames" => [
3191+ % {
3192+ "line" => line_stage_1 ,
3193+ "name" => "MixProject.Dbg.pipe_multi_stage/0" ,
3194+ "source" => % { "path" => ^ abs_path }
3195+ }
3196+ ]
3197+ } )
3198+
3199+ assert line_stage_1 in 22 .. 27
3200+
3201+ Server . receive_packet ( server , next_req ( 15 , thread_id ) )
3202+ assert_receive response ( _ , 15 , "next" )
3203+
3204+ assert_receive event ( _ , "stopped" , % {
3205+ "allThreadsStopped" => false ,
3206+ "reason" => "breakpoint" ,
3207+ "threadId" => ^ thread_id
3208+ } ) ,
3209+ 5_000
3210+
3211+ Server . receive_packet ( server , stacktrace_req ( 151 , thread_id ) )
3212+
3213+ assert_receive response ( _ , 151 , "stackTrace" , % {
3214+ "stackFrames" => [
3215+ % {
3216+ "line" => line_stage_2 ,
3217+ "name" => "MixProject.Dbg.pipe_multi_stage/0" ,
3218+ "source" => % { "path" => ^ abs_path }
3219+ }
3220+ ]
3221+ } )
3222+
3223+ assert line_stage_2 in 22 .. 27
3224+ assert line_stage_2 != line_stage_1
3225+
3226+ Server . receive_packet ( server , continue_req ( 16 , thread_id ) )
3227+ assert_receive response ( _ , 16 , "continue" , % { "allThreadsContinued" => true } )
3228+
3229+ refute_receive event ( _ , "stopped" , % {
3230+ "allThreadsStopped" => false ,
3231+ "reason" => "breakpoint" ,
3232+ "threadId" => ^ thread_id
3233+ } ) ,
3234+ 1_000
3235+ end )
3236+ end
3237+
3238+ test "dbg pipeline inside case exposes branch bindings" , % { server: server } do
3239+ in_fixture ( __DIR__ , "mix_project" , fn ->
3240+ abs_path = Path . absname ( "lib/dbg.ex" )
3241+ Server . receive_packet ( server , initialize_req_ ( 1 ) )
3242+ assert_receive ( response ( _ , 1 , "initialize" , _ ) )
3243+
3244+ Server . receive_packet (
3245+ server ,
3246+ launch_req ( 2 , % {
3247+ "request" => "launch" ,
3248+ "type" => "mix_task" ,
3249+ "task" => "run" ,
3250+ "taskArgs" => [ "-e" , "MixProject.Dbg.case_pipe_dbg()" ] ,
3251+ "projectDir" => File . cwd! ( )
3252+ } )
3253+ )
3254+
3255+ assert_receive ( response ( _ , 2 , "launch" ) , 3000 )
3256+ assert_receive ( event ( _ , "initialized" , _ ) , 5000 )
3257+
3258+ Process . sleep ( 100 )
3259+
3260+ assert MixProject.Dbg in :int . interpreted ( )
3261+
3262+ Server . receive_packet ( server , request ( 5 , "configurationDone" , % { } ) )
3263+ assert_receive ( response ( _ , 5 , "configurationDone" ) )
3264+
3265+ Server . receive_packet ( server , request ( 6 , "threads" , % { } ) )
3266+ assert_receive ( response ( _ , 6 , "threads" , % { "threads" => threads } ) )
3267+ assert Enum . count ( Enum . uniq ( Enum . map ( threads , & & 1 [ "id" ] ) ) ) == Enum . count ( threads )
3268+
3269+ assert_receive event ( _ , "stopped" , % {
3270+ "allThreadsStopped" => false ,
3271+ "reason" => "breakpoint" ,
3272+ "threadId" => thread_id
3273+ } ) ,
3274+ 5_000
3275+
3276+ Server . receive_packet ( server , stacktrace_req ( 7 , thread_id ) )
3277+
3278+ assert_receive response ( _ , 7 , "stackTrace" , % {
3279+ "stackFrames" => [
3280+ % {
3281+ "column" => 0 ,
3282+ "id" => frame_id ,
3283+ "line" => initial_line ,
3284+ "name" => "MixProject.Dbg.case_pipe_dbg/1" ,
3285+ "source" => % { "path" => ^ abs_path }
3286+ }
3287+ ] ,
3288+ "totalFrames" => 1
3289+ } )
3290+
3291+ assert initial_line in 34 .. 44
3292+
3293+ Server . receive_packet ( server , scopes_req ( 8 , frame_id ) )
3294+
3295+ assert_receive response ( _ , 8 , "scopes" , % {
3296+ "scopes" => [
3297+ % {
3298+ "name" => "variables" ,
3299+ "variablesReference" => vars_id
3300+ }
3301+ | _
3302+ ]
3303+ } )
3304+
3305+ Server . receive_packet ( server , vars_req ( 9 , vars_id ) )
3306+
3307+ assert_receive response ( _ , 9 , "variables" , % {
3308+ "variables" => vars
3309+ } )
3310+
3311+ assert Enum . any? ( vars , fn
3312+ % { "name" => "list" , "value" => "[\" a\" , \" b\" ]" } -> true
3313+ _ -> false
3314+ end )
3315+
3316+ Server . receive_packet ( server , next_req ( 14 , thread_id ) )
3317+ assert_receive response ( _ , 14 , "next" )
3318+
3319+ assert_receive event ( _ , "stopped" , % {
3320+ "allThreadsStopped" => false ,
3321+ "reason" => "breakpoint" ,
3322+ "threadId" => ^ thread_id
3323+ } ) ,
3324+ 5_000
3325+
3326+ Server . receive_packet ( server , stacktrace_req ( 141 , thread_id ) )
3327+
3328+ assert_receive response ( _ , 141 , "stackTrace" , % {
3329+ "stackFrames" => [
3330+ % {
3331+ "line" => line_after_step ,
3332+ "name" => "MixProject.Dbg.case_pipe_dbg/1" ,
3333+ "source" => % { "path" => ^ abs_path }
3334+ }
3335+ ]
3336+ } )
3337+
3338+ assert line_after_step in 34 .. 37
3339+
3340+ Server . receive_packet ( server , continue_req ( 15 , thread_id ) )
3341+ assert_receive response ( _ , 15 , "continue" , % { "allThreadsContinued" => true } )
3342+
3343+ refute_receive event ( _ , "stopped" , % {
3344+ "allThreadsStopped" => false ,
3345+ "reason" => "breakpoint" ,
3346+ "threadId" => ^ thread_id
3347+ } ) ,
3348+ 1_000
3349+ end )
3350+ end
3351+
31273352 test "breaks on dbg when module is not interpreted" , % { server: server } do
31283353 in_fixture ( __DIR__ , "mix_project" , fn ->
31293354 abs_path = Path . absname ( "lib/dbg.ex" )
0 commit comments