aboutsummaryrefslogtreecommitdiff
path: root/tests/grep.test
blob: 798a9c6a754fa07ef7db841e8de4add444c00cf1 (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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#!/bin/bash

[ -f testing.sh ] && . testing.sh

# Copyright 2013 by Kyungsu Kim <kaspyx@gmail.com>
# Copyright 2013 by Kyungwan Han <asura321@gmail.com>

#testing "name" "command" "result" "infile" "stdin"

testing "-c" "grep -c 123 input" "3\n" "123\ncount 123\n123\nfasdfasdf" ""

echo -e "this is test" > foo
echo -e "this is test2" > foo2
echo -e "this is foo3" > foo3
testing "-l" "grep -l test foo foo2 foo3" "foo\nfoo2\n" "" ""
rm foo foo2 foo3

testing "-q" "grep -q test input && echo yes" "yes\n" "this is a test\n" ""
testing "-E" "grep -E '[0-9]' input" "1234123asdfas123123\n1\n" \
  "1234123asdfas123123\nabc\n1\nabcde" ""
testing "-e" "grep -e '[0-9]' input" "1234123asdfas123123\n1\n" \
  "1234123asdfas123123\nabc\n1\nabcde" ""
testing "-e -e" "grep -e one -e two -e three input" \
  "two\ntwo\nthree\none\n" "two\ntwo\nthree\nand\none\n" ""
testing "-F" "grep -F is input" "this is test\nthis is test2\n" \
  "this is test\nthis is test2\ntest case" ""

echo -e "this is test\nthis is test2\ntest case" > foo
echo -e "hello this is test" > foo2
echo -e "hi hello" > foo3
testing "-H" "grep -H is foo foo2 foo3" "foo:this is test\nfoo:this is test2\nfoo2:hello this is test\n" "" ""
rm foo foo2 foo3

testing "-b" "grep -b is input" "0:this is test\n13:this is test2\n" \
  "this is test\nthis is test2\ntest case" ""
testing "-i" "grep -i is input" "thisIs test\nthis is test2\n" \
  "thisIs test\nthis is test2\ntest case" ""
testing "-n" "grep -n is input" "1:this is test\n2:this is test2\n" \
  "this is test\nthis is test2\ntest case" ""
testing "-o" "grep -o is input" "is\nis\nis\nis\n" \
  "this is test\nthis is test2\ntest case" ""
testing "-s" "grep -hs hello asdf input 2>&1" "hello\n" "hello\n" ""
testing "-v" "grep -v abc input" "1234123asdfas123123\n1ABa\n" \
  "1234123asdfas123123\n1ABabc\nabc\n1ABa\nabcde" ""
testing "-w" "grep -w abc input" "abc\n123 abc\nabc 123\n123 abc 456\n" \
  "1234123asdfas123123\n1ABabc\nabc\n1ABa\nabcde\n123 abc\nabc 123\n123 abc 456\n" ""
testing "-x" "grep -x abc input" "abc\n" \
  "aabcc\nabc\n" ""

testing "-H (standard input)" "grep -H abc" "(standard input):abc\n" \
  "" "abc\n"
testing "-l (standard input)" "grep -l abc" "(standard input)\n" \
  "" "abc\n"
testing "-n two inputs" "grep -hn def - input" "2:def\n2:def\n" \
  "abc\ndef\n" "abc\ndef\n"

testing "pattern with newline" "grep 'abc
def' input" "aabcc\nddeff\n" \
  "aaaa\naabcc\n\dddd\nddeff\nffff\n" ""

testing "-lH" "grep -lH abc input" "input\n" "abc\n" ""
testing "-cn" "grep -cn abc input" "1\n" "abc\n" ""
testing "-cH" "grep -cH abc input" "input:1\n" "abc\n" ""
testing "-qs" "grep -qs abc none input && echo yes" "yes\n" "abc\n" ""
testing "-hl" "grep -hl abc input" "input\n" "abc\n" ""
testing "-b stdin" "grep -b one" "0:one\n4:one\n8:one\n" "" "one\none\none\n"
testing "-o overlap" "grep -bo aaa" "1:aaa\n" "" "baaaa\n"
# nonobvious: -co counts lines, not matches
testing "-co" "grep -co one input" "1\n" "one one one\n" ""
testing "-nom" "grep -nom 2 one" "1:one\n1:one\n1:one\n2:one\n2:one\n" \
  "" "one one one\none one\none"
testing "-vo" "grep -vo one input" "two\nthree\n" "onetwoonethreeone\n" ""
testing "no newline" "grep -h one input -" \
  "hello one\nthere one\n" "hello one" "there one"

testing "-e multi" "grep -e one -ethree input" \
  "three\none\n" "three\ntwo\none\n" ""
# Suppress filenames for recursive test because dunno order they'd occur in
mkdir sub
echo -e "one\ntwo\nthree" > sub/one
echo -e "three\ntwo\none" > sub/two
testing "-hr" "grep -hr one sub" "one\none\n" "" ""
testing "-r file" "grep -r three sub/two" "three\n" "" ""
testing "-r dir" "grep -r one sub | sort" "sub/one:one\nsub/two:one\n" \
  "" ""
rm -rf sub

# -x exact match trumps -F's "empty string matches whole line" behavior
testing "-Fx ''" "grep -Fx '' input" "" "one one one\n" ""
testing "-F ''" "grep -F '' input" "one one one\n" "one one one\n" ""
testing "-F -e blah -e ''" "grep -F -e blah -e '' input" "one one one\n" \
  "one one one\n" ""
testing "-e blah -e ''" "grep -e blah -e '' input" "one one one\n" \
  "one one one\n" ""
testing "-w ''" "grep -w '' input" "" "one one one\n" ""
testing "-w '' 2" "grep -w '' input" "one  two\n" "one  two\n" ""
testing "-w \\1" "grep -wo '\\(x\\)\\1'" "xx\n" "" "xx"
testing "-o ''" "grep -o '' input" "" "one one one\n" ""
testing "backref" 'grep -e "a\(b\)" -e "b\(c\)\1"' "bcc\nab\n" \
  "" "bcc\nbcb\nab\n"

testing "-A" "grep -A 2 yes" "yes\nno\nno\n--\nyes\nno\nno\nyes\nno\n" \
  "" "yes\nno\nno\nno\nyes\nno\nno\nyes\nno"
testing "-B" "grep -B 1 yes" "no\nyes\n--\nno\nyes\nno\nyes\n" \
  "" "no\nno\nno\nyes\nno\nno\nyes\nno\nyes"
testing "-C" "grep -C 1 yes" \
  "yes\nno\n--\nno\nyes\nno\nno\nyes\nno\nyes\nno\n" \
  "" "yes\nno\nno\nno\nyes\nno\nno\nyes\nno\nyes\nno\nno"
testing "-HnC" "grep -HnC1 two" \
  "(standard input)-1-one\n(standard input):2:two\n(standard input)-3-three\n" \
  "" "one\ntwo\nthree"

# Context lines weren't showing -b
testing "-HnbB1" "grep -HnbB1 f input" \
  "input-3-8-three\ninput:4:14:four\ninput:5:19:five\n" \
  "one\ntwo\nthree\nfour\nfive\n" ""

testing "-q match overrides error" \
  "grep -q hello missing input 2>/dev/null && echo yes" "yes\n" "hello\n" ""
testing "-q not found is 1" \
  'grep -q hello input || echo $?' "1\n" "" ""
testing "-q missing is 2" \
  'grep -q hello missing missing 2>/dev/null || echo $?' "2\n" "" ""
testing "-q missing survives exists but not found" \
  'grep -q hello missing missing input 2>/dev/null || echo $?' "2\n" "" ""
testing "not found retained past match" \
  'grep hello missing input 2>/dev/null || echo $?' \
  "input:hello\n2\n" "hello\n" ""
touch empty
testing "one match good enough for 0" \
  'grep hello input empty && echo $?' 'input:hello\n0\n' 'hello\n' ''
rm empty

testing "-o ''" "grep -o ''" "" "" "one two three\none two\none\n"
testing '' "grep -o -e '' -e two" "two\ntwo\n" "" \
  "one two three\none two\none\n"

echo "one\ntwo\nthree" > test
testing "-l trumps -C" "grep -l -C1 two test input" "test\ninput\n" \
  "three\ntwo\none\n" ""
rm test

# match after NUL byte
testing "match after NUL byte" "grep -a two" "one\0and two three\n" \
  "" 'one\0and two three'

# BREs versus EREs
testing "implicit BRE |" "grep 'uno|dos'" "uno|dos\n" \
  "" "uno\ndos\nuno|dos\n"
testing "explicit BRE |" "grep -e 'uno|dos'" "uno|dos\n" \
  "" "uno\ndos\nuno|dos\n"
testing "explicit ERE |" "grep -E 'uno|dos'" "uno\ndos\nuno|dos\n" \
  "" "uno\ndos\nuno|dos\n"

testing "" "grep -o -e iss -e ipp" "iss\niss\nipp\n" "" "mississippi"
testing "" "grep -o -e gum -e rgu" "rgu\n" "" "argument"

testing "early failure" 'grep --what 2>/dev/null || echo $?' "2\n" "" ""

testing "" 'grep abc ; echo $?' "abcdef\n0\n" "" "abcdef\n"
testing "" 'grep abc doesnotexist input 2>/dev/null; echo $?' \
  "input:abcdef\n2\n" "abcdef\n" ""
mkdir sub
ln -s nope sub/link
testing "" 'grep -r walrus sub 2>/dev/null; echo $?' "1\n" "" ""
rm -rf sub