22import subprocess
33import sys
44import unittest
5+ from contextlib import contextmanager
56from textwrap import dedent
67
78from test .support import os_helper , requires_resource , Py_DEBUG
@@ -109,6 +110,18 @@ def test_putwch(self):
109110
110111
111112class TestOther (unittest .TestCase ):
113+ # We can't suppress the msgbox with invalid input without debug build
114+ @unittest .skipUnless (Py_DEBUG , "only available under debug build" )
115+ @contextmanager
116+ def set_crt_dbg_report_to_stderr (self ):
117+ mode = msvcrt .CrtSetReportMode (msvcrt .CRT_ASSERT , msvcrt .CRTDBG_MODE_FILE )
118+ file = msvcrt .CrtSetReportFile (msvcrt .CRT_ASSERT , msvcrt .CRTDBG_FILE_STDERR )
119+ try :
120+ yield
121+ finally :
122+ msvcrt .CrtSetReportMode (msvcrt .CRT_ASSERT , mode )
123+ msvcrt .CrtSetReportFile (msvcrt .CRT_ASSERT , file )
124+
112125 def test_heap_min (self ):
113126 try :
114127 msvcrt .heapmin ()
@@ -128,6 +141,10 @@ def test_SetErrorMode(self):
128141 self .assertIs (type (returned ), int )
129142 self .assertEqual (old , returned )
130143
144+ msvcrt .SetErrorMode (- 1 )
145+ msvcrt .SetErrorMode (2 ** 32 ) # max unsigned int
146+ msvcrt .SetErrorMode (- 2 ** 31 )
147+
131148 @unittest .skipUnless (Py_DEBUG , "only available under debug build" )
132149 def test_set_error_mode (self ):
133150 old = msvcrt .set_error_mode (msvcrt .REPORT_ERRMODE )
@@ -141,6 +158,11 @@ def test_set_error_mode(self):
141158 returned = msvcrt .set_error_mode (msvcrt .REPORT_ERRMODE )
142159 self .assertEqual (returned , msvcrt .OUT_TO_STDERR )
143160
161+ with self .set_crt_dbg_report_to_stderr ():
162+ self .assertEqual (msvcrt .set_error_mode (- 1 ), - 1 )
163+ self .assertEqual (msvcrt .set_error_mode (2 ** 31 - 1 ), - 1 )
164+ self .assertEqual (msvcrt .set_error_mode (- 2 ** 31 ), - 1 )
165+
144166 @unittest .skipUnless (Py_DEBUG , "only available under debug build" )
145167 def test_CrtSetReportMode (self ):
146168 old = msvcrt .CrtSetReportMode (msvcrt .CRT_WARN ,
@@ -157,6 +179,10 @@ def test_CrtSetReportMode(self):
157179 msvcrt .CRTDBG_REPORT_MODE )
158180 self .assertEqual (returned , msvcrt .CRTDBG_MODE_DEBUG )
159181
182+ self .assertRaises (OSError , msvcrt .CrtSetReportMode , - 1 , - 1 )
183+ self .assertRaises (OSError , msvcrt .CrtSetReportMode , 2 ** 31 - 1 , 2 ** 31 - 1 )
184+ self .assertRaises (OSError , msvcrt .CrtSetReportMode , - 2 ** 31 , - 2 ** 31 )
185+
160186 @unittest .skipUnless (Py_DEBUG , "only available under debug build" )
161187 def test_CrtSetReportFile (self ):
162188 # Set the report mode to CRTDBG_REPORT_FILE at first.
@@ -176,6 +202,10 @@ def test_CrtSetReportFile(self):
176202 msvcrt .CRTDBG_REPORT_FILE )
177203 self .assertEqual (returned , msvcrt .get_osfhandle (sys .stdout .fileno ()))
178204
205+ msvcrt .CrtSetReportFile (- 1 , - 1 )
206+ msvcrt .CrtSetReportFile (2 ** 31 - 1 , 2 ** 31 - 1 )
207+ msvcrt .CrtSetReportFile (- 2 ** 31 , - 2 ** 31 )
208+
179209
180210if __name__ == "__main__" :
181211 unittest .main ()
0 commit comments