#!/bin/sh
set -eu

. tests/lib.sh

test_picking_first_makes_it_be_always_first() {
	OUT="$(mktemp)"
	ERR="$(mktemp)"
	PROFILE="always-picks-first-$(uuid)"
	for _ in $(seq 10); do
		printf 'always-picked\nnever-picked\n' | \
			sh remembering \
				-p "$PROFILE" \
				-c 'head -n1' \
				1>"$OUT" 2>"$ERR"
		STATUS=$?
		assert_status 0
		assert_empty_stderr
		assert_stdout 'always-picked'
	done
}

INPUT='a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
w
x
y
z'

pick_x() {
	OUT="$(mktemp)"
	ERR="$(mktemp)"
	PICK="$1"

	echo "$INPUT" | \
		sh remembering \
			-p "$PROFILE" \
			-c "tee -a /dev/stderr | grep $PICK" \
			1>"$OUT" 2>"$ERR"
	STATUS=$?
	assert_status 0
	assert_stdout "$PICK"
}

assert_first() {
	FIRST="$(head -n1 "$ERR")"
	if [ "$FIRST" != "$1" ]; then
		echo 'Previous choice did not appear at the beginning of the list'
		printf '\nexpected: %s\ngot: %s\n' "$1" "$FIRST"
		exit 1
	fi
}

test_promoting_values() {
	PROFILE="promoting-$(uuid)"

	pick_x h
	pick_x z # just to get the new STDIN
	assert_first h

	pick_x h
	pick_x z
	assert_first h
}

test_higher_values_loose_tie() {
	PROFILE="higher-loose-tie-$(uuid)"

	pick_x f
	pick_x f
	pick_x g
	pick_x g
	pick_x z
	assert_first f
}

test_smaller_values_win_tie() {
	PROFILE="smaller-win-tie-$(uuid)"

	pick_x d
	pick_x d
	pick_x c
	pick_x c
	pick_x z
	assert_first c
}

test_many_sequential_picks() {
	PROFILE="many-sequential-picks-$(uuid)"

	pick_x b
	pick_x r
	pick_x l
	pick_x r
	pick_x s
	pick_x a
	pick_x d
	pick_x m
	pick_x g
	pick_x g
	pick_x l
	pick_x l
	pick_x f
	pick_x f
	pick_x f
	pick_x l
	pick_x a

	pick_x z
	assert_first l

	EXPECTED='l
f
a
g
r
b
d
m
s'
	ACTUAL="$(head -n9 "$ERR")"
	if [ "$ACTUAL" != "$EXPECTED" ]; then
		printf 'Bad order!\n\nexpected: %s\ngot:      %s\n' \
			"$(echo "$EXPECTED" | tr '\n' ' ')" \
			"$(echo "$ACTUAL"   | tr '\n' ' ')"
		exit 1
	fi
}

test_picking_first_makes_it_be_always_first
test_promoting_values
test_higher_values_loose_tie
test_smaller_values_win_tie
test_many_sequential_picks