#!/bin/bash set -euo pipefail if [[ $# -ne 1 ]]; then echo "$0 {chop.rb}" exit 1 fi SOURCE=$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 { ruby -w "$SOURCE" "$2" < "$TEST_DIR/input.txt" > "$TEST_DIR/actual.txt" \ || die "$LINENO: $1 (pipe)" diff -q "$TEST_DIR/expected.txt" "$TEST_DIR/actual.txt" \ || die "$LINENO: $1 (pipe diff)" ruby -w "$SOURCE" "$2" "$TEST_DIR/input.txt" > "$TEST_DIR/actual.txt" \ || die "$LINENO: $1 (arg1)" diff -q "$TEST_DIR/expected.txt" "$TEST_DIR/actual.txt" \ || die "$LINENO: $1 (arg1 diff)" } # Check help message. ruby "$SOURCE" > "$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 0" 0 run_test "$LINENO: empty 1" 1 run_test "$LINENO: empty 2" 2 run_test "$LINENO: empty -1" -1 run_test "$LINENO: empty -2" -2 # Chopping head off. seq 10 > "$TEST_DIR/input.txt" cp -f "$TEST_DIR/input.txt" "$TEST_DIR/expected.txt" run_test "$LINENO: head 0" 0 seq 10 | tail -9 > "$TEST_DIR/expected.txt" run_test "$LINENO: head 1" 1 seq 10 | tail -7 > "$TEST_DIR/expected.txt" run_test "$LINENO: head 3" 3 echo -n "" > "$TEST_DIR/expected.txt" run_test "$LINENO: head 10" 10 run_test "$LINENO: head 11" 11 # Chopping tail off. cp -f "$TEST_DIR/input.txt" "$TEST_DIR/expected.txt" seq 9 > "$TEST_DIR/expected.txt" run_test "$LINENO: tail -1" -1 seq 7 > "$TEST_DIR/expected.txt" run_test "$LINENO: tail -3" -3 echo -n "" > "$TEST_DIR/expected.txt" run_test "$LINENO: tail -10" -10 run_test "$LINENO: tail -11" -11 # Try file without trailing newline. echo -n -e "hoge\npiyo\nfuga" > "$TEST_DIR/input.txt" cp -f "$TEST_DIR/input.txt" "$TEST_DIR/expected.txt" run_test "$LINENO: missing end of line 0" 0 echo -n -e "piyo\nfuga" > "$TEST_DIR/expected.txt" run_test "$LINENO: missing end of line 1" 1 echo -n "fuga" > "$TEST_DIR/expected.txt" run_test "$LINENO: missing end of line 2" 2 echo -n "" > "$TEST_DIR/expected.txt" run_test "$LINENO: missing end of line 3" 3 echo -n -e "hoge\npiyo\n" > "$TEST_DIR/expected.txt" run_test "$LINENO: missing end of line -1" -1 echo -n -e "hoge\n" > "$TEST_DIR/expected.txt" run_test "$LINENO: missing end of line -2" -2 echo -n "" > "$TEST_DIR/expected.txt" run_test "$LINENO: missing end of line -3" -3 # Try a larger input file. ruby <<'EOT' > "$TEST_DIR/input.txt" srand(1) 20.times{ (rand(4096) + 256).times{ print((rand(95) + 32).chr) } print "\n" } EOT cp -f "$TEST_DIR/input.txt" "$TEST_DIR/expected.txt" run_test "$LINENO: large 0" 0 sed -e "1d" "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: large 1" 1 sed -e "1,3d" "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: large 3" 3 head -19 "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: large -1" -1 head -17 "$TEST_DIR/input.txt" > "$TEST_DIR/expected.txt" run_test "$LINENO: large -3" -3 rm -rf "$TEST_DIR" exit 0