@@ -1129,21 +1129,27 @@ def test_scr_dump(self):
11291129 with tempfile .TemporaryDirectory () as d :
11301130 dump = os .path .join (d , 'dump' )
11311131 self .assertIsNone (curses .scr_dump (dump ))
1132- # Dumping the same screen again is deterministic.
1132+ with open (dump , 'rb' ) as f :
1133+ image = f .read ()
1134+ self .assertTrue (image )
1135+ # The dump format embeds raw pointers on some platforms (such as
1136+ # macOS), so two dumps of the same screen are not always identical.
1137+ # Only compare dump files when the format proves deterministic.
11331138 dump2 = os .path .join (d , 'dump2' )
11341139 curses .scr_dump (dump2 )
1135- with open (dump , 'rb' ) as f1 , open ( dump2 , 'rb' ) as f2 :
1136- self . assertEqual ( f1 . read (), f2 .read ())
1140+ with open (dump2 , 'rb' ) as f :
1141+ deterministic = f .read () == image
11371142 # scr_restore() reloads that virtual screen, so dumping it again
11381143 # reproduces the original file even after the screen has changed.
11391144 stdscr .erase ()
11401145 stdscr .addstr (0 , 0 , 'something else' )
11411146 stdscr .refresh ()
11421147 self .assertIsNone (curses .scr_restore (dump ))
1143- restored = os .path .join (d , 'restored' )
1144- curses .scr_dump (restored )
1145- with open (dump , 'rb' ) as f1 , open (restored , 'rb' ) as f2 :
1146- self .assertEqual (f1 .read (), f2 .read ())
1148+ if deterministic :
1149+ restored = os .path .join (d , 'restored' )
1150+ curses .scr_dump (restored )
1151+ with open (restored , 'rb' ) as f :
1152+ self .assertEqual (f .read (), image )
11471153 # scr_init() and scr_set() accept a dump file and return None.
11481154 self .assertIsNone (curses .scr_init (dump ))
11491155 self .assertIsNone (curses .scr_set (dump ))
@@ -1315,6 +1321,21 @@ def test_env_queries(self):
13151321 self .assertIsInstance (c , str )
13161322 self .assertEqual (len (c ), 1 )
13171323
1324+ @requires_curses_func ('define_key' )
1325+ def test_key_management (self ):
1326+ # Bind a custom escape sequence to a free key code and read it back.
1327+ seq = '\x1b spam'
1328+ keycode = 0o600
1329+ curses .define_key (seq , keycode )
1330+ self .assertEqual (curses .key_defined (seq ), keycode )
1331+ # keyok enables or disables interpretation of a single key code.
1332+ # Use the key code just defined, which is guaranteed to be known.
1333+ self .assertIsNone (curses .keyok (keycode , False ))
1334+ self .assertIsNone (curses .keyok (keycode , True ))
1335+ # Passing None removes the binding for the key code.
1336+ curses .define_key (None , keycode )
1337+ self .assertEqual (curses .key_defined (seq ), 0 )
1338+
13181339 def test_output_options (self ):
13191340 stdscr = self .stdscr
13201341
0 commit comments