#!/bin/sh

test_description='common tail optimization'

TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh

z=zzzzzzzz ;# 8
z="$z$z$z$z$z$z$z$z" ;# 64
z="$z$z$z$z$z$z$z$z" ;# 512
z="$z$z$z$z" ;# 2048
z2047=$(expr "$z" : '.\(.*\)') ; #2047

x=zzzzzzzzzz			;# 10
y="$x$x$x$x$x$x$x$x$x$x"	;# 100
z="$y$y$y$y$y$y$y$y$y$y"	;# 1000
z1000=$z
z100=$y
z10=$x

zs() {
	count="$1"
	while test "$count" -ge 1000
	do
		count=$(($count - 1000))
		printf "%s" $z1000
	done
	while test "$count" -ge 100
	do
		count=$(($count - 100))
		printf "%s" $z100
	done
	while test "$count" -ge 10
	do
		count=$(($count - 10))
		printf "%s" $z10
	done
	while test "$count" -ge 1
	do
		count=$(($count - 1))
		printf "z"
	done
}

zc () {
	sed -e "/^index/d" \
		-e "s/$z1000/Q/g" \
		-e "s/QQQQQQQQQ/Z9000/g" \
		-e "s/QQQQQQQQ/Z8000/g" \
		-e "s/QQQQQQQ/Z7000/g" \
		-e "s/QQQQQQ/Z6000/g" \
		-e "s/QQQQQ/Z5000/g" \
		-e "s/QQQQ/Z4000/g" \
		-e "s/QQQ/Z3000/g" \
		-e "s/QQ/Z2000/g" \
		-e "s/Q/Z1000/g" \
		-e "s/$z100/Q/g" \
		-e "s/QQQQQQQQQ/Z900/g" \
		-e "s/QQQQQQQQ/Z800/g" \
		-e "s/QQQQQQQ/Z700/g" \
		-e "s/QQQQQQ/Z600/g" \
		-e "s/QQQQQ/Z500/g" \
		-e "s/QQQQ/Z400/g" \
		-e "s/QQQ/Z300/g" \
		-e "s/QQ/Z200/g" \
		-e "s/Q/Z100/g" \
		-e "s/000Z//g" \
		-e "s/$z10/Q/g" \
		-e "s/QQQQQQQQQ/Z90/g" \
		-e "s/QQQQQQQQ/Z80/g" \
		-e "s/QQQQQQQ/Z70/g" \
		-e "s/QQQQQQ/Z60/g" \
		-e "s/QQQQQ/Z50/g" \
		-e "s/QQQQ/Z40/g" \
		-e "s/QQQ/Z30/g" \
		-e "s/QQ/Z20/g" \
		-e "s/Q/Z10/g" \
		-e "s/00Z//g" \
		-e "s/z/Q/g" \
		-e "s/QQQQQQQQQ/Z9/g" \
		-e "s/QQQQQQQQ/Z8/g" \
		-e "s/QQQQQQQ/Z7/g" \
		-e "s/QQQQQQ/Z6/g" \
		-e "s/QQQQQ/Z5/g" \
		-e "s/QQQQ/Z4/g" \
		-e "s/QQQ/Z3/g" \
		-e "s/QQ/Z2/g" \
		-e "s/Q/Z1/g" \
		-e "s/0Z//g" \
	;
}

expect_pattern () {
	cnt="$1"
	cat <<EOF
diff --git a/file-a$cnt b/file-a$cnt
--- a/file-a$cnt
+++ b/file-a$cnt
@@ -1 +1 @@
-Z${cnt}a
+Z${cnt}A
diff --git a/file-b$cnt b/file-b$cnt
--- a/file-b$cnt
+++ b/file-b$cnt
@@ -1 +1 @@
-b
+B
diff --git a/file-c$cnt b/file-c$cnt
--- a/file-c$cnt
+++ b/file-c$cnt
@@ -1 +1 @@
-cZ$cnt
\ No newline at end of file
+CZ$cnt
\ No newline at end of file
diff --git a/file-d$cnt b/file-d$cnt
--- a/file-d$cnt
+++ b/file-d$cnt
@@ -1 +1 @@
-d
+D
EOF
}

sample='1023 1024 1025 2047 4095'

test_expect_success setup '

	for n in $sample
	do
		( zs $n && echo a ) >file-a$n &&
		( echo b && zs $n && echo ) >file-b$n &&
		( printf c && zs $n ) >file-c$n &&
		( echo d && zs $n ) >file-d$n &&

		git add file-a$n file-b$n file-c$n file-d$n &&

		( zs $n && echo A ) >file-a$n &&
		( echo B && zs $n && echo ) >file-b$n &&
		( printf C && zs $n ) >file-c$n &&
		( echo D && zs $n ) >file-d$n &&

		expect_pattern $n || return 1

	done >expect
'

test_expect_success 'diff -U0' '

	for n in $sample
	do
		git diff -U0 file-?$n || return 1
	done | zc >actual &&
	test_cmp expect actual

'

test_done
