@@ -13,12 +13,12 @@ fn is_terminal() {
1313 println!( "{} {} {}" , stdin( ) . is_terminal( ) , stdout( ) . is_terminal( ) , stderr( ) . is_terminal( ) ) ;
1414 } ) ) ;
1515
16- let Terminal { mut pty_stream , child_handle } =
16+ let Terminal { mut pty_reader , pty_writer : _pty_writer , child_handle } =
1717 Terminal :: spawn ( ScreenSize { rows : 80 , cols : 80 } , cmd) . unwrap ( ) ;
1818 let mut discard = Vec :: new ( ) ;
19- pty_stream . read_to_end ( & mut discard) . unwrap ( ) ;
19+ pty_reader . read_to_end ( & mut discard) . unwrap ( ) ;
2020 let _ = child_handle. wait ( ) ;
21- let output = pty_stream . screen_contents ( ) ;
21+ let output = pty_reader . screen_contents ( ) ;
2222 assert_eq ! ( output. trim( ) , "true true true" ) ;
2323}
2424
@@ -37,16 +37,16 @@ fn write_basic_echo() {
3737 }
3838 } ) ) ;
3939
40- let Terminal { mut pty_stream , child_handle } =
40+ let Terminal { mut pty_reader , mut pty_writer , child_handle } =
4141 Terminal :: spawn ( ScreenSize { rows : 80 , cols : 80 } , cmd) . unwrap ( ) ;
4242
43- pty_stream . write_line ( b"hello world" ) . unwrap ( ) ;
43+ pty_writer . write_line ( b"hello world" ) . unwrap ( ) ;
4444
4545 let mut discard = Vec :: new ( ) ;
46- pty_stream . read_to_end ( & mut discard) . unwrap ( ) ;
46+ pty_reader . read_to_end ( & mut discard) . unwrap ( ) ;
4747 let _ = child_handle. wait ( ) ;
4848
49- let output = pty_stream . screen_contents ( ) ;
49+ let output = pty_reader . screen_contents ( ) ;
5050 // PTY echoes the input, so we see "hello world\nhello world"
5151 assert_eq ! ( output. trim( ) , "hello world\n hello world" ) ;
5252}
@@ -68,12 +68,12 @@ fn write_multiple_lines() {
6868 }
6969 } ) ) ;
7070
71- let Terminal { mut pty_stream , child_handle } =
71+ let Terminal { mut pty_reader , mut pty_writer , child_handle } =
7272 Terminal :: spawn ( ScreenSize { rows : 80 , cols : 80 } , cmd) . unwrap ( ) ;
7373
74- pty_stream . write_line ( b"first" ) . unwrap ( ) ;
74+ pty_writer . write_line ( b"first" ) . unwrap ( ) ;
7575 {
76- let mut buf_reader = BufReader :: new ( & mut pty_stream ) ;
76+ let mut buf_reader = BufReader :: new ( & mut pty_reader ) ;
7777 let mut line = Vec :: new ( ) ;
7878 // Read PTY echo of "first\n"
7979 buf_reader. read_until ( b'\n' , & mut line) . unwrap ( ) ;
@@ -82,22 +82,22 @@ fn write_multiple_lines() {
8282 buf_reader. read_until ( b'\n' , & mut line) . unwrap ( ) ;
8383 }
8484
85- pty_stream . write_line ( b"second" ) . unwrap ( ) ;
85+ pty_writer . write_line ( b"second" ) . unwrap ( ) ;
8686 {
87- let mut buf_reader = BufReader :: new ( & mut pty_stream ) ;
87+ let mut buf_reader = BufReader :: new ( & mut pty_reader ) ;
8888 let mut line = Vec :: new ( ) ;
8989 buf_reader. read_until ( b'\n' , & mut line) . unwrap ( ) ;
9090 line. clear ( ) ;
9191 buf_reader. read_until ( b'\n' , & mut line) . unwrap ( ) ;
9292 }
9393
94- pty_stream . write_line ( b"third" ) . unwrap ( ) ;
94+ pty_writer . write_line ( b"third" ) . unwrap ( ) ;
9595
9696 let mut discard = Vec :: new ( ) ;
97- pty_stream . read_to_end ( & mut discard) . unwrap ( ) ;
97+ pty_reader . read_to_end ( & mut discard) . unwrap ( ) ;
9898 let _ = child_handle. wait ( ) ;
9999
100- let output = pty_stream . screen_contents ( ) ;
100+ let output = pty_reader . screen_contents ( ) ;
101101 // PTY echoes input, then child prints "Echo: {line}\n" for each
102102 assert_eq ! ( output. trim( ) , "first\n Echo: first\n second\n Echo: second\n third\n Echo: third" ) ;
103103}
@@ -110,18 +110,18 @@ fn write_after_exit() {
110110 print!( "exiting" ) ;
111111 } ) ) ;
112112
113- let Terminal { mut pty_stream , child_handle } =
113+ let Terminal { mut pty_reader , mut pty_writer , child_handle } =
114114 Terminal :: spawn ( ScreenSize { rows : 80 , cols : 80 } , cmd) . unwrap ( ) ;
115115
116116 // Read all output - this blocks until child exits and EOF is reached
117117 let mut discard = Vec :: new ( ) ;
118- pty_stream . read_to_end ( & mut discard) . unwrap ( ) ;
118+ pty_reader . read_to_end ( & mut discard) . unwrap ( ) ;
119119 let _ = child_handle. wait ( ) ;
120120
121121 // The background thread should have set writer to None by now
122122 // since read_to_end only returns after EOF (child exit)
123123 // Writing should fail with BrokenPipe
124- let result = pty_stream . write_all ( b"too late\n " ) ;
124+ let result = pty_writer . write_all ( b"too late\n " ) ;
125125 assert ! ( result. is_err( ) ) ;
126126}
127127
@@ -141,25 +141,25 @@ fn write_interactive_prompt() {
141141 stdout. flush( ) . unwrap( ) ;
142142 } ) ) ;
143143
144- let Terminal { mut pty_stream , child_handle } =
144+ let Terminal { mut pty_reader , mut pty_writer , child_handle } =
145145 Terminal :: spawn ( ScreenSize { rows : 80 , cols : 80 } , cmd) . unwrap ( ) ;
146146
147147 // Wait for prompt "Name: " (read until the space after colon)
148148 {
149- let mut buf_reader = BufReader :: new ( & mut pty_stream ) ;
149+ let mut buf_reader = BufReader :: new ( & mut pty_reader ) ;
150150 let mut buf = Vec :: new ( ) ;
151151 buf_reader. read_until ( b' ' , & mut buf) . unwrap ( ) ;
152152 assert ! ( String :: from_utf8_lossy( & buf) . contains( "Name:" ) ) ;
153153 }
154154
155155 // Send response
156- pty_stream . write_line ( b"Alice" ) . unwrap ( ) ;
156+ pty_writer . write_line ( b"Alice" ) . unwrap ( ) ;
157157
158158 let mut discard = Vec :: new ( ) ;
159- pty_stream . read_to_end ( & mut discard) . unwrap ( ) ;
159+ pty_reader . read_to_end ( & mut discard) . unwrap ( ) ;
160160 let _ = child_handle. wait ( ) ;
161161
162- let output = pty_stream . screen_contents ( ) ;
162+ let output = pty_reader . screen_contents ( ) ;
163163 assert_eq ! ( output. trim( ) , "Name: Alice\n Hello, Alice" ) ;
164164}
165165
@@ -232,28 +232,28 @@ fn resize_terminal() {
232232 stdout( ) . flush( ) . unwrap( ) ;
233233 } ) ) ;
234234
235- let Terminal { mut pty_stream , child_handle : _ } =
235+ let Terminal { mut pty_reader , mut pty_writer , child_handle : _ } =
236236 Terminal :: spawn ( ScreenSize { rows : 80 , cols : 80 } , cmd) . unwrap ( ) ;
237237
238238 // Wait for initial size line (synchronize before resizing)
239239 {
240- let mut buf_reader = BufReader :: new ( & mut pty_stream ) ;
240+ let mut buf_reader = BufReader :: new ( & mut pty_reader ) ;
241241 let mut line = Vec :: new ( ) ;
242242 buf_reader. read_until ( b'\n' , & mut line) . unwrap ( ) ;
243243 assert ! ( String :: from_utf8_lossy( & line) . contains( "initial: 80 80" ) ) ;
244244 }
245245
246246 // Perform resize
247- pty_stream . resize ( ScreenSize { rows : 40 , cols : 40 } ) . unwrap ( ) ;
247+ pty_writer . resize ( ScreenSize { rows : 40 , cols : 40 } ) . unwrap ( ) ;
248248
249249 // Signal the process to continue and check resize
250- pty_stream . write_line ( b"" ) . unwrap ( ) ;
250+ pty_writer . write_line ( b"" ) . unwrap ( ) ;
251251
252252 // Read remaining output
253253 let mut discard = Vec :: new ( ) ;
254- pty_stream . read_to_end ( & mut discard) . unwrap ( ) ;
254+ pty_reader . read_to_end ( & mut discard) . unwrap ( ) ;
255255
256- let output = pty_stream . screen_contents ( ) ;
256+ let output = pty_reader . screen_contents ( ) ;
257257 // Verify resize was detected (SIGWINCH on Unix, synchronous on Windows)
258258 assert ! ( output. contains( "RESIZE_DETECTED" ) ) ;
259259 // Verify new size is correct
@@ -303,25 +303,25 @@ fn send_ctrl_c_interrupts_process() {
303303 }
304304 } ) ) ;
305305
306- let Terminal { mut pty_stream , child_handle : _ } =
306+ let Terminal { mut pty_reader , mut pty_writer , child_handle : _ } =
307307 Terminal :: spawn ( ScreenSize { rows : 80 , cols : 80 } , cmd) . unwrap ( ) ;
308308
309309 // Wait for process to be ready
310310 {
311- let mut buf_reader = BufReader :: new ( & mut pty_stream ) ;
311+ let mut buf_reader = BufReader :: new ( & mut pty_reader ) ;
312312 let mut line = Vec :: new ( ) ;
313313 buf_reader. read_until ( b'\n' , & mut line) . unwrap ( ) ;
314314 assert ! ( String :: from_utf8_lossy( & line) . contains( "ready" ) ) ;
315315 }
316316
317317 // Send Ctrl+C
318- pty_stream . send_ctrl_c ( ) . unwrap ( ) ;
318+ pty_writer . send_ctrl_c ( ) . unwrap ( ) ;
319319
320320 // Read remaining output
321321 let mut discard = Vec :: new ( ) ;
322- pty_stream . read_to_end ( & mut discard) . unwrap ( ) ;
322+ pty_reader . read_to_end ( & mut discard) . unwrap ( ) ;
323323
324- let output = pty_stream . screen_contents ( ) ;
324+ let output = pty_reader . screen_contents ( ) ;
325325 // Verify interruption was detected
326326 assert ! ( output. contains( "INTERRUPTED" ) ) ;
327327}
@@ -334,10 +334,10 @@ fn read_to_end_returns_exit_status_success() {
334334 println!( "success" ) ;
335335 } ) ) ;
336336
337- let Terminal { mut pty_stream , child_handle } =
337+ let Terminal { mut pty_reader , pty_writer : _pty_writer , child_handle } =
338338 Terminal :: spawn ( ScreenSize { rows : 80 , cols : 80 } , cmd) . unwrap ( ) ;
339339 let mut discard = Vec :: new ( ) ;
340- pty_stream . read_to_end ( & mut discard) . unwrap ( ) ;
340+ pty_reader . read_to_end ( & mut discard) . unwrap ( ) ;
341341 let status = child_handle. wait ( ) ;
342342 assert ! ( status. success( ) ) ;
343343 assert_eq ! ( status. exit_code( ) , 0 ) ;
@@ -350,10 +350,10 @@ fn read_to_end_returns_exit_status_nonzero() {
350350 std:: process:: exit( 42 ) ;
351351 } ) ) ;
352352
353- let Terminal { mut pty_stream , child_handle } =
353+ let Terminal { mut pty_reader , pty_writer : _pty_writer , child_handle } =
354354 Terminal :: spawn ( ScreenSize { rows : 80 , cols : 80 } , cmd) . unwrap ( ) ;
355355 let mut discard = Vec :: new ( ) ;
356- pty_stream . read_to_end ( & mut discard) . unwrap ( ) ;
356+ pty_reader . read_to_end ( & mut discard) . unwrap ( ) ;
357357 let status = child_handle. wait ( ) ;
358358 assert ! ( !status. success( ) ) ;
359359 assert_eq ! ( status. exit_code( ) , 42 ) ;
0 commit comments