@@ -1173,6 +1173,85 @@ def test_replace_char(self):
11731173 self .assertEqual (reader .pos , 2 ) # cursor stays on replaced char
11741174 self .assertEqual (reader .vi_mode , ViMode .NORMAL ) # stays in normal mode
11751175
1176+ def test_undo_after_insert (self ):
1177+ events = itertools .chain (
1178+ code_to_events ("hello" ),
1179+ [
1180+ Event (evt = "key" , data = "\x1b " , raw = bytearray (b"\x1b " )), # ESC
1181+ Event (evt = "key" , data = "u" , raw = bytearray (b"u" )), # undo
1182+ ],
1183+ )
1184+ reader , _ = self ._run_vi (events )
1185+ self .assertEqual (reader .get_unicode (), "" )
1186+ self .assertEqual (reader .vi_mode , ViMode .NORMAL )
1187+
1188+ def test_undo_after_delete_word (self ):
1189+ events = itertools .chain (
1190+ code_to_events ("hello world" ),
1191+ [
1192+ Event (evt = "key" , data = "\x1b " , raw = bytearray (b"\x1b " )), # ESC
1193+ Event (evt = "key" , data = "0" , raw = bytearray (b"0" )), # BOL
1194+ Event (evt = "key" , data = "d" , raw = bytearray (b"d" )), # delete
1195+ Event (evt = "key" , data = "w" , raw = bytearray (b"w" )), # word
1196+ Event (evt = "key" , data = "u" , raw = bytearray (b"u" )), # undo
1197+ ],
1198+ )
1199+ reader , _ = self ._run_vi (events )
1200+ self .assertEqual (reader .get_unicode (), "hello world" )
1201+
1202+ def test_undo_after_x_delete (self ):
1203+ events = itertools .chain (
1204+ code_to_events ("hello" ),
1205+ [
1206+ Event (evt = "key" , data = "\x1b " , raw = bytearray (b"\x1b " )), # ESC
1207+ Event (evt = "key" , data = "x" , raw = bytearray (b"x" )), # delete char
1208+ Event (evt = "key" , data = "u" , raw = bytearray (b"u" )), # undo
1209+ ],
1210+ )
1211+ reader , _ = self ._run_vi (events )
1212+ self .assertEqual (reader .get_unicode (), "hello" )
1213+
1214+ def test_undo_stack_cleared_on_prepare (self ):
1215+ events = itertools .chain (
1216+ code_to_events ("hello" ),
1217+ [Event (evt = "key" , data = "\x1b " , raw = bytearray (b"\x1b " ))],
1218+ )
1219+ reader , console = self ._run_vi (events )
1220+ self .assertGreater (len (reader .undo_stack ), 0 )
1221+ reader .prepare ()
1222+ self .assertEqual (len (reader .undo_stack ), 0 )
1223+
1224+ def test_multiple_undo (self ):
1225+ events = itertools .chain (
1226+ code_to_events ("a" ),
1227+ [
1228+ Event (evt = "key" , data = "\x1b " , raw = bytearray (b"\x1b " )), # ESC
1229+ Event (evt = "key" , data = "a" , raw = bytearray (b"a" )), # append
1230+ ],
1231+ code_to_events ("b" ),
1232+ [
1233+ Event (evt = "key" , data = "\x1b " , raw = bytearray (b"\x1b " )), # ESC
1234+ Event (evt = "key" , data = "u" , raw = bytearray (b"u" )), # undo 'b'
1235+ Event (evt = "key" , data = "u" , raw = bytearray (b"u" )), # undo 'a'
1236+ ],
1237+ )
1238+ reader , _ = self ._run_vi (events )
1239+ self .assertEqual (reader .get_unicode (), "" )
1240+
1241+ def test_undo_after_replace (self ):
1242+ events = itertools .chain (
1243+ code_to_events ("hello" ),
1244+ [
1245+ Event (evt = "key" , data = "\x1b " , raw = bytearray (b"\x1b " )), # ESC
1246+ Event (evt = "key" , data = "0" , raw = bytearray (b"0" )), # BOL
1247+ Event (evt = "key" , data = "r" , raw = bytearray (b"r" )), # replace
1248+ Event (evt = "key" , data = "X" , raw = bytearray (b"X" )), # replacement
1249+ Event (evt = "key" , data = "u" , raw = bytearray (b"u" )), # undo
1250+ ],
1251+ )
1252+ reader , _ = self ._run_vi (events )
1253+ self .assertEqual (reader .get_unicode (), "hello" )
1254+
11761255
11771256@force_not_colorized_test_class
11781257class TestHistoricalReaderBindings (TestCase ):
0 commit comments