1#!/bin/sh
2#
3# Copyright (c) 2007 Johannes E. Schindelin
4#
5
6test_description='Test custom diff function name patterns'
7
8. ./test-lib.sh
9
10LF='
11'
12cat >Beer.java <<\EOF
13public class Beer
14{
15 int special;
16 public static void main(String args[])
17 {
18 String s=" ";
19 for(int x = 99; x > 0; x--)
20 {
21 System.out.print(x + " bottles of beer on the wall "
22 + x + " bottles of beer\n"
23 + "Take one down, pass it around, " + (x - 1)
24 + " bottles of beer on the wall.\n");
25 }
26 System.out.print("Go to the store, buy some more,\n"
27 + "99 bottles of beer on the wall.\n");
28 }
29}
30EOF
31sed 's/beer\\/beer,\\/' <Beer.java >Beer-correct.java
32cat >Beer.perl <<\EOT
33package Beer;
34
35use strict;
36use warnings;
37use parent qw(Exporter);
38our @EXPORT_OK = qw(round finalround);
39
40sub other; # forward declaration
41
42# hello
43
44sub round {
45 my ($n) = @_;
46 print "$n bottles of beer on the wall ";
47 print "$n bottles of beer\n";
48 print "Take one down, pass it around, ";
49 $n = $n - 1;
50 print "$n bottles of beer on the wall.\n";
51}
52
53sub finalround
54{
55 print "Go to the store, buy some more\n";
56 print "99 bottles of beer on the wall.\n");
57}
58
59sub withheredocument {
60 print <<"EOF"
61decoy here-doc
62EOF
63 # some lines of context
64 # to pad it out
65 print "hello\n";
66}
67
68__END__
69
70=head1 NAME
71
72Beer - subroutine to output fragment of a drinking song
73
74=head1 SYNOPSIS
75
76 use Beer qw(round finalround);
77
78 sub song {
79 for (my $i = 99; $i > 0; $i--) {
80 round $i;
81 }
82 finalround;
83 }
84
85 song;
86
87=cut
88EOT
89sed -e '
90 s/hello/goodbye/
91 s/beer\\/beer,\\/
92 s/more\\/more,\\/
93 s/song;/song();/
94' <Beer.perl >Beer-correct.perl
95
96test_expect_funcname () {
97 lang=${2-java}
98 test_expect_code 1 git diff --no-index -U1 \
99 "Beer.$lang" "Beer-correct.$lang" >diff &&
100 grep "^@@.*@@ $1" diff
101}
102
103diffpatterns="
104 ada
105 bibtex
106 cpp
107 csharp
108 fortran
109 html
110 java
111 matlab
112 objc
113 pascal
114 perl
115 php
116 python
117 ruby
118 tex
119"
120
121for p in $diffpatterns
122do
123 test_expect_success "builtin $p pattern compiles" '
124 echo "*.java diff=$p" >.gitattributes &&
125 test_expect_code 1 git diff --no-index \
126 Beer.java Beer-correct.java 2>msg &&
127 ! grep fatal msg &&
128 ! grep error msg
129 '
130 test_expect_success "builtin $p wordRegex pattern compiles" '
131 echo "*.java diff=$p" >.gitattributes &&
132 test_expect_code 1 git diff --no-index --word-diff \
133 Beer.java Beer-correct.java 2>msg &&
134 ! grep fatal msg &&
135 ! grep error msg
136 '
137done
138
139test_expect_success 'set up .gitattributes declaring drivers to test' '
140 cat >.gitattributes <<-\EOF
141 *.java diff=java
142 *.perl diff=perl
143 EOF
144'
145
146test_expect_success 'preset java pattern' '
147 test_expect_funcname "public static void main("
148'
149
150test_expect_success 'preset perl pattern' '
151 test_expect_funcname "sub round {\$" perl
152'
153
154test_expect_success 'perl pattern accepts K&R style brace placement, too' '
155 test_expect_funcname "sub finalround\$" perl
156'
157
158test_expect_success 'but is not distracted by end of <<here document' '
159 test_expect_funcname "sub withheredocument {\$" perl
160'
161
162test_expect_success 'perl pattern is not distracted by sub within POD' '
163 test_expect_funcname "=head" perl
164'
165
166test_expect_success 'perl pattern gets full line of POD header' '
167 test_expect_funcname "=head1 SYNOPSIS\$" perl
168'
169
170test_expect_success 'perl pattern is not distracted by forward declaration' '
171 test_expect_funcname "package Beer;\$" perl
172'
173
174test_expect_success 'custom pattern' '
175 test_config diff.java.funcname "!static
176!String
177[^ ].*s.*" &&
178 test_expect_funcname "int special;\$"
179'
180
181test_expect_success 'last regexp must not be negated' '
182 test_config diff.java.funcname "!static" &&
183 test_expect_code 128 git diff --no-index Beer.java Beer-correct.java 2>msg &&
184 grep ": Last expression must not be negated:" msg
185'
186
187test_expect_success 'pattern which matches to end of line' '
188 test_config diff.java.funcname "Beer\$" &&
189 test_expect_funcname "Beer\$"
190'
191
192test_expect_success 'alternation in pattern' '
193 test_config diff.java.funcname "Beer$" &&
194 test_config diff.java.xfuncname "^[ ]*((public|static).*)$" &&
195 test_expect_funcname "public static void main("
196'
197
198test_expect_success 'setup hunk header tests' '
199 for i in $diffpatterns
200 do
201 echo "$i-* diff=$i"
202 done > .gitattributes &&
203
204 # add all test files to the index
205 (
206 cd "$TEST_DIRECTORY"/t4018 &&
207 git --git-dir="$TRASH_DIRECTORY/.git" add .
208 ) &&
209
210 # place modified files in the worktree
211 for i in $(git ls-files)
212 do
213 sed -e "s/ChangeMe/IWasChanged/" <"$TEST_DIRECTORY/t4018/$i" >"$i" || return 1
214 done
215'
216
217# check each individual file
218for i in $(git ls-files)
219do
220 if grep broken "$i" >/dev/null 2>&1
221 then
222 result=failure
223 else
224 result=success
225 fi
226 test_expect_$result "hunk header: $i" "
227 test_when_finished 'cat actual' && # for debugging only
228 git diff -U1 $i >actual &&
229 grep '@@ .* @@.*RIGHT' actual
230 "
231done
232
233test_done