// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.

package markdown

import (
	"fmt"
	"strings"
	"testing"

	"github.com/stretchr/testify/assert"
)

func TestInspect(t *testing.T) {
	markdown := `
[foo]: bar
- a
  > [![]()]()
  > [![foo]][foo]
- d
`

	visited := []string{}
	level := 0
	Inspect(markdown, func(blockOrInline any) bool {
		if blockOrInline == nil {
			level--
		} else {
			visited = append(visited, strings.Repeat(" ", level*4)+strings.TrimPrefix(fmt.Sprintf("%T", blockOrInline), "*markdown."))
			level++
		}
		return true
	})

	assert.Equal(t, []string{
		"Document",
		"    Paragraph",
		"    List",
		"        ListItem",
		"            Paragraph",
		"                Text",
		"            BlockQuote",
		"                Paragraph",
		"                    InlineLink",
		"                        InlineImage",
		"                    SoftLineBreak",
		"                    ReferenceLink",
		"                        ReferenceImage",
		"                            Text",
		"        ListItem",
		"            Paragraph",
		"                Text",
	}, visited)
}

var counterSink int

func BenchmarkInspect(b *testing.B) {
	text := `Some standard piece of text.

Has a link [post](https://github.com) and also has a blockquote.

> This is a famous quote.

Some bold text **Text for markdown?** to go with it.

At the end, some more lines`

	for i := 0; i < b.N; i++ {
		Inspect(text, func(_ any) bool {
			counterSink++
			return true
		})
	}
}
