| import os | |
| import subprocess | |
| import sys | |
| import unittest | |
| from textwrap import dedent | |
| from test.support import os_helper, requires_resource | |
| from test.support.os_helper import TESTFN, TESTFN_ASCII | |
| if sys.platform != "win32": | |
| raise unittest.SkipTest("windows related tests") | |
| import _winapi | |
| import msvcrt | |
| class TestFileOperations(unittest.TestCase): | |
| def test_locking(self): | |
| with open(TESTFN, "w") as f: | |
| self.addCleanup(os_helper.unlink, TESTFN) | |
| msvcrt.locking(f.fileno(), msvcrt.LK_LOCK, 1) | |
| self.assertRaises(OSError, msvcrt.locking, f.fileno(), msvcrt.LK_NBLCK, 1) | |
| def test_unlockfile(self): | |
| with open(TESTFN, "w") as f: | |
| self.addCleanup(os_helper.unlink, TESTFN) | |
| msvcrt.locking(f.fileno(), msvcrt.LK_LOCK, 1) | |
| msvcrt.locking(f.fileno(), msvcrt.LK_UNLCK, 1) | |
| msvcrt.locking(f.fileno(), msvcrt.LK_LOCK, 1) | |
| def test_setmode(self): | |
| with open(TESTFN, "w") as f: | |
| self.addCleanup(os_helper.unlink, TESTFN) | |
| msvcrt.setmode(f.fileno(), os.O_BINARY) | |
| msvcrt.setmode(f.fileno(), os.O_TEXT) | |
| def test_open_osfhandle(self): | |
| h = _winapi.CreateFile(TESTFN_ASCII, _winapi.GENERIC_WRITE, 0, 0, 1, 128, 0) | |
| self.addCleanup(os_helper.unlink, TESTFN_ASCII) | |
| try: | |
| fd = msvcrt.open_osfhandle(h, os.O_RDONLY) | |
| h = None | |
| os.close(fd) | |
| finally: | |
| if h: | |
| _winapi.CloseHandle(h) | |
| def test_get_osfhandle(self): | |
| with open(TESTFN, "w") as f: | |
| self.addCleanup(os_helper.unlink, TESTFN) | |
| msvcrt.get_osfhandle(f.fileno()) | |
| c = '\u5b57' # unicode CJK char (meaning 'character') for 'wide-char' tests | |
| c_encoded = b'\x57\x5b' # utf-16-le (which windows internally used) encoded char for this CJK char | |
| class TestConsoleIO(unittest.TestCase): | |
| # CREATE_NEW_CONSOLE creates a "popup" window. | |
| @requires_resource('gui') | |
| def run_in_separated_process(self, code): | |
| # Run test in a separated process to avoid stdin conflicts. | |
| # See: gh-110147 | |
| cmd = [sys.executable, '-c', code] | |
| subprocess.run(cmd, check=True, capture_output=True, | |
| creationflags=subprocess.CREATE_NEW_CONSOLE) | |
| def test_kbhit(self): | |
| code = dedent(''' | |
| import msvcrt | |
| assert msvcrt.kbhit() == 0 | |
| ''') | |
| self.run_in_separated_process(code) | |
| def test_getch(self): | |
| msvcrt.ungetch(b'c') | |
| self.assertEqual(msvcrt.getch(), b'c') | |
| def check_getwch(self, funcname): | |
| code = dedent(f''' | |
| import msvcrt | |
| from _testconsole import write_input | |
| with open("CONIN$", "rb", buffering=0) as stdin: | |
| write_input(stdin, {ascii(c_encoded)}) | |
| assert msvcrt.{funcname}() == "{c}" | |
| ''') | |
| self.run_in_separated_process(code) | |
| def test_getwch(self): | |
| self.check_getwch('getwch') | |
| def test_getche(self): | |
| msvcrt.ungetch(b'c') | |
| self.assertEqual(msvcrt.getche(), b'c') | |
| def test_getwche(self): | |
| self.check_getwch('getwche') | |
| def test_putch(self): | |
| msvcrt.putch(b'c') | |
| def test_putwch(self): | |
| msvcrt.putwch(c) | |
| class TestOther(unittest.TestCase): | |
| def test_heap_min(self): | |
| try: | |
| msvcrt.heapmin() | |
| except OSError: | |
| pass | |
| if __name__ == "__main__": | |
| unittest.main() |