summaryrefslogtreecommitdiff
path: root/corebinutils/cat/tests/test.sh
blob: 1e9b5bc8203d3412f6fe227baf45f971b2cafe80 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#!/bin/sh
set -eu

ROOT=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
CAT_BIN=${CAT_BIN:-"$ROOT/out/cat"}
TMPDIR=${TMPDIR:-/tmp}
WORKDIR=$(mktemp -d "$TMPDIR/cat-test.XXXXXX")
trap 'rm -rf "$WORKDIR"' EXIT INT TERM

fail() {
	printf '%s\n' "FAIL: $1" >&2
	exit 1
}

assert_eq() {
	name=$1
	expected=$2
	actual=$3
	if [ "$expected" != "$actual" ]; then
		printf '%s\n' "FAIL: $name" >&2
		printf '%s\n' "--- expected ---" >&2
		printf '%s' "$expected" >&2
		printf '\n%s\n' "--- actual ---" >&2
		printf '%s' "$actual" >&2
		printf '\n' >&2
		exit 1
	fi
}

[ -x "$CAT_BIN" ] || fail "missing binary: $CAT_BIN"

printf 'hello\nworld\n' > "$WORKDIR/basic.txt"
assert_eq "file passthrough" \
	"hello
world" \
	"$("$CAT_BIN" "$WORKDIR/basic.txt")"

assert_eq "stdin passthrough" \
	"stdin-check" \
	"$(printf 'stdin-check\n' | "$CAT_BIN" -)"

printf 'a\n\n\nb\t\177\n' > "$WORKDIR/fixture.txt"

assert_eq "number all lines" \
	"     1	a
     2	
     3	
     4	b	" \
	"$("$CAT_BIN" -n "$WORKDIR/fixture.txt")"

assert_eq "number nonblank lines" \
	"     1	a


     2	b	" \
	"$("$CAT_BIN" -b "$WORKDIR/fixture.txt")"

assert_eq "squeeze blanks" \
	"a

b	" \
	"$("$CAT_BIN" -s "$WORKDIR/fixture.txt")"

assert_eq "show ends" \
	"a$
$
$
b	^?$" \
	"$("$CAT_BIN" -e "$WORKDIR/fixture.txt")"

assert_eq "show tabs" \
	"a


b^I^?" \
	"$("$CAT_BIN" -t "$WORKDIR/fixture.txt")"

assert_eq "show nonprinting" \
	"a


b	^?" \
	"$("$CAT_BIN" -v "$WORKDIR/fixture.txt")"

usage_output=$("$CAT_BIN" -z 2>&1 || true)
case $usage_output in
	*"usage: cat [-belnstuv] [file ...]"*) ;;
	*) fail "usage on bad flag" ;;
esac

printf '%s\n' "PASS"