aboutsummaryrefslogtreecommitdiff
path: root/tests/ranking.sh
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xtests/ranking.sh133
1 files changed, 133 insertions, 0 deletions
diff --git a/tests/ranking.sh b/tests/ranking.sh
new file mode 100755
index 0000000..7b69106
--- /dev/null
+++ b/tests/ranking.sh
@@ -0,0 +1,133 @@
+#!/bin/sh
+set -eu
+
+. tests/lib.sh
+
+test_picking_first_makes_it_be_always_first() {
+ OUT="$(mktemp)"
+ ERR="$(mktemp)"
+ PROFILE="always-picks-first-$(uuidgen)"
+ 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'
+for letter in {b..z}; do
+ INPUT="$INPUT
+$letter"
+done
+
+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-$(uuidgen)"
+
+ 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-$(uuidgen)"
+
+ 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-$(uuidgen)"
+
+ 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-$(uuidgen)"
+
+ 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