mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			120 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
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()
 |