NAME=Import project
FILE=malloc://512
CMDS=<<EOF
e prj.vc=false
e scr.interactive=false
e dir.projects = bins/other/projects
CC hello world
C*
Po test > /dev/null
C*
EOF
EXPECT=<<EOF
CCu base64:aGVsbG8gd29ybGQ= @ 0x00000000
CCu base64:U29tZSB0ZXN0 @ 0x00404890
EOF
RUN

NAME=Import project with overwriting
FILE=malloc://512
CMDS=<<EOF
e prj.vc=false
e asm.bits=64
e asm.arch = x86
e anal.arch = x86
e dir.projects = ../bin/
CC Some test @ 0x00404890
Ps import2
Po import2 > /dev/null
CC*
EOF
EXPECT=<<EOF
CCu base64:U29tZSB0ZXN0 @ 0x00404890
EOF
RUN

NAME=Import project with overwriting
FILE=malloc://512
CMDS=<<EOF
e prj.vc=false
t-*
e asm.arch = x86
e anal.arch = x86
e dir.projects = .tmp/
e asm.bits=64
wx 31ed4989d15e4889e24883e4f0505449c7c09024410048c7c12024410048c7c7a0284000e857dcfffff4
af test
afF @ test
pdf
Ps testw > /dev/null
Pc testw~afF
rm .tmp/testw
EOF
EXPECT=<<EOF
/ (fcn) test
\           0x00000000 (42 byte folded function)
afF @ 0x00000000
EOF
RUN

NAME=Export project
FILE=malloc://512
CMDS=<<EOF
e prj.vc=false
e dir.projects = .tmp/
CC "Some other test" @ 0x00404890
Ps testexp > /dev/null
cat .tmp/testexp/rc.r2 | grep base64
rmdir -p .tmp/testexp
EOF
EXPECT=<<EOF
"e bin.debase64 = false"
CCu base64:IlNvbWUgb3RoZXIgdGVzdCI= @ 0x00404890
EOF
RUN

NAME=Set, export, unset and import
FILE=malloc://512
CMDS=<<EOF
e prj.vc=false
e dir.projects = .tmp/
t-*
CC "First comment" @ 0x00404890
CC "Second comment" @ 0x00404800
Ps testset > /dev/null
C- @ 0x00404890
C- @ 0x00404800
Po project.r2
cat .tmp/testset/rc.r2 | grep CC
rmdir -p .tmp/testset
EOF
EXPECT=<<EOF
CCu base64:IlNlY29uZCBjb21tZW50Ig== @ 0x00404800
CCu base64:IkZpcnN0IGNvbW1lbnQi @ 0x00404890
EOF
RUN

NAME=xrefs
FILE=malloc://512
CMDS=<<EOF
e prj.vc=false
ax 1
e dir.projects = .tmp/
axq
Ps xrefs > /dev/null
axq
EOF
EXPECT=<<EOF
0x00000000 -> 0x00000001  UNKNOWN
0x00000000 -> 0x00000001  UNKNOWN
EOF
RUN

NAME=Import mapped project
FILE=malloc://0xf000
CMDS=<<EOF
e prj.vc=false
e dir.projects = bins/other/projects/
e io.cache=true
wx 4ce2fc@0xc000
echo Saved `pu 3 @ 0xc000`
# Ps resetc64
pu 3 @2
pu 3 @0xc000
Po resetc64
echo Loaded `pu 3 @ 0xc000`
pu 3 @0xc000
EOF
EXPECT=<<EOF
Saved %4c%e2%fc
%00%00%00
%4c%e2%fc
Loaded %4c%e2%fc
%4c%e2%fc
EOF
RUN

NAME=asm.emu in project
FILE=bins/elf/analysis/simpleARM.elf
CMDS=<<EOF
e prj.vc=false
e asm.flags = false
e asm.emu = true
e dir.projects = .tmp/
Ps emu > /dev/null
Po emu
CC-
om `o~[0]` 0
pd 1
rm .tmp/emu
EOF
EXPECT=<<EOF
            0x08000060      0d20a0e3       mov r2, 0xd                 ; r2=0xd -> 0x2000000
EOF
RUN

NAME=Variables in project file
FILE=bins/efi/bootia32.efi
CMDS=<<EOF
e prj.vc=false
e dir.projects = .tmp/
af
afvr edi blahblah typeR @ 0x10002d8d
afvb 8 ImageHandle blah @ 0x10002d8d
Ps var > /dev/null
Pc var~ImageHandle
Pc var~blahblah
rm .tmp/var
EOF
EXPECT=<<EOF
"afvb 8 ImageHandle blah"
"afvr edi blahblah typeR"
EOF
RUN


NAME=Types and link in project file
FILE=-
CMDS=<<EOF
e prj.vc=false
e dir.projects = .tmp/
tk zoby  =  type
tl char @ 0x0
Ps types > /dev/null
Pc types~?link.,symlink,unlink
Pc types~?zoby
EOF
EXPECT=<<EOF
10
1
EOF
RUN

NAME=Breakpoints in project file
FILE=bins/elf/analysis/main
BROKEN=1
CMDS=<<EOF
e prj.vc=false
e dbg.bpinmaps = false
e dir.projects = .tmp/
db 0x1234567
Ps breakpoints > /dev/null
Pc breakpoints~?0x1234567
EOF
EXPECT=<<EOF
1
EOF
RUN

NAME=Visual Marks in project file
FILE=bins/elf/analysis/main
CMDS=<<EOF
e prj.vc=false
fV 49 0x400410
fV 50 0x400412
Ps vmarks > /dev/null
Pc vmarks~fV
Pd vmarks > /dev/null
EOF
EXPECT=<<EOF
fV 49 0x400410
fV 50 0x400412
EOF
RUN

NAME=Custom types in project file
FILE=bins/elf/analysis/main
CMDS=<<EOF
e prj.vc=false
tk char **=type
tk type.char **=**z
tk type.char **.size=64
Ps ctypes > /dev/null
Pc ctypes~?char **
"td struct Foo { int bar; int x; int y; };"
Ps ctypes > /dev/null
Pc ctypes~?char **
Pc ctypes~?Foo
Pd ctypes > /dev/null
EOF
EXPECT=<<EOF
9
9
8
EOF
RUN

NAME=Export custom types and import again
FILE=bins/elf/analysis/main
BROKEN=1
CMDS=<<EOF
e prj.vc=false
tk char **=type
tk type.char **=**z
tk type.char **.size=64
"td struct Foo { int bar; int x; int y; };"
Ps costom_types > /dev/null
t- char **
t- Foo
tk~?char **
tk~?Foo
Po costom_types > /dev/null
tk~?char **
tk~?Foo
Pd costom_types > /dev/null
EOF
EXPECT=<<EOF
5
0
7
5
EOF
RUN

NAME=Save project for a binary and checking opened files
FILE=bins/elf/analysis/main
BROKEN=1
CMDS=<<EOF
e prj.vc=false
e dir.projects = .tmp/
Ps ulumulu > /dev/null
Po ulumulu > /dev/null
o*~?
EOF
EXPECT=<<EOF
1
EOF
RUN

NAME=Save project for a binary without saving its info
BROKEN=1
FILE=bins/elf/analysis/main
ARGS=-n
CMDS=<<EOF
e prj.vc=false
e dir.projects = .tmp/
# Ps blub > /dev/null
Po blub > /dev/null
i~format
EOF
EXPECT=<<EOF
format   elf64
EOF
RUN

NAME=Save project for a binary after analysis
FILE=bins/elf/analysis/main
CMDS=<<EOF
e prj.vc=false
e dir.projects = .tmp/
e scr.interactive=false
aa
Ps beer
e scr.interactive=false
Po beer
echo Info: `Pi~Info`
aflc
e scr.interactive=false
EOF
EXPECT=<<EOF
Info:
13
EOF
RUN

NAME=Save project with baddr
FILE=bins/elf/analysis/main
ARGS=-B 0x1337
CMDS=<<EOF
e prj.vc=false
e dir.projects = .tmp/
o
om
om*
?e --
Pd hand
Ps hand > /dev/null
Po hand > /dev/null
om*
?e --
om*~?
om*~[2]
EOF
EXPECT=<<EOF
 3 * r-x 0x000021da bins/elf/analysis/main
 4 - rw- 0x00000008 null://8
* 3 fd: 3 +0x00000000 0x00001337 - 0x00001a12 r-x fmap.LOAD0
- 2 fd: 3 +0x000006e0 0x00201a17 - 0x00201c46 r-- fmap.LOAD1
- 1 fd: 4 +0x00000000 0x00201c47 - 0x00201c4e rw- mmap.LOAD1
om 4 0x00201c47 0x00000008 0x00000000 rw- mmap.LOAD1
om 3 0x00201a17 0x00000230 0x000006e0 r-- fmap.LOAD1
om 3 0x00001337 0x000006dc 0x00000000 r-x fmap.LOAD0
--
om 4 0x00201c47 0x00000008 0x00000000 rw- mmap.LOAD1
om 3 0x00201a17 0x00000230 0x000006e0 r-- fmap.LOAD1
om 3 0x00001337 0x000006dc 0x00000000 r-x fmap.LOAD0
om 3 0x002020f7 0x00000230 0x00000000 r-- fmap.LOAD1
om 3 0x00001337 0x000006dc 0x00000000 r-x fmap.LOAD0
--
5
0x00201c47
0x00201a17
0x00001337
0x002020f7
0x00001337
EOF
RUN

NAME=Save project with maddr
FILE=bins/elf/analysis/main
ARGS=-n -m 0x1337
CMDS=<<EOF
e prj.vc=false
e dir.projects = .tmp/
o
om
om*
?e --
Pd hond
Ps hond > /dev/null
Po hond > /dev/null
om*
?e --
om*~?
om*~[2]
EOF
EXPECT=<<EOF
 3 * r-x 0x000021da bins/elf/analysis/main
* 1 fd: 3 +0x00000000 0x00001337 - 0x00003510 r-x 
om 3 0x00001337 0x000021da 0x00000000 r-x
--
--
0
EOF
RUN

NAME=Save PE project with maddr
FILE=bins/pe/rabin2.exe
CMDS=<<EOF
e prj.vc=false
e dir.projects = .tmp/
CC hello world
pd 4
o
om
om*
?e --
Pd hund
Ps hund > /dev/null
CC-$$
Po hund > /dev/null
pd 4
om*
?e --
om*~?
om*~[2]
EOF
EXPECT=<<EOF
        :   ;-- entry0:
        :   0x14001a1d4      4883ec28       sub rsp, 0x28              ; hello world
        :   0x14001a1d8      e85b050000     call 0x14001a738
        :   0x14001a1dd      4883c428       add rsp, 0x28
        `=< 0x14001a1e1      e972feffff     jmp 0x14001a058
 3 * r-x 0x0001fe00 bins/pe/rabin2.exe
 4 - r-- 0x00000e00 null://3584
 5 - rw- 0x00002200 null://8704
 6 - r-- 0x00000400 null://1024
 7 - r-x 0x00000200 null://512
* 9 fd: 3 +0x00000400 0x140001000 - 0x14001adff r-x fmap..text
- 8 fd: 7 +0x00000000 0x14001ae00 - 0x14001afff r-x mmap..text
- 7 fd: 3 +0x0001a200 0x14001b000 - 0x14001dbff r-- fmap..rdata
- 6 fd: 6 +0x00000000 0x14001dc00 - 0x14001dfff r-- mmap..rdata
- 5 fd: 3 +0x0001ce00 0x14001e000 - 0x14001fdff r-- fmap..data
- 4 fd: 5 +0x00000000 0x14001fe00 - 0x140021fff rw- mmap..data
- 3 fd: 3 +0x0001ec00 0x140022000 - 0x140022fff r-- fmap..pdata
- 2 fd: 3 +0x0001fc00 0x140023000 - 0x1400231ff r-- fmap..reloc
- 1 fd: 4 +0x00000000 0x140023200 - 0x140023fff r-- mmap..reloc
om 4 0x140023200 0x00000e00 0x00000000 r-- mmap..reloc
om 3 0x140023000 0x00000200 0x0001fc00 r-- fmap..reloc
om 3 0x140022000 0x00001000 0x0001ec00 r-- fmap..pdata
om 5 0x14001fe00 0x00002200 0x00000000 rw- mmap..data
om 3 0x14001e000 0x00001e00 0x0001ce00 r-- fmap..data
om 6 0x14001dc00 0x00000400 0x00000000 r-- mmap..rdata
om 3 0x14001b000 0x00002c00 0x0001a200 r-- fmap..rdata
om 7 0x14001ae00 0x00000200 0x00000000 r-x mmap..text
om 3 0x140001000 0x00019e00 0x00000400 r-x fmap..text
--
        :   ;-- entry0:
        :   0x14001a1d4      4883ec28       sub rsp, 0x28              ; hello world
        :   0x14001a1d8      e85b050000     call 0x14001a738
        :   0x14001a1dd      4883c428       add rsp, 0x28
        `=< 0x14001a1e1      e972feffff     jmp 0x14001a058
om 4 0x140023200 0x00000e00 0x00000000 r-- mmap..reloc
om 3 0x140023000 0x00000200 0x0001fc00 r-- fmap..reloc
om 3 0x140022000 0x00001000 0x0001ec00 r-- fmap..pdata
om 5 0x14001fe00 0x00002200 0x00000000 rw- mmap..data
om 3 0x14001e000 0x00001e00 0x0001ce00 r-- fmap..data
om 6 0x14001dc00 0x00000400 0x00000000 r-- mmap..rdata
om 3 0x14001b000 0x00002c00 0x0001a200 r-- fmap..rdata
om 7 0x14001ae00 0x00000200 0x00000000 r-x mmap..text
om 3 0x140001000 0x00019e00 0x00000400 r-x fmap..text
--
9
0x140023200
0x140023000
0x140022000
0x14001fe00
0x14001e000
0x14001dc00
0x14001b000
0x14001ae00
0x140001000
EOF
RUN

NAME=Delete a saved project (with Pd)
FILE=bins/elf/analysis/main
ARGS=-n
CMDS=<<EOF
e prj.vc=false
e dir.projects = .tmp/
Ps cannot > /dev/null
Pd cannot > /dev/null
Pl~cannot

EOF
EXPECT=<<EOF
EOF
RUN

NAME=Delete a saved project (with P-)
FILE=bins/elf/analysis/main
ARGS=-n
CMDS=<<EOF
e prj.vc=false
e dir.projects = .tmp/
Ps erase > /dev/null
P- erase > /dev/null
Pl~erase
EOF
EXPECT=<<EOF
EOF
RUN

NAME=Delete a saved project and used directory (with Pd)
FILE=bins/elf/analysis/main
ARGS=-n
CMDS=<<EOF
e prj.vc=false
e dir.projects = .tmp/
Ps anesthetize > /dev/null
Pd anesthetize > /dev/null
Pl~blah
ls -l `e dir.projects`~anesthetize
EOF
EXPECT=<<EOF
EOF
RUN

NAME=Delete a saved project and used directory (with P-)
FILE=bins/elf/analysis/main
ARGS=-n
BROKEN=1
CMDS=<<EOF
e prj.vc=false
e dir.projects = .tmp/
Ps lightbulb > /dev/null
P- lightbulb > /dev/null
Pl~lightbulb
ls -l `e dir.projects`~lightbulb
EOF
EXPECT=<<EOF
-drwxr-xr-x  1  501:20    96          .tmp/lightbulb/
EOF
RUN

NAME=Save project for a file with x86_16 and check the value after loading again
FILE=bins/src/hello.c
ARGS=
CMDS=<<EOF
e prj.vc=false
e dir.projects = .tmp/
e asm.arch=x86
e asm.bits=16
Ps sun > /dev/null
Po sun > /dev/null
e asm.arch
e asm.bits
EOF
EXPECT=<<EOF
x86
16
EOF
RUN

NAME=prj.name saved in project
FILE=malloc://512
CMDS=<<EOF
e prj.vc=false
e dir.projects = .tmp/
Ps namedprj > /dev/null
e prj.name=
Po namedprj > /dev/null
e prj.name
rm .tmp/namedprj
EOF
EXPECT=<<EOF
namedprj
EOF
RUN

NAME=Checking e prj.name after saving again
FILE=bins/elf/analysis/main
CMDS=<<EOF
e prj.vc=false
e dir.projects = .tmp/
Ps stupid > /dev/null
Po stupid > /dev/null
Ps stupid > /dev/null
Po stupid > /dev/null
e prj.name
EOF
EXPECT=<<EOF
stupid
EOF
RUN

NAME=Restoring xrefs
FILE=malloc://512
CMDS=<<EOF
e prj.vc=false
e asm.arch = x86
e anal.arch = x86
e asm.bits=32
e dir.projects = .tmp/
wx 5031c0e801000000c3b801000000c3
af
Ps dream > /dev/null
Po dream > /dev/null
axq
EOF
EXPECT=<<EOF
0x00000003 -> 0x00000009  CALL
EOF
RUN

NAME=Reopening projects bin info loading
FILE=bins/elf/analysis/main
BROKEN=1
CMDS=<<EOF
e prj.vc=false
e dir.projects = .tmp/
Ps bininfo > /dev/null
Po bininfo
i~?
ie~?
ii~?
EOF
EXPECT=<<EOF
37
3
5
EOF
RUN

NAME=Reopening project with changes loading
FILE=bins/elf/analysis/main
CMDS=<<EOF
e prj.vc=false
aaa > /dev/null
e dir.projects = .tmp/
s main > /dev/null
CC test
Ps lapa > /dev/null
Po lapa
pd 1 ~test
rm .tmp/
EOF
EXPECT=<<EOF
|           0x00400506      55             push rbp                    ; test
EOF
RUN
