|  | #!/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_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 ada bibtex cpp csharp fortran html java matlab 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 |