NAME=afcf ls
FILE=bins/mach0/ls-osx-x86_64
CMDS=<<EOF
af@main
afcf main @ 0
afcf @ main
afcfj @ main
EOF
EXPECT=<<EOF
int main (int argc, char **argv);
int main (int argc, char **argv);
[{"name":"main","return":"int","args":[{"name":"argc","type":"int"},{"name":"argv","type":"char **"}],"count":2}]
EOF
RUN

NAME=af localflag
FILE=bins/mach0/mac-ls2
CMDS=<<EOF
af
f.foobar=0x100001216
pd 20~foo
EOF
EXPECT=<<EOF
|       ,=< 0x10000120f      7f05           jg .foobar                 ; main.foobar
|       |    .foobar:
EOF
RUN

NAME=af switch test
FILE=bins/mach0/mac-ls2
CMDS=<<EOF
af
axf@0x100001308
EOF
EXPECT=<<EOF
CODE 0x1000012dc case.0x100001308.50
CODE 0x10000130a case.0x100001308.49
CODE 0x100001321 case.0x100001308.114
CODE 0x10000132a case.0x100001308.120
CODE 0x100001347 case.0x100001308.118
CODE 0x100001353 case.0x100001308.99
CODE 0x100001370 case.0x100001308.102
CODE 0x100001392 case.0x100001308.97
CODE 0x100001396 case.0x100001308.65
CODE 0x1000013a2 case.0x100001308.84
CODE 0x1000013b1 case.0x100001308.107
CODE 0x1000013bd case.0x100001308.115
CODE 0x1000013cc case.0x100001308.76
CODE 0x1000013fb case.0x100001308.104
CODE 0x10000140a case.0x100001308.80
CODE 0x10000141a case.0x100001308.110
CODE 0x10000143f case.0x100001308.108
CODE 0x10000144b case.0x100001308.103
CODE 0x100001473 case.0x100001308.83
CODE 0x10000147f case.0x100001308.100
CODE 0x100001492 case.0x100001308.111
CODE 0x1000014d0 case.0x100001308.79
CODE 0x1000014df case.0x100001308.113
CODE 0x1000014f0 case.0x100001308.64
CODE 0x1000014ff case.0x100001308.67
CODE 0x100001519 case.0x100001308.82
CODE 0x100001525 case.0x100001308.70
CODE 0x10000153e case.0x100001308.66
CODE 0x10000155b case.0x100001308.105
CODE 0x10000156a case.0x100001308.119
CODE 0x100001583 case.0x100001308.85
CODE 0x1000015a0 case.0x100001308.87
CODE 0x1000015ac case.0x100001308.71
CODE 0x1000015c9 case.0x100001308.72
CODE 0x1000015f7 case.0x100001308.112
CODE 0x10000160d case.0x100001308.98
CODE 0x10000162a case.0x100001308.116
CODE 0x100001636 case.0x100001308.101
CODE 0x100001645 case.0x100001308.109
CODE 0x100001665 case.0x100001308.117
CODE 0x100001682 case.default.0x100001308
EOF
RUN

NAME=af import
FILE=bins/mach0/ls-osx-x86_64
BROKEN=1
CMDS=<<EOF
s sym.imp.write
af
?v $FS
EOF
EXPECT=<<EOF
before:
EOF
RUN

NAME=afll
FILE=bins/mach0/ls-osx-x86_64
CMDS=aa ; afll~?main
EXPECT=<<EOF
1
EOF
RUN

NAME=missing bb fix
FILE=bins/elf/before-after-main
CMDS=<<EOF
e asm.bytes=false
e asm.comments=false
s sym.register_tm_clones
af
pdf
EOF
EXPECT=<<EOF
/ 53: sym.register_tm_clones ();
|           0x08048410      mov eax, obj.completed.6891
|           0x08048415      sub eax, obj.completed.6891
|           0x0804841a      sar eax, 2
|           0x0804841d      mov edx, eax
|           0x0804841f      shr edx, 0x1f
|           0x08048422      add eax, edx
|           0x08048424      sar eax, 1
|       ,=< 0x08048426      je 0x8048448
|       |   0x08048428      mov edx, 0
|       |   0x0804842d      test edx, edx
|      ,==< 0x0804842f      je 0x8048448
|      ||   0x08048431      push ebp
|      ||   0x08048432      mov ebp, esp
|      ||   0x08048434      sub esp, 0x10
|      ||   0x08048437      push eax
|      ||   0x08048438      push obj.completed.6891
|      ||   0x0804843d      call edx
|      ||   0x0804843f      add esp, 0x10
|      ||   0x08048442      leave
|      ||   0x08048443      ret
..
\      ``-> 0x08048448      ret
EOF
RUN

