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">&#39;</span><span class="o">&lt;</span><span class="o">&gt;</span><span class="k">&#39;</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">&#39;</span><span class="removed-code">%s</span>&#39;`, "\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">&#39;</span><span class="added-code">%s</span>&#39;`, "\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  }