NAME=t/manyundo
FILE=malloc://1024
CMDS=<<EOF
sh
# Force a wraparound in the undo/redo buffer.
100sd +1
sh ; %v $$ ; echo
shj~{62}
shj~{63}

# Make sure get back to the last available undo.
100shu
sh ; %v $$ ; echo

# And redo must work of course.
100shr
sh ; %v $$ ; echo

# Seeking inside the undo list must destroy the redo list.
50shu
sh ; %v $$ ; echo
shj~{12}
shj~{13}
shj~{14}
s 0x100
sh ; %v $$ ; echo
EOF
EXPECT=<<EOF
0x0  # current seek
0x25 
0x26 
0x27 
0x28 
0x29 
0x2a 
0x2b 
0x2c 
0x2d 
0x2e 
0x2f 
0x30 
0x31 
0x32 
0x33 
0x34 
0x35 
0x36 
0x37 
0x38 
0x39 
0x3a 
0x3b 
0x3c 
0x3d 
0x3e 
0x3f 
0x40 
0x41 
0x42 
0x43 
0x44 
0x45 
0x46 
0x47 
0x48 
0x49 
0x4a 
0x4b 
0x4c 
0x4d 
0x4e 
0x4f 
0x50 
0x51 
0x52 
0x53 
0x54 
0x55 
0x56 
0x57 
0x58 
0x59 
0x5a 
0x5b 
0x5c 
0x5d 
0x5e 
0x5f 
0x60 
0x61 
0x62 
0x63 
0x64  # current seek
0x64

{"offset":99,"cursor":0,"current":false}
{"offset":100,"cursor":0,"current":true}
0x25  # current seek
0x26  # redo
0x27  # redo
0x28  # redo
0x29  # redo
0x2a  # redo
0x2b  # redo
0x2c  # redo
0x2d  # redo
0x2e  # redo
0x2f  # redo
0x30  # redo
0x31  # redo
0x32  # redo
0x33  # redo
0x34  # redo
0x35  # redo
0x36  # redo
0x37  # redo
0x38  # redo
0x39  # redo
0x3a  # redo
0x3b  # redo
0x3c  # redo
0x3d  # redo
0x3e  # redo
0x3f  # redo
0x40  # redo
0x41  # redo
0x42  # redo
0x43  # redo
0x44  # redo
0x45  # redo
0x46  # redo
0x47  # redo
0x48  # redo
0x49  # redo
0x4a  # redo
0x4b  # redo
0x4c  # redo
0x4d  # redo
0x4e  # redo
0x4f  # redo
0x50  # redo
0x51  # redo
0x52  # redo
0x53  # redo
0x54  # redo
0x55  # redo
0x56  # redo
0x57  # redo
0x58  # redo
0x59  # redo
0x5a  # redo
0x5b  # redo
0x5c  # redo
0x5d  # redo
0x5e  # redo
0x5f  # redo
0x60  # redo
0x61  # redo
0x62  # redo
0x63  # redo
0x64  # redo
0x25

0x25 
0x26 
0x27 
0x28 
0x29 
0x2a 
0x2b 
0x2c 
0x2d 
0x2e 
0x2f 
0x30 
0x31 
0x32 
0x33 
0x34 
0x35 
0x36 
0x37 
0x38 
0x39 
0x3a 
0x3b 
0x3c 
0x3d 
0x3e 
0x3f 
0x40 
0x41 
0x42 
0x43 
0x44 
0x45 
0x46 
0x47 
0x48 
0x49 
0x4a 
0x4b 
0x4c 
0x4d 
0x4e 
0x4f 
0x50 
0x51 
0x52 
0x53 
0x54 
0x55 
0x56 
0x57 
0x58 
0x59 
0x5a 
0x5b 
0x5c 
0x5d 
0x5e 
0x5f 
0x60 
0x61 
0x62 
0x63 
0x64  # current seek
0x64

0x25 
0x26 
0x27 
0x28 
0x29 
0x2a 
0x2b 
0x2c 
0x2d 
0x2e 
0x2f 
0x30 
0x31 
0x32  # current seek
0x33  # redo
0x34  # redo
0x35  # redo
0x36  # redo
0x37  # redo
0x38  # redo
0x39  # redo
0x3a  # redo
0x3b  # redo
0x3c  # redo
0x3d  # redo
0x3e  # redo
0x3f  # redo
0x40  # redo
0x41  # redo
0x42  # redo
0x43  # redo
0x44  # redo
0x45  # redo
0x46  # redo
0x47  # redo
0x48  # redo
0x49  # redo
0x4a  # redo
0x4b  # redo
0x4c  # redo
0x4d  # redo
0x4e  # redo
0x4f  # redo
0x50  # redo
0x51  # redo
0x52  # redo
0x53  # redo
0x54  # redo
0x55  # redo
0x56  # redo
0x57  # redo
0x58  # redo
0x59  # redo
0x5a  # redo
0x5b  # redo
0x5c  # redo
0x5d  # redo
0x5e  # redo
0x5f  # redo
0x60  # redo
0x61  # redo
0x62  # redo
0x63  # redo
0x64  # redo
0x32

{"offset":49,"cursor":0,"current":false}
{"offset":50,"cursor":0,"current":true}
{"offset":51,"cursor":0,"current":false}
0x25 
0x26 
0x27 
0x28 
0x29 
0x2a 
0x2b 
0x2c 
0x2d 
0x2e 
0x2f 
0x30 
0x31 
0x32 
0x100  # current seek
0x100

EOF
RUN
