#!/bin/sh

test_description='log/show --expand-tabs'

TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh

HT="	"
title='tab indent at the beginning of the title line'
body='tab indent on a line in the body'

# usage: count_expand $indent $numSP $numHT @format_args
count_expand ()
{
	expect=
	count=$(( $1 + $2 )) ;# expected spaces
	while test $count -gt 0
	do
		expect="$expect "
		count=$(( $count - 1 ))
	done
	shift 2
	count=$1 ;# expected tabs
	while test $count -gt 0
	do
		expect="$expect$HT"
		count=$(( $count - 1 ))
	done
	shift

	# The remainder of the command line is "git show -s" options
	case " $* " in
	*' --pretty=short '*)
		line=$title ;;
	*)
		line=$body ;;
	esac

	# Prefix the output with the command line arguments, and
	# replace SP with a dot both in the expected and actual output
	# so that test_cmp would show the difference together with the
	# breakage in a way easier to consume by the debugging user.
	{
		echo "git show -s $*"
		echo "$expect$line"
	} | sed -e 's/ /./g' >expect

	{
		echo "git show -s $*"
		git show -s "$@" |
		sed -n -e "/$line\$/p"
	} | sed -e 's/ /./g' >actual

	test_cmp expect actual
}

test_expand ()
{
	fmt=$1
	case "$fmt" in
	*=raw | *=short | *=email)
		default="0 1" ;;
	*)
		default="8 0" ;;
	esac
	case "$fmt" in
	*=email)
		in=0 ;;
	*)
		in=4 ;;
	esac
	test_expect_success "expand/no-expand${fmt:+ for $fmt}" '
		count_expand $in $default $fmt &&
		count_expand $in 8 0 $fmt --expand-tabs &&
		count_expand $in 8 0 --expand-tabs $fmt &&
		count_expand $in 8 0 $fmt --expand-tabs=8 &&
		count_expand $in 8 0 --expand-tabs=8 $fmt &&
		count_expand $in 0 1 $fmt --no-expand-tabs &&
		count_expand $in 0 1 --no-expand-tabs $fmt &&
		count_expand $in 0 1 $fmt --expand-tabs=0 &&
		count_expand $in 0 1 --expand-tabs=0 $fmt &&
		count_expand $in 4 0 $fmt --expand-tabs=4 &&
		count_expand $in 4 0 --expand-tabs=4 $fmt
	'
}

test_expect_success 'setup' '
	test_tick &&
	sed -e "s/Q/$HT/g" <<-EOF >msg &&
	Q$title

	Q$body
	EOF
	git commit --allow-empty -F msg
'

test_expand ""
test_expand --pretty
test_expand --pretty=short
test_expand --pretty=medium
test_expand --pretty=full
test_expand --pretty=fuller
test_expand --pretty=raw
test_expand --pretty=email

test_done