NAME=afb+
FILE=bins/pe/a.exe
CMDS=<<EOF
s 0x004017c0
af+ 0x004017c0 fcn2.0x004017c0
afb+ 0x4017c0 0x4017c0 13 0x4017dd 0x4017cd
afi~size
afb
?e
pdf
?e
af-
af+ 0x004017c0 fcn2.0x004017c0
afb+ 0x4017c0 0x4017c0 6 0x4017dd 0x4017cd
afi~size
afb
?e
pdf
?e
afb+ 0x4017c0 0x4017c0 11 0x4017dd 0x4017cd
afi~size
afb
?e
pdf
EOF
EXPECT=<<EOF
size: 13
0x004017c0 0x004017cd 00:0000 13 j 0x004017dd f 0x004017cd

/ 13: fcn2.0x004017c0 ();
|           0x004017c0      51             push ecx
|           0x004017c1      89e1           mov ecx, esp
|           0x004017c3      83c108         add ecx, 8
|           0x004017c6      3d00100000     cmp eax, 0x1000
\       ,=< 0x004017cb      7210           jb 0x4017dd

size: 6
0x004017c0 0x004017c6 00:0000 6 j 0x004017dd f 0x004017cd

/ 6: fcn2.0x004017c0 ();
|           0x004017c0      51             push ecx
|           0x004017c1      89e1           mov ecx, esp
\           0x004017c3      83c108         add ecx, 8

size: 11
0x004017c0 0x004017cb 00:0000 11 j 0x004017dd f 0x004017cd

/ 11: fcn2.0x004017c0 ();
|           0x004017c0      51             push ecx
|           0x004017c1      89e1           mov ecx, esp
|           0x004017c3      83c108         add ecx, 8
\           0x004017c6      3d00100000     cmp eax, 0x1000
EOF
EXPECT_ERR=<<EOF
WARN: Relocs has not been applied. Please use `-e bin.relocs.apply=true` or `-e bin.cache=true` next time
EOF
RUN

NAME=Adding basic blocks with with wrong size (afb+)
BROKEN=1
FILE=bins/pe/a.exe
CMDS=<<EOF
s 0x004017c0
af+ 0x004017c0 fcn2.0x004017c0
afb+ 0x4017c0 0x4017c0 9 0x4017dd 0x4017cd
afi~size
afb
?e
pdf
?e
pdr
?e
afb+ 0x4017c0 0x4017c0 12 0x4017dd 0x4017cd
afi~size
afb
?e
pdf
?e
pdr
EOF
EXPECT=<<EOF
size: 9
0x004017c0 0x004017c9 00:0000 9 j 0x004017dd f 0x004017cd

/ 9: fcn2.0x004017c0 ();
|           0x004017c0      51             push ecx
|           0x004017c1      89e1           mov ecx, esp
|           0x004017c3      83c108         add ecx, 8
..

/ 9: fcn2.0x004017c0 ();
| 0x004017c0      51             push ecx
| 0x004017c1      89e1           mov ecx, esp
| 0x004017c3      83c108         add ecx, 8
| 0x004017c6      3d             invalid
\ 0x004017c7      0010           add byte [eax], dl
| // true: 0x004017dd  false: 0x004017cd

size: 12
0x004017c0 0x004017cc 00:0000 12 j 0x004017dd f 0x004017cd

/ 12: fcn2.0x004017c0 ();
|           0x004017c0      51             push ecx
|           0x004017c1      89e1           mov ecx, esp
|           0x004017c3      83c108         add ecx, 8
|           0x004017c6      3d00100000     cmp eax, 0x1000
..

/ 12: fcn2.0x004017c0 ();
| 0x004017c0      51             push ecx
| 0x004017c1      89e1           mov ecx, esp
| 0x004017c3      83c108         add ecx, 8
| 0x004017c6      3d00100000     cmp eax, 0x1000
\ 0x004017cb      72             invalid
| // true: 0x004017dd  false: 0x004017cd
EOF
RUN

NAME=afcf
FILE=bins/elf/crackme0x05
CMDS=<<EOF
af@main
afcf main @ 0
afcf @ main
afcfj @ main
EOF
EXPECT=<<EOF
int main (int argc, char **argv, char **envp);
int main (int argc, char **argv, char **envp);
[{"name":"main","return":"int","args":[{"name":"argc","type":"int"},{"name":"argv","type":"char **"},{"name":"envp","type":"char **"}],"count":3}]
EOF
RUN

NAME=afcf (vars)
FILE=bins/elf/ls
CMDS=<<EOF
s 0x00013c70
af
afcf
afcfj
EOF
EXPECT=<<EOF
fcn.00013c70 (int64_t arg1, int64_t arg2, int64_t arg3);
[{"name":"fcn.00013c70","args":[{"name":"arg1","type":"int64_t"},{"name":"arg2","type":"int64_t"},{"name":"arg3","type":"int64_t"}],"count":3}]
EOF
RUN

NAME=float args afli
FILE=bins/elf/float_point
CMDS=<<EOF
aa
afi sym.sum_float
EOF
EXPECT=<<EOF
#
offset: 0x00001119
name: sym.sum_float
size: 26
is-pure: true
realsz: 26
stackframe: 8
call-convention: amd64
cyclomatic-cost: 10
cyclomatic-complexity: 1
bits: 64
type: sym [NEW]
num-bbs: 1
num-instrs: 8
edges: 0
minbound: 0x00001119
maxbound: 0x00001133
is-lineal: true
end-bbs: 1
maxbbins: 8
midbbins: 8.00
ratbbins: 1.00
noreturn: false
in-degree: 1
out-degree: 0
locals: 2
args: 2

EOF
RUN

NAME=double args afli
FILE=bins/elf/float_point
BROKEN=1
CMDS=<<EOF
aa
afi sym.sum_double
EOF
EXPECT=<<EOF
#
offset: 0x00001133
name: sym.sum_double
size: 26
realsz: 26
stackframe: 8
call-convention: amd64
cyclomatic-cost: 11
cyclomatic-complexity: 1
bits: 64
type: sym [NEW]
num-bbs: 1
edges: 0
end-bbs: 1
call-refs:
data-refs:
code-xrefs: 0x00001181 C
in-degree: 1
out-degree: 0
data-xrefs:
locals: 2
args: 2
var int local_10h @ rbp-0x10
var int local_8h @ rbp-0x8
arg int arg1 @ xmm0
arg int arg2 @ xmm1
diff: type: new
EOF
RUN

NAME=duplicate af+
FILE=-
CMDS=<<EOF
af+ 0x1337 func
af+ 0x1337 func
af+ 0x1337 func
afl
EOF
EXPECT=<<EOF
0x00001337    0      0 func
EOF
EXPECT_ERR=<<EOF
ERROR: Cannot add function 'func' (duplicated) at 0x00001337
ERROR: Cannot add function 'func' (duplicated) at 0x00001337
EOF
RUN

NAME=function naming
FILE=-
CMDS=<<EOF
e asm.arch=x86
e asm.bits=64
wx c3c3c3c3c3c3c3c3c3
f sym.some_func @ 0
f sym.some_other_func @ 1
f a @ 2
f aa @ 3
f aaa @ 4
f aaaa @ 5
f sym @ 6
f sym. @ 7
f sym.b @ 8
e asm.flags.real=0
af @@ *
afl
?e --
af- @@ *
afl
?e --
e asm.flags.real=1
af @@ *
afl
EOF
EXPECT=<<EOF
0x00000000    1      1 sym.some_func
0x00000001    1      1 sym.some_other_func
0x00000002    1      1 a
0x00000003    1      1 aa
0x00000004    1      1 aaa
0x00000005    1      1 aaaa
0x00000006    1      1 sym
0x00000007    1      1 sym.
0x00000008    1      1 sym.b
--
--
0x00000000    1      1 sym.some_func
0x00000001    1      1 sym.some_other_func
0x00000002    1      1 a
0x00000003    1      1 aa
0x00000004    1      1 aaa
0x00000005    1      1 aaaa
0x00000006    1      1 sym
0x00000007    1      1 sym.
0x00000008    1      1 sym.b
EOF
RUN

NAME=af skips symbols
ARGS=-ebin.dbginfo=false
FILE=bins/elf/analysis/guess-number-riscv64
CMDS=<<EOF
af @ sym.fstatat
af @ sym.__syscall_error
afl
EOF
EXPECT=<<EOF
0x0001f8b8    2     20 sym.fstatat
0x0001f7cc    1     48 sym.__syscall_error
0x00021484    1      8 sym.__errno
EOF
RUN

NAME=af with custom sym.il name
FILE=bins/mach0/ls-m1
ARGS=-a arm -b 64
CMDS=<<EOF
sn
sn
s
f sym.il.piltrafilla
af
pd 2
EOF
EXPECT=<<EOF
0x1000047a8
            ;-- func.1000047a8:
/ 688: sym.il.piltrafilla (int64_t arg1, int64_t arg2, int64_t arg3);
|           ; arg int64_t arg1 @ x0
|           ; arg int64_t arg2 @ x1
|           ; arg int64_t arg3 @ x2
|           ; var int64_t var_10h @ sp+0x10
|           ; var int64_t var_20h @ sp+0x20
|           ; var int64_t var_30h @ sp+0x30
|           ; var int64_t var_40h @ sp+0x40
|           ; var int64_t var_50h @ sp+0x50
|           0x1000047a8      7f2303d5       pacibsp
|           0x1000047ac      fc6fbaa9       stp x28, x27, [sp, -0x60]!
EOF
RUN
