NAME=radiff2 -n
FILE=-
CMDS=!radiff2 -n bins/other/radiff2/radiff2_c_1 bins/other/radiff2/radiff2_c_2
EXPECT=<<EOF
1
EOF
RUN

NAME=radiff2 -a -O x86
FILE=-
CMDS=!radiff2 -a x86 -O bins/other/radiff2/radiff2_c_1 bins/other/radiff2/radiff2_c_2
EXPECT=<<EOF
0x00000000 91 => 90 0x00000000
EOF
RUN

NAME=radiff2 -B 0x420000
FILE=-
CMDS=!radiff2 -a x86 -B 0x420000 -O bins/other/radiff2/radiff2_c_1 bins/other/radiff2/radiff2_c_2
EXPECT=<<EOF
0x00420000 91 => 90 0x00420000
EOF
RUN

NAME=radiff2 -g
FILE=-
CMDS=!!radiff2 -g main -m d bins/other/radiff2/false bins/other/radiff2/true~digrap
EXPECT=<<EOF
digraph code {
EOF
RUN

NAME=radiff2 -v~commit?"
FILE=-
CMDS=!!radiff2 -v~commit?
EXPECT=<<EOF
1
EOF
RUN

NAME=radiff2 -h~Usage?"
FILE=-
CMDS=!!radiff2 -h~Usage?
EXPECT=<<EOF
1
EOF
RUN

NAME=radiff2 string comparison
FILE=-
CMDS=!!radiff2 -iz bins/elf/elf_one_symbol_shdr bins/elf/elf_one_symbol_shdr1
EXPECT=<<EOF
0x00000000 48656c6c => 41414141 0x00000000
EOF
RUN

NAME=radiff2 unified string comparison
FILE=-
CMDS=!!radiff2 -qu -iz bins/elf/elf_one_symbol_shdr bins/elf/elf_one_symbol_shdr1
EXPECT=<<EOF
-0x00000000:48 65 6c 6c 
+0x00000000:41 41 41 41 
EOF
RUN

NAME=radiff2 unified single byte changes
FILE=-
CMDS=<<EOF
!radiff2 -qu bins/other/radiff2/radiff2_c_1 bins/other/radiff2/radiff2_c_2
!radiff2 -qu hex://610062 hex://610162
EOF
EXPECT=<<EOF
-0x00000000:91 
+0x00000000:90 
-0x00000001:00 
+0x00000001:01 
EOF
RUN

NAME=radiff2 unified string context
FILE=-
CMDS=<<EOF
!radiff2 -u hex://610062 hex://610162
!radiff2 -u hex://6162636465 hex://6158635965
!radiff2 -u hex://6162 hex://6158
!radiff2 -du hex://610a620a630a640a650a660a hex://610a580a630a640a590a660a
!radiff2 -u -iz bins/elf/elf_one_symbol_shdr bins/elf/elf_one_symbol_shdr1
EOF
EXPECT=<<EOF
[31m-0x00000001:00  ""[0m
[32m+0x00000001:01  "\x01b"[0m
[31m-0x00000001:62  "bcde"[0m
[32m+0x00000001:58  "XcYe"[0m
[31m-0x00000003:64  "de"[0m
[32m+0x00000003:59  "Ye"[0m
[31m-0x00000001:62  "b"[0m
[32m+0x00000001:58  "X"[0m
[31m-0x00000002:62 0a  "b\nc\nd\ne\nf\n"[0m
[32m+0x00000002:58 0a  "X\nc\nd\nY\nf\n"[0m
[31m-0x00000008:65 0a  "e\nf\n"[0m
[32m+0x00000008:59 0a  "Y\nf\n"[0m
[31m-0x00000000:48 65 6c 6c  "Hello world!\n"[0m
[32m+0x00000000:41 41 41 41  "AAAAo world!\n"[0m
EOF
RUN

NAME=radiff2 gnu unified string comparison
FILE=-
CMDS=!!radiff2 -U -iz bins/elf/elf_one_symbol_shdr bins/elf/elf_one_symbol_shdr1 | tail -n 2
EXPECT=<<EOF
-Hello world!
+AAAAo world!
EOF
RUN

NAME=radiff2 -U shows the input names
FILE=-
CMDS=!radiff2 -U hex://610a62 hex://610a63
EXPECT=<<EOF
--- hex://610a62
+++ hex://610a63
@@ -1,2 +1,2 @@
 a
-b
\ No newline at end of file
+c
\ No newline at end of file
EOF
RUN

NAME=radiff2 -AC (elf files)
FILE=-
CMDS=!!radiff2 -AC bins/other/radiff2/true bins/other/radiff2/false~?\(1.000000\)
EXPECT=<<EOF
50
EOF
RUN

NAME=radiff2 -AAC (elf files)
FILE=-
CMDS=!!radiff2 -AAC bins/other/radiff2/true bins/other/radiff2/false~?\(1.000000\)
EXPECT=<<EOF
54
EOF
RUN

NAME=radiff2 -AC (mach0 fat files)
FILE=-
CMDS=!!radiff2 -AC bins/other/radiff2/hellocxx-osx-fat-intel_1 bins/other/radiff2/hellocxx-osx-fat-intel_2~?\(1.000000\)
EXPECT=<<EOF
16
EOF
RUN

NAME=radiff2 -f1 (GDIFF support) #1
FILE=-
CMDS=!!radiff2 -f1 bins/other/radiff2/radiff2_c_1 bins/other/radiff2/radiff2_c_2 | rax2 -S
EXPECT=<<EOF
d1ffd1ff04019000
EOF
RUN

NAME=radiff2 empty first file
FILE=-
CMDS=!radiff2 "" bins/other/radiff2/radiff2_c_2
EXPECT_ERR=<<EOF
ERROR: Cannot open empty path
EOF
RUN

NAME=radiff2 empty second file
FILE=-
CMDS=!radiff2 bins/other/radiff2/radiff2_c_1 ""
EXPECT_ERR=<<EOF
ERROR: Cannot open empty path
EOF
RUN

NAME=radiff2 compares saved project functions and virtual maps without analysis
FILE=hex://b801000000c3b802000000c3
ARGS=-a x86 -b 64 -m 0x1000
CMDS=<<END
mkdir .tmp
af+ 0x1000 main
afb+ 0x1000 0x1000 6
af+ 0x1006 helper
afb+ 0x1006 0x1006 6
prj save .tmp/radiff-project-a.prj
!r2 -Nq -a x86 -b 64 -m 0x2000 -c 'af+ 0x2000 main;afb+ 0x2000 0x2000 6;af+ 0x2006 helper;afb+ 0x2006 0x2006 6;prj save .tmp/radiff-project-b.prj' hex://b803000000c3b802000000c3
!radiff2 -C .tmp/radiff-project-a.prj .tmp/radiff-project-a.prj
!radiff2 -C .tmp/radiff-project-a.prj .tmp/radiff-project-b.prj
!!radiff2 -g main -m j .tmp/radiff-project-a.prj .tmp/radiff-project-a.prj~{0.name}
rm .tmp/radiff-project-a.prj
rm .tmp/radiff-project-b.prj
END
EXPECT=<<END
  main 6 0x1000 |   MATCH  (1.000000) | 0x1000  6 main
helper 6 0x1006 |   MATCH  (1.000000) | 0x1006  6 helper
  main 6 0x1000 |   MATCH  (0.833333) | 0x2000  6 main
helper 6 0x1006 |   MATCH  (1.000000) | 0x2006  6 helper
main
END
RUN

NAME=radiff2 compares projects with one saved function per session
FILE=hex://b801000000c3
ARGS=-a x86 -b 64 -m 0x1000
CMDS=<<END
mkdir .tmp
af+ 0x1000 main
afb+ 0x1000 0x1000 6
prj save .tmp/radiff-single-a.prj
!r2 -Nq -a x86 -b 64 -m 0x2000 -c 'af+ 0x2000 main;afb+ 0x2000 0x2000 6;prj save .tmp/radiff-single-b.prj' hex://b802000000c3
!radiff2 -C .tmp/radiff-single-a.prj .tmp/radiff-single-a.prj
!radiff2 -C .tmp/radiff-single-a.prj .tmp/radiff-single-b.prj
rm .tmp/radiff-single-a.prj
rm .tmp/radiff-single-b.prj
END
EXPECT=<<END
main 6 0x1000 |   MATCH  (1.000000) | 0x1000  6 main
main 6 0x1000 |   MATCH  (0.833333) | 0x2000  6 main
END
RUN

NAME=radiff2 -x ignores a stale R2CONS
FILE=-
ENV=R2CONS=4416884320
CMDS=<<EOF
!radiff2 -x malloc://4 malloc://4
?e ok
EOF
EXPECT=<<EOF
  offset     0 1 2 3 4 5 6 7 01234567    0 1 2 3 4 5 6 7 01234567
[32m0x00000000  [0m00000000         ....       00000000         ....

[0mok
EOF
RUN

NAME=tools spawned after an in-process tool do not crash
FILE=-
CMDS=radiff2 malloc://8 malloc://8;!ragg2 -B 90;!rasm2 -a x86 -b 32 -d 90;?e alive
EXPECT=<<EOF
90
nop
alive
EOF
RUN

NAME=radiff2 disassembly expands changed immediates
FILE=-
CMDS=<<EOF
!radiff2 -qD -a x86 -b 64 hex://90b801000000c3 hex://90b802000000c3
EOF
EXPECT=<<EOF
--- 0x00000001  b801000000
- 0x00000001  mov eax, 1
+++ 0x00000001  b802000000
+ 0x00000001  mov eax, 2
EOF
RUN

NAME=radiff2 disassembly with eval has no leading blank lines
FILE=-
CMDS=!radiff2 -e bin.relocs.apply=true -qD -a x86 -b 64 hex://90 hex://c3
EXPECT=<<EOF
--- 0x00000000  90
- 0x00000000  nop
+++ 0x00000000  c3
+ 0x00000000  ret
EOF
RUN

NAME=radiff2 disassembly merges fragments of one instruction
FILE=-
CMDS=<<EOF
!radiff2 -qD -a x86 -b 64 hex://b801000203c3 hex://b804000506c3
EOF
EXPECT=<<EOF
--- 0x00000000  b801000203
- 0x00000000  mov eax, 0x3020001
+++ 0x00000000  b804000506
+ 0x00000000  mov eax, 0x6050004
EOF
RUN

NAME=radiff2 disassembly uses instruction addresses and base
FILE=-
CMDS=<<EOF
!radiff2 -qD -a x86 -b 64 hex://90e800000000c3 hex://90e801000000c3
!radiff2 -qD -a x86 -b 64 -B 0x1000 hex://90740490c3 hex://90eb0490c3
EOF
EXPECT=<<EOF
--- 0x00000001  e800000000
- 0x00000001  call 6
+++ 0x00000001  e801000000
+ 0x00000001  call 7
--- 0x00001001  7404
- 0x00001001  je 0x1007
+++ 0x00001001  eb04
+ 0x00001001  jmp 0x1007
EOF
RUN

NAME=radiff2 disassembly keeps separate changes aligned
FILE=-
CMDS=<<EOF
!radiff2 -qD -a x86 -b 64 hex://b80100000090b802000000c3 hex://b80300000090b804000000c3
EOF
EXPECT=<<EOF
--- 0x00000000  b801000000
- 0x00000000  mov eax, 1
+++ 0x00000000  b803000000
+ 0x00000000  mov eax, 3
--- 0x00000006  b802000000
- 0x00000006  mov eax, 2
+++ 0x00000006  b804000000
+ 0x00000006  mov eax, 4
EOF
RUN

NAME=radiff2 disassembly honors independent offsets and lengths
FILE=-
CMDS=<<EOF
!radiff2 -qD -a x86 -b 64 -o 1:2 -l 5 hex://90b801000000c3 hex://9090b802000000c3
EOF
EXPECT=<<EOF
--- 0x00000001  b801000000
- 0x00000001  mov eax, 1
+++ 0x00000002  b802000000
+ 0x00000002  mov eax, 2
EOF
RUN

NAME=radiff2 disassembly bounds short inputs
FILE=-
CMDS=<<EOF
!radiff2 -qD -a x86 -b 64 hex://90 hex://c3
!radiff2 -qD -a x86 -b 64 hex://0f hex://90
!radiff2 -qD -a x86 -b 64 hex://90 hex://90
EOF
EXPECT=<<EOF
--- 0x00000000  90
- 0x00000000  nop
+++ 0x00000000  c3
+ 0x00000000  ret
--- 0x00000000  0f
- 0x00000000  invalid
+++ 0x00000000  90
+ 0x00000000  nop
EOF
RUN

NAME=radiff2 disassembly expands fixed width instructions
FILE=-
CMDS=<<EOF
!radiff2 -qD -a arm -b 32 hex://0100a0e31eff2fe1 hex://0200a0e31eff2fe1
EOF
EXPECT=<<EOF
--- 0x00000000  0100a0e3
- 0x00000000  mov r0, 1
+++ 0x00000000  0200a0e3
+ 0x00000000  mov r0, 2
EOF
RUN

NAME=radiff2 disassembly follows different instruction lengths
FILE=-
CMDS=!radiff2 -qD -a x86 -b 64 hex://b801000000900f1f00c3 hex://90b802000000909090c3
EXPECT=<<EOF
--- 0x00000000  b801000000900f1f00
- 0x00000000  mov eax, 1
- 0x00000005  nop
- 0x00000006  nop dword [rax]
+++ 0x00000000  90b802000000909090
+ 0x00000000  nop
+ 0x00000001  mov eax, 2
+ 0x00000006  nop
+ 0x00000007  nop
+ 0x00000008  nop
EOF
RUN
