t / t4034-diff-words.shon commit Merge branch 'jk/diff-submodule-diff-inline' (a531ecf)
   1#!/bin/sh
   2
   3test_description='word diff colors'
   4
   5. ./test-lib.sh
   6. "$TEST_DIRECTORY"/diff-lib.sh
   7
   8cat >pre.simple <<-\EOF
   9        h(4)
  10
  11        a = b + c
  12EOF
  13cat >post.simple <<-\EOF
  14        h(4),hh[44]
  15
  16        a = b + c
  17
  18        aa = a
  19
  20        aeff = aeff * ( aaa )
  21EOF
  22cat >expect.letter-runs-are-words <<-\EOF
  23        <BOLD>diff --git a/pre b/post<RESET>
  24        <BOLD>index 330b04f..5ed8eff 100644<RESET>
  25        <BOLD>--- a/pre<RESET>
  26        <BOLD>+++ b/post<RESET>
  27        <CYAN>@@ -1,3 +1,7 @@<RESET>
  28        h(4),<GREEN>hh<RESET>[44]
  29
  30        a = b + c<RESET>
  31
  32        <GREEN>aa = a<RESET>
  33
  34        <GREEN>aeff = aeff * ( aaa<RESET> )
  35EOF
  36cat >expect.non-whitespace-is-word <<-\EOF
  37        <BOLD>diff --git a/pre b/post<RESET>
  38        <BOLD>index 330b04f..5ed8eff 100644<RESET>
  39        <BOLD>--- a/pre<RESET>
  40        <BOLD>+++ b/post<RESET>
  41        <CYAN>@@ -1,3 +1,7 @@<RESET>
  42        h(4)<GREEN>,hh[44]<RESET>
  43
  44        a = b + c<RESET>
  45
  46        <GREEN>aa = a<RESET>
  47
  48        <GREEN>aeff = aeff * ( aaa )<RESET>
  49EOF
  50
  51word_diff () {
  52        test_must_fail git diff --no-index "$@" pre post >output &&
  53        test_decode_color <output >output.decrypted &&
  54        test_cmp expect output.decrypted
  55}
  56
  57test_language_driver () {
  58        lang=$1
  59        test_expect_success "diff driver '$lang'" '
  60                cp "$TEST_DIRECTORY/t4034/'"$lang"'/pre" \
  61                        "$TEST_DIRECTORY/t4034/'"$lang"'/post" \
  62                        "$TEST_DIRECTORY/t4034/'"$lang"'/expect" . &&
  63                echo "* diff='"$lang"'" >.gitattributes &&
  64                word_diff --color-words
  65        '
  66}
  67
  68test_expect_success setup '
  69        git config diff.color.old red &&
  70        git config diff.color.new green &&
  71        git config diff.color.func magenta
  72'
  73
  74test_expect_success 'set up pre and post with runs of whitespace' '
  75        cp pre.simple pre &&
  76        cp post.simple post
  77'
  78
  79test_expect_success 'word diff with runs of whitespace' '
  80        cat >expect <<-\EOF &&
  81                <BOLD>diff --git a/pre b/post<RESET>
  82                <BOLD>index 330b04f..5ed8eff 100644<RESET>
  83                <BOLD>--- a/pre<RESET>
  84                <BOLD>+++ b/post<RESET>
  85                <CYAN>@@ -1,3 +1,7 @@<RESET>
  86                <RED>h(4)<RESET><GREEN>h(4),hh[44]<RESET>
  87
  88                a = b + c<RESET>
  89
  90                <GREEN>aa = a<RESET>
  91
  92                <GREEN>aeff = aeff * ( aaa )<RESET>
  93        EOF
  94        word_diff --color-words &&
  95        word_diff --word-diff=color &&
  96        word_diff --color --word-diff=color
  97'
  98
  99test_expect_success '--word-diff=porcelain' '
 100        sed 's/#.*$//' >expect <<-\EOF &&
 101                diff --git a/pre b/post
 102                index 330b04f..5ed8eff 100644
 103                --- a/pre
 104                +++ b/post
 105                @@ -1,3 +1,7 @@
 106                -h(4)
 107                +h(4),hh[44]
 108                ~
 109                 # significant space
 110                ~
 111                 a = b + c
 112                ~
 113                ~
 114                +aa = a
 115                ~
 116                ~
 117                +aeff = aeff * ( aaa )
 118                ~
 119        EOF
 120        word_diff --word-diff=porcelain
 121'
 122
 123test_expect_success '--word-diff=plain' '
 124        cat >expect <<-\EOF &&
 125                diff --git a/pre b/post
 126                index 330b04f..5ed8eff 100644
 127                --- a/pre
 128                +++ b/post
 129                @@ -1,3 +1,7 @@
 130                [-h(4)-]{+h(4),hh[44]+}
 131
 132                a = b + c
 133
 134                {+aa = a+}
 135
 136                {+aeff = aeff * ( aaa )+}
 137        EOF
 138        word_diff --word-diff=plain &&
 139        word_diff --word-diff=plain --no-color
 140'
 141
 142test_expect_success '--word-diff=plain --color' '
 143        cat >expect <<-\EOF &&
 144                <BOLD>diff --git a/pre b/post<RESET>
 145                <BOLD>index 330b04f..5ed8eff 100644<RESET>
 146                <BOLD>--- a/pre<RESET>
 147                <BOLD>+++ b/post<RESET>
 148                <CYAN>@@ -1,3 +1,7 @@<RESET>
 149                <RED>[-h(4)-]<RESET><GREEN>{+h(4),hh[44]+}<RESET>
 150
 151                a = b + c<RESET>
 152
 153                <GREEN>{+aa = a+}<RESET>
 154
 155                <GREEN>{+aeff = aeff * ( aaa )+}<RESET>
 156        EOF
 157        word_diff --word-diff=plain --color
 158'
 159
 160test_expect_success 'word diff without context' '
 161        cat >expect <<-\EOF &&
 162                <BOLD>diff --git a/pre b/post<RESET>
 163                <BOLD>index 330b04f..5ed8eff 100644<RESET>
 164                <BOLD>--- a/pre<RESET>
 165                <BOLD>+++ b/post<RESET>
 166                <CYAN>@@ -1 +1 @@<RESET>
 167                <RED>h(4)<RESET><GREEN>h(4),hh[44]<RESET>
 168                <CYAN>@@ -3,0 +4,4 @@<RESET> <RESET><MAGENTA>a = b + c<RESET>
 169
 170                <GREEN>aa = a<RESET>
 171
 172                <GREEN>aeff = aeff * ( aaa )<RESET>
 173        EOF
 174        word_diff --color-words --unified=0
 175'
 176
 177test_expect_success 'word diff with a regular expression' '
 178        cp expect.letter-runs-are-words expect &&
 179        word_diff --color-words="[a-z]+"
 180'
 181
 182test_expect_success 'set up a diff driver' '
 183        git config diff.testdriver.wordRegex "[^[:space:]]" &&
 184        cat <<-\EOF >.gitattributes
 185                pre diff=testdriver
 186                post diff=testdriver
 187        EOF
 188'
 189
 190test_expect_success 'option overrides .gitattributes' '
 191        cp expect.letter-runs-are-words expect &&
 192        word_diff --color-words="[a-z]+"
 193'
 194
 195test_expect_success 'use regex supplied by driver' '
 196        cp expect.non-whitespace-is-word expect &&
 197        word_diff --color-words
 198'
 199
 200test_expect_success 'set up diff.wordRegex option' '
 201        git config diff.wordRegex "[[:alnum:]]+"
 202'
 203
 204test_expect_success 'command-line overrides config' '
 205        cp expect.letter-runs-are-words expect &&
 206        word_diff --color-words="[a-z]+"
 207'
 208
 209test_expect_success 'command-line overrides config: --word-diff-regex' '
 210        cat >expect <<-\EOF &&
 211                <BOLD>diff --git a/pre b/post<RESET>
 212                <BOLD>index 330b04f..5ed8eff 100644<RESET>
 213                <BOLD>--- a/pre<RESET>
 214                <BOLD>+++ b/post<RESET>
 215                <CYAN>@@ -1,3 +1,7 @@<RESET>
 216                h(4),<GREEN>{+hh+}<RESET>[44]
 217
 218                a = b + c<RESET>
 219
 220                <GREEN>{+aa = a+}<RESET>
 221
 222                <GREEN>{+aeff = aeff * ( aaa+}<RESET> )
 223        EOF
 224        word_diff --color --word-diff-regex="[a-z]+"
 225'
 226
 227test_expect_success '.gitattributes override config' '
 228        cp expect.non-whitespace-is-word expect &&
 229        word_diff --color-words
 230'
 231
 232test_expect_success 'setup: remove diff driver regex' '
 233        test_unconfig diff.testdriver.wordRegex
 234'
 235
 236test_expect_success 'use configured regex' '
 237        cat >expect <<-\EOF &&
 238                <BOLD>diff --git a/pre b/post<RESET>
 239                <BOLD>index 330b04f..5ed8eff 100644<RESET>
 240                <BOLD>--- a/pre<RESET>
 241                <BOLD>+++ b/post<RESET>
 242                <CYAN>@@ -1,3 +1,7 @@<RESET>
 243                h(4),<GREEN>hh[44<RESET>]
 244
 245                a = b + c<RESET>
 246
 247                <GREEN>aa = a<RESET>
 248
 249                <GREEN>aeff = aeff * ( aaa<RESET> )
 250        EOF
 251        word_diff --color-words
 252'
 253
 254test_expect_success 'test parsing words for newline' '
 255        echo "aaa (aaa)" >pre &&
 256        echo "aaa (aaa) aaa" >post &&
 257        cat >expect <<-\EOF &&
 258                <BOLD>diff --git a/pre b/post<RESET>
 259                <BOLD>index c29453b..be22f37 100644<RESET>
 260                <BOLD>--- a/pre<RESET>
 261                <BOLD>+++ b/post<RESET>
 262                <CYAN>@@ -1 +1 @@<RESET>
 263                aaa (aaa) <GREEN>aaa<RESET>
 264        EOF
 265        word_diff --color-words="a+"
 266'
 267
 268test_expect_success 'test when words are only removed at the end' '
 269        echo "(:" >pre &&
 270        echo "(" >post &&
 271        cat >expect <<-\EOF &&
 272                <BOLD>diff --git a/pre b/post<RESET>
 273                <BOLD>index 289cb9d..2d06f37 100644<RESET>
 274                <BOLD>--- a/pre<RESET>
 275                <BOLD>+++ b/post<RESET>
 276                <CYAN>@@ -1 +1 @@<RESET>
 277                (<RED>:<RESET>
 278        EOF
 279        word_diff --color-words=.
 280'
 281
 282test_expect_success '--word-diff=none' '
 283        echo "(:" >pre &&
 284        echo "(" >post &&
 285        cat >expect <<-\EOF &&
 286                diff --git a/pre b/post
 287                index 289cb9d..2d06f37 100644
 288                --- a/pre
 289                +++ b/post
 290                @@ -1 +1 @@
 291                -(:
 292                +(
 293        EOF
 294        word_diff --word-diff=plain --word-diff=none
 295'
 296
 297test_expect_success 'unset default driver' '
 298        test_unconfig diff.wordregex
 299'
 300
 301test_language_driver ada
 302test_language_driver bibtex
 303test_language_driver cpp
 304test_language_driver csharp
 305test_language_driver css
 306test_language_driver fortran
 307test_language_driver html
 308test_language_driver java
 309test_language_driver matlab
 310test_language_driver objc
 311test_language_driver pascal
 312test_language_driver perl
 313test_language_driver php
 314test_language_driver python
 315test_language_driver ruby
 316test_language_driver tex
 317
 318test_expect_success 'word-diff with diff.sbe' '
 319        cat >expect <<-\EOF &&
 320        diff --git a/pre b/post
 321        index a1a53b5..bc8fe6d 100644
 322        --- a/pre
 323        +++ b/post
 324        @@ -1,3 +1,3 @@
 325        a
 326
 327        [-b-]{+c+}
 328        EOF
 329        cat >pre <<-\EOF &&
 330        a
 331
 332        b
 333        EOF
 334        cat >post <<-\EOF &&
 335        a
 336
 337        c
 338        EOF
 339        test_config diff.suppress-blank-empty true &&
 340        word_diff --word-diff=plain
 341'
 342
 343test_expect_success 'word-diff with no newline at EOF' '
 344        cat >expect <<-\EOF &&
 345        diff --git a/pre b/post
 346        index 7bf316e..3dd0303 100644
 347        --- a/pre
 348        +++ b/post
 349        @@ -1 +1 @@
 350        a a [-a-]{+ab+} a a
 351        EOF
 352        printf "%s" "a a a a a" >pre &&
 353        printf "%s" "a a ab a a" >post &&
 354        word_diff --word-diff=plain
 355'
 356
 357test_expect_success 'setup history with two files' '
 358        echo "a b; c" >a.tex &&
 359        echo "a b; c" >z.txt &&
 360        git add a.tex z.txt &&
 361        git commit -minitial &&
 362
 363        # modify both
 364        echo "a bx; c" >a.tex &&
 365        echo "a bx; c" >z.txt &&
 366        git commit -mmodified -a
 367'
 368
 369test_expect_success 'wordRegex for the first file does not apply to the second' '
 370        echo "*.tex diff=tex" >.gitattributes &&
 371        test_config diff.tex.wordRegex "[a-z]+|." &&
 372        cat >expect <<-\EOF &&
 373                diff --git a/a.tex b/a.tex
 374                --- a/a.tex
 375                +++ b/a.tex
 376                @@ -1 +1 @@
 377                a [-b-]{+bx+}; c
 378                diff --git a/z.txt b/z.txt
 379                --- a/z.txt
 380                +++ b/z.txt
 381                @@ -1 +1 @@
 382                a [-b;-]{+bx;+} c
 383        EOF
 384        git diff --word-diff HEAD~ >actual &&
 385        compare_diff_patch expect actual
 386'
 387
 388test_done