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 golang
37 html
38 java
39 matlab
40 objc
41 pascal
42 perl
43 php
44 python
45 ruby
46 tex
47 custom1
48 custom2
49 custom3
50"
51
52for p in $diffpatterns
53do
54 test_expect_success "builtin $p pattern compiles" '
55 echo "*.java diff=$p" >.gitattributes &&
56 test_expect_code 1 git diff --no-index \
57 A.java B.java 2>msg &&
58 test_i18ngrep ! fatal msg &&
59 test_i18ngrep ! error msg
60 '
61 test_expect_success "builtin $p wordRegex pattern compiles" '
62 echo "*.java diff=$p" >.gitattributes &&
63 test_expect_code 1 git diff --no-index --word-diff \
64 A.java B.java 2>msg &&
65 test_i18ngrep ! fatal msg &&
66 test_i18ngrep ! error msg
67 '
68done
69
70test_expect_success 'last regexp must not be negated' '
71 echo "*.java diff=java" >.gitattributes &&
72 test_config diff.java.funcname "!static" &&
73 test_expect_code 128 git diff --no-index A.java B.java 2>msg &&
74 test_i18ngrep ": Last expression must not be negated:" msg
75'
76
77test_expect_success 'setup hunk header tests' '
78 for i in $diffpatterns
79 do
80 echo "$i-* diff=$i"
81 done > .gitattributes &&
82
83 # add all test files to the index
84 (
85 cd "$TEST_DIRECTORY"/t4018 &&
86 git --git-dir="$TRASH_DIRECTORY/.git" add .
87 ) &&
88
89 # place modified files in the worktree
90 for i in $(git ls-files)
91 do
92 sed -e "s/ChangeMe/IWasChanged/" <"$TEST_DIRECTORY/t4018/$i" >"$i" || return 1
93 done
94'
95
96# check each individual file
97for i in $(git ls-files)
98do
99 if grep broken "$i" >/dev/null 2>&1
100 then
101 result=failure
102 else
103 result=success
104 fi
105 test_expect_$result "hunk header: $i" "
106 test_when_finished 'cat actual' && # for debugging only
107 git diff -U1 $i >actual &&
108 grep '@@ .* @@.*RIGHT' actual
109 "
110done
111
112test_done