@@ -201,5 +201,41 @@ def test_control_chars_with_echo_char(self):
201201 self .assertEqual ('Password: *******\x08 \x08 ' , mock_output .getvalue ())
202202
203203
204+ class GetpassEchoCharTest (unittest .TestCase ):
205+
206+ def test_accept_none (self ):
207+ getpass ._check_echo_char (None )
208+
209+ @support .subTests ('echo_char' , ["*" , "A" , " " ])
210+ def test_accept_single_printable_ascii (self , echo_char ):
211+ getpass ._check_echo_char (echo_char )
212+
213+ def test_reject_empty_string (self ):
214+ self .assertRaises (ValueError , getpass .getpass , echo_char = "" )
215+
216+ @support .subTests ('echo_char' , ["***" , "AA" , "aA*!" ])
217+ def test_reject_multi_character_strings (self , echo_char ):
218+ self .assertRaises (ValueError , getpass .getpass , echo_char = echo_char )
219+
220+ @support .subTests ('echo_char' , [
221+ '\N{LATIN CAPITAL LETTER AE} ' , # non-ASCII single character
222+ '\N{HEAVY BLACK HEART} ' , # non-ASCII multibyte character
223+ ])
224+ def test_reject_non_ascii (self , echo_char ):
225+ self .assertRaises (ValueError , getpass .getpass , echo_char = echo_char )
226+
227+ @support .subTests ('echo_char' , [
228+ ch for ch in map (chr , range (0 , 128 ))
229+ if not ch .isprintable ()
230+ ])
231+ def test_reject_non_printable_characters (self , echo_char ):
232+ self .assertRaises (ValueError , getpass .getpass , echo_char = echo_char )
233+
234+ # TypeError Rejection
235+ @support .subTests ('echo_char' , [b"*" , 0 , 0.0 , [], {}])
236+ def test_reject_non_string (self , echo_char ):
237+ self .assertRaises (TypeError , getpass .getpass , echo_char = echo_char )
238+
239+
204240if __name__ == "__main__" :
205241 unittest .main ()
0 commit comments