#!/bin/bash set -euo pipefail if [[ $# -ne 2 ]]; then echo "$0 {head|tail} {tool}" exit 1 fi FUNCTION=$1 TOOL=$2 TEST_DIR=$(mktemp -d) # Delete temporary directory and exit with nonzero status. function die { echo "$1" rm -rf "$TEST_DIR" exit 1 } # Run tool and check output. function run_test { "$TOOL" "$2" < "$TEST_DIR/input.txt" > "$TEST_DIR/actual.txt" \ || die "$LINENO: $1 (run)" diff -q "$TEST_DIR/expected.txt" "$TEST_DIR/actual.txt" \ || die "$LINENO: $1 (diff)" "$TOOL" "-$2" < "$TEST_DIR/input.txt" > "$TEST_DIR/actual.txt" \ || die "$LINENO: $1 (run, negative input)" diff -q "$TEST_DIR/expected.txt" "$TEST_DIR/actual.txt" \ || die "$LINENO: $1 (diff, negative input)" } # Check help message. "$TOOL" > "$TEST_DIR/help.txt" && die "$LINENO: unexpected success" grep -qF "line_count" "$TEST_DIR/help.txt" \ || die "$LINENO: missing help message" # Test empty input. touch "$TEST_DIR/input.txt" touch "$TEST_DIR/expected.txt" run_test "$LINENO: empty input 0" 0 run_test "$LINENO: empty input 1" 1 run_test "$LINENO: empty input 2" 2 # Test empty output. seq 10 > "$TEST_DIR/input.txt" run_test "$LINENO: empty output" 0 # Select a subset of input lines. "$FUNCTION" -1 "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: select 1" 1 "$FUNCTION" -5 "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: select 5" 5 "$FUNCTION" -10 "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: select 10" 10 # Select more than available lines. run_test "$LINENO: select 11" 11 run_test "$LINENO: select 999" 999 # Try consecutive blank lines. perl -e 'print "\n" x 10' > "$TEST_DIR/input.txt" "$FUNCTION" -1 "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: consecutive 1" 1 "$FUNCTION" -5 "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: consecutive 5" 5 cp -f "$TEST_DIR/input.txt" "$TEST_DIR/expected.txt" run_test "$LINENO: consecutive 10" 10 # Try file with missing newline at the end. echo -e -n "hoge\npiyo\nfuga" > "$TEST_DIR/input.txt" "$FUNCTION" -1 "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: truncated 1" 1 "$FUNCTION" -2 "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: truncated 2" 2 "$FUNCTION" -3 "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: truncated 3" 3 # Try a larger input file. perl <<'EOT' > "$TEST_DIR/input.txt" srand(1); for($i = 0; $i < 20; $i++) { for($j = int(rand(4096) + 256); $j > 0; $j--) { print chr(int(rand(95) + 32)); } print "\n"; } EOT "$FUNCTION" -1 "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: large 1" 1 "$FUNCTION" -10 "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: large 10" 10 cp -f "$TEST_DIR/input.txt" "$TEST_DIR/expected.txt" run_test "$LINENO: large 100" 100 rm -rf "$TEST_DIR" exit 0