// Copyright 2022 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package gitdiff
import (
	"fmt"
	"strings"
	"testing"
	"github.com/sergi/go-diff/diffmatchpatch"
	"github.com/stretchr/testify/assert"
)
func TestDiffWithHighlight(t *testing.T) {
	hcd := newHighlightCodeDiff()
	diffs := hcd.diffWithHighlight(
		"main.v", "",
		"		run('<>')\n",
		"		run(db)\n",
	)
	expected := `		run('<>')`
	output := diffToHTML(nil, diffs, DiffLineDel)
	assert.Equal(t, expected, output)
	expected = `		run(db)`
	output = diffToHTML(nil, diffs, DiffLineAdd)
	assert.Equal(t, expected, output)
	hcd = newHighlightCodeDiff()
	hcd.placeholderTokenMap['O'] = ""
	hcd.placeholderTokenMap['C'] = ""
	diff := diffmatchpatch.Diff{}
	diff.Text = "OC"
	hcd.recoverOneDiff(&diff)
	assert.Equal(t, "", diff.Text)
	diff.Text = "O"
	hcd.recoverOneDiff(&diff)
	assert.Equal(t, "", diff.Text)
	diff.Text = "C"
	hcd.recoverOneDiff(&diff)
	assert.Equal(t, "", diff.Text)
}
func TestDiffWithHighlightPlaceholder(t *testing.T) {
	hcd := newHighlightCodeDiff()
	diffs := hcd.diffWithHighlight(
		"main.js", "",
		"a='\U00100000'",
		"a='\U0010FFFD''",
	)
	assert.Equal(t, "", hcd.placeholderTokenMap[0x00100000])
	assert.Equal(t, "", hcd.placeholderTokenMap[0x0010FFFD])
	expected := fmt.Sprintf(`a='%s'`, "\U00100000")
	output := diffToHTML(hcd.lineWrapperTags, diffs, DiffLineDel)
	assert.Equal(t, expected, output)
	hcd = newHighlightCodeDiff()
	diffs = hcd.diffWithHighlight(
		"main.js", "",
		"a='\U00100000'",
		"a='\U0010FFFD'",
	)
	expected = fmt.Sprintf(`a='%s'`, "\U0010FFFD")
	output = diffToHTML(nil, diffs, DiffLineAdd)
	assert.Equal(t, expected, output)
}
func TestDiffWithHighlightPlaceholderExhausted(t *testing.T) {
	hcd := newHighlightCodeDiff()
	hcd.placeholderMaxCount = 0
	diffs := hcd.diffWithHighlight(
		"main.js", "",
		"'",
		``,
	)
	output := diffToHTML(nil, diffs, DiffLineDel)
	expected := fmt.Sprintf(`%s#39;`, "\uFFFD")
	assert.Equal(t, expected, output)
	hcd = newHighlightCodeDiff()
	hcd.placeholderMaxCount = 0
	diffs = hcd.diffWithHighlight(
		"main.js", "",
		"a < b",
		"a > b",
	)
	output = diffToHTML(nil, diffs, DiffLineDel)
	expected = fmt.Sprintf(`a %slt; b`, "\uFFFD")
	assert.Equal(t, expected, output)
	output = diffToHTML(nil, diffs, DiffLineAdd)
	expected = fmt.Sprintf(`a %sgt; b`, "\uFFFD")
	assert.Equal(t, expected, output)
}
func TestDiffWithHighlightTagMatch(t *testing.T) {
	totalOverflow := 0
	for i := 0; i < 100; i++ {
		hcd := newHighlightCodeDiff()
		hcd.placeholderMaxCount = i
		diffs := hcd.diffWithHighlight(
			"main.js", "",
			"a='1'",
			"b='2'",
		)
		totalOverflow += hcd.placeholderOverflowCount
		output := diffToHTML(nil, diffs, DiffLineDel)
		c1 := strings.Count(output, "