#!/bin/sh

. "${srcdir=.}/init.sh"; path_prepend_ ../src

TZ=UTC0
export TZ

fail=0

echo a > a
echo b > b

# On systems lacking fractional timestamp support, diff -u does not print
# a decimal point and 9-digit nanosecond suffix.
nanosecond_zeros=$(diff -u a b|grep '\.' > /dev/null && echo .000000000)

epoch='1970-01-01 00:00:00'
touch -t 197001010000.00 a b

e=$(printf '\033')
tab=$(printf '\t')

gen_exp_u()
{
    local epoch_plus="$epoch$nanosecond_zeros +0000"
    local rs=$(printf "$e[${rs}m")
    local hd=$(printf "$e[${hd}m")
    local ad=$(printf "$e[${ad}m")
    local de=$(printf "$e[${de}m")
    local ln=$(printf "$e[${ln}m")
    printf '%s' \
"$hd--- a$tab$epoch_plus$rs
$hd+++ b$tab$epoch_plus$rs
${ln}@@ -1 +1 @@$rs
$de-a$rs
$ad+b$rs
"
}

gen_exp_c()
{
    local epoch_posix_1003_1_2001="Thu Jan  1 00:00:00 1970"
    local rs=$(printf "$e[${rs}m")
    local hd=$(printf "$e[${hd}m")
    local ad=$(printf "$e[${ad}m")
    local de=$(printf "$e[${de}m")
    local ln=$(printf "$e[${ln}m")
    printf '%s' \
"$hd*** a$tab$epoch_posix_1003_1_2001$rs
$hd--- b$tab$epoch_posix_1003_1_2001$rs
***************
$ln*** 1 ****$rs
$de! a$rs
$ln--- 1 ----$rs
$ad! b$rs
"
}

gen_exp_default()
{
    printf '%s' \
"1c1
< a
---
> b
"
}

gen_exp_default_colors()
{
    local rs=$(printf "$e[${rs}m")
    local hd=$(printf "$e[${hd}m")
    local ad=$(printf "$e[${ad}m")
    local de=$(printf "$e[${de}m")
    local ln=$(printf "$e[${ln}m")
    printf '%s' \
"${ln}1c1$rs
$de< a$rs
---
$ad> b$rs
"
}

# Compare with some known outputs

rs=0 hd=1 ad=32 de=31 ln=36

returns_ 1 diff --color=auto a b > out || fail=1
gen_exp_default > exp || framework_failure_
compare exp out || fail=1

returns_ 1 env PATH="$PATH" TERM=dumb \
         diff ---presume-output-tty --color=auto a b > out \
  || fail=1
gen_exp_default > exp || framework_failure_
compare exp out || fail=1

returns_ 1 diff --color=never a b > out || fail=1
gen_exp_default > exp || framework_failure_
compare exp out || fail=1

returns_ 1 diff a b > out || fail=1
gen_exp_default > exp || framework_failure_
compare exp out || fail=1

returns_ 1 diff --color=always a b > out || fail=1
gen_exp_default_colors > exp || framework_failure_
compare exp out || fail=1

returns_ 1 diff -u --color=always a b > out || fail=1
gen_exp_u > exp || framework_failure_
compare exp out || fail=1

returns_ 1 diff -c --color=always a b > out || fail=1
gen_exp_c > exp || framework_failure_
compare exp out || fail=1

rs=0 hd=33 ad=34 de=35 ln=36
returns_ 1 diff -u --color=always \
  --palette="rs=0:hd=33:ad=34:de=35:ln=36" a b > out || fail=1
gen_exp_u > exp || framework_failure_
compare exp out || fail=1

# Before the fix in http://debbugs.gnu.org/22067,
# this test would trigger an infinite loop bug.
mkfifo fifo
printf '%1000000s-a' > a
printf '%1000000s-b' > b
head -c 10 < fifo > /dev/null &
diff --color=always ---presume-output-tty a b > fifo

# Depending on version of GNU make (4.3.92-4.4 set SIGPIPE to "ignore"),
# either of these is acceptable.
case $? in 2|141) ;; *) fail=1 ;; esac

Exit $fail
