NAME=p== output lines
FILE=-
CMDS=<<EOF
wx 00112233445566778899aabbccddeeff
p== 16~?
EOF
EXPECT=<<EOF
14
EOF
RUN

NAME=p== value ruler
FILE=-
CMDS=<<EOF
e scr.utf8=false
e scr.color=0
wx 00112233445566778899aabbccddeeff
p== 16~[-1]
EOF
EXPECT=<<EOF
ff
ed
db
c9
b7
a5
93
81
6f
5d
4b
39
27
15
EOF
RUN

NAME=p== keeps an isolated peak when squeezing
FILE=-
CMDS=<<EOF
e scr.color=0
e scr.hist.block=false
e scr.utf8=false
e scr.cols=80
wx ff @ 79
p== 80~:0
EOF
EXPECT=<<EOF
                                                                          | | ff
EOF
RUN

NAME=p== bar reaches the row matching its value
FILE=-
CMDS=<<EOF
e scr.color=0
e scr.hist.block=false
e scr.utf8=false
e scr.cols=20
wx edededededededededededededededed
p== 16~:0
p== 16~:1
EOF
EXPECT=<<EOF
                | ff
||||||||||||||| | ed
EOF
RUN

NAME=p== zero input draws only the baseline
FILE=-
CMDS=<<EOF
e scr.color=0
e scr.hist.block=false
e scr.utf8=false
e scr.cols=20
wx 00000000000000000000000000000000
p== 16~:0
p== 16~:13
EOF
EXPECT=<<EOF
                | ff
_______________ | 15
EOF
RUN

NAME=p== ruler needs one plot column
FILE=-
CMDS=<<EOF
e scr.color=0
e scr.hist.block=false
e scr.utf8=false
wx 00112233445566778899aabbccddeeff
e scr.cols=5
p== 16~:0
e scr.cols=6
p== 16~:0
EOF
EXPECT=<<EOF
    |
| | ff
EOF
RUN

NAME=p== ruler needs one plot column with utf8
FILE=-
CMDS=<<EOF
e scr.color=0
e scr.hist.block=false
e scr.utf8=true
wx 00112233445566778899aabbccddeeff
e scr.cols=5
p== 16~:0
e scr.cols=6
p== 16~:0
EOF
EXPECT=<<EOF
    │
│ │ ff
EOF
RUN

NAME=p== density modes draw full bars for fully matching blocks
FILE=malloc://256
CMDS=<<EOF
e scr.color=0
e scr.hist.block=false
e scr.utf8=false
e scr.cols=20
p==0 16~:0
wow ff
p==f 16~:0
wow 41
p==p 16~:0
EOF
EXPECT=<<EOF
||||||||||||||| | ff
||||||||||||||| | ff
||||||||||||||| | ff
EOF
RUN

NAME=p==b output lines
FILE=-
CMDS=<<EOF
wx 00112233445566778899aabbccddeeff
p==b 16~?
EOF
EXPECT=<<EOF
14
EOF
RUN

NAME=p==e output lines
FILE=-
CMDS=<<EOF
wx 00000000111111112222222233333333
p==e 16~?
EOF
EXPECT=<<EOF
14
EOF
RUN

NAME=p==p output lines
FILE=-
CMDS=<<EOF
w helloworld12345
p==p 16~?
EOF
EXPECT=<<EOF
14
EOF
RUN

NAME=p==0 output lines
FILE=-
CMDS=<<EOF
wx 00000000112233440000000055667788
p==0 16~?
EOF
EXPECT=<<EOF
14
EOF
RUN

NAME=p==f output lines
FILE=-
CMDS=<<EOF
wx ffffffff00000000ffffffff00000000
p==f 16~?
EOF
EXPECT=<<EOF
14
EOF
RUN

NAME=p== not crash with empty
FILE=-
CMDS=p==~?
EXPECT=<<EOF
14
EOF
RUN

NAME=p=F counts 0xff bytes
FILE=-
CMDS=<<EOF
b 2
wx 0xff
p=F 2 2@0
EOF
EXPECT=<<EOF
0x00000000 000 0001 |
0x00000100 001 0000 |
EOF
RUN

NAME=p=b 0xff 0x00
FILE=-
CMDS=<<EOF
b 2
wx 0xff
e zoom.in=range
p=b 2 2@0
EOF
EXPECT=<<EOF
0x00000000 000 00ff |###################################################
0x00000001 001 0000 |
EOF
RUN

NAME=p= - crash
FILE=-
CMDS=<<EOF
e zoom.in = block
p=p" 1 " 1 EN
EOF
EXPECT=<<EOF
0x00000000 000 0000 |
EOF
RUN

# merged: p=e 5 0x100
NAME=p=d
FILE=bins/elf/arm1.bin
ARGS=-n
CMDS=<<EOF
p=d 10 @ 0
?e --
e zoom.in = block
p=e 5 0x100
EOF
EXPECT=<<EOF
min:              0  0x0
max:              127  0x7f
unique (count):   6  0x6
range (max-min):  127  0x7f
size (of block):  10  0xa
--
0x00000000 000 007f |#########################
0x00000033 001 006b |#####################
0x00000066 002 007a |########################
0x00000099 003 006a |#####################
0x000000cc 004 005f |###################
EOF
RUN

NAME=p=e 5
FILE=bins/elf/arm1.bin
CMDS=p=e 5@0
EXPECT=<<EOF
0x00000000 000 009f |###############################
0x0001bec1 001 00c3 |#######################################
0x00037d82 002 00c3 |#######################################
0x00053c43 003 00c3 |#######################################
0x0006fb04 004 0051 |################
EOF
RUN

