@@ -10,12 +10,18 @@ defmodule GenLSP.Test do
1010 @ typedoc """
1111 The test server data structure.
1212 """
13- @ opaque server :: % { lsp: pid ( ) , buffer: pid ( ) , port: integer ( ) }
13+ @ opaque server :: % {
14+ lsp: pid ( ) ,
15+ lsp_id: atom ( ) ,
16+ buffer: pid ( ) ,
17+ buffer_id: atom ( ) ,
18+ port: integer ( )
19+ }
1420
1521 @ typedoc """
1622 The test client data structure.
1723 """
18- @ opaque client :: % { socket: :gen_tcp . socket ( ) }
24+ @ opaque client :: % { socket: :gen_tcp . socket ( ) , listener: pid ( ) }
1925
2026 @ doc """
2127 Starts a new server.
@@ -30,14 +36,19 @@ defmodule GenLSP.Test do
3036 """
3137 @ spec server ( mod :: atom ( ) ) :: server ( )
3238 def server ( mod , opts \\ [ ] ) do
39+ buffer_id = Keyword . get ( opts , :buffer_id , :buffer )
40+ lsp_id = Keyword . get ( opts , :lsp_id , :lsp )
41+
3342 buffer =
34- start_supervised! ( { GenLSP.Buffer , communication: { GenLSP.Communication.TCP , [ port: 0 ] } } )
43+ start_supervised! ( { GenLSP.Buffer , communication: { GenLSP.Communication.TCP , [ port: 0 ] } } ,
44+ id: buffer_id
45+ )
3546
3647 { :ok , port } = :inet . port ( GenLSP.Buffer . comm_state ( buffer ) . lsocket )
3748
38- lsp = start_supervised! ( { mod , Keyword . merge ( [ buffer: buffer ] , opts ) } )
49+ lsp = start_supervised! ( { mod , Keyword . merge ( [ buffer: buffer ] , opts ) } , id: lsp_id )
3950
40- % { lsp: lsp , buffer: buffer , port: port }
51+ % { lsp: lsp , buffer: buffer , port: port , buffer_id: buffer_id , lsp_id: lsp_id }
4152 end
4253
4354 @ doc """
@@ -62,37 +73,59 @@ defmodule GenLSP.Test do
6273
6374 me = self ( )
6475
65- Task . start_link ( fn ->
66- Stream . resource (
67- fn -> "" end ,
68- fn buffer ->
69- case GenLSP.Communication.TCP . read ( % { socket: socket } , buffer ) do
70- :eof ->
71- { :halt , :ok }
76+ { :ok , listener } =
77+ Task . start_link ( fn ->
78+ Stream . resource (
79+ fn -> "" end ,
80+ fn buffer ->
81+ case GenLSP.Communication.TCP . read ( % { socket: socket } , buffer ) do
82+ :eof ->
83+ { :halt , :ok }
84+
85+ { :ok , body , buffer } ->
86+ send ( me , Jason . decode! ( body ) )
87+
88+ { [ body ] , buffer }
89+ end
90+ end ,
91+ fn
92+ :ok ->
93+ :ok
94+
95+ { :error , reason } ->
96+ IO . warn ( "Unable to read from device: #{ inspect ( reason ) } " )
97+
98+ other ->
99+ IO . warn (
100+ "Ended stream with value: #{ inspect ( other ) } . This was probably due to something going wrong."
101+ )
102+ end
103+ )
104+ |> Enum . to_list ( )
105+ end )
72106
73- { :ok , body , buffer } ->
74- send ( me , Jason . decode! ( body ) )
107+ % { socket: socket , listener: listener }
108+ end
75109
76- { [ body ] , buffer }
77- end
78- end ,
79- fn
80- :ok ->
81- :ok
82-
83- { :error , reason } ->
84- IO . warn ( "Unable to read from device: #{ inspect ( reason ) } " )
85-
86- other ->
87- IO . warn (
88- "Ended stream with value: #{ inspect ( other ) } . This was probably due to something going wrong."
89- )
90- end
91- )
92- |> Enum . to_list ( )
93- end )
110+ @ doc """
111+ Shuts down an LSP server.
112+ """
113+ @ spec shutdown_server! ( server :: server ( ) ) :: :ok
114+ def shutdown_server! ( server ) do
115+ stop_supervised! ( server . buffer_id )
116+ stop_supervised! ( server . lsp_id )
117+
118+ :ok
119+ end
120+
121+ @ doc """
122+ Shuts down an LSP client.
123+ """
124+ @ spec shutdown_client! ( client :: client ( ) ) :: :ok
125+ def shutdown_client! ( client ) do
126+ Process . exit ( client . listener , :normal )
94127
95- % { socket: socket }
128+ :ok
96129 end
97130
98131 @ doc ~S"""
0 commit comments