#!/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