#!/bin/bash set -euo pipefail if [[ $# -ne 1 ]]; then echo "$0 {slash}" exit 1 fi TOOL=$1 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)" } # Check help message. "$TOOL" > "$TEST_DIR/help.txt" && die "$LINENO: unexpected success" grep -qF "line_number" "$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 run_test "$LINENO: empty input -1" -1 run_test "$LINENO: empty input -2" -2 # Slash specific lines (positive). seq 10 > "$TEST_DIR/input.txt" sed -e "1d" "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: slash 1" 1 sed -e "5d" "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: slash 5" 5 sed -e "10d" "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: slash 10" 10 # Slash specific lines (negative). sed -e "10d" "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: slash -1" -1 sed -e "6d" "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: slash -5" -5 sed -e "1d" "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: slash -10" -10 # Slash outside of available range. cp -f "$TEST_DIR/input.txt" "$TEST_DIR/expected.txt" run_test "$LINENO: slash 11" 11 run_test "$LINENO: slash 999" 999 run_test "$LINENO: slash -11" -11 run_test "$LINENO: slash -999" -999 # Try consecutive blank lines. perl -e 'print "\n" x 10' > "$TEST_DIR/input.txt" head -9 "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: slash consecutive blanks 1" 1 run_test "$LINENO: slash consecutive blanks 5" 5 run_test "$LINENO: slash consecutive blanks 10" 10 run_test "$LINENO: slash consecutive blanks -1" -1 run_test "$LINENO: slash consecutive blanks -5" -5 run_test "$LINENO: slash consecutive blanks -10" -10 # Try file with missing newline at the end. echo -e -n "hoge\npiyo\nfuga" > "$TEST_DIR/input.txt" echo -e -n "piyo\nfuga" > "$TEST_DIR/expected.txt" run_test "$LINENO: truncated 1" 1 run_test "$LINENO: truncated -3" -3 echo -e -n "hoge\nfuga" > "$TEST_DIR/expected.txt" run_test "$LINENO: truncated 2" 2 run_test "$LINENO: truncated -2" -2 echo -e -n "hoge\npiyo\n" > "$TEST_DIR/expected.txt" run_test "$LINENO: truncated 3" 3 run_test "$LINENO: truncated -1" -1 # 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 sed -e "1d" "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: large 1" 1 sed -e "2d" "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: large 2" 2 sed -e "10d" "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: large 10" 10 sed -e "19d" "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: large 19" 19 sed -e "20d" "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: large 20" 20 cp -f "$TEST_DIR/input.txt" "$TEST_DIR/expected.txt" run_test "$LINENO: large 100" 100 sed -e "20d" "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: large -1" -1 sed -e "19d" "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: large -2" -2 sed -e "11d" "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: large -10" -10 sed -e "2d" "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: large -19" -19 sed -e "1d" "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: large -20" -20 cp -f "$TEST_DIR/input.txt" "$TEST_DIR/expected.txt" run_test "$LINENO: large -100" -100 rm -rf "$TEST_DIR" exit 0