NAME=rz-diff empty first file
FILE==
CMDS=!rz-diff -C -t bytes "" bins/other/rz-diff/rz-diff_c_2
EXPECT_ERR=<<EOF
ERROR: rz-diff: error, cannot open a file without a name.
EOF
RUN

NAME=rz-diff empty second file
FILE==
CMDS=!rz-diff -C -t bytes bins/other/rz-diff/rz-diff_c_1 ""
EXPECT_ERR=<<EOF
ERROR: rz-diff: error, cannot open a file without a name.
EOF
RUN

NAME=rz-diff -V~commit?"
FILE==
CMDS=!!rz-diff -C -V~commit?
EXPECT=<<EOF
1
EOF
RUN

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


NAME=rz-diff distance comparison (leven)
FILE==
CMDS=!rz-diff -C -d leven bins/java/Main.java.1.7.class bins/java/Main.java.15.class
EXPECT=<<EOF
similarity: 0.637
distance: 529
EOF
RUN

NAME=rz-diff distance comparison (leven) JSON
FILE==
CMDS=!rz-diff -C -jd leven bins/java/Main.java.1.7.class bins/java/Main.java.15.class
EXPECT=<<EOF
{"similarity":0.636676,"distance":529}
EOF
RUN

NAME=rz-diff distance comparison (leven) QUIET
FILE==
CMDS=!rz-diff -C -qd leven bins/java/Main.java.1.7.class bins/java/Main.java.15.class
EXPECT=<<EOF
0.637
529
EOF
RUN


NAME=rz-diff distance comparison (myers)
FILE==
CMDS=!rz-diff -C -d myers bins/java/Main.java.1.7.class bins/java/Main.java.15.class
EXPECT=<<EOF
similarity: 0.769
distance: 602
EOF
RUN

NAME=rz-diff distance comparison (myers) JSON
FILE==
CMDS=!rz-diff -C -jd myers bins/java/Main.java.1.7.class bins/java/Main.java.15.class
EXPECT=<<EOF
{"similarity":0.768995,"distance":602}
EOF
RUN

NAME=rz-diff distance comparison (myers) QUIET
FILE==
CMDS=!rz-diff -C -qd myers bins/java/Main.java.1.7.class bins/java/Main.java.15.class
EXPECT=<<EOF
0.769
602
EOF
RUN

NAME=rz-diff similarity comparison (ssdeep)
FILE==
CMDS=!rz-diff -i -d ssdeep '384:2rOP+jOA3orMecdFpCAFRa5FZiqboYOCE:CwqVCA/IFZiqboYOC' '384:lrOPfSTZjOA3orMecdFpu1FFl5bZiqboVOCX:zTZwqVu1fXbZiqboVOC'
EXPECT=<<EOF
similarity: 0.696
EOF
RUN

NAME=rz-diff similarity comparison (ssdeep) json
FILE==
CMDS=!rz-diff -j -i -d ssdeep '384:2rOP+jOA3orMecdFpCAFRa5FZiqboYOCE:CwqVCA/IFZiqboYOC' '384:lrOPfSTZjOA3orMecdFpu1FFl5bZiqboVOCX:zTZwqVu1fXbZiqboVOC'
EXPECT=<<EOF
{"similarity":0.695652}
EOF
RUN

NAME=rz-diff similarity comparison (ssdeep) QUIET
FILE==
CMDS=!rz-diff -q -i -d ssdeep '384:2rOP+jOA3orMecdFpCAFRa5FZiqboYOCE:CwqVCA/IFZiqboYOC' '384:lrOPfSTZjOA3orMecdFpu1FFl5bZiqboVOCX:zTZwqVu1fXbZiqboVOC'
EXPECT=<<EOF
0.696
EOF
RUN

NAME=rz-diff bytes comparison
FILE==
CMDS=!rz-diff -C -t bytes bins/other/rz-diff/rz-diff_c_1 bins/other/rz-diff/rz-diff_c_2
EXPECT=<<EOF
--- bins/other/rz-diff/rz-diff_c_1
+++ bins/other/rz-diff/rz-diff_c_2
@@ -1,1 +1,1 @@
-91
+90

EOF
RUN

NAME=rz-diff bytes comparison JSON
FILE==
CMDS=!rz-diff -C -jt bytes bins/other/rz-diff/rz-diff_c_1 bins/other/rz-diff/rz-diff_c_2
EXPECT=<<EOF
{"from":"bins/other/rz-diff/rz-diff_c_1","to":"bins/other/rz-diff/rz-diff_c_2","diff":[{"from":[1,1],"to":[1,1],"ops":[{"op":"delete","value":"91"},{"op":"insert","value":"90"}]}]}
EOF
RUN


NAME=rz-diff strings comparison
FILE==
CMDS=!rz-diff -C -t strings bins/elf/elf_one_symbol_shdr bins/elf/elf_one_symbol_shdr1
EXPECT=<<EOF
--- bins/elf/elf_one_symbol_shdr
+++ bins/elf/elf_one_symbol_shdr1
@@ -1,1 +1,1 @@
-Hello world!
+AAAAo world!

EOF
RUN

NAME=rz-diff strings comparison JSON
FILE==
CMDS=!rz-diff -C -jt strings bins/elf/elf_one_symbol_shdr bins/elf/elf_one_symbol_shdr1
EXPECT=<<EOF
{"from":"bins/elf/elf_one_symbol_shdr","to":"bins/elf/elf_one_symbol_shdr1","diff":[{"from":[1,1],"to":[1,1],"ops":[{"op":"delete","value":"Hello world!\n"},{"op":"insert","value":"AAAAo world!\n"}]}]}
EOF
RUN

NAME=rz-diff strings comparison with addresses
FILE==
CMDS=!rz-diff -C -At strings bins/elf/elf_one_symbol_shdr bins/elf/elf_one_symbol_shdr1
EXPECT=<<EOF
--- bins/elf/elf_one_symbol_shdr
+++ bins/elf/elf_one_symbol_shdr1
@@ -1,1 +1,1 @@
-virt: 0x00000000080484b0 phys: 0x00000000000004b0 Hello world!
+virt: 0x00000000080484b0 phys: 0x00000000000004b0 AAAAo world!

EOF
RUN

NAME=rz-diff strings comparison with addresses JSON
FILE==
CMDS=!rz-diff -C -Ajt strings bins/elf/elf_one_symbol_shdr bins/elf/elf_one_symbol_shdr1
EXPECT=<<EOF
{"from":"bins/elf/elf_one_symbol_shdr","to":"bins/elf/elf_one_symbol_shdr1","diff":[{"from":[1,1],"to":[1,1],"ops":[{"op":"delete","value":"virt: 0x00000000080484b0 phys: 0x00000000000004b0 Hello world!\n"},{"op":"insert","value":"virt: 0x00000000080484b0 phys: 0x00000000000004b0 AAAAo world!\n"}]}]}
EOF
RUN


NAME=rz-diff functions comparison
FILE==
CMDS=!rz-diff -C -q -t functions -e flirt.sigdb.load.system=false -e flirt.sigdb.load.home=false bins/other/rz-diff/true bins/other/rz-diff/false
EXPECT=<<EOF
                   fcn.00401050 26    0x00401050 COMPLETE 1.000000   0x00401050 26    fcn.00401050
                sym.imp.__uflow 6     0x00401080 COMPLETE 1.000000   0x00401080 6     sym.imp.__uflow
                 sym.imp.getenv 6     0x00401090 COMPLETE 1.000000   0x00401090 6     sym.imp.getenv
                   sym.imp.free 6     0x004010a0 COMPLETE 1.000000   0x004010a0 6     sym.imp.free
                  sym.imp.abort 6     0x004010b0 COMPLETE 1.000000   0x004010b0 6     sym.imp.abort
       sym.imp.__errno_location 6     0x004010c0 COMPLETE 1.000000   0x004010c0 6     sym.imp.__errno_location
                sym.imp.strncmp 6     0x004010d0 COMPLETE 1.000000   0x004010d0 6     sym.imp.strncmp
                  sym.imp._exit 6     0x004010e0 COMPLETE 1.000000   0x004010e0 6     sym.imp._exit
                 sym.imp.strcpy 6     0x004010f0 COMPLETE 1.000000   0x004010f0 6     sym.imp.strcpy
             sym.imp.__fpending 6     0x00401100 COMPLETE 1.000000   0x00401100 6     sym.imp.__fpending
             sym.imp.textdomain 6     0x00401110 COMPLETE 1.000000   0x00401110 6     sym.imp.textdomain
                 sym.imp.fclose 6     0x00401120 COMPLETE 1.000000   0x00401120 6     sym.imp.fclose
         sym.imp.bindtextdomain 6     0x00401130 COMPLETE 1.000000   0x00401130 6     sym.imp.bindtextdomain
              sym.imp.dcgettext 6     0x00401140 COMPLETE 1.000000   0x00401140 6     sym.imp.dcgettext
 sym.imp.__ctype_get_mb_cur_max 6     0x00401150 COMPLETE 1.000000   0x00401150 6     sym.imp.__ctype_get_mb_cur_max
                 sym.imp.strlen 6     0x00401160 COMPLETE 1.000000   0x00401160 6     sym.imp.strlen
       sym.imp.__stack_chk_fail 6     0x00401170 COMPLETE 1.000000   0x00401170 6     sym.imp.__stack_chk_fail
                sym.imp.strrchr 6     0x00401190 COMPLETE 1.000000   0x00401190 6     sym.imp.strrchr
                  sym.imp.lseek 6     0x004011a0 COMPLETE 1.000000   0x004011a0 6     sym.imp.lseek
                 sym.imp.memset 6     0x004011b0 COMPLETE 1.000000   0x004011b0 6     sym.imp.memset
                 sym.imp.fscanf 6     0x004011c0 COMPLETE 1.000000   0x004011c0 6     sym.imp.fscanf
                  sym.imp.close 6     0x004011d0 COMPLETE 1.000000   0x004011d0 6     sym.imp.close
      sym.imp.__libc_start_main 6     0x004011e0 COMPLETE 1.000000   0x004011e0 6     sym.imp.__libc_start_main
                 sym.imp.memcmp 6     0x004011f0 COMPLETE 1.000000   0x004011f0 6     sym.imp.memcmp
         sym.imp.fputs_unlocked 6     0x00401200 COMPLETE 1.000000   0x00401200 6     sym.imp.fputs_unlocked
                 sym.imp.calloc 6     0x00401210 COMPLETE 1.000000   0x00401210 6     sym.imp.calloc
                 sym.imp.strcmp 6     0x00401220 COMPLETE 1.000000   0x00401220 6     sym.imp.strcmp
           loc.imp.__gmon_start 6     0x00401230 COMPLETE 1.000000   0x00401230 6     loc.imp.__gmon_start
                 sym.imp.memcpy 6     0x00401240 COMPLETE 1.000000   0x00401240 6     sym.imp.memcpy
                 sym.imp.fileno 6     0x00401250 COMPLETE 1.000000   0x00401250 6     sym.imp.fileno
                 sym.imp.malloc 6     0x00401260 COMPLETE 1.000000   0x00401260 6     sym.imp.malloc
            sym.imp.nl_langinfo 6     0x00401280 COMPLETE 1.000000   0x00401280 6     sym.imp.nl_langinfo
                 sym.imp.ungetc 6     0x00401290 COMPLETE 1.000000   0x00401290 6     sym.imp.ungetc
             sym.imp.__freading 6     0x004012a0 COMPLETE 1.000000   0x004012a0 6     sym.imp.__freading
                sym.imp.realloc 6     0x004012b0 COMPLETE 1.000000   0x004012b0 6     sym.imp.realloc
                 sym.imp.fdopen 6     0x004012c0 COMPLETE 1.000000   0x004012c0 6     sym.imp.fdopen
              sym.imp.setlocale 6     0x004012d0 COMPLETE 1.000000   0x004012d0 6     sym.imp.setlocale
           sym.imp.__printf_chk 6     0x004012e0 COMPLETE 1.000000   0x004012e0 6     sym.imp.__printf_chk
                  sym.imp.error 6     0x004012f0 COMPLETE 1.000000   0x004012f0 6     sym.imp.error
                   sym.imp.open 6     0x00401300 COMPLETE 1.000000   0x00401300 6     sym.imp.open
                   sym.imp.exit 6     0x00401330 COMPLETE 1.000000   0x00401330 6     sym.imp.exit
                 sym.imp.fwrite 6     0x00401340 COMPLETE 1.000000   0x00401340 6     sym.imp.fwrite
          sym.imp.__fprintf_chk 6     0x00401350 COMPLETE 1.000000   0x00401350 6     sym.imp.__fprintf_chk
                sym.imp.mbsinit 6     0x00401360 COMPLETE 1.000000   0x00401360 6     sym.imp.mbsinit
               sym.imp.iswprint 6     0x00401370 COMPLETE 1.000000   0x00401370 6     sym.imp.iswprint
          sym.imp.__ctype_b_loc 6     0x00401380 COMPLETE 1.000000   0x00401380 6     sym.imp.__ctype_b_loc
                   fcn.00401460 41    0x00401460 COMPLETE 1.000000   0x00401470 41    fcn.00401470
                   fcn.00401530 745   0x00401530 PARTIAL  0.879195   0x00401540 745   fcn.00401540
                   fcn.004018f0 147   0x004018f0 PARTIAL  0.931973   0x00401900 147   fcn.00401900
                   fcn.00401990 137   0x00401990 PARTIAL  0.985401   0x004019a0 137   fcn.004019a0
                   fcn.00401a20 162   0x00401a20 COMPLETE 1.000000   0x00401a30 162   fcn.00401a30
                   fcn.00401ae0 228   0x00401ae0 PARTIAL  0.964912   0x00401af0 228   fcn.00401af0
                   fcn.00401be0 2728  0x00401be0 PARTIAL  0.991569   0x00401bf0 2728  fcn.00401bf0
                   fcn.00402730 425   0x00402730 PARTIAL  0.971765   0x00402740 425   fcn.00402740
                   fcn.004029a0 50    0x004029a0 PARTIAL  0.980000   0x004029b0 50    fcn.004029b0
                   fcn.00402e20 204   0x00402e20 PARTIAL  0.960784   0x00402e30 204   fcn.00402e30
                   fcn.00402fc0 944   0x00402fc0 PARTIAL  0.952331   0x00402fd0 944   fcn.00402fd0
                   fcn.004033d0 131   0x004033d0 PARTIAL  0.992366   0x004033e0 131   fcn.004033e0
                   fcn.00403460 167   0x00403460 PARTIAL  0.994012   0x00403470 167   fcn.00403470
                   fcn.00403590 26    0x00403590 PARTIAL  0.961538   0x004035a0 26    fcn.004035a0
                   fcn.004035e0 48    0x004035e0 PARTIAL  0.958333   0x004035f0 48    fcn.004035f0
                   fcn.00403750 40    0x00403750 PARTIAL  0.975000   0x00403760 40    fcn.00403760
                   fcn.004037a0 49    0x004037a0 PARTIAL  0.857143   0x004037b0 49    fcn.004037b0
                   fcn.004037e0 35    0x004037e0 PARTIAL  0.914286   0x004037f0 35    fcn.004037f0
                   fcn.00403810 67    0x00403810 COMPLETE 1.000000   0x00403820 67    fcn.00403820
                   fcn.00403860 108   0x00403860 PARTIAL  0.972222   0x00403870 108   fcn.00403870
                   fcn.004038e0 1015  0x004038e0 PARTIAL  0.958621   0x004038f0 1015  fcn.004038f0
                   fcn.00403cf0 118   0x00403cf0 PARTIAL  0.932203   0x00403d00 118   fcn.00403d00
                   fcn.00403d70 59    0x00403d70 PARTIAL  0.949153   0x00403d80 59    fcn.00403d80
                   fcn.00403db0 86    0x00403db0 PARTIAL  0.965116   0x00403dc0 86    fcn.00403dc0
                   fcn.00403e90 26    0x00403e90 PARTIAL  0.923077   0x00403ea0 26    fcn.00403ea0
EOF
RUN

NAME=rz-diff functions comparison JSON
FILE==
CMDS=!rz-diff -C -jt functions -e flirt.sigdb.load.system=false -e flirt.sigdb.load.home=false bins/other/rz-diff/true bins/other/rz-diff/false
EXPECT=<<EOF
[{"similarity":1.000000,"type":"COMPLETE","original":{"name":"fcn.00401050","addr":4198480,"size":26},"modified":{"name":"fcn.00401050","addr":4198480,"size":26}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.__uflow","addr":4198528,"size":6},"modified":{"name":"sym.imp.__uflow","addr":4198528,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.getenv","addr":4198544,"size":6},"modified":{"name":"sym.imp.getenv","addr":4198544,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.free","addr":4198560,"size":6},"modified":{"name":"sym.imp.free","addr":4198560,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.abort","addr":4198576,"size":6},"modified":{"name":"sym.imp.abort","addr":4198576,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.__errno_location","addr":4198592,"size":6},"modified":{"name":"sym.imp.__errno_location","addr":4198592,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.strncmp","addr":4198608,"size":6},"modified":{"name":"sym.imp.strncmp","addr":4198608,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp._exit","addr":4198624,"size":6},"modified":{"name":"sym.imp._exit","addr":4198624,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.strcpy","addr":4198640,"size":6},"modified":{"name":"sym.imp.strcpy","addr":4198640,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.__fpending","addr":4198656,"size":6},"modified":{"name":"sym.imp.__fpending","addr":4198656,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.textdomain","addr":4198672,"size":6},"modified":{"name":"sym.imp.textdomain","addr":4198672,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.fclose","addr":4198688,"size":6},"modified":{"name":"sym.imp.fclose","addr":4198688,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.bindtextdomain","addr":4198704,"size":6},"modified":{"name":"sym.imp.bindtextdomain","addr":4198704,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.dcgettext","addr":4198720,"size":6},"modified":{"name":"sym.imp.dcgettext","addr":4198720,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.__ctype_get_mb_cur_max","addr":4198736,"size":6},"modified":{"name":"sym.imp.__ctype_get_mb_cur_max","addr":4198736,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.strlen","addr":4198752,"size":6},"modified":{"name":"sym.imp.strlen","addr":4198752,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.__stack_chk_fail","addr":4198768,"size":6},"modified":{"name":"sym.imp.__stack_chk_fail","addr":4198768,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.strrchr","addr":4198800,"size":6},"modified":{"name":"sym.imp.strrchr","addr":4198800,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.lseek","addr":4198816,"size":6},"modified":{"name":"sym.imp.lseek","addr":4198816,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.memset","addr":4198832,"size":6},"modified":{"name":"sym.imp.memset","addr":4198832,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.fscanf","addr":4198848,"size":6},"modified":{"name":"sym.imp.fscanf","addr":4198848,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.close","addr":4198864,"size":6},"modified":{"name":"sym.imp.close","addr":4198864,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.__libc_start_main","addr":4198880,"size":6},"modified":{"name":"sym.imp.__libc_start_main","addr":4198880,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.memcmp","addr":4198896,"size":6},"modified":{"name":"sym.imp.memcmp","addr":4198896,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.fputs_unlocked","addr":4198912,"size":6},"modified":{"name":"sym.imp.fputs_unlocked","addr":4198912,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.calloc","addr":4198928,"size":6},"modified":{"name":"sym.imp.calloc","addr":4198928,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.strcmp","addr":4198944,"size":6},"modified":{"name":"sym.imp.strcmp","addr":4198944,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"loc.imp.__gmon_start","addr":4198960,"size":6},"modified":{"name":"loc.imp.__gmon_start","addr":4198960,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.memcpy","addr":4198976,"size":6},"modified":{"name":"sym.imp.memcpy","addr":4198976,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.fileno","addr":4198992,"size":6},"modified":{"name":"sym.imp.fileno","addr":4198992,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.malloc","addr":4199008,"size":6},"modified":{"name":"sym.imp.malloc","addr":4199008,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.nl_langinfo","addr":4199040,"size":6},"modified":{"name":"sym.imp.nl_langinfo","addr":4199040,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.ungetc","addr":4199056,"size":6},"modified":{"name":"sym.imp.ungetc","addr":4199056,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.__freading","addr":4199072,"size":6},"modified":{"name":"sym.imp.__freading","addr":4199072,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.realloc","addr":4199088,"size":6},"modified":{"name":"sym.imp.realloc","addr":4199088,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.fdopen","addr":4199104,"size":6},"modified":{"name":"sym.imp.fdopen","addr":4199104,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.setlocale","addr":4199120,"size":6},"modified":{"name":"sym.imp.setlocale","addr":4199120,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.__printf_chk","addr":4199136,"size":6},"modified":{"name":"sym.imp.__printf_chk","addr":4199136,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.error","addr":4199152,"size":6},"modified":{"name":"sym.imp.error","addr":4199152,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.open","addr":4199168,"size":6},"modified":{"name":"sym.imp.open","addr":4199168,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.exit","addr":4199216,"size":6},"modified":{"name":"sym.imp.exit","addr":4199216,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.fwrite","addr":4199232,"size":6},"modified":{"name":"sym.imp.fwrite","addr":4199232,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.__fprintf_chk","addr":4199248,"size":6},"modified":{"name":"sym.imp.__fprintf_chk","addr":4199248,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.mbsinit","addr":4199264,"size":6},"modified":{"name":"sym.imp.mbsinit","addr":4199264,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.iswprint","addr":4199280,"size":6},"modified":{"name":"sym.imp.iswprint","addr":4199280,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"sym.imp.__ctype_b_loc","addr":4199296,"size":6},"modified":{"name":"sym.imp.__ctype_b_loc","addr":4199296,"size":6}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"fcn.00401460","addr":4199520,"size":41},"modified":{"name":"fcn.00401470","addr":4199536,"size":41}},{"similarity":0.879195,"type":"PARTIAL","original":{"name":"fcn.00401530","addr":4199728,"size":745},"modified":{"name":"fcn.00401540","addr":4199744,"size":745}},{"similarity":0.931973,"type":"PARTIAL","original":{"name":"fcn.004018f0","addr":4200688,"size":147},"modified":{"name":"fcn.00401900","addr":4200704,"size":147}},{"similarity":0.985401,"type":"PARTIAL","original":{"name":"fcn.00401990","addr":4200848,"size":137},"modified":{"name":"fcn.004019a0","addr":4200864,"size":137}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"fcn.00401a20","addr":4200992,"size":162},"modified":{"name":"fcn.00401a30","addr":4201008,"size":162}},{"similarity":0.964912,"type":"PARTIAL","original":{"name":"fcn.00401ae0","addr":4201184,"size":228},"modified":{"name":"fcn.00401af0","addr":4201200,"size":228}},{"similarity":0.991569,"type":"PARTIAL","original":{"name":"fcn.00401be0","addr":4201440,"size":2728},"modified":{"name":"fcn.00401bf0","addr":4201456,"size":2728}},{"similarity":0.971765,"type":"PARTIAL","original":{"name":"fcn.00402730","addr":4204336,"size":425},"modified":{"name":"fcn.00402740","addr":4204352,"size":425}},{"similarity":0.980000,"type":"PARTIAL","original":{"name":"fcn.004029a0","addr":4204960,"size":50},"modified":{"name":"fcn.004029b0","addr":4204976,"size":50}},{"similarity":0.960784,"type":"PARTIAL","original":{"name":"fcn.00402e20","addr":4206112,"size":204},"modified":{"name":"fcn.00402e30","addr":4206128,"size":204}},{"similarity":0.952331,"type":"PARTIAL","original":{"name":"fcn.00402fc0","addr":4206528,"size":944},"modified":{"name":"fcn.00402fd0","addr":4206544,"size":944}},{"similarity":0.992366,"type":"PARTIAL","original":{"name":"fcn.004033d0","addr":4207568,"size":131},"modified":{"name":"fcn.004033e0","addr":4207584,"size":131}},{"similarity":0.994012,"type":"PARTIAL","original":{"name":"fcn.00403460","addr":4207712,"size":167},"modified":{"name":"fcn.00403470","addr":4207728,"size":167}},{"similarity":0.961538,"type":"PARTIAL","original":{"name":"fcn.00403590","addr":4208016,"size":26},"modified":{"name":"fcn.004035a0","addr":4208032,"size":26}},{"similarity":0.958333,"type":"PARTIAL","original":{"name":"fcn.004035e0","addr":4208096,"size":48},"modified":{"name":"fcn.004035f0","addr":4208112,"size":48}},{"similarity":0.975000,"type":"PARTIAL","original":{"name":"fcn.00403750","addr":4208464,"size":40},"modified":{"name":"fcn.00403760","addr":4208480,"size":40}},{"similarity":0.857143,"type":"PARTIAL","original":{"name":"fcn.004037a0","addr":4208544,"size":49},"modified":{"name":"fcn.004037b0","addr":4208560,"size":49}},{"similarity":0.914286,"type":"PARTIAL","original":{"name":"fcn.004037e0","addr":4208608,"size":35},"modified":{"name":"fcn.004037f0","addr":4208624,"size":35}},{"similarity":1.000000,"type":"COMPLETE","original":{"name":"fcn.00403810","addr":4208656,"size":67},"modified":{"name":"fcn.00403820","addr":4208672,"size":67}},{"similarity":0.972222,"type":"PARTIAL","original":{"name":"fcn.00403860","addr":4208736,"size":108},"modified":{"name":"fcn.00403870","addr":4208752,"size":108}},{"similarity":0.958621,"type":"PARTIAL","original":{"name":"fcn.004038e0","addr":4208864,"size":1015},"modified":{"name":"fcn.004038f0","addr":4208880,"size":1015}},{"similarity":0.932203,"type":"PARTIAL","original":{"name":"fcn.00403cf0","addr":4209904,"size":118},"modified":{"name":"fcn.00403d00","addr":4209920,"size":118}},{"similarity":0.949153,"type":"PARTIAL","original":{"name":"fcn.00403d70","addr":4210032,"size":59},"modified":{"name":"fcn.00403d80","addr":4210048,"size":59}},{"similarity":0.965116,"type":"PARTIAL","original":{"name":"fcn.00403db0","addr":4210096,"size":86},"modified":{"name":"fcn.00403dc0","addr":4210112,"size":86}},{"similarity":0.923077,"type":"PARTIAL","original":{"name":"fcn.00403e90","addr":4210320,"size":26},"modified":{"name":"fcn.00403ea0","addr":4210336,"size":26}}]
EOF
RUN

NAME=rz-diff graphs comparison with addresses
FILE==
CMDS=!rz-diff -C -t graphs -0 0x401ae0 -1 0x401af0 bins/other/rz-diff/true bins/other/rz-diff/false
EXPECT=<<EOF
digraph code {
	graph [bgcolor=azure fontsize=8 fontname="Courier" splines="ortho"];
	node [fillcolor=gray style=filled shape=box];
	edge [arrowhead="normal"];
	"0x00401ae0" [fillcolor="yellow",color="black", fontname="Courier", label="--- fcn.00401ae0\l+++ fcn.00401af0\l@@ -1,4 +1,4 @@\l-fcn.00401ae0(int64_t arg1, int64_t arg2);\l+fcn.00401af0(int64_t arg1, int64_t arg2);\l      ; arg int64_t arg1 @ rdi\l      ; arg int64_t arg2 @ rsi\l      push  r12\l@@ -12,4 +12,4 @@\l      call  sym.imp.dcgettext\l      cmp   rax, rbp\l      mov   rbx, rax\l-     je    0x401b10\l+     je    0x401b20\l", URL="fcn.00401ae0/0x00401ae0"]
	"0x00401b01" [fillcolor="lightgray",color="black", fontname="Courier", label="     mov   rax, rbx\l     pop   rbx\l     pop   rbp\l     pop   r12\l     ret\l", URL="fcn.00401ae0/0x00401b01"]
	"0x00401b10" [fillcolor="lightgray",color="black", fontname="Courier", label="--- fcn.00401ae0\l+++ fcn.00401af0\l@@ -1,5 +1,5 @@\l-     call  fcn.004038e0\l+     call  fcn.004038f0\l      movzx edx, byte [rax]\l      and   edx, 0xffffffdf\l      cmp   dl, 0x55\l-     jne   0x401b78\l+     jne   0x401b88\l", URL="fcn.00401ae0/0x00401b10"]
	"0x00401b20" [fillcolor="lightgray",color="black", fontname="Courier", label="--- fcn.00401ae0\l+++ fcn.00401af0\l@@ -1,4 +1,4 @@\l      movzx edx, byte [rax + 1]\l      and   edx, 0xffffffdf\l      cmp   dl, 0x54\l-     jne   0x401b60\l+     jne   0x401b70\l", URL="fcn.00401ae0/0x00401b20"]
	"0x00401b2c" [fillcolor="lightgray",color="black", fontname="Courier", label="--- fcn.00401ae0\l+++ fcn.00401af0\l@@ -1,4 +1,4 @@\l      movzx edx, byte [rax + 2]\l      and   edx, 0xffffffdf\l      cmp   dl, 0x46\l-     jne   0x401b60\l+     jne   0x401b70\l", URL="fcn.00401ae0/0x00401b2c"]
	"0x00401b38" [fillcolor="lightgray",color="black", fontname="Courier", label="--- fcn.00401ae0\l+++ fcn.00401af0\l@@ --1,4 +-1,4 @@\l      cmp   byte [rax + 3], 0x2d\l-     jne   0x401b60\l+     jne   0x401b70\l", URL="fcn.00401ae0/0x00401b38"]
	"0x00401b3e" [fillcolor="lightgray",color="black", fontname="Courier", label="--- fcn.00401ae0\l+++ fcn.00401af0\l@@ --1,4 +-1,4 @@\l      cmp   byte [rax + 4], 0x38\l-     jne   0x401b60\l+     jne   0x401b70\l", URL="fcn.00401ae0/0x00401b3e"]
	"0x00401b44" [fillcolor="lightgray",color="black", fontname="Courier", label="--- fcn.00401ae0\l+++ fcn.00401af0\l@@ --1,4 +-1,4 @@\l      cmp   byte [rax + 5], 0\l-     jne   0x401b60\l+     jne   0x401b70\l", URL="fcn.00401ae0/0x00401b44"]
	"0x00401b4a" [fillcolor="yellow",color="black", fontname="Courier", label="--- fcn.00401ae0\l+++ fcn.00401af0\l@@ --1,7 +-1,7 @@\l      cmp   byte [rbx], 0x60\l-     mov   eax, 0x404253\l-     mov   ebx, 0x404247\l+     mov   eax, 0x404293\l+     mov   ebx, 0x404287\l      cmove rbx, rax\l-     jmp   0x401b01\l+     jmp   0x401b11\l", URL="fcn.00401ae0/0x00401b4a"]
	"0x00401b60" [fillcolor="yellow",color="black", fontname="Courier", label="--- fcn.00401ae0\l+++ fcn.00401af0\l@@ -1,5 +1,5 @@\l-     cmp   r12d, 7\l-     mov   ebx, 0x40424b\l-     mov   eax, 0x40424d\l+     cmp   byte [rbx], 0x60\l+     mov   eax, 0x404293\l+     mov   ebx, 0x404287\l      cmove rbx, rax\l-     jmp   0x401b01\l+     jmp   0x401b11\l", URL="fcn.00401ae0/0x00401b60"]
	"0x00401b78" [fillcolor="lightgray",color="black", fontname="Courier", label="--- fcn.00401ae0\l+++ fcn.00401af0\l@@ --1,4 +-1,4 @@\l      cmp   dl, 0x47\l-     jne   0x401b60\l+     jne   0x401b70\l", URL="fcn.00401ae0/0x00401b78"]
	"0x00401b7d" [fillcolor="lightgray",color="black", fontname="Courier", label="--- fcn.00401ae0\l+++ fcn.00401af0\l@@ -1,4 +1,4 @@\l      movzx edx, byte [rax + 1]\l      and   edx, 0xffffffdf\l      cmp   dl, 0x42\l-     jne   0x401b60\l+     jne   0x401b70\l", URL="fcn.00401ae0/0x00401b7d"]
	"0x00401b89" [fillcolor="lightgray",color="black", fontname="Courier", label="--- fcn.00401ae0\l+++ fcn.00401af0\l@@ --1,4 +-1,4 @@\l      cmp   byte [rax + 2], 0x31\l-     jne   0x401b60\l+     jne   0x401b70\l", URL="fcn.00401ae0/0x00401b89"]
	"0x00401b8f" [fillcolor="lightgray",color="black", fontname="Courier", label="--- fcn.00401ae0\l+++ fcn.00401af0\l@@ --1,4 +-1,4 @@\l      cmp   byte [rax + 3], 0x38\l-     jne   0x401b60\l+     jne   0x401b70\l", URL="fcn.00401ae0/0x00401b8f"]
	"0x00401b95" [fillcolor="lightgray",color="black", fontname="Courier", label="--- fcn.00401ae0\l+++ fcn.00401af0\l@@ --1,4 +-1,4 @@\l      cmp   byte [rax + 4], 0x30\l-     jne   0x401b60\l+     jne   0x401b70\l", URL="fcn.00401ae0/0x00401b95"]
	"0x00401b9b" [fillcolor="lightgray",color="black", fontname="Courier", label="--- fcn.00401ae0\l+++ fcn.00401af0\l@@ --1,4 +-1,4 @@\l      cmp   byte [rax + 5], 0x33\l-     jne   0x401b60\l+     jne   0x401b70\l", URL="fcn.00401ae0/0x00401b9b"]
	"0x00401ba1" [fillcolor="yellow",color="black", fontname="Courier", label="--- fcn.00401ae0\l+++ fcn.00401af0\l@@ -3,6 +3,6 @@\l      mov   edx, 0x30\l      mov   esi, str.GB18030\l      mov   rdi, rax\l-     call  fcn.00401a20\l+     call  fcn.00401a30\l      test  eax, eax\l-     je    0x401b60\l+     je    0x401b70\l", URL="fcn.00401ae0/0x00401ba1"]
	"0x00401bbc" [fillcolor="yellow",color="black", fontname="Courier", label="--- fcn.00401ae0\l+++ fcn.00401af0\l@@ --1,7 +-1,7 @@\l      cmp   byte [rbx], 0x60\l-     mov   eax, 0x40424f\l-     mov   ebx, 0x404244\l+     mov   eax, 0x404293\l+     mov   ebx, 0x404287\l      cmove rbx, rax\l-     jmp   0x401b01\l+     jmp   0x401b11\l", URL="fcn.00401ae0/0x00401bbc"]
	"0x00401ae0" -> "0x00401b10" [color="#13a10e"];
	"0x00401ae0" -> "0x00401b01" [color="#c50f1f"];
	"0x00401b10" -> "0x00401b78" [color="#13a10e"];
	"0x00401b10" -> "0x00401b20" [color="#c50f1f"];
	"0x00401b78" -> "0x00401b60" [color="#13a10e"];
	"0x00401b78" -> "0x00401b7d" [color="#c50f1f"];
	"0x00401b60" -> "0x00401b01" [color="#0037da"];
	"0x00401b7d" -> "0x00401b60" [color="#13a10e"];
	"0x00401b7d" -> "0x00401b89" [color="#c50f1f"];
	"0x00401b89" -> "0x00401b60" [color="#13a10e"];
	"0x00401b89" -> "0x00401b8f" [color="#c50f1f"];
	"0x00401b8f" -> "0x00401b60" [color="#13a10e"];
	"0x00401b8f" -> "0x00401b95" [color="#c50f1f"];
	"0x00401b95" -> "0x00401b60" [color="#13a10e"];
	"0x00401b95" -> "0x00401b9b" [color="#c50f1f"];
	"0x00401b9b" -> "0x00401b60" [color="#13a10e"];
	"0x00401b9b" -> "0x00401ba1" [color="#c50f1f"];
	"0x00401ba1" -> "0x00401b60" [color="#13a10e"];
	"0x00401ba1" -> "0x00401bbc" [color="#c50f1f"];
	"0x00401bbc" -> "0x00401b01" [color="#0037da"];
	"0x00401b20" -> "0x00401b60" [color="#13a10e"];
	"0x00401b20" -> "0x00401b2c" [color="#c50f1f"];
	"0x00401b2c" -> "0x00401b60" [color="#13a10e"];
	"0x00401b2c" -> "0x00401b38" [color="#c50f1f"];
	"0x00401b38" -> "0x00401b60" [color="#13a10e"];
	"0x00401b38" -> "0x00401b3e" [color="#c50f1f"];
	"0x00401b3e" -> "0x00401b60" [color="#13a10e"];
	"0x00401b3e" -> "0x00401b44" [color="#c50f1f"];
	"0x00401b44" -> "0x00401b60" [color="#13a10e"];
	"0x00401b44" -> "0x00401b4a" [color="#c50f1f"];
	"0x00401b4a" -> "0x00401b01" [color="#0037da"];
}
EOF
RUN

NAME=rz-diff graphs comparison with addresses JSON
FILE==
CMDS=!rz-diff -e analysis.jmp.cref=true -C -j -t graphs -0 0x401ae0 -1 0x401af0 bins/other/rz-diff/true bins/other/rz-diff/false
EXPECT=<<EOF
{"source":{"name":"fcn.00401ae0","offset":4201184,"ninstr":73,"nargs":2,"nlocals":0,"size":242,"stack":24,"type":"fcn"},"match":{"name":"fcn.00401ae0","offset":4201184,"ninstr":73,"nargs":2,"nlocals":0,"size":242,"stack":24,"type":"fcn"},"result":[{"pair":{"source":{"address":4201184,"jump":4201232,"fail":4201217},"match":{"address":4201200,"jump":4201248,"fail":4201233}},"similarity":{"type":"PARTIAL","score":0.969697},"opcodes":"--- fcn.00401ae0\n+++ fcn.00401af0\n@@ -1,4 +1,4 @@\n-fcn.00401ae0(int64_t arg1, int64_t arg2);\n+fcn.00401af0(int64_t arg1, int64_t arg2);\n      ; arg int64_t arg1 @ rdi\n      ; arg int64_t arg2 @ rsi\n      push  r12\n@@ -12,4 +12,4 @@\n      call  sym.imp.dcgettext\n      cmp   rax, rbp\n      mov   rbx, rax\n-     je    0x401b10\n+     je    0x401b20\n"},{"pair":{"source":{"address":4201217},"match":{"address":4201233}},"similarity":{"type":"COMPLETE","score":1.000000},"opcodes":"     mov   rax, rbx\n     pop   rbx\n     pop   rbp\n     pop   r12\n     ret\n"},{"pair":{"source":{"address":4201232,"jump":4201336,"fail":4201248},"match":{"address":4201248,"jump":4201352,"fail":4201264}},"similarity":{"type":"COMPLETE","score":1.000000},"opcodes":"--- fcn.00401ae0\n+++ fcn.00401af0\n@@ -1,5 +1,5 @@\n-     call  fcn.004038e0\n+     call  fcn.004038f0\n      movzx edx, byte [rax]\n      and   edx, 0xffffffdf\n      cmp   dl, 0x55\n-     jne   0x401b78\n+     jne   0x401b88\n"},{"pair":{"source":{"address":4201248,"jump":4201312,"fail":4201260},"match":{"address":4201264,"jump":4201328,"fail":4201276}},"similarity":{"type":"COMPLETE","score":1.000000},"opcodes":"--- fcn.00401ae0\n+++ fcn.00401af0\n@@ -1,4 +1,4 @@\n      movzx edx, byte [rax + 1]\n      and   edx, 0xffffffdf\n      cmp   dl, 0x54\n-     jne   0x401b60\n+     jne   0x401b70\n"},{"pair":{"source":{"address":4201260,"jump":4201312,"fail":4201272},"match":{"address":4201276,"jump":4201328,"fail":4201288}},"similarity":{"type":"COMPLETE","score":1.000000},"opcodes":"--- fcn.00401ae0\n+++ fcn.00401af0\n@@ -1,4 +1,4 @@\n      movzx edx, byte [rax + 2]\n      and   edx, 0xffffffdf\n      cmp   dl, 0x46\n-     jne   0x401b60\n+     jne   0x401b70\n"},{"pair":{"source":{"address":4201272,"jump":4201312,"fail":4201278},"match":{"address":4201288,"jump":4201328,"fail":4201294}},"similarity":{"type":"COMPLETE","score":1.000000},"opcodes":"--- fcn.00401ae0\n+++ fcn.00401af0\n@@ --1,4 +-1,4 @@\n      cmp   byte [rax + 3], 0x2d\n-     jne   0x401b60\n+     jne   0x401b70\n"},{"pair":{"source":{"address":4201278,"jump":4201312,"fail":4201284},"match":{"address":4201294,"jump":4201328,"fail":4201300}},"similarity":{"type":"COMPLETE","score":1.000000},"opcodes":"--- fcn.00401ae0\n+++ fcn.00401af0\n@@ --1,4 +-1,4 @@\n      cmp   byte [rax + 4], 0x38\n-     jne   0x401b60\n+     jne   0x401b70\n"},{"pair":{"source":{"address":4201284,"jump":4201312,"fail":4201290},"match":{"address":4201300,"jump":4201328,"fail":4201306}},"similarity":{"type":"COMPLETE","score":1.000000},"opcodes":"--- fcn.00401ae0\n+++ fcn.00401af0\n@@ --1,4 +-1,4 @@\n      cmp   byte [rax + 5], 0\n-     jne   0x401b60\n+     jne   0x401b70\n"},{"pair":{"source":{"address":4201290,"jump":4201217},"match":{"address":4201306,"jump":4201233}},"similarity":{"type":"PARTIAL","score":0.894737},"opcodes":"--- fcn.00401ae0\n+++ fcn.00401af0\n@@ --1,7 +-1,7 @@\n      cmp   byte [rbx], 0x60\n-     mov   eax, 0x404253\n-     mov   ebx, 0x404247\n+     mov   eax, 0x404293\n+     mov   ebx, 0x404287\n      cmove rbx, rax\n-     jmp   0x401b01\n+     jmp   0x401b11\n"},{"pair":{"source":{"address":4201312,"jump":4201217},"match":{"address":4201306,"jump":4201233}},"similarity":{"type":"PARTIAL","score":0.550000},"opcodes":"--- fcn.00401ae0\n+++ fcn.00401af0\n@@ -1,5 +1,5 @@\n-     cmp   r12d, 7\n-     mov   ebx, 0x40424b\n-     mov   eax, 0x40424d\n+     cmp   byte [rbx], 0x60\n+     mov   eax, 0x404293\n+     mov   ebx, 0x404287\n      cmove rbx, rax\n-     jmp   0x401b01\n+     jmp   0x401b11\n"},{"pair":{"source":{"address":4201336,"jump":4201312,"fail":4201341},"match":{"address":4201352,"jump":4201328,"fail":4201357}},"similarity":{"type":"COMPLETE","score":1.000000},"opcodes":"--- fcn.00401ae0\n+++ fcn.00401af0\n@@ --1,4 +-1,4 @@\n      cmp   dl, 0x47\n-     jne   0x401b60\n+     jne   0x401b70\n"},{"pair":{"source":{"address":4201341,"jump":4201312,"fail":4201353},"match":{"address":4201357,"jump":4201328,"fail":4201369}},"similarity":{"type":"COMPLETE","score":1.000000},"opcodes":"--- fcn.00401ae0\n+++ fcn.00401af0\n@@ -1,4 +1,4 @@\n      movzx edx, byte [rax + 1]\n      and   edx, 0xffffffdf\n      cmp   dl, 0x42\n-     jne   0x401b60\n+     jne   0x401b70\n"},{"pair":{"source":{"address":4201353,"jump":4201312,"fail":4201359},"match":{"address":4201369,"jump":4201328,"fail":4201375}},"similarity":{"type":"COMPLETE","score":1.000000},"opcodes":"--- fcn.00401ae0\n+++ fcn.00401af0\n@@ --1,4 +-1,4 @@\n      cmp   byte [rax + 2], 0x31\n-     jne   0x401b60\n+     jne   0x401b70\n"},{"pair":{"source":{"address":4201359,"jump":4201312,"fail":4201365},"match":{"address":4201375,"jump":4201328,"fail":4201381}},"similarity":{"type":"COMPLETE","score":1.000000},"opcodes":"--- fcn.00401ae0\n+++ fcn.00401af0\n@@ --1,4 +-1,4 @@\n      cmp   byte [rax + 3], 0x38\n-     jne   0x401b60\n+     jne   0x401b70\n"},{"pair":{"source":{"address":4201365,"jump":4201312,"fail":4201371},"match":{"address":4201381,"jump":4201328,"fail":4201387}},"similarity":{"type":"COMPLETE","score":1.000000},"opcodes":"--- fcn.00401ae0\n+++ fcn.00401af0\n@@ --1,4 +-1,4 @@\n      cmp   byte [rax + 4], 0x30\n-     jne   0x401b60\n+     jne   0x401b70\n"},{"pair":{"source":{"address":4201371,"jump":4201312,"fail":4201377},"match":{"address":4201387,"jump":4201328,"fail":4201393}},"similarity":{"type":"COMPLETE","score":1.000000},"opcodes":"--- fcn.00401ae0\n+++ fcn.00401af0\n@@ --1,4 +-1,4 @@\n      cmp   byte [rax + 5], 0x33\n-     jne   0x401b60\n+     jne   0x401b70\n"},{"pair":{"source":{"address":4201377,"jump":4201312,"fail":4201404},"match":{"address":4201393,"jump":4201328,"fail":4201420}},"similarity":{"type":"PARTIAL","score":0.962963},"opcodes":"--- fcn.00401ae0\n+++ fcn.00401af0\n@@ -3,6 +3,6 @@\n      mov   edx, 0x30\n      mov   esi, str.GB18030\n      mov   rdi, rax\n-     call  fcn.00401a20\n+     call  fcn.00401a30\n      test  eax, eax\n-     je    0x401b60\n+     je    0x401b70\n"},{"pair":{"source":{"address":4201404,"jump":4201217},"match":{"address":4201306,"jump":4201233}},"similarity":{"type":"PARTIAL","score":0.681818},"opcodes":"--- fcn.00401ae0\n+++ fcn.00401af0\n@@ --1,7 +-1,7 @@\n      cmp   byte [rbx], 0x60\n-     mov   eax, 0x40424f\n-     mov   ebx, 0x404244\n+     mov   eax, 0x404293\n+     mov   ebx, 0x404287\n      cmove rbx, rax\n-     jmp   0x401b01\n+     jmp   0x401b11\n"},{"pair":{"source":null,"match":{"address":4201328,"jump":4201233}},"similarity":{"type":"UNLIKE","score":0.000000},"opcodes":"     cmp   r12d, 7\n     mov   ebx, 0x40428b\n     mov   eax, 0x40428d\n     cmove rbx, rax\n     jmp   0x401b11\n"},{"pair":{"source":null,"match":{"address":4201420,"jump":4201233}},"similarity":{"type":"UNLIKE","score":0.000000},"opcodes":"     cmp   byte [rbx], 0x60\n     mov   eax, 0x40428f\n     mov   ebx, 0x404284\n     cmove rbx, rax\n     jmp   0x401b11\n"}]}
EOF
RUN


NAME=rz-diff entries comparison
FILE==
CMDS=!rz-diff -C -t entries bins/elf/hello_world bins/elf/hello_world32
EXPECT=<<EOF
--- bins/elf/hello_world
+++ bins/elf/hello_world32
@@ -1,3 +1,3 @@
-virt: 0x00000000000007a0 phys: 0x00000000000007a0 entry init
-virt: 0x0000000000000760 phys: 0x0000000000000760 entry fini
-virt: 0x00000000000006a0 phys: 0x00000000000006a0 entry program
+virt: 0x0000000000000600 phys: 0x0000000000000600 entry init
+virt: 0x00000000000005b0 phys: 0x00000000000005b0 entry fini
+virt: 0x00000000000004d0 phys: 0x00000000000004d0 entry program

EOF
RUN

NAME=rz-diff entries comparison JSON
FILE==
CMDS=!rz-diff -C -jt entries bins/elf/hello_world bins/elf/hello_world32
EXPECT=<<EOF
{"from":"bins/elf/hello_world","to":"bins/elf/hello_world32","diff":[{"from":[1,3],"to":[1,3],"ops":[{"op":"delete","value":"virt: 0x00000000000007a0 phys: 0x00000000000007a0 entry init\n"},{"op":"delete","value":"virt: 0x0000000000000760 phys: 0x0000000000000760 entry fini\n"},{"op":"delete","value":"virt: 0x00000000000006a0 phys: 0x00000000000006a0 entry program\n"},{"op":"insert","value":"virt: 0x0000000000000600 phys: 0x0000000000000600 entry init\n"},{"op":"insert","value":"virt: 0x00000000000005b0 phys: 0x00000000000005b0 entry fini\n"},{"op":"insert","value":"virt: 0x00000000000004d0 phys: 0x00000000000004d0 entry program\n"}]}]}
EOF
RUN


NAME=rz-diff imports comparison
FILE==
CMDS=!rz-diff -C -t imports bins/elf/hello_world bins/other/rz-diff/true
EXPECT=<<EOF
--- bins/elf/hello_world
+++ bins/other/rz-diff/true
@@ -1,11 +1,49 @@
-WEAK    NOTYPE  _ITM_deregisterTMCloneTable
-WEAK    NOTYPE  _ITM_registerTMCloneTable
-WEAK    FUNC    __cxa_finalize
+GLOBAL  FUNC    __ctype_b_loc
+GLOBAL  FUNC    __ctype_get_mb_cur_max
+GLOBAL  FUNC    __cxa_atexit
+GLOBAL  FUNC    __errno_location
+GLOBAL  FUNC    __fpending
+GLOBAL  FUNC    __fprintf_chk
+GLOBAL  FUNC    __freading
 WEAK    NOTYPE  __gmon_start__
 GLOBAL  FUNC    __libc_start_main
+GLOBAL  FUNC    __printf_chk
+GLOBAL  FUNC    __stack_chk_fail
+GLOBAL  FUNC    __uflow
+GLOBAL  FUNC    _exit
+GLOBAL  FUNC    abort
+GLOBAL  FUNC    bindtextdomain
+GLOBAL  FUNC    calloc
+GLOBAL  FUNC    close
+GLOBAL  FUNC    dcgettext
+GLOBAL  FUNC    error
+GLOBAL  FUNC    exit
+GLOBAL  FUNC    fclose
+GLOBAL  FUNC    fdopen
+GLOBAL  FUNC    fflush
+GLOBAL  FUNC    fileno
+GLOBAL  FUNC    fputs_unlocked
 GLOBAL  FUNC    free
+GLOBAL  FUNC    fscanf
+GLOBAL  FUNC    fseeko
+GLOBAL  FUNC    fwrite
+GLOBAL  FUNC    getenv
+GLOBAL  FUNC    iswprint
+GLOBAL  FUNC    lseek
 GLOBAL  FUNC    malloc
-GLOBAL  FUNC    puts
-GLOBAL  FUNC    strcat
+GLOBAL  FUNC    mbrtowc
+GLOBAL  FUNC    mbsinit
+GLOBAL  FUNC    memcmp
+GLOBAL  FUNC    memcpy
+GLOBAL  FUNC    memset
+GLOBAL  FUNC    nl_langinfo
+GLOBAL  FUNC    open
+GLOBAL  FUNC    realloc
+GLOBAL  FUNC    setlocale
+GLOBAL  FUNC    strcmp
 GLOBAL  FUNC    strcpy
 GLOBAL  FUNC    strlen
+GLOBAL  FUNC    strncmp
+GLOBAL  FUNC    strrchr
+GLOBAL  FUNC    textdomain
+GLOBAL  FUNC    ungetc

EOF
RUN

NAME=rz-diff imports comparison JSON
FILE==
CMDS=!rz-diff -C -jt imports bins/elf/hello_world bins/other/rz-diff/true
EXPECT=<<EOF
{"from":"bins/elf/hello_world","to":"bins/other/rz-diff/true","diff":[{"from":[1,11],"to":[1,49],"ops":[{"op":"delete","value":"WEAK    NOTYPE  _ITM_deregisterTMCloneTable\n"},{"op":"delete","value":"WEAK    NOTYPE  _ITM_registerTMCloneTable\n"},{"op":"delete","value":"WEAK    FUNC    __cxa_finalize\n"},{"op":"insert","value":"GLOBAL  FUNC    __ctype_b_loc\n"},{"op":"insert","value":"GLOBAL  FUNC    __ctype_get_mb_cur_max\n"},{"op":"insert","value":"GLOBAL  FUNC    __cxa_atexit\n"},{"op":"insert","value":"GLOBAL  FUNC    __errno_location\n"},{"op":"insert","value":"GLOBAL  FUNC    __fpending\n"},{"op":"insert","value":"GLOBAL  FUNC    __fprintf_chk\n"},{"op":"insert","value":"GLOBAL  FUNC    __freading\n"},{"op":"equal","value":"WEAK    NOTYPE  __gmon_start__\n"},{"op":"equal","value":"GLOBAL  FUNC    __libc_start_main\n"},{"op":"insert","value":"GLOBAL  FUNC    __printf_chk\n"},{"op":"insert","value":"GLOBAL  FUNC    __stack_chk_fail\n"},{"op":"insert","value":"GLOBAL  FUNC    __uflow\n"},{"op":"insert","value":"GLOBAL  FUNC    _exit\n"},{"op":"insert","value":"GLOBAL  FUNC    abort\n"},{"op":"insert","value":"GLOBAL  FUNC    bindtextdomain\n"},{"op":"insert","value":"GLOBAL  FUNC    calloc\n"},{"op":"insert","value":"GLOBAL  FUNC    close\n"},{"op":"insert","value":"GLOBAL  FUNC    dcgettext\n"},{"op":"insert","value":"GLOBAL  FUNC    error\n"},{"op":"insert","value":"GLOBAL  FUNC    exit\n"},{"op":"insert","value":"GLOBAL  FUNC    fclose\n"},{"op":"insert","value":"GLOBAL  FUNC    fdopen\n"},{"op":"insert","value":"GLOBAL  FUNC    fflush\n"},{"op":"insert","value":"GLOBAL  FUNC    fileno\n"},{"op":"insert","value":"GLOBAL  FUNC    fputs_unlocked\n"},{"op":"equal","value":"GLOBAL  FUNC    free\n"},{"op":"insert","value":"GLOBAL  FUNC    fscanf\n"},{"op":"insert","value":"GLOBAL  FUNC    fseeko\n"},{"op":"insert","value":"GLOBAL  FUNC    fwrite\n"},{"op":"insert","value":"GLOBAL  FUNC    getenv\n"},{"op":"insert","value":"GLOBAL  FUNC    iswprint\n"},{"op":"insert","value":"GLOBAL  FUNC    lseek\n"},{"op":"equal","value":"GLOBAL  FUNC    malloc\n"},{"op":"delete","value":"GLOBAL  FUNC    puts\n"},{"op":"delete","value":"GLOBAL  FUNC    strcat\n"},{"op":"insert","value":"GLOBAL  FUNC    mbrtowc\n"},{"op":"insert","value":"GLOBAL  FUNC    mbsinit\n"},{"op":"insert","value":"GLOBAL  FUNC    memcmp\n"},{"op":"insert","value":"GLOBAL  FUNC    memcpy\n"},{"op":"insert","value":"GLOBAL  FUNC    memset\n"},{"op":"insert","value":"GLOBAL  FUNC    nl_langinfo\n"},{"op":"insert","value":"GLOBAL  FUNC    open\n"},{"op":"insert","value":"GLOBAL  FUNC    realloc\n"},{"op":"insert","value":"GLOBAL  FUNC    setlocale\n"},{"op":"insert","value":"GLOBAL  FUNC    strcmp\n"},{"op":"equal","value":"GLOBAL  FUNC    strcpy\n"},{"op":"equal","value":"GLOBAL  FUNC    strlen\n"},{"op":"insert","value":"GLOBAL  FUNC    strncmp\n"},{"op":"insert","value":"GLOBAL  FUNC    strrchr\n"},{"op":"insert","value":"GLOBAL  FUNC    textdomain\n"},{"op":"insert","value":"GLOBAL  FUNC    ungetc\n"}]}]}
EOF
RUN


NAME=rz-diff fields comparison
FILE==
CMDS=!rz-diff -C -t fields bins/mach0/test-arm32 bins/mach0/test-arm64
EXPECT=<<EOF
--- bins/mach0/test-arm32
+++ bins/mach0/test-arm64
@@ --1,16 +-1,16 @@
  header
- load_command_0_LC_SEGMENT
+ load_command_0_LC_SEGMENT_64
  load_command_10_LC_SOURCE_VERSION
  load_command_11_LC_MAIN
- load_command_12_LC_ENCRYPTION_INFO
+ load_command_12_LC_ENCRYPTION_INFO_64
  load_command_13_LC_LOAD_DYLIB
  load_command_14_LC_FUNCTION_STARTS
  load_command_15_LC_DATA_IN_CODE
- load_command_1_LC_SEGMENT
- load_command_2_LC_SEGMENT
- load_command_3_LC_SEGMENT
+ load_command_1_LC_SEGMENT_64
+ load_command_2_LC_SEGMENT_64
+ load_command_3_LC_SEGMENT_64
  load_command_4_LC_DYLD_INFO_ONLY
  load_command_5_LC_SYMTAB
  load_command_6_LC_DYSYMTAB
@@ -21,3 +21,4 @@
  section_1
  section_2
  section_3
+ section_4

EOF
RUN

NAME=rz-diff fields comparison JSON
FILE==
CMDS=!rz-diff -C -jt fields bins/mach0/test-arm32 bins/mach0/test-arm64
EXPECT=<<EOF
{"from":"bins/mach0/test-arm32","to":"bins/mach0/test-arm64","diff":[{"from":[-1,16],"to":[-1,16],"ops":[{"op":"equal","value":" header\n"},{"op":"delete","value":" load_command_0_LC_SEGMENT\n"},{"op":"insert","value":" load_command_0_LC_SEGMENT_64\n"},{"op":"equal","value":" load_command_10_LC_SOURCE_VERSION\n"},{"op":"equal","value":" load_command_11_LC_MAIN\n"},{"op":"delete","value":" load_command_12_LC_ENCRYPTION_INFO\n"},{"op":"insert","value":" load_command_12_LC_ENCRYPTION_INFO_64\n"},{"op":"equal","value":" load_command_13_LC_LOAD_DYLIB\n"},{"op":"equal","value":" load_command_14_LC_FUNCTION_STARTS\n"},{"op":"equal","value":" load_command_15_LC_DATA_IN_CODE\n"},{"op":"delete","value":" load_command_1_LC_SEGMENT\n"},{"op":"delete","value":" load_command_2_LC_SEGMENT\n"},{"op":"delete","value":" load_command_3_LC_SEGMENT\n"},{"op":"insert","value":" load_command_1_LC_SEGMENT_64\n"},{"op":"insert","value":" load_command_2_LC_SEGMENT_64\n"},{"op":"insert","value":" load_command_3_LC_SEGMENT_64\n"},{"op":"equal","value":" load_command_4_LC_DYLD_INFO_ONLY\n"},{"op":"equal","value":" load_command_5_LC_SYMTAB\n"},{"op":"equal","value":" load_command_6_LC_DYSYMTAB\n"}]},{"from":[21,3],"to":[21,4],"ops":[{"op":"equal","value":" section_1\n"},{"op":"equal","value":" section_2\n"},{"op":"equal","value":" section_3\n"},{"op":"insert","value":" section_4\n"}]}]}
EOF
RUN

NAME=rz-diff fields comparison with addresses
FILE==
CMDS=!rz-diff -C -At fields bins/mach0/test-arm32 bins/mach0/test-arm64
EXPECT=<<EOF
--- bins/mach0/test-arm32
+++ bins/mach0/test-arm64
@@ --1,25 +-1,26 @@
 virt: 0x0000000000000000 phys: 0x0000000000000000          header
-virt: 0x000000000000001c phys: 0x000000000000001c          load_command_0_LC_SEGMENT
-virt: 0x0000000000000370 phys: 0x0000000000000370          load_command_10_LC_SOURCE_VERSION
-virt: 0x0000000000000380 phys: 0x0000000000000380          load_command_11_LC_MAIN
-virt: 0x0000000000000398 phys: 0x0000000000000398          load_command_12_LC_ENCRYPTION_INFO
-virt: 0x00000000000003ac phys: 0x00000000000003ac          load_command_13_LC_LOAD_DYLIB
-virt: 0x00000000000003e0 phys: 0x00000000000003e0          load_command_14_LC_FUNCTION_STARTS
-virt: 0x00000000000003f0 phys: 0x00000000000003f0          load_command_15_LC_DATA_IN_CODE
-virt: 0x0000000000000054 phys: 0x0000000000000054          load_command_1_LC_SEGMENT
-virt: 0x000000000000019c phys: 0x000000000000019c          load_command_2_LC_SEGMENT
-virt: 0x000000000000025c phys: 0x000000000000025c          load_command_3_LC_SEGMENT
-virt: 0x0000000000000294 phys: 0x0000000000000294          load_command_4_LC_DYLD_INFO_ONLY
-virt: 0x00000000000002c4 phys: 0x00000000000002c4          load_command_5_LC_SYMTAB
-virt: 0x00000000000002dc phys: 0x00000000000002dc          load_command_6_LC_DYSYMTAB
-virt: 0x000000000000032c phys: 0x000000000000032c          load_command_7_LC_LOAD_DYLINKER
-virt: 0x0000000000000348 phys: 0x0000000000000348          load_command_8_LC_UUID
-virt: 0x0000000000000360 phys: 0x0000000000000360          load_command_9_LC_VERSION_MIN_IPHONEOS
-virt: 0x00000000000001d4 phys: 0x00000000000001d4          section_0
-virt: 0x000000000000008c phys: 0x000000000000008c          section_0
-virt: 0x0000000000000218 phys: 0x0000000000000218          section_1
-virt: 0x00000000000000d0 phys: 0x00000000000000d0          section_1
-virt: 0x0000000000000114 phys: 0x0000000000000114          section_2
-virt: 0x0000000000000158 phys: 0x0000000000000158          section_3
+virt: 0x0000000000000020 phys: 0x0000000000000020          load_command_0_LC_SEGMENT_64
+virt: 0x0000000000000450 phys: 0x0000000000000450          load_command_10_LC_SOURCE_VERSION
+virt: 0x0000000000000460 phys: 0x0000000000000460          load_command_11_LC_MAIN
+virt: 0x0000000000000478 phys: 0x0000000000000478          load_command_12_LC_ENCRYPTION_INFO_64
+virt: 0x0000000000000490 phys: 0x0000000000000490          load_command_13_LC_LOAD_DYLIB
+virt: 0x00000000000004c8 phys: 0x00000000000004c8          load_command_14_LC_FUNCTION_STARTS
+virt: 0x00000000000004d8 phys: 0x00000000000004d8          load_command_15_LC_DATA_IN_CODE
+virt: 0x0000000000000068 phys: 0x0000000000000068          load_command_1_LC_SEGMENT_64
+virt: 0x0000000000000240 phys: 0x0000000000000240          load_command_2_LC_SEGMENT_64
+virt: 0x0000000000000328 phys: 0x0000000000000328          load_command_3_LC_SEGMENT_64
+virt: 0x0000000000000370 phys: 0x0000000000000370          load_command_4_LC_DYLD_INFO_ONLY
+virt: 0x00000000000003a0 phys: 0x00000000000003a0          load_command_5_LC_SYMTAB
+virt: 0x00000000000003b8 phys: 0x00000000000003b8          load_command_6_LC_DYSYMTAB
+virt: 0x0000000000000408 phys: 0x0000000000000408          load_command_7_LC_LOAD_DYLINKER
+virt: 0x0000000000000428 phys: 0x0000000000000428          load_command_8_LC_UUID
+virt: 0x0000000000000440 phys: 0x0000000000000440          load_command_9_LC_VERSION_MIN_IPHONEOS
+virt: 0x0000000000000288 phys: 0x0000000000000288          section_0
+virt: 0x00000000000000b0 phys: 0x00000000000000b0          section_0
+virt: 0x00000000000002d8 phys: 0x00000000000002d8          section_1
+virt: 0x0000000000000100 phys: 0x0000000000000100          section_1
+virt: 0x0000000000000150 phys: 0x0000000000000150          section_2
+virt: 0x00000000000001a0 phys: 0x00000000000001a0          section_3
+virt: 0x00000000000001f0 phys: 0x00000000000001f0          section_4

EOF
RUN

NAME=rz-diff fields comparison with addresses JSON
FILE==
CMDS=!rz-diff -C -Ajt fields bins/mach0/test-arm32 bins/mach0/test-arm64
EXPECT=<<EOF
{"from":"bins/mach0/test-arm32","to":"bins/mach0/test-arm64","diff":[{"from":[-1,25],"to":[-1,26],"ops":[{"op":"equal","value":"virt: 0x0000000000000000 phys: 0x0000000000000000          header\n"},{"op":"delete","value":"virt: 0x000000000000001c phys: 0x000000000000001c          load_command_0_LC_SEGMENT\n"},{"op":"delete","value":"virt: 0x0000000000000370 phys: 0x0000000000000370          load_command_10_LC_SOURCE_VERSION\n"},{"op":"delete","value":"virt: 0x0000000000000380 phys: 0x0000000000000380          load_command_11_LC_MAIN\n"},{"op":"delete","value":"virt: 0x0000000000000398 phys: 0x0000000000000398          load_command_12_LC_ENCRYPTION_INFO\n"},{"op":"delete","value":"virt: 0x00000000000003ac phys: 0x00000000000003ac          load_command_13_LC_LOAD_DYLIB\n"},{"op":"delete","value":"virt: 0x00000000000003e0 phys: 0x00000000000003e0          load_command_14_LC_FUNCTION_STARTS\n"},{"op":"delete","value":"virt: 0x00000000000003f0 phys: 0x00000000000003f0          load_command_15_LC_DATA_IN_CODE\n"},{"op":"delete","value":"virt: 0x0000000000000054 phys: 0x0000000000000054          load_command_1_LC_SEGMENT\n"},{"op":"delete","value":"virt: 0x000000000000019c phys: 0x000000000000019c          load_command_2_LC_SEGMENT\n"},{"op":"delete","value":"virt: 0x000000000000025c phys: 0x000000000000025c          load_command_3_LC_SEGMENT\n"},{"op":"delete","value":"virt: 0x0000000000000294 phys: 0x0000000000000294          load_command_4_LC_DYLD_INFO_ONLY\n"},{"op":"delete","value":"virt: 0x00000000000002c4 phys: 0x00000000000002c4          load_command_5_LC_SYMTAB\n"},{"op":"delete","value":"virt: 0x00000000000002dc phys: 0x00000000000002dc          load_command_6_LC_DYSYMTAB\n"},{"op":"delete","value":"virt: 0x000000000000032c phys: 0x000000000000032c          load_command_7_LC_LOAD_DYLINKER\n"},{"op":"delete","value":"virt: 0x0000000000000348 phys: 0x0000000000000348          load_command_8_LC_UUID\n"},{"op":"delete","value":"virt: 0x0000000000000360 phys: 0x0000000000000360          load_command_9_LC_VERSION_MIN_IPHONEOS\n"},{"op":"delete","value":"virt: 0x00000000000001d4 phys: 0x00000000000001d4          section_0\n"},{"op":"delete","value":"virt: 0x000000000000008c phys: 0x000000000000008c          section_0\n"},{"op":"delete","value":"virt: 0x0000000000000218 phys: 0x0000000000000218          section_1\n"},{"op":"delete","value":"virt: 0x00000000000000d0 phys: 0x00000000000000d0          section_1\n"},{"op":"delete","value":"virt: 0x0000000000000114 phys: 0x0000000000000114          section_2\n"},{"op":"delete","value":"virt: 0x0000000000000158 phys: 0x0000000000000158          section_3\n"},{"op":"insert","value":"virt: 0x0000000000000020 phys: 0x0000000000000020          load_command_0_LC_SEGMENT_64\n"},{"op":"insert","value":"virt: 0x0000000000000450 phys: 0x0000000000000450          load_command_10_LC_SOURCE_VERSION\n"},{"op":"insert","value":"virt: 0x0000000000000460 phys: 0x0000000000000460          load_command_11_LC_MAIN\n"},{"op":"insert","value":"virt: 0x0000000000000478 phys: 0x0000000000000478          load_command_12_LC_ENCRYPTION_INFO_64\n"},{"op":"insert","value":"virt: 0x0000000000000490 phys: 0x0000000000000490          load_command_13_LC_LOAD_DYLIB\n"},{"op":"insert","value":"virt: 0x00000000000004c8 phys: 0x00000000000004c8          load_command_14_LC_FUNCTION_STARTS\n"},{"op":"insert","value":"virt: 0x00000000000004d8 phys: 0x00000000000004d8          load_command_15_LC_DATA_IN_CODE\n"},{"op":"insert","value":"virt: 0x0000000000000068 phys: 0x0000000000000068          load_command_1_LC_SEGMENT_64\n"},{"op":"insert","value":"virt: 0x0000000000000240 phys: 0x0000000000000240          load_command_2_LC_SEGMENT_64\n"},{"op":"insert","value":"virt: 0x0000000000000328 phys: 0x0000000000000328          load_command_3_LC_SEGMENT_64\n"},{"op":"insert","value":"virt: 0x0000000000000370 phys: 0x0000000000000370          load_command_4_LC_DYLD_INFO_ONLY\n"},{"op":"insert","value":"virt: 0x00000000000003a0 phys: 0x00000000000003a0          load_command_5_LC_SYMTAB\n"},{"op":"insert","value":"virt: 0x00000000000003b8 phys: 0x00000000000003b8          load_command_6_LC_DYSYMTAB\n"},{"op":"insert","value":"virt: 0x0000000000000408 phys: 0x0000000000000408          load_command_7_LC_LOAD_DYLINKER\n"},{"op":"insert","value":"virt: 0x0000000000000428 phys: 0x0000000000000428          load_command_8_LC_UUID\n"},{"op":"insert","value":"virt: 0x0000000000000440 phys: 0x0000000000000440          load_command_9_LC_VERSION_MIN_IPHONEOS\n"},{"op":"insert","value":"virt: 0x0000000000000288 phys: 0x0000000000000288          section_0\n"},{"op":"insert","value":"virt: 0x00000000000000b0 phys: 0x00000000000000b0          section_0\n"},{"op":"insert","value":"virt: 0x00000000000002d8 phys: 0x00000000000002d8          section_1\n"},{"op":"insert","value":"virt: 0x0000000000000100 phys: 0x0000000000000100          section_1\n"},{"op":"insert","value":"virt: 0x0000000000000150 phys: 0x0000000000000150          section_2\n"},{"op":"insert","value":"virt: 0x00000000000001a0 phys: 0x00000000000001a0          section_3\n"},{"op":"insert","value":"virt: 0x00000000000001f0 phys: 0x00000000000001f0          section_4\n"}]}]}
EOF
RUN


NAME=rz-diff libraries comparison
FILE==
CMDS=!rz-diff -C -t libraries bins/java/Main.java.11.class bins/java/Hello.class
EXPECT=<<EOF
--- bins/java/Main.java.11.class
+++ bins/java/Hello.class
@@ -1,12 +1,5 @@
-Main
-[Ljava/lang/String;
-java/io/BufferedReader
-java/io/FileReader
+Hello
 java/io/PrintStream
-java/lang/Exception
 java/lang/Object
-java/lang/String
+java/lang/StringBuilder
 java/lang/System
-java/lang/invoke/MethodHandles
-java/lang/invoke/MethodHandles$Lookup
-java/lang/invoke/StringConcatFactory

EOF
RUN

NAME=rz-diff libraries comparison JSON
FILE==
CMDS=!rz-diff -C -jt libraries bins/java/Main.java.11.class bins/java/Hello.class
EXPECT=<<EOF
{"from":"bins/java/Main.java.11.class","to":"bins/java/Hello.class","diff":[{"from":[1,12],"to":[1,5],"ops":[{"op":"delete","value":"Main\n"},{"op":"delete","value":"[Ljava/lang/String;\n"},{"op":"delete","value":"java/io/BufferedReader\n"},{"op":"delete","value":"java/io/FileReader\n"},{"op":"insert","value":"Hello\n"},{"op":"equal","value":"java/io/PrintStream\n"},{"op":"delete","value":"java/lang/Exception\n"},{"op":"equal","value":"java/lang/Object\n"},{"op":"delete","value":"java/lang/String\n"},{"op":"insert","value":"java/lang/StringBuilder\n"},{"op":"equal","value":"java/lang/System\n"},{"op":"delete","value":"java/lang/invoke/MethodHandles\n"},{"op":"delete","value":"java/lang/invoke/MethodHandles$Lookup\n"},{"op":"delete","value":"java/lang/invoke/StringConcatFactory\n"}]}]}
EOF
RUN


NAME=rz-diff sections comparison
FILE==
CMDS=!rz-diff -C -t sections bins/java/Main.java.11.class bins/java/Hello.class
EXPECT=<<EOF
--- bins/java/Main.java.11.class
+++ bins/java/Hello.class
@@ -0,8 +0,12 @@
 align: 0x00000000 -r-- class.attr
 align: 0x00000000 -r-- class.constant_pool
+align: 0x00000000 -r-- class.fields
+align: 0x00000000 -r-- class.fields.who.attr
 align: 0x00000000 -r-- class.methods
 align: 0x00000000 -r-- class.methods.<init>.attr
 align: 0x00000000 -r-x class.methods.<init>.attr.0.code
 align: 0x00000000 -r-- class.methods.main.attr
 align: 0x00000000 -r-x class.methods.main.attr.0.code
+align: 0x00000000 -r-- class.methods.say.attr
+align: 0x00000000 -r-x class.methods.say.attr.0.code

EOF
RUN

NAME=rz-diff sections comparison JSON
FILE==
CMDS=!rz-diff -C -jt sections bins/java/Main.java.11.class bins/java/Hello.class
EXPECT=<<EOF
{"from":"bins/java/Main.java.11.class","to":"bins/java/Hello.class","diff":[{"from":[0,8],"to":[0,12],"ops":[{"op":"equal","value":"align: 0x00000000 -r-- class.attr\n"},{"op":"equal","value":"align: 0x00000000 -r-- class.constant_pool\n"},{"op":"insert","value":"align: 0x00000000 -r-- class.fields\n"},{"op":"insert","value":"align: 0x00000000 -r-- class.fields.who.attr\n"},{"op":"equal","value":"align: 0x00000000 -r-- class.methods\n"},{"op":"equal","value":"align: 0x00000000 -r-- class.methods.<init>.attr\n"},{"op":"equal","value":"align: 0x00000000 -r-x class.methods.<init>.attr.0.code\n"},{"op":"equal","value":"align: 0x00000000 -r-- class.methods.main.attr\n"},{"op":"equal","value":"align: 0x00000000 -r-x class.methods.main.attr.0.code\n"},{"op":"insert","value":"align: 0x00000000 -r-- class.methods.say.attr\n"},{"op":"insert","value":"align: 0x00000000 -r-x class.methods.say.attr.0.code\n"}]}]}
EOF
RUN

NAME=rz-diff sections comparison with addresses
FILE==
CMDS=!rz-diff -C -At sections bins/java/Main.java.11.class bins/java/Hello.class
EXPECT=<<EOF
--- bins/java/Main.java.11.class
+++ bins/java/Hello.class
@@ -1,7 +1,11 @@
-virt: 0x000000000000058a:0x0026 phys: 0x000000000000058a:0x0026 align: 0x00000000 -r-- class.attr
-virt: 0x000000000000000a:0x0480 phys: 0x000000000000000a:0x0480 align: 0x00000000 -r-- class.constant_pool
-virt: 0x000000000000048e:0x00fc phys: 0x000000000000048e:0x00fc align: 0x00000000 -r-- class.methods
-virt: 0x000000000000048e:0x002b phys: 0x000000000000048e:0x002b align: 0x00000000 -r-- class.methods.<init>.attr
-virt: 0x00000000000004a4:0x001d phys: 0x00000000000004a4:0x001d align: 0x00000000 -r-x class.methods.<init>.attr.0.code
-virt: 0x00000000000004b9:0x00d1 phys: 0x00000000000004b9:0x00d1 align: 0x00000000 -r-- class.methods.main.attr
-virt: 0x00000000000004cf:0x00c1 phys: 0x00000000000004cf:0x00c1 align: 0x00000000 -r-x class.methods.main.attr.0.code
+virt: 0x00000000000002cd:0x0008 phys: 0x00000000000002cd:0x0008 align: 0x00000000 -r-- class.attr
+virt: 0x000000000000000a:0x01ff phys: 0x000000000000000a:0x01ff align: 0x00000000 -r-- class.constant_pool
+virt: 0x000000000000020b:0x000a phys: 0x000000000000020b:0x000a align: 0x00000000 -r-- class.fields
+virt: 0x000000000000020b:0x000a phys: 0x000000000000020b:0x000a align: 0x00000000 -r-- class.fields.who.attr
+virt: 0x0000000000000215:0x00b8 phys: 0x0000000000000215:0x00b8 align: 0x00000000 -r-- class.methods
+virt: 0x0000000000000215:0x0038 phys: 0x0000000000000215:0x0038 align: 0x00000000 -r-- class.methods.<init>.attr
+virt: 0x000000000000022b:0x002a phys: 0x000000000000022b:0x002a align: 0x00000000 -r-x class.methods.<init>.attr.0.code
+virt: 0x0000000000000294:0x0039 phys: 0x0000000000000294:0x0039 align: 0x00000000 -r-- class.methods.main.attr
+virt: 0x00000000000002aa:0x0029 phys: 0x00000000000002aa:0x0029 align: 0x00000000 -r-x class.methods.main.attr.0.code
+virt: 0x000000000000024d:0x0047 phys: 0x000000000000024d:0x0047 align: 0x00000000 -r-- class.methods.say.attr
+virt: 0x0000000000000263:0x0039 phys: 0x0000000000000263:0x0039 align: 0x00000000 -r-x class.methods.say.attr.0.code

EOF
RUN

NAME=rz-diff sections comparison with addresses JSON
FILE==
CMDS=!rz-diff -C -Ajt sections bins/java/Main.java.11.class bins/java/Hello.class
EXPECT=<<EOF
{"from":"bins/java/Main.java.11.class","to":"bins/java/Hello.class","diff":[{"from":[1,7],"to":[1,11],"ops":[{"op":"delete","value":"virt: 0x000000000000058a:0x0026 phys: 0x000000000000058a:0x0026 align: 0x00000000 -r-- class.attr\n"},{"op":"delete","value":"virt: 0x000000000000000a:0x0480 phys: 0x000000000000000a:0x0480 align: 0x00000000 -r-- class.constant_pool\n"},{"op":"delete","value":"virt: 0x000000000000048e:0x00fc phys: 0x000000000000048e:0x00fc align: 0x00000000 -r-- class.methods\n"},{"op":"delete","value":"virt: 0x000000000000048e:0x002b phys: 0x000000000000048e:0x002b align: 0x00000000 -r-- class.methods.<init>.attr\n"},{"op":"delete","value":"virt: 0x00000000000004a4:0x001d phys: 0x00000000000004a4:0x001d align: 0x00000000 -r-x class.methods.<init>.attr.0.code\n"},{"op":"delete","value":"virt: 0x00000000000004b9:0x00d1 phys: 0x00000000000004b9:0x00d1 align: 0x00000000 -r-- class.methods.main.attr\n"},{"op":"delete","value":"virt: 0x00000000000004cf:0x00c1 phys: 0x00000000000004cf:0x00c1 align: 0x00000000 -r-x class.methods.main.attr.0.code\n"},{"op":"insert","value":"virt: 0x00000000000002cd:0x0008 phys: 0x00000000000002cd:0x0008 align: 0x00000000 -r-- class.attr\n"},{"op":"insert","value":"virt: 0x000000000000000a:0x01ff phys: 0x000000000000000a:0x01ff align: 0x00000000 -r-- class.constant_pool\n"},{"op":"insert","value":"virt: 0x000000000000020b:0x000a phys: 0x000000000000020b:0x000a align: 0x00000000 -r-- class.fields\n"},{"op":"insert","value":"virt: 0x000000000000020b:0x000a phys: 0x000000000000020b:0x000a align: 0x00000000 -r-- class.fields.who.attr\n"},{"op":"insert","value":"virt: 0x0000000000000215:0x00b8 phys: 0x0000000000000215:0x00b8 align: 0x00000000 -r-- class.methods\n"},{"op":"insert","value":"virt: 0x0000000000000215:0x0038 phys: 0x0000000000000215:0x0038 align: 0x00000000 -r-- class.methods.<init>.attr\n"},{"op":"insert","value":"virt: 0x000000000000022b:0x002a phys: 0x000000000000022b:0x002a align: 0x00000000 -r-x class.methods.<init>.attr.0.code\n"},{"op":"insert","value":"virt: 0x0000000000000294:0x0039 phys: 0x0000000000000294:0x0039 align: 0x00000000 -r-- class.methods.main.attr\n"},{"op":"insert","value":"virt: 0x00000000000002aa:0x0029 phys: 0x00000000000002aa:0x0029 align: 0x00000000 -r-x class.methods.main.attr.0.code\n"},{"op":"insert","value":"virt: 0x000000000000024d:0x0047 phys: 0x000000000000024d:0x0047 align: 0x00000000 -r-- class.methods.say.attr\n"},{"op":"insert","value":"virt: 0x0000000000000263:0x0039 phys: 0x0000000000000263:0x0039 align: 0x00000000 -r-x class.methods.say.attr.0.code\n"}]}]}
EOF
RUN


NAME=rz-diff symbols comparison
FILE==
CMDS=!rz-diff -C -t symbols bins/java/Main.java.11.class bins/java/Main.java.1.7.class
EXPECT=<<EOF
--- bins/java/Main.java.11.class
+++ bins/java/Main.java.1.7.class
@@ -2,6 +2,9 @@
 Main Main Main.<init>
 Main Main Main.main
 java.lang.Object Object Object.<init>
+java.lang.StringBuilder StringBuilder StringBuilder.<init>
+java.lang.StringBuilder StringBuilder StringBuilder.append
+java.lang.StringBuilder StringBuilder StringBuilder.toString
 java.lang.System System System.err
 java.lang.System System System.out
 java.io.BufferedReader java.io.BufferedReader java.io.BufferedReader.<init>
@@ -10,4 +13,3 @@
 java.io.FileReader java.io.FileReader java.io.FileReader.<init>
 java.io.PrintStream java.io.PrintStream java.io.PrintStream.format
 java.io.PrintStream java.io.PrintStream java.io.PrintStream.println
-java.lang.invoke.StringConcatFactory java.lang.invoke.StringConcatFactory java.lang.invoke.StringConcatFactory.makeConcatWithConstants

EOF
RUN

NAME=rz-diff symbols comparison JSON
FILE==
CMDS=!rz-diff -C -jt symbols bins/java/Main.java.11.class bins/java/Main.java.1.7.class
EXPECT=<<EOF
{"from":"bins/java/Main.java.11.class","to":"bins/java/Main.java.1.7.class","diff":[{"from":[2,6],"to":[2,9],"ops":[{"op":"equal","value":"Main Main Main.<init>\n"},{"op":"equal","value":"Main Main Main.main\n"},{"op":"equal","value":"java.lang.Object Object Object.<init>\n"},{"op":"insert","value":"java.lang.StringBuilder StringBuilder StringBuilder.<init>\n"},{"op":"insert","value":"java.lang.StringBuilder StringBuilder StringBuilder.append\n"},{"op":"insert","value":"java.lang.StringBuilder StringBuilder StringBuilder.toString\n"},{"op":"equal","value":"java.lang.System System System.err\n"},{"op":"equal","value":"java.lang.System System System.out\n"},{"op":"equal","value":"java.io.BufferedReader java.io.BufferedReader java.io.BufferedReader.<init>\n"}]},{"from":[10,4],"to":[13,3],"ops":[{"op":"equal","value":"java.io.FileReader java.io.FileReader java.io.FileReader.<init>\n"},{"op":"equal","value":"java.io.PrintStream java.io.PrintStream java.io.PrintStream.format\n"},{"op":"equal","value":"java.io.PrintStream java.io.PrintStream java.io.PrintStream.println\n"},{"op":"delete","value":"java.lang.invoke.StringConcatFactory java.lang.invoke.StringConcatFactory java.lang.invoke.StringConcatFactory.makeConcatWithConstants\n"}]}]}
EOF
RUN

NAME=rz-diff symbols comparison with addresses
FILE==
CMDS=!rz-diff -C -At symbols bins/java/Main.java.11.class bins/java/Main.java.1.7.class
EXPECT=<<EOF
--- bins/java/Main.java.11.class
+++ bins/java/Main.java.1.7.class
@@ -1,13 +1,15 @@
-virt: 0x0000000000000271 phys: 0x0000000000000271 java.lang.Exception Exception Exception.printStackTrace
-virt: 0x00000000000004a4 phys: 0x00000000000004a4 Main Main Main.<init>
-virt: 0x00000000000004cf phys: 0x00000000000004cf Main Main Main.main
+virt: 0x00000000000002aa phys: 0x00000000000002aa java.lang.Exception Exception Exception.printStackTrace
+virt: 0x0000000000000383 phys: 0x0000000000000383 Main Main Main.<init>
+virt: 0x00000000000003ae phys: 0x00000000000003ae Main Main Main.main
 virt: 0x000000000000000a phys: 0x000000000000000a java.lang.Object Object Object.<init>
-virt: 0x00000000000001e2 phys: 0x00000000000001e2 java.lang.System System System.err
+virt: 0x0000000000000187 phys: 0x0000000000000187 java.lang.StringBuilder StringBuilder StringBuilder.<init>
+virt: 0x0000000000000198 phys: 0x0000000000000198 java.lang.StringBuilder StringBuilder StringBuilder.append
+virt: 0x00000000000001db phys: 0x00000000000001db java.lang.StringBuilder StringBuilder StringBuilder.toString
+virt: 0x000000000000021b phys: 0x000000000000021b java.lang.System System System.err
 virt: 0x0000000000000039 phys: 0x0000000000000039 java.lang.System System System.out
 virt: 0x000000000000011e phys: 0x000000000000011e java.io.BufferedReader java.io.BufferedReader java.io.BufferedReader.<init>
-virt: 0x00000000000001b7 phys: 0x00000000000001b7 java.io.BufferedReader java.io.BufferedReader java.io.BufferedReader.close
+virt: 0x00000000000001f0 phys: 0x00000000000001f0 java.io.BufferedReader java.io.BufferedReader java.io.BufferedReader.close
 virt: 0x000000000000013e phys: 0x000000000000013e java.io.BufferedReader java.io.BufferedReader java.io.BufferedReader.readLine
 virt: 0x0000000000000114 phys: 0x0000000000000114 java.io.FileReader java.io.FileReader java.io.FileReader.<init>
-virt: 0x000000000000021f phys: 0x000000000000021f java.io.PrintStream java.io.PrintStream java.io.PrintStream.format
+virt: 0x0000000000000258 phys: 0x0000000000000258 java.io.PrintStream java.io.PrintStream java.io.PrintStream.format
 virt: 0x0000000000000088 phys: 0x0000000000000088 java.io.PrintStream java.io.PrintStream java.io.PrintStream.println
-virt: 0x000000000000033f phys: 0x000000000000033f java.lang.invoke.StringConcatFactory java.lang.invoke.StringConcatFactory java.lang.invoke.StringConcatFactory.makeConcatWithConstants

EOF
RUN

NAME=rz-diff symbols comparison with addresses JSON
FILE==
CMDS=!rz-diff -C -Ajt symbols bins/java/Main.java.11.class bins/java/Main.java.1.7.class
EXPECT=<<EOF
{"from":"bins/java/Main.java.11.class","to":"bins/java/Main.java.1.7.class","diff":[{"from":[1,13],"to":[1,15],"ops":[{"op":"delete","value":"virt: 0x0000000000000271 phys: 0x0000000000000271 java.lang.Exception Exception Exception.printStackTrace\n"},{"op":"delete","value":"virt: 0x00000000000004a4 phys: 0x00000000000004a4 Main Main Main.<init>\n"},{"op":"delete","value":"virt: 0x00000000000004cf phys: 0x00000000000004cf Main Main Main.main\n"},{"op":"insert","value":"virt: 0x00000000000002aa phys: 0x00000000000002aa java.lang.Exception Exception Exception.printStackTrace\n"},{"op":"insert","value":"virt: 0x0000000000000383 phys: 0x0000000000000383 Main Main Main.<init>\n"},{"op":"insert","value":"virt: 0x00000000000003ae phys: 0x00000000000003ae Main Main Main.main\n"},{"op":"equal","value":"virt: 0x000000000000000a phys: 0x000000000000000a java.lang.Object Object Object.<init>\n"},{"op":"delete","value":"virt: 0x00000000000001e2 phys: 0x00000000000001e2 java.lang.System System System.err\n"},{"op":"insert","value":"virt: 0x0000000000000187 phys: 0x0000000000000187 java.lang.StringBuilder StringBuilder StringBuilder.<init>\n"},{"op":"insert","value":"virt: 0x0000000000000198 phys: 0x0000000000000198 java.lang.StringBuilder StringBuilder StringBuilder.append\n"},{"op":"insert","value":"virt: 0x00000000000001db phys: 0x00000000000001db java.lang.StringBuilder StringBuilder StringBuilder.toString\n"},{"op":"insert","value":"virt: 0x000000000000021b phys: 0x000000000000021b java.lang.System System System.err\n"},{"op":"equal","value":"virt: 0x0000000000000039 phys: 0x0000000000000039 java.lang.System System System.out\n"},{"op":"equal","value":"virt: 0x000000000000011e phys: 0x000000000000011e java.io.BufferedReader java.io.BufferedReader java.io.BufferedReader.<init>\n"},{"op":"delete","value":"virt: 0x00000000000001b7 phys: 0x00000000000001b7 java.io.BufferedReader java.io.BufferedReader java.io.BufferedReader.close\n"},{"op":"insert","value":"virt: 0x00000000000001f0 phys: 0x00000000000001f0 java.io.BufferedReader java.io.BufferedReader java.io.BufferedReader.close\n"},{"op":"equal","value":"virt: 0x000000000000013e phys: 0x000000000000013e java.io.BufferedReader java.io.BufferedReader java.io.BufferedReader.readLine\n"},{"op":"equal","value":"virt: 0x0000000000000114 phys: 0x0000000000000114 java.io.FileReader java.io.FileReader java.io.FileReader.<init>\n"},{"op":"delete","value":"virt: 0x000000000000021f phys: 0x000000000000021f java.io.PrintStream java.io.PrintStream java.io.PrintStream.format\n"},{"op":"insert","value":"virt: 0x0000000000000258 phys: 0x0000000000000258 java.io.PrintStream java.io.PrintStream java.io.PrintStream.format\n"},{"op":"equal","value":"virt: 0x0000000000000088 phys: 0x0000000000000088 java.io.PrintStream java.io.PrintStream java.io.PrintStream.println\n"},{"op":"delete","value":"virt: 0x000000000000033f phys: 0x000000000000033f java.lang.invoke.StringConcatFactory java.lang.invoke.StringConcatFactory java.lang.invoke.StringConcatFactory.makeConcatWithConstants\n"}]}]}
EOF
RUN


NAME=rz-diff command with zero argument
FILE==
CMDS=!rz-diff -C -t command bins/java/Main.java.11.class bins/java/Hello.class
EXPECT_ERR=<<EOF
ERROR: rz-diff: error, option -t 'command' requires -0 <command>.
EOF
RUN

NAME=rz-diff command with one argument
FILE==
CMDS=!rz-diff -C -0 javac -t command bins/java/Main.java.11.class bins/java/Main.java.15.class
EXPECT=<<EOF
--- bins/java/Main.java.11.class
+++ bins/java/Main.java.15.class
@@ -1,4 +1,4 @@
-Version: (55.0) Java SE 11
+Version: (59.0) Java SE 15
 Flags: (0x0021) public super
 Class: (#57) LMain;
 Super: (#2) Ljava/lang/Object;

EOF
RUN

NAME=rz-diff command with one argument JSON
FILE==
CMDS=!rz-diff -C -j -0 javac -t command bins/java/Main.java.11.class bins/java/Main.java.15.class
EXPECT=<<EOF
{"from":"bins/java/Main.java.11.class","to":"bins/java/Main.java.15.class","diff":[{"from":[1,4],"to":[1,4],"ops":[{"op":"delete","value":"Version: (55.0) Java SE 11\n"},{"op":"insert","value":"Version: (59.0) Java SE 15\n"},{"op":"equal","value":"Flags: (0x0021) public super\n"},{"op":"equal","value":"Class: (#57) LMain;\n"},{"op":"equal","value":"Super: (#2) Ljava/lang/Object;\n"}]}]}
EOF
RUN

NAME=rz-diff command with two arguments
FILE==
CMDS=!rz-diff -C -0 "pi 20 @ main" -1 "pi 20 @ sym.main"  -t command bins/elf/hello_world bins/elf/hello_world32
EXPECT=<<EOF
--- bins/elf/hello_world
+++ bins/elf/hello_world32
@@ -1,20 +1,20 @@
-push rbp
-mov rbp, rsp
-sub rsp, 0x20
-lea rax, str.Hello
-mov qword [rbp - 0x18], rax
-lea rax, str.r2_folks
-mov qword [rbp - 0x10], rax
-mov rax, qword [rbp - 0x18]
-mov rdi, rax
+lea ecx, [esp + 4]
+and esp, 0xfffffff0
+push dword [ecx - 4]
+push ebp
+mov ebp, esp
+push ebx
+push ecx
+sub esp, 0x20
+call sym.__x86.get_pc_thunk.bx
+add ebx, 0x19a0
+lea eax, [ebx - 0x1874]
+mov dword [ebp - 0x1c], eax
+lea eax, [ebx - 0x186e]
+mov dword [ebp - 0x18], eax
+sub esp, 0xc
+push dword [ebp - 0x1c]
 call sym.imp.strlen
-mov dword [rbp - 0x20], eax
-mov rax, qword [rbp - 0x10]
-mov rdi, rax
-call sym.imp.strlen
-mov dword [rbp - 0x1c], eax
-mov edx, dword [rbp - 0x20]
-mov eax, dword [rbp - 0x1c]
-add eax, edx
-add eax, 1
-cdqe
+add esp, 0x10
+mov dword [ebp - 0x14], eax
+sub esp, 0xc

EOF
RUN

NAME=rz-diff command with two arguments JSON
FILE==
CMDS=!rz-diff -C -j -0 "pi 20 @ main" -1 "pi 20 @ sym.main"  -t command bins/elf/hello_world bins/elf/hello_world32
EXPECT=<<EOF
{"from":"bins/elf/hello_world","to":"bins/elf/hello_world32","diff":[{"from":[1,20],"to":[1,20],"ops":[{"op":"delete","value":"push rbp\n"},{"op":"delete","value":"mov rbp, rsp\n"},{"op":"delete","value":"sub rsp, 0x20\n"},{"op":"delete","value":"lea rax, str.Hello\n"},{"op":"delete","value":"mov qword [rbp - 0x18], rax\n"},{"op":"delete","value":"lea rax, str.r2_folks\n"},{"op":"delete","value":"mov qword [rbp - 0x10], rax\n"},{"op":"delete","value":"mov rax, qword [rbp - 0x18]\n"},{"op":"delete","value":"mov rdi, rax\n"},{"op":"insert","value":"lea ecx, [esp + 4]\n"},{"op":"insert","value":"and esp, 0xfffffff0\n"},{"op":"insert","value":"push dword [ecx - 4]\n"},{"op":"insert","value":"push ebp\n"},{"op":"insert","value":"mov ebp, esp\n"},{"op":"insert","value":"push ebx\n"},{"op":"insert","value":"push ecx\n"},{"op":"insert","value":"sub esp, 0x20\n"},{"op":"insert","value":"call sym.__x86.get_pc_thunk.bx\n"},{"op":"insert","value":"add ebx, 0x19a0\n"},{"op":"insert","value":"lea eax, [ebx - 0x1874]\n"},{"op":"insert","value":"mov dword [ebp - 0x1c], eax\n"},{"op":"insert","value":"lea eax, [ebx - 0x186e]\n"},{"op":"insert","value":"mov dword [ebp - 0x18], eax\n"},{"op":"insert","value":"sub esp, 0xc\n"},{"op":"insert","value":"push dword [ebp - 0x1c]\n"},{"op":"equal","value":"call sym.imp.strlen\n"},{"op":"delete","value":"mov dword [rbp - 0x20], eax\n"},{"op":"delete","value":"mov rax, qword [rbp - 0x10]\n"},{"op":"delete","value":"mov rdi, rax\n"},{"op":"delete","value":"call sym.imp.strlen\n"},{"op":"delete","value":"mov dword [rbp - 0x1c], eax\n"},{"op":"delete","value":"mov edx, dword [rbp - 0x20]\n"},{"op":"delete","value":"mov eax, dword [rbp - 0x1c]\n"},{"op":"delete","value":"add eax, edx\n"},{"op":"delete","value":"add eax, 1\n"},{"op":"delete","value":"cdqe\n"},{"op":"insert","value":"add esp, 0x10\n"},{"op":"insert","value":"mov dword [ebp - 0x14], eax\n"},{"op":"insert","value":"sub esp, 0xc\n"}]}]}
EOF
RUN

NAME=rz-diff text lines comparison
FILE=--
CMDS=!rz-diff -Ct lines bins/other/rz-diff/incorrect_cmd_i.txt bins/other/rz-diff/correct_cmd_i.txt
EXPECT=<<EOF
--- bins/other/rz-diff/incorrect_cmd_i.txt
+++ bins/other/rz-diff/correct_cmd_i.txt
@@ -3,40 +3,39 @@
 vaddr      name
 ---------------
 0x00000000 
+0x00600910 .bss
 0x006006e0 .init_array
-ax006006e8 .fini_arrar
-0x006006f0 .jct
-ax006008c8 .got
+0x006006e8 .fini_array
+0x006006f0 .jcr
+0x006008c8 .got
 0x0040031e .gnu.version
 0x004005b4 .fini
-0x00600910 .bss
-000600900 .data
-004005c0 .rodata
+0x00600900 .data
+0x004005c0 .rodata
 0x00400348 .rela.dyn
-0x004003a8 .ini
-x00400260 .gnu.hash
-0x00400200 .interpj
-10x0040021c .note.ABI-tag
+0x004003a8 .init
+0x00400260 .gnu.hash
+0x00400200 .interp
+0x0040021c .note.ABI-tag
 0x00400328 .gnu.version_r
 0x00000000 .comment
 0x0040023c .note.gnu.build-id
 0x006008d0 .got.plt
-0abc4005d0 .eh_frame_hdr
-004002e0 .dynstr
-0d004003d0 .plt
+0x004005d0 .eh_frame_hdr
+0x004002e0 .dynstr
+0x004003d0 .plt
 0x00400360 .rela.plt
 0x00400280 .dynsym
 0x00000000 .debug_abbrev
 0x00000000 .debug_ranges
 0x00000000 .debug_str
-0x00600910 .bss
 0x00000000 .debug_aranges
 0x00400608 .eh_frame
-0x000000000 .debug_line
-0x00000000000 .shstrtab
-000000000 .debug_info
+0x00000000 .debug_line
+0x00000000 .shstrtab
+0x00000000 .debug_info
 0x00400410 .text
 0x006006f8 .dynamic
-0x00000 .strtab
-0x0000000 .symtab
+0x00000000 .strtab
+0x00000000 .symtab
 

EOF
RUN

NAME=rz-diff text lines comparison COLOR
FILE=--
CMDS=!rz-diff -t lines bins/other/rz-diff/incorrect_cmd_i.txt bins/other/rz-diff/correct_cmd_i.txt
EXPECT=<<EOF
--- bins/other/rz-diff/incorrect_cmd_i.txt
+++ bins/other/rz-diff/correct_cmd_i.txt
[94m@@ -3,40 +3,39 @@[0m
 vaddr      name[0m
 ---------------[0m
 0x00000000 [0m
[92m+0x00600910 .bss[0m
 0x006006e0 .init_array[0m
[91m-ax006006e8 .fini_arrar[0m
[91m-0x006006f0 .jc[48;5;52mt[49m[0m
[91m-[48;5;52ma[49mx006008c8 .got[0m
[92m+0x006006e8 .fini_array[0m
[92m+0x006006f0 .jc[48;5;22mr[49m[0m
[92m+[48;5;22m0[49mx006008c8 .got[0m
 0x0040031e .gnu.version[0m
 0x004005b4 .fini[0m
[91m-0x00600910 .bss[0m
[91m-000600900 .data[0m
[91m-004005c0 .rodata[0m
[92m+0x00600900 .data[0m
[92m+0x004005c0 .rodata[0m
 0x00400348 .rela.dyn[0m
[91m-0x004003a8 .ini[48;5;52m[49m[0m
[91m-[48;5;52m[49mx00400260 .gnu.hash[0m
[91m-0x00400200 .interp[48;5;52mj[49m[0m
[91m-[48;5;52m1[49m0x0040021c .note.ABI-tag[0m
[92m+0x004003a8 .ini[48;5;22mt[49m[0m
[92m+[48;5;22m0[49mx00400260 .gnu.hash[0m
[92m+0x00400200 .interp[48;5;22m[49m[0m
[92m+[48;5;22m[49m0x0040021c .note.ABI-tag[0m
 0x00400328 .gnu.version_r[0m
 0x00000000 .comment[0m
 0x0040023c .note.gnu.build-id[0m
 0x006008d0 .got.plt[0m
[91m-0[48;5;52mabc[49m4005d0 .eh_frame_hdr[0m
[91m-0[48;5;52m[49m04002e0 .dynstr[0m
[91m-0[48;5;52md[49m004003d0 .plt[0m
[92m+0[48;5;22mx00[49m4005d0 .eh_frame_hdr[0m
[92m+0[48;5;22mx0[49m04002e0 .dynstr[0m
[92m+0[48;5;22mx[49m004003d0 .plt[0m
 0x00400360 .rela.plt[0m
 0x00400280 .dynsym[0m
 0x00000000 .debug_abbrev[0m
 0x00000000 .debug_ranges[0m
 0x00000000 .debug_str[0m
[91m-0x00600910 .bss[0m
 0x00000000 .debug_aranges[0m
 0x00400608 .eh_frame[0m
[91m-0x00000000[48;5;52m0[49m .debug_line[0m
[91m-0x00000000[48;5;52m000[49m .shstrtab[0m
[91m-0[48;5;52m[49m00000000 .debug_info[0m
[92m+0x00000000[48;5;22m[49m .debug_line[0m
[92m+0x00000000[48;5;22m[49m .shstrtab[0m
[92m+0[48;5;22mx[49m00000000 .debug_info[0m
 0x00400410 .text[0m
 0x006006f8 .dynamic[0m
[91m-0x00000[48;5;52m[49m .strtab[0m
[91m-0x0000000[48;5;52m[49m .symtab[0m
[92m+0x00000[48;5;22m000[49m .strtab[0m
[92m+0x0000000[48;5;22m0[49m .symtab[0m
 [0m

EOF
RUN

NAME=rz-diff functions comparison
FILE==
CMDS=!rz-diff -e 'analysis.fcnprefix=test' -e 'analysis.limits=true' -e 'analysis.from=0x401460' -e 'analysis.to=0x4033d0' -C -t functions bins/other/rz-diff/true bins/other/rz-diff/false
EXPECT=<<EOF
.-------------------------------------------------------------------------------------------------.
| name0         | size0 | addr0      | type     | similarity | addr1      | size1 | name1         |
)-------------------------------------------------------------------------------------------------(
| test.00401460 | 41    | 0x00401460 | COMPLETE | 1.000000   | 0x00401470 | 41    | test.00401470 |
| test.00401990 | 137   | 0x00401990 | PARTIAL  | 0.985401   | 0x004019a0 | 137   | test.004019a0 |
| test.00401a20 | 162   | 0x00401a20 | COMPLETE | 1.000000   | 0x00401a30 | 162   | test.00401a30 |
| test.00401ae0 | 228   | 0x00401ae0 | PARTIAL  | 0.964912   | 0x00401af0 | 228   | test.00401af0 |
| test.00401be0 | 2728  | 0x00401be0 | PARTIAL  | 0.991569   | 0x00401bf0 | 2728  | test.00401bf0 |
| test.00402730 | 425   | 0x00402730 | PARTIAL  | 0.971765   | 0x00402740 | 425   | test.00402740 |
| test.004029a0 | 50    | 0x004029a0 | PARTIAL  | 0.980000   | 0x004029b0 | 50    | test.004029b0 |
| test.00402e20 | 204   | 0x00402e20 | PARTIAL  | 0.960784   | 0x00402e30 | 204   | test.00402e30 |
`-------------------------------------------------------------------------------------------------'
EOF
RUN

NAME=rz-diff functions comparison (colored)
FILE==
CMDS=!rz-diff -e 'analysis.fcnprefix=test' -e 'analysis.limits=true' -e 'analysis.from=0x401460' -e 'analysis.to=0x4033d0' -t functions bins/other/rz-diff/true bins/other/rz-diff/false
EXPECT=<<EOF
.-------------------------------------------------------------------------------------------------.
| name0         | size0 | addr0      | type     | similarity | addr1      | size1 | name1         |
)-------------------------------------------------------------------------------------------------(
| test.00401460 | 41    | 0x00401460 | [92mCOMPLETE[0m | [92m1.000000[0m   | 0x00401470 | 41    | test.00401470 |
| test.00401990 | 137   | 0x00401990 | [93mPARTIAL [0m | [93m0.985401[0m   | 0x004019a0 | 137   | test.004019a0 |
| test.00401a20 | 162   | 0x00401a20 | [92mCOMPLETE[0m | [92m1.000000[0m   | 0x00401a30 | 162   | test.00401a30 |
| test.00401ae0 | 228   | 0x00401ae0 | [93mPARTIAL [0m | [93m0.964912[0m   | 0x00401af0 | 228   | test.00401af0 |
| test.00401be0 | 2728  | 0x00401be0 | [93mPARTIAL [0m | [93m0.991569[0m   | 0x00401bf0 | 2728  | test.00401bf0 |
| test.00402730 | 425   | 0x00402730 | [93mPARTIAL [0m | [93m0.971765[0m   | 0x00402740 | 425   | test.00402740 |
| test.004029a0 | 50    | 0x004029a0 | [93mPARTIAL [0m | [93m0.980000[0m   | 0x004029b0 | 50    | test.004029b0 |
| test.00402e20 | 204   | 0x00402e20 | [93mPARTIAL [0m | [93m0.960784[0m   | 0x00402e30 | 204   | test.00402e30 |
`-------------------------------------------------------------------------------------------------'
EOF
RUN
