You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

highlightdiff_test.go 3.6KB

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