#! /bin/sh

: ${TASK_MODULE_DIR:=/usr/pkg/share/pkgtasks-1}
: ${TASK_TESTS_DIR:=/usr/pkg/tests/pkgtasks-1}

[ -f "${TASK_MODULE_DIR}/load.subr" ] ||
	echo "${0##*/}: missing file ``${TASK_MODULE_DIR}/load.subr''"

. "${TASK_MODULE_DIR}/load.subr"

# Copyright (c) 2017 The NetBSD Foundation, Inc.
# All rights reserved.
#
# This code is derived from software contributed to The NetBSD Foundation
# by Johnny C. Lam.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.

task_load createfile
task_load echo
task_load unittest

test_setup()
{
	: ${CAT:=cat}
	: ${CMP:=cmp}

	# Explicitly set TASK_LOGFILE to empty string to prevent unintended
	# duplicate output.
	#
	TASK_LOGFILE=
}

test1()
{
	describe="task_echo -b buffers text"
	task_echo -bc "line 1"
	task_echo -b "line 2"
	task_echo "line 3" > value
	${CAT} > expected << 'EOF'
line 1
line 2
line 3
EOF
	if ${CMP} -s expected value; then
		: "success"
	else
		return 1
	fi
	task_echo "only line" > value
	echo "only line" > expected
	if ${CMP} -s expected value; then
		: "success"
	else
		describe="$describe: next write has extra output!"
		return 1
	fi
	for entry in *; do
		case $entry in
		expected|value)
			: "can exist" ;;
		*)	describe="$describe: unknown file!"
			return 1 ;;
		esac
	done
	return 0
}

test2()
{
	describe="task_echo -c clears buffer"
	task_echo -bc "line 1"
	task_echo -b "line 2"
	task_echo -cn
	task_echo "only line" > value
	echo "only line" > expected
	if ${CMP} -s expected value; then
		: "success"
	else
		return 1
	fi
	for entry in *; do
		case $entry in
		expected|value)
			: "can exist" ;;
		*)	describe="$describe: unknown file!"
			return 1 ;;
		esac
	done
	return 0
}

test3()
{
	describe="task_echo -bc clears buffer"
	task_echo -bc "line 1"
	task_echo -b "line 2"
	task_echo -bc "line 3"
	task_echo "line 4" > value
	${CAT} > expected << 'EOF'
line 3
line 4
EOF
	if ${CMP} -s expected value; then
		: "success"
	else
		${CAT} value
		return 1
	fi
	for entry in *; do
		case $entry in
		expected|value)
			: "can exist" ;;
		*)	describe="$describe: unknown file!"
			return 1 ;;
		esac
	done
	return 0
}

test4()
{
	describe="task_echo -n skips trailing newline"
	task_echo -bcn "list: 1"
	task_echo -bn ", 2"
	task_echo -bn ", 3"
	task_echo > value
	echo "list: 1, 2, 3" > expected
	if ${CMP} -s expected value; then
		: "success"
	else
		${CAT} value
		return 1
	fi
	for entry in *; do
		case $entry in
		expected|value)
			: "can exist" ;;
		*)	describe="$describe: unknown file!"
			return 1 ;;
		esac
	done
	return 0
}

test5()
{
	describe="task_echo preserves leading whitespace"
	task_echo "    1 2 3 4" > value
	echo      "    1 2 3 4" > expected
	if ${CMP} -s expected value; then
		: "success"
	else
		${CAT} value
		return 1
	fi
	for entry in *; do
		case $entry in
		expected|value)
			: "can exist" ;;
		*)	describe="$describe: unknown file!"
			return 1 ;;
		esac
	done
	return 0
}

test6()
{
	describe="task_echo preserves leading whitespace after buffer output"
	task_echo -bc "header"
	task_echo "    1 2 3 4" > value
	${CAT} > expected << 'EOF'
header
    1 2 3 4
EOF
	if ${CMP} -s expected value; then
		: "success"
	else
		${CAT} value
		return 1
	fi
	for entry in *; do
		case $entry in
		expected|value)
			: "can exist" ;;
		*)	describe="$describe: unknown file!"
			return 1 ;;
		esac
	done
	return 0
}


test7()
{
	describe="task_echo -b buffers text with log"
	TASK_LOGFILE="${TEST_CURDIR}/log"
	task_echo -bc "line 1"
	if [ -f "${TASK_LOGFILE}" ]; then
		describe="$describe: log exists after first buffered echo!"
		return 1
	fi
	task_echo -b "line 2"
	if [ -f "${TASK_LOGFILE}" ]; then
		describe="$describe: log exists after second buffered echo!"
		return 1
	fi
	task_echo "line 3" > value
	if [ ! -f "${TASK_LOGFILE}" ]; then
		describe="$describe: log missing!"
		return 1
	fi
	${CAT} > expected << 'EOF'
line 1
line 2
line 3
EOF
	if ${CMP} -s expected value; then
		: "success"
	else
		return 1
	fi
	if ${CMP} -s value log; then
		: "success"
	else
		describe="$describe: log doesn't match standard output!"
		${CAT} log
		return 1
	fi
	task_echo "only line" > value
	echo "only line" >> expected
	if ${CMP} -s expected log; then
		: "success"
	else
		describe="$describe: log doesn't match all writes!"
		${CAT} log
		return 1
	fi
	return 0
}

test8()
{
	describe="task_echo -c clears buffer with log"
	TASK_LOGFILE="${TEST_CURDIR}/log"
	task_echo -bc "line 1"
	task_echo -b "line 2"
	task_echo -cn
	task_echo "only line" > value
	echo "only line" > expected
	if ${CMP} -s expected log; then
		: "success"
	else
		${CAT} log
		return 1
	fi
	if ${CMP} -s value log; then
		: "success"
	else
		describe="$describe: log doesn't match output"
		${CAT} log
		return 1
	fi
	return 0
}

test9()
{
	describe="task_echo -bc clears buffer with log"
	TASK_LOGFILE="${TEST_CURDIR}/log"
	task_echo -bc "line 1"
	task_echo -b "line 2"
	task_echo -bc "line 3"
	task_echo "line 4" > value
	${CAT} > expected << 'EOF'
line 3
line 4
EOF
	if ${CMP} -s expected log; then
		: "success"
	else
		${CAT} log
		return 1
	fi
	if ${CMP} -s value log; then
		: "success"
	else
		describe="$describe: log doesn't match output"
		${CAT} log
		return 1
	fi
	return 0
}

test10()
{
	describe="task_echo -n skips trailing newline with log"
	TASK_LOGFILE="${TEST_CURDIR}/log"
	task_echo -bcn "list: 1"
	task_echo -bn ", 2"
	task_echo -bn ", 3"
	task_echo > value
	echo "list: 1, 2, 3" > expected
	if ${CMP} -s expected log; then
		: "success"
	else
		${CAT} log
		return 1
	fi
	if ${CMP} -s value log; then
		: "success"
	else
		describe="$describe: log doesn't match output"
		${CAT} log
		return 1
	fi
	return 0
}

test11()
{
	describe="task_echo preserves leading whitespace with log"
	TASK_LOGFILE="${TEST_CURDIR}/log"
	task_echo "    1 2 3 4" > value
	echo      "    1 2 3 4" > expected
	if ${CMP} -s expected log; then
		: "success"
	else
		${CAT} log
		return 1
	fi
	if ${CMP} -s value log; then
		: "success"
	else
		describe="$describe: log doesn't match output"
		${CAT} log
		return 1
	fi
	return 0
}

test12()
{
	describe="task_echo preserves leading whitespace after buffer output with log"
	TASK_LOGFILE="${TEST_CURDIR}/log"
	task_echo -bc "header"
	task_echo "    1 2 3 4" > value
	${CAT} > expected << 'EOF'
header
    1 2 3 4
EOF
	if ${CMP} -s expected log; then
		: "success"
	else
		${CAT} log
		return 1
	fi
	if ${CMP} -s value log; then
		: "success"
	else
		describe="$describe: log doesn't match output"
		${CAT} log
		return 1
	fi
	return 0
}

task_run_tests "$@"
