1// Copyright 2022 The Gitea Authors. All rights reserved.
2// SPDX-License-Identifier: MIT
3
4package gitdiff
5
6import (
7 "fmt"
8 "strings"
9 "testing"
10
11 "github.com/sergi/go-diff/diffmatchpatch"
12 "github.com/stretchr/testify/assert"
13)
14
15func 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.Empty(t, diff.Text)
47}
48
49func TestDiffWithHighlightPlaceholder(t *testing.T) {
50 hcd := NewHighlightCodeDiff()
51 diffs := hcd.diffWithHighlight(
52 "main.js", "",
53 "a='\U00100000'",
54 "a='\U0010FFFD''",
55 )
56 assert.Empty(t, hcd.PlaceholderTokenMap[0x00100000])
57 assert.Empty(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
74func 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
102func 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}