@@ -222,39 +222,19 @@ export class TestShell {
222
222
return this . _process ;
223
223
}
224
224
225
- async waitForPrompt ( start = 0 ) : Promise < void > {
226
- await eventually ( ( ) => {
227
- const output = this . _output . slice ( start ) ;
225
+ /**
226
+ * Wait for the last line of the output to become a prompt and resolve with it
227
+ */
228
+ async waitForPrompt ( start = 0 ) : Promise < string > {
229
+ return this . eventually ( ( ) => {
230
+ const output = this . _output . slice ( start ) . trim ( ) ;
228
231
const lines = output . split ( '\n' ) ;
229
- const found = ! ! lines
230
- . filter ( ( l ) => PROMPT_PATTERN . exec ( l ) ) // a line that is the prompt must at least match the pattern
231
- . find ( ( l ) => {
232
- // in some situations the prompt occurs multiple times in the line (but only in tests!)
233
- const prompts = l
234
- . trim ( )
235
- . replace ( / > $ / g, '' )
236
- . split ( '>' )
237
- . map ( ( m ) => m . trim ( ) ) ;
238
- // if there are multiple prompt parts they must all equal
239
- if ( prompts . length > 1 ) {
240
- for ( const p of prompts ) {
241
- if ( p !== prompts [ 0 ] ) {
242
- return false ;
243
- }
244
- }
245
- }
246
- return true ;
247
- } ) ;
248
- if ( ! found ) {
249
- throw new assert . AssertionError ( {
250
- message : 'expected prompt' ,
251
- expected : PROMPT_PATTERN . toString ( ) ,
252
- actual :
253
- this . _output . slice ( 0 , start ) +
254
- '[prompt search starts here]' +
255
- output ,
256
- } ) ;
257
- }
232
+ const lastLine = lines [ lines . length - 1 ] ;
233
+ assert (
234
+ PROMPT_PATTERN . test ( lastLine ) ,
235
+ `Expected a prompt (last line was "${ lastLine } ")`
236
+ ) ;
237
+ return lastLine ;
258
238
} ) ;
259
239
}
260
240
@@ -341,10 +321,21 @@ export class TestShell {
341
321
}
342
322
343
323
async executeLine ( line : string ) : Promise < string > {
344
- const previousOutputLength = this . _output . length ;
324
+ // Waiting for a prompt to appear since the last execution
325
+ await this . waitForPrompt ( this . _previousOutputLength ) ;
326
+ // Keeping an the length of the output to return only output as result of the input
327
+ const outputLengthBefore = this . _output . length ;
345
328
this . writeInputLine ( line ) ;
346
- await this . waitForPrompt ( previousOutputLength ) ;
347
- return this . _output . slice ( previousOutputLength ) ;
329
+ // Wait for the execution and a new prompt to appear
330
+ const prompt = await this . waitForPrompt ( outputLengthBefore ) ;
331
+ // Store the output (excluding the following prompt)
332
+ const output = this . _output . slice (
333
+ outputLengthBefore ,
334
+ this . _output . length - prompt . length - 1
335
+ ) ;
336
+ // Storing the output for future executions
337
+ this . _previousOutputLength = outputLengthBefore + output . length ;
338
+ return output ;
348
339
}
349
340
350
341
async executeLineWithJSONResult ( line : string ) : Promise < any > {
0 commit comments