@@ -281,15 +281,15 @@ def test_prompt_length(self):
281281        self .assertEqual (l , 5 )
282282
283283    def  test_prompt_ps1_raise_exception (self ):
284-         # Handles simple ASCII  prompt 
284+         # Handles exceptions from ps1  prompt 
285285        class  Prompt :
286286            def  __str__ (self ): 1 / 0 
287287
288288        def  prepare_reader_keep_prompts (* args , ** kwargs ):
289289            reader  =  prepare_reader (* args , ** kwargs )
290290            del  reader .get_prompt 
291291            reader .ps1  =  Prompt ()
292-             reader .ps2  =  "+++  " 
292+             reader .ps2  =  "...  " 
293293            reader .ps3  =  "... " 
294294            reader .ps4  =  "" 
295295            reader .can_colorize  =  False 
@@ -305,23 +305,23 @@ def prepare_reader_keep_prompts(*args, **kwargs):
305305        prompt  =  reader .get_prompt (0 , False )
306306        self .assertEqual (prompt , DEFAULT_PS1 )
307307
308-     def  test_prompt_ps2_raise_exception (self ):
309-         # Handles simple ASCII prompt  
308+     def  test_prompt_ps2_ps3_ps4_raise_exception (self ):
309+         # Handles exceptions from ps2, ps3 and ps4 prompts  
310310        class  Prompt :
311311            def  __str__ (self ): 1 / 0 
312312
313313        def  prepare_reader_keep_prompts (* args , ** kwargs ):
314314            reader  =  prepare_reader (* args , ** kwargs )
315315            del  reader .get_prompt 
316-             reader .ps1  =  "+++ " 
316+             reader .ps1  =  Prompt () 
317317            reader .ps2  =  Prompt ()
318-             reader .ps3  =  "--- " 
319-             reader .ps4  =  "~~~ " 
318+             reader .ps3  =  Prompt () 
319+             reader .ps4  =  Prompt () 
320320            reader .can_colorize  =  False 
321321            reader .paste_mode  =  False 
322322            return  reader 
323323
324-         events  =  code_to_events ("if some_condition:\n some_function()" )
324+         events  =  code_to_events ("if some_condition:\n some_function()\n some_function() " )
325325        reader , _  =  handle_events_narrow_console (
326326            events ,
327327            prepare_reader = prepare_reader_keep_prompts ,
@@ -330,43 +330,22 @@ def prepare_reader_keep_prompts(*args, **kwargs):
330330        prompt  =  reader .get_prompt (0 , False )
331331        self .assertEqual (prompt , DEFAULT_PS2 )
332332
333-     def  test_prompt_ps3_raise_exception (self ):
334-         # Handles simple ASCII prompt 
335-         class  Prompt :
336-             def  __str__ (self ): 1 / 0 
337- 
338-         def  prepare_reader_keep_prompts (* args , ** kwargs ):
339-             reader  =  prepare_reader (* args , ** kwargs )
340-             del  reader .get_prompt 
341-             reader .ps1  =  "+++ " 
342-             reader .ps2  =  "--- " 
343-             reader .ps3  =  Prompt ()
344-             reader .ps4  =  "" 
345-             reader .can_colorize  =  False 
346-             reader .paste_mode  =  False 
347-             return  reader 
348- 
349-         events  =  code_to_events ("if some_condition:\n some_function()" )
350-         reader , _  =  handle_events_narrow_console (
351-             events ,
352-             prepare_reader = prepare_reader_keep_prompts ,
353-         )
354- 
355333        prompt  =  reader .get_prompt (1 , False )
356334        self .assertEqual (prompt , DEFAULT_PS3 )
357335
358-     def  test_prompt_ps4_raise_exception (self ):
359-         # Handles simple ASCII prompt 
336+         prompt  =  reader .get_prompt (2 , False )
337+         self .assertEqual (prompt , DEFAULT_PS4 )
338+ 
339+     def  test_prompt_arg_raise_exception (self ):
340+         # Handles exceptions from arg prompt 
360341        class  Prompt :
361342            def  __str__ (self ): 1 / 0 
362343
344+             def  __rmul__ (self , b ): return  b 
345+ 
363346        def  prepare_reader_keep_prompts (* args , ** kwargs ):
364347            reader  =  prepare_reader (* args , ** kwargs )
365348            del  reader .get_prompt 
366-             reader .ps1  =  "+++ " 
367-             reader .ps2  =  "--- " 
368-             reader .ps3  =  "~~~ " 
369-             reader .ps4  =  Prompt ()
370349            reader .can_colorize  =  False 
371350            reader .paste_mode  =  False 
372351            return  reader 
@@ -377,8 +356,36 @@ def prepare_reader_keep_prompts(*args, **kwargs):
377356            prepare_reader = prepare_reader_keep_prompts ,
378357        )
379358
380-         prompt  =  reader .get_prompt (1 , False )
381-         self .assertEqual (prompt , DEFAULT_PS4 )
359+         reader .arg  =  Prompt ()
360+         prompt  =  reader .get_prompt (0 , True )
361+         self .assertEqual (prompt , DEFAULT_PS1 )
362+ 
363+     def  test_prompt_raise_exception (self ):
364+         # Tests unrecoverable exceptions from prompts 
365+         cases  =  [
366+             (MemoryError , "No memory for prompt" ),
367+             (SystemError , "System error for prompt" ),
368+         ]
369+         for  cls , msg  in  cases :
370+             with  self .subTest (msg ):
371+ 
372+                 class  Prompt :
373+                     def  __str__ (self ): raise  cls (msg )
374+ 
375+                 def  prepare_reader_keep_prompts (* args , ** kwargs ):
376+                     reader  =  prepare_reader (* args , ** kwargs )
377+                     del  reader .get_prompt 
378+                     reader .ps1  =  Prompt ()
379+                     reader .can_colorize  =  False 
380+                     reader .paste_mode  =  False 
381+                     return  reader 
382+ 
383+                 with  self .assertRaisesRegex (cls , msg ):
384+                     events  =  code_to_events ("a=1" )
385+                     handle_events_narrow_console (
386+                         events ,
387+                         prepare_reader = prepare_reader_keep_prompts ,
388+                     )
382389
383390    def  test_completions_updated_on_key_press (self ):
384391        namespace  =  {"itertools" : itertools }
0 commit comments