code.gitea.io/gitea@v1.21.7/services/gitdiff/highlightdiff_test.go (about) 1 // Copyright 2022 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package gitdiff 5 6 import ( 7 "fmt" 8 "strings" 9 "testing" 10 11 "github.com/sergi/go-diff/diffmatchpatch" 12 "github.com/stretchr/testify/assert" 13 ) 14 15 func TestDiffWithHighlight(t *testing.T) { 16 hcd := newHighlightCodeDiff() 17 diffs := hcd.diffWithHighlight( 18 "main.v", "", 19 " run('<>')\n", 20 " run(db)\n", 21 ) 22 23 expected := ` <span class="n">run</span><span class="o">(</span><span class="removed-code"><span class="k">'</span><span class="o"><</span><span class="o">></span><span class="k">'</span></span><span class="o">)</span>` 24 output := diffToHTML(nil, diffs, DiffLineDel) 25 assert.Equal(t, expected, output) 26 27 expected = ` <span class="n">run</span><span class="o">(</span><span class="added-code"><span class="n">db</span></span><span class="o">)</span>` 28 output = diffToHTML(nil, diffs, DiffLineAdd) 29 assert.Equal(t, expected, output) 30 31 hcd = newHighlightCodeDiff() 32 hcd.placeholderTokenMap['O'] = "<span>" 33 hcd.placeholderTokenMap['C'] = "</span>" 34 diff := diffmatchpatch.Diff{} 35 36 diff.Text = "OC" 37 hcd.recoverOneDiff(&diff) 38 assert.Equal(t, "<span></span>", diff.Text) 39 40 diff.Text = "O" 41 hcd.recoverOneDiff(&diff) 42 assert.Equal(t, "<span></span>", diff.Text) 43 44 diff.Text = "C" 45 hcd.recoverOneDiff(&diff) 46 assert.Equal(t, "", diff.Text) 47 } 48 49 func TestDiffWithHighlightPlaceholder(t *testing.T) { 50 hcd := newHighlightCodeDiff() 51 diffs := hcd.diffWithHighlight( 52 "main.js", "", 53 "a='\U00100000'", 54 "a='\U0010FFFD''", 55 ) 56 assert.Equal(t, "", hcd.placeholderTokenMap[0x00100000]) 57 assert.Equal(t, "", hcd.placeholderTokenMap[0x0010FFFD]) 58 59 expected := fmt.Sprintf(`<span class="nx">a</span><span class="o">=</span><span class="s1">'</span><span class="removed-code">%s</span>'`, "\U00100000") 60 output := diffToHTML(hcd.lineWrapperTags, diffs, DiffLineDel) 61 assert.Equal(t, expected, output) 62 63 hcd = newHighlightCodeDiff() 64 diffs = hcd.diffWithHighlight( 65 "main.js", "", 66 "a='\U00100000'", 67 "a='\U0010FFFD'", 68 ) 69 expected = fmt.Sprintf(`<span class="nx">a</span><span class="o">=</span><span class="s1">'</span><span class="added-code">%s</span>'`, "\U0010FFFD") 70 output = diffToHTML(nil, diffs, DiffLineAdd) 71 assert.Equal(t, expected, output) 72 } 73 74 func TestDiffWithHighlightPlaceholderExhausted(t *testing.T) { 75 hcd := newHighlightCodeDiff() 76 hcd.placeholderMaxCount = 0 77 diffs := hcd.diffWithHighlight( 78 "main.js", "", 79 "'", 80 ``, 81 ) 82 output := diffToHTML(nil, diffs, DiffLineDel) 83 expected := fmt.Sprintf(`<span class="removed-code">%s#39;</span>`, "\uFFFD") 84 assert.Equal(t, expected, output) 85 86 hcd = newHighlightCodeDiff() 87 hcd.placeholderMaxCount = 0 88 diffs = hcd.diffWithHighlight( 89 "main.js", "", 90 "a < b", 91 "a > b", 92 ) 93 output = diffToHTML(nil, diffs, DiffLineDel) 94 expected = fmt.Sprintf(`a %s<span class="removed-code">l</span>t; b`, "\uFFFD") 95 assert.Equal(t, expected, output) 96 97 output = diffToHTML(nil, diffs, DiffLineAdd) 98 expected = fmt.Sprintf(`a %s<span class="added-code">g</span>t; b`, "\uFFFD") 99 assert.Equal(t, expected, output) 100 } 101 102 func TestDiffWithHighlightTagMatch(t *testing.T) { 103 totalOverflow := 0 104 for i := 0; i < 100; i++ { 105 hcd := newHighlightCodeDiff() 106 hcd.placeholderMaxCount = i 107 diffs := hcd.diffWithHighlight( 108 "main.js", "", 109 "a='1'", 110 "b='2'", 111 ) 112 totalOverflow += hcd.placeholderOverflowCount 113 114 output := diffToHTML(nil, diffs, DiffLineDel) 115 c1 := strings.Count(output, "<span") 116 c2 := strings.Count(output, "</span") 117 assert.Equal(t, c1, c2) 118 119 output = diffToHTML(nil, diffs, DiffLineAdd) 120 c1 = strings.Count(output, "<span") 121 c2 = strings.Count(output, "</span") 122 assert.Equal(t, c1, c2) 123 } 124 assert.NotZero(t, totalOverflow) 125 }