NAME=b
FILE=-
CMDS=<<EOF
b 100
b
EOF
EXPECT=<<EOF
0x64
EOF
RUN

NAME=b updates its command context
FILE=-
CMDS=<<EOF
b 64;b;b+4;b;b-2;b
EOF
EXPECT=<<EOF
0x40
0x44
0x42
EOF
RUN

NAME=b command token help suffixes
FILE=-
CMDS=<<EOF
b?~?change working block size
bf?~?set block size to flag size
bm?~?set max block size
bj?~?display block size information in JSON
b*?~?display current block size in r2 command
b+?~?increase blocksize by 3
b-?~?decrease blocksize by 16
b64:?~?execute a base64-encoded r2 script
bg?~?run command in background
EOF
EXPECT=<<EOF
1
1
1
1
1
1
1
1
1
EOF
EXPECT_ERR=
RUN

NAME=b64 raw command help suffix
FILE=-
CMDS=b64:'?
EXPECT=<<EOF
| b64:AA=   execute a base64-encoded r2 script
| b64:'AA=  execute a base64-encoded command without evaluating special chars
EOF
EXPECT_ERR=
RUN

NAME=b help and invalid arithmetic do not change block size
FILE=-
CMDS=<<EOF
b 32
b+?~__no_help_line__
b-?~__no_help_line__
b
b-33
b
b+0xffffffffffffffff
b
b-0xffffffffffffffff
b
b 0xffffffffffffffff
b
bm 0x100000000
bm
EOF
EXPECT=<<EOF
0x20
0x20
0x20
0x20
0x20
0x3200000
EOF
RUN

NAME=bj
FILE=-
CMDS=<<EOF
b 100
bj
EOF
EXPECT=<<EOF
{"blocksize":100,"blocksize_limit":52428800}
EOF
RUN

NAME=bj preserves unsigned block size limit
FILE=-
CMDS=<<EOF
bm 0xffffffff
bj
EOF
EXPECT=<<EOF
{"blocksize":256,"blocksize_limit":4294967295}
EOF
RUN

NAME=b64
FILE=-
CMDS=<<EOF
b64?
"p6es ?e hello;?e world"
b64:`_`
b64:'P2UgaGVsbG87P2Ugd29ybGQ=
b64:P2UgZmlyc3QKP2Ugc2Vjb25k
b64:ZWNobyBoZWxsbwojIGNvbW1lbnQKZWNobyB3b3JsZAo=
p6ds P2UgaGVsbG87P2Ugd29ybGQ=
`p6ds P2UgaGVsbG87P2Ugd29ybGQ=`
EOF
EXPECT=<<EOF
| b64:AA=   execute a base64-encoded r2 script
| b64:'AA=  execute a base64-encoded command without evaluating special chars
P2UgaGVsbG87P2Ugd29ybGQ=
hello
world
hello;?e world
first
second
hello
world
?e hello;?e world
hello
world
EOF
RUN

NAME=b64 raw preserves encoded semicolons without executing the suffix
FILE=-
CMDS=<<EOF
b64:'P2UgbGl0ZXJhbDtmIGI2NC5zZXBhcmF0b3I=
f~b64.separator
EOF
EXPECT=<<EOF
literal;f b64.separator
EOF
EXPECT_ERR=
RUN

NAME=b64 scripts execute encoded semicolons and newlines
FILE=-
CMDS=<<EOF
b64:P2UgbGl0ZXJhbDtmIGI2NC5zZXBhcmF0b3I=
f~b64.separator
b64:P2UgZmlyc3QKZiBiNjQubmV3bGluZQo/ZSBsYXN0
f~b64.newline
EOF
EXPECT=<<EOF
literal
0x00000000 1 b64.separator
first
last
0x00000000 1 b64.newline
EOF
EXPECT_ERR=
RUN

NAME=b64 raw preserves encoded substitutions and seek operators
FILE=-
CMDS=<<EOF
b64:'P2UgJChmIGI2NC5kb2xsYXIpIGBmIGI2NC5iYWNrdGlja2AgQCAweDQw
f~b64.
s
EOF
EXPECT=<<EOF
$(f b64.dollar) `f b64.backtick` @ 0x40
0x0
EOF
EXPECT_ERR=
RUN

NAME=b64 palette commands work outside theme loading
FILE=-
CMDS=<<EOF
ec comment rgb:123456
b64:'ZWMgY29tbWVudCByZ2I6YWJjZGVm
ec*~^ec comment
ec comment rgb:123456
b64:ZWMgY29tbWVudCByZ2I6YWJjZGVm
ec*~^ec comment
EOF
EXPECT=<<EOF
ec comment rgb:abcdef
ec comment rgb:abcdef
EOF
EXPECT_ERR=
RUN