NAME=p=e 5 0x100 1
FILE=bins/elf/arm1.bin
ARGS=-n
CMDS=<<EOF
e zoom.in = block
p=e 5 0x100 1
EOF
EXPECT=<<EOF
0x00000000 000 006b |#####################
0x00000033 001 007a |########################
0x00000066 002 006a |#####################
0x00000099 003 005f |###################
0x000000cc 004 0059 |#################
EOF
RUN

# merged: p=p 5 0x100
NAME=p=p 5
FILE=bins/elf/arm1.bin
ARGS=-n
CMDS=<<EOF
p=p 5@0
?e --
e zoom.in = block
p=p 5 0x100
EOF
EXPECT=<<EOF
0x00000000 000 0032 |##########
0x0001bec1 001 0031 |#########
0x00037d82 002 0035 |##########
0x00053c43 003 0040 |############
0x0006fb04 004 0076 |#######################
--
0x00000000 000 0032 |##########
0x00000033 001 0019 |#####
0x00000066 002 001e |######
0x00000099 003 001e |######
0x000000cc 004 0028 |########
EOF
RUN

NAME=p=p 5 0x100 1
FILE=bins/elf/arm1.bin
ARGS=-n
CMDS=<<EOF
e zoom.in = block
p=p 5 0x100 1
EOF
EXPECT=<<EOF
0x00000000 000 0019 |#####
0x00000033 001 001e |######
0x00000066 002 001e |######
0x00000099 003 0028 |########
0x000000cc 004 001e |######
EOF
RUN

NAME=p=e hex.addr=0
FILE=-
CMDS=<<EOF
e hex.addr=0
e scr.color=0
woe 0 0xff 1
p=e 10
EOF
EXPECT=<<EOF
000 00ff |###################################################
001 00ff |###################################################
002 00ff |###################################################
003 00ff |###################################################
004 00ff |###################################################
005 0006 |#
006 0000 |
007 0000 |
008 0000 |
009 0000 |
EOF
RUN

# merged: p-j analysis metadata after aa
NAME=p=F hello-linux-x86_64
FILE=bins/elf/analysis/hello-linux-x86_64
CMDS=<<EOF
p=F
?e --
aa;s main;e search.in=anal.fcn;p-j 4~{ranges[0]};p-j 4~{blocks[0].symbols};p-j 4~{blocks[20].perm}
EOF
EXPECT=<<EOF
0x00400000 000 0000 |
0x00400100 001 0000 |
0x00400200 002 0000 |
0x00400300 003 000a |##
0x00400400 004 0013 |###
0x00400500 005 0014 |####
--
{"from":4195580,"to":4195601}
1
r-x
EOF
RUN


NAME=p-j analysis metadata json keeps offsets
FILE=-
CMDS=o--;e hex.cols=4;e search.in=range;e search.from=0;e search.to=16;af+ 0 16 fcn_test;p-j 4~{ranges[0]};p-j 4~{blocks[0]};p-j 4~{blocks[3]}
EXPECT=<<EOF
{"from":0,"to":16}
{"offset":0,"size":4,"flags":1,"functions":1,"in_functions":1,"perm":"r-x"}
{"offset":12,"size":4,"in_functions":1,"perm":"r-x"}
EOF
RUN

NAME=p= p- and p-j raw json ranges
FILE=-
CMDS=wx 00112233445566778899aabbccddeeff;e hex.cols=1;e zoom.in=raw;p=ej 1~{entropy[0].value};e search.in=raw;p-ej 1~{entropy[0].value};af+ 0 16 fcn_test;p-j 1~{ranges[0]};p-j 1~{blocks[0].perm}
EXPECT=<<EOF
9
9
{"from":0,"to":512}
rwx
EOF
RUN

NAME=p-j io.maps json keeps sparse holes addressable
FILE=malloc://0x100
CMDS=om-*;om `oq` 0x1000 0x10 0 rwx map1;om `oq` 0x2000 0x10 0 r-- map2;e search.in=io.maps;p-j 4~{ranges[1]};p-j 4~{blocks[1]};p-j 4~{blocks[15]}
EXPECT=<<EOF
{"from":8192,"to":8208}
{"offset":4353,"size":257}
{"offset":7951,"size":257,"perm":"r--"}
EOF
RUN

NAME=p=ej and p-ej io.maps ignore sparse holes
FILE=malloc://0x100
CMDS=om-*;om `oq` 0x1000 0x10 0 rwx map1;om `oq` 0x800000000000 0x10 0 r-- map2;e hex.cols=4;e zoom.in=io.maps;p=ej 4~{blocksize};p=ej 4~{entropy[3]};e search.in=io.maps;p-ej 4~{entropy[3]}
EXPECT=<<EOF
35184372087812
{"addr":105553116267532,"value":0}
{"addr":105553116267532,"value":0}
EOF
RUN

NAME=p-j analysis stats in_functions range relative
FILE=malloc://0x1000
CMDS=e search.in=range;e search.from=0x100;e search.to=0x200;e hex.cols=4;af+ 0x110 0x10 fcn_test;p-j 4~{blocksize};p-j 4~{blocks[0]};p-j 4~{blocks[1]}
EXPECT=<<EOF
64
{"offset":256,"size":64,"flags":1,"functions":1,"in_functions":1,"perm":"rwx"}
{"offset":320,"size":64,"perm":"rwx"}
EOF
RUN
