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
10test_expect_success 'setup' '
11 # a non-trivial custom pattern
12 git config diff.custom1.funcname "!static
13!String
14[^ ].*s.*" &&
15
16 # a custom pattern which matches to end of line
17 git config diff.custom2.funcname "......Beer\$" &&
18
19 # alternation in pattern
20 git config diff.custom3.funcname "Beer$" &&
21 git config diff.custom3.xfuncname "^[ ]*((public|static).*)$" &&
22
23 # for regexp compilation tests
24 echo A >A.java &&
25 echo B >B.java
26'
27
28diffpatterns="
29 ada
30 bibtex
31 cpp
32 csharp
33 css
34 fortran
35 fountain
36 html
37 java
38 matlab
39 objc
40 pascal
41 perl
42 php
43 python
44 ruby
45 tex
46 custom1
47 custom2
48 custom3
49"
50
51for p in $diffpatterns
52do
53 test_expect_success "builtin $p pattern compiles" '
54 echo "*.java diff=$p" >.gitattributes &&
55 test_expect_code 1 git diff --no-index \
56 A.java B.java 2>msg &&
57 test_i18ngrep ! fatal msg &&
58 test_i18ngrep ! error msg
59 '
60 test_expect_success "builtin $p wordRegex pattern compiles" '
61 echo "*.java diff=$p" >.gitattributes &&
62 test_expect_code 1 git diff --no-index --word-diff \
63 A.java B.java 2>msg &&
64 test_i18ngrep ! fatal msg &&
65 test_i18ngrep ! error msg
66 '
67done
68
69test_expect_success 'last regexp must not be negated' '
70 echo "*.java diff=java" >.gitattributes &&
71 test_config diff.java.funcname "!static" &&
72 test_expect_code 128 git diff --no-index A.java B.java 2>msg &&
73 test_i18ngrep ": Last expression must not be negated:" msg
74'
75
76test_expect_success 'setup hunk header tests' '
77 for i in $diffpatterns
78 do
79 echo "$i-* diff=$i"
80 done > .gitattributes &&
81
82 # add all test files to the index
83 (
84 cd "$TEST_DIRECTORY"/t4018 &&
85 git --git-dir="$TRASH_DIRECTORY/.git" add .
86 ) &&
87
88 # place modified files in the worktree
89 for i in $(git ls-files)
90 do
91 sed -e "s/ChangeMe/IWasChanged/" <"$TEST_DIRECTORY/t4018/$i" >"$i" || return 1
92 done
93'
94
95# check each individual file
96for i in $(git ls-files)
97do
98 if grep broken "$i" >/dev/null 2>&1
99 then
100 result=failure
101 else
102 result=success
103 fi
104 test_expect_$result "hunk header: $i" "
105 test_when_finished 'cat actual' && # for debugging only
106 git diff -U1 $i >actual &&
107 grep '@@ .* @@.*RIGHT' actual
108 "
109done
110
111test_done