aboutsummaryrefslogtreecommitdiff
path: root/t/t4018-diff-funcname.sh
blob: b68c56b68c0f80a0d96b513733bc5fb17db6fed4 (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
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#!/bin/sh
#
# Copyright (c) 2007 Johannes E. Schindelin
#

test_description='Test custom diff function name patterns'

. ./test-lib.sh

LF='
'
cat >Beer.java <<\EOF
public class Beer
{
	int special;
	public static void main(String args[])
	{
		String s=" ";
		for(int x = 99; x > 0; x--)
		{
			System.out.print(x + " bottles of beer on the wall "
				+ x + " bottles of beer\n"
				+ "Take one down, pass it around, " + (x - 1)
				+ " bottles of beer on the wall.\n");
		}
		System.out.print("Go to the store, buy some more,\n"
			+ "99 bottles of beer on the wall.\n");
	}
}
EOF
sed 's/beer\\/beer,\\/' <Beer.java >Beer-correct.java
cat >Beer.perl <<\EOT
package Beer;

use strict;
use warnings;
use parent qw(Exporter);
our @EXPORT_OK = qw(round finalround);

sub other; # forward declaration

# hello

sub round {
	my ($n) = @_;
	print "$n bottles of beer on the wall ";
	print "$n bottles of beer\n";
	print "Take one down, pass it around, ";
	$n = $n - 1;
	print "$n bottles of beer on the wall.\n";
}

sub finalround
{
	print "Go to the store, buy some more\n";
	print "99 bottles of beer on the wall.\n");
}

sub withheredocument {
	print <<"EOF"
decoy here-doc
EOF
	# some lines of context
	# to pad it out
	print "hello\n";
}

__END__

=head1 NAME

Beer - subroutine to output fragment of a drinking song

=head1 SYNOPSIS

	use Beer qw(round finalround);

	sub song {
		for (my $i = 99; $i > 0; $i--) {
			round $i;
		}
		finalround;
	}

	song;

=cut
EOT
sed -e '
	s/hello/goodbye/
	s/beer\\/beer,\\/
	s/more\\/more,\\/
	s/song;/song();/
' <Beer.perl >Beer-correct.perl

test_config () {
	git config "$1" "$2" &&
	test_when_finished "git config --unset $1"
}

test_expect_funcname () {
	lang=${2-java}
	test_expect_code 1 git diff --no-index -U1 \
		"Beer.$lang" "Beer-correct.$lang" >diff &&
	grep "^@@.*@@ $1" diff
}

for p in bibtex cpp csharp fortran html java objc pascal perl php python ruby tex
do
	test_expect_success "builtin $p pattern compiles" '
		echo "*.java diff=$p" >.gitattributes &&
		test_expect_code 1 git diff --no-index \
			Beer.java Beer-correct.java 2>msg &&
		! grep fatal msg &&
		! grep error msg
	'
	test_expect_success "builtin $p wordRegex pattern compiles" '
		echo "*.java diff=$p" >.gitattributes &&
		test_expect_code 1 git diff --no-index --word-diff \
			Beer.java Beer-correct.java 2>msg &&
		! grep fatal msg &&
		! grep error msg
	'
done

test_expect_success 'default behaviour' '
	rm -f .gitattributes &&
	test_expect_funcname "public class Beer\$"
'

test_expect_success 'set up .gitattributes declaring drivers to test' '
	cat >.gitattributes <<-\EOF
	*.java diff=java
	*.perl diff=perl
	EOF
'

test_expect_success 'preset java pattern' '
	test_expect_funcname "public static void main("
'

test_expect_success 'preset perl pattern' '
	test_expect_funcname "sub round {\$" perl
'

test_expect_success 'perl pattern accepts K&R style brace placement, too' '
	test_expect_funcname "sub finalround\$" perl
'

test_expect_success 'but is not distracted by end of <<here document' '
	test_expect_funcname "sub withheredocument {\$" perl
'

test_expect_success 'perl pattern is not distracted by sub within POD' '
	test_expect_funcname "=head" perl
'

test_expect_success 'perl pattern gets full line of POD header' '
	test_expect_funcname "=head1 SYNOPSIS\$" perl
'

test_expect_success 'perl pattern is not distracted by forward declaration' '
	test_expect_funcname "package Beer;\$" perl
'

test_expect_success 'custom pattern' '
	test_config diff.java.funcname "!static
!String
[^ 	].*s.*" &&
	test_expect_funcname "int special;\$"
'

test_expect_success 'last regexp must not be negated' '
	test_config diff.java.funcname "!static" &&
	test_expect_code 128 git diff --no-index Beer.java Beer-correct.java 2>msg &&
	grep ": Last expression must not be negated:" msg
'

test_expect_success 'pattern which matches to end of line' '
	test_config diff.java.funcname "Beer\$" &&
	test_expect_funcname "Beer\$"
'

test_expect_success 'alternation in pattern' '
	test_config diff.java.funcname "Beer$" &&
	test_config diff.java.xfuncname "^[ 	]*((public|static).*)$" &&
	test_expect_funcname "public static void main("
'

test_done