#!/bin/sh

test_description='shifted diff groups re-diffing during histogram diff'

. ./test-lib.sh

test_expect_success 'shifted/merged diff group should re-diff to minimize patch' '
	test_write_lines A x A A A x A A A >file1 &&
	test_write_lines A x A Z A x A A A >file2 &&

	file1_h=$(git rev-parse --short $(git hash-object file1)) &&
	file2_h=$(git rev-parse --short $(git hash-object file2)) &&

	cat >expect <<-EOF &&
	diff --git a/file1 b/file2
	index $file1_h..$file2_h 100644
	--- a/file1
	+++ b/file2
	@@ -1,7 +1,7 @@
	 A
	 x
	 A
	-A
	+Z
	 A
	 x
	 A
	EOF

	test_expect_code 1 git diff --no-index --histogram file1 file2 >output &&
	test_cmp expect output
'

test_expect_success 'merged diff group with no shift' '
	test_write_lines A Z B x >file1 &&
	test_write_lines C D x Z E x >file2 &&

	file1_h=$(git rev-parse --short $(git hash-object file1)) &&
	file2_h=$(git rev-parse --short $(git hash-object file2)) &&

	cat >expect <<-EOF &&
	diff --git a/file1 b/file2
	index $file1_h..$file2_h 100644
	--- a/file1
	+++ b/file2
	@@ -1,4 +1,6 @@
	-A
	+C
	+D
	+x
	 Z
	-B
	+E
	 x
	EOF

	test_expect_code 1 git diff --no-index --histogram file1 file2 >output &&
	test_cmp expect output
'

test_expect_success 're-diff should preserve diff flags' '
	test_write_lines a b c a b c >file1 &&
	test_write_lines x " b" z a b c >file2 &&

	file1_h=$(git rev-parse --short $(git hash-object file1)) &&
	file2_h=$(git rev-parse --short $(git hash-object file2)) &&

	cat >expect <<-EOF &&
	diff --git a/file1 b/file2
	index $file1_h..$file2_h 100644
	--- a/file1
	+++ b/file2
	@@ -1,6 +1,6 @@
	-a
	-b
	-c
	+x
	+ b
	+z
	 a
	 b
	 c
	EOF

	test_expect_code 1 git diff --no-index --histogram file1 file2 >output &&
	test_cmp expect output &&

	cat >expect_iwhite <<-EOF &&
	diff --git a/file1 b/file2
	index $file1_h..$file2_h 100644
	--- a/file1
	+++ b/file2
	@@ -1,6 +1,6 @@
	-a
	+x
	  b
	-c
	+z
	 a
	 b
	 c
	EOF

	test_expect_code 1 git diff --no-index --histogram --ignore-all-space file1 file2 >output_iwhite &&
	test_cmp expect_iwhite output_iwhite
'

test_expect_success 'shifting on either side should trigger re-diff properly' '
	test_write_lines a b c a b c a b c >file1 &&
	test_write_lines a b c a1 a2 a3 b c1 a b c >file2 &&

	file1_h=$(git rev-parse --short $(git hash-object file1)) &&
	file2_h=$(git rev-parse --short $(git hash-object file2)) &&

	cat >expect1 <<-EOF &&
	diff --git a/file1 b/file2
	index $file1_h..$file2_h 100644
	--- a/file1
	+++ b/file2
	@@ -1,9 +1,11 @@
	 a
	 b
	 c
	-a
	+a1
	+a2
	+a3
	 b
	-c
	+c1
	 a
	 b
	 c
	EOF

	test_expect_code 1 git diff --no-index --histogram file1 file2 >output1 &&
	test_cmp expect1 output1 &&

	cat >expect2 <<-EOF &&
	diff --git a/file2 b/file1
	index $file2_h..$file1_h 100644
	--- a/file2
	+++ b/file1
	@@ -1,11 +1,9 @@
	 a
	 b
	 c
	-a1
	-a2
	-a3
	+a
	 b
	-c1
	+c
	 a
	 b
	 c
	EOF

	test_expect_code 1 git diff --no-index --histogram file2 file1 >output2 &&
	test_cmp expect2 output2
'

test_done
