// GoToSocial
// Copyright (C) GoToSocial Authors admin@gotosocial.org
// SPDX-License-Identifier: AGPL-3.0-or-later
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see 
Here's a simple text in markdown.
Here's a link.
" withCodeBlockExpected = "Below is some JSON.
{\n  "key": "value",\n  "another_key": [\n    "value1",\n    "value2"\n  ]\n}\nthat was some JSON :)
" withInlineCode = "`Nobody tells you about theSECRET CODENobody tells you about the <code><del>SECRET CODE</del></code>, do they?
, do they?`"
	withInlineCode2Expected         = "Nobody tells you about the </code><del>SECRET CODE</del><code>, do they?
"
	withHashtag                     = "# Title\n\nhere's a simple status that uses hashtag #Hashtag!"
	withHashtagExpected             = "Title
here's a simple status that uses hashtag #Hashtag!
"
	mdWithHTML                      = "# Title\n\nHere's a simple text in markdown.\n\nHere's a link.\n\nHere's an image:  "
	mdWithHTMLExpected              = "
"
	mdWithHTMLExpected              = "Title
Here's a simple text in markdown.
Here's a link.
Here's an image:
"
	mdWithCheekyHTML                = "# Title\n\nHere's a simple text in markdown.\n\nHere's a cheeky little script: "
	mdWithCheekyHTMLExpected        = "Title
Here's a simple text in markdown.
Here's a cheeky little script:
"
	mdWithHashtagInitial            = "#welcome #Hashtag"
	mdWithHashtagInitialExpected    = ""
	mdCodeBlockWithNewlines         = "some code coming up\n\n```\n\n\n\n```\nthat was some code"
	mdCodeBlockWithNewlinesExpected = "some code coming up
\n\n\n
that was some code
"
	mdWithFootnote                  = "fox mulder,fbi.[^1]\n\n[^1]: federated bureau of investigation"
	mdWithFootnoteExpected          = "fox mulder,fbi.[^1]
[^1]: federated bureau of investigation
"
	mdWithBlockQuote                = "get ready, there's a block quote coming:\n\n>line1\n>line2\n>\n>line3\n\n"
	mdWithBlockQuoteExpected        = "get ready, there's a block quote coming:
line1
line2
line3
"
	mdHashtagAndCodeBlock           = "#Hashtag\n\n```\n#Hashtag\n```"
	mdHashtagAndCodeBlockExpected   = "#Hashtag\n
"
	mdMentionAndCodeBlock           = "@the_mighty_zork\n\n```\n@the_mighty_zork\n```"
	mdMentionAndCodeBlockExpected   = "@the_mighty_zork\n
"
	mdWithSmartypants               = "\"you have to quargle the bleepflorp\" they said with 1/2 of nominal speed and 1/3 of the usual glumping"
	mdWithSmartypantsExpected       = "\"you have to quargle the bleepflorp\" they said with 1/2 of nominal speed and 1/3 of the usual glumping
"
	mdWithAsciiHeart                = "hello <3 old friend <3 i loved u 3 :(( you stole my heart"
	mdWithAsciiHeartExpected        = "hello <3 old friend <3 i loved u </3 :(( you stole my heart
"
	mdWithStrikethrough             = "I have ~~mdae~~ made an error"
	mdWithStrikethroughExpected     = "I have mdae made an error
"
	mdWithLink                      = "Check out this code, i heard it was written by a sloth https://github.com/superseriousbusiness/gotosocial"
	mdWithLinkExpected              = "Check out this code, i heard it was written by a sloth https://github.com/superseriousbusiness/gotosocial
"
	mdObjectInCodeBlock             = "@foss_satan@fossbros-anonymous.io this is how to mention a user\n```\n@the_mighty_zork hey bud! nice #ObjectOrientedProgramming software you've been writing lately! :rainbow:\n```\nhope that helps"
	mdObjectInCodeBlockExpected     = "@foss_satan this is how to mention a user
@the_mighty_zork hey bud! nice #ObjectOrientedProgramming software you've been writing lately! :rainbow:\n
hope that helps
"
	// Hashtags can be italicized but only with *, not _.
	mdItalicHashtag          = "*#hashtag*"
	mdItalicHashtagExpected  = ""
	mdItalicHashtags         = "*#hashtag #hashtag #hashtag*"
	mdItalicHashtagsExpected = ""
	// Hashtags can end with or contain _ but not start with it.
	mdUnderscorePrefixHashtag         = "_#hashtag"
	mdUnderscorePrefixHashtagExpected = "_#hashtag
"
	mdUnderscoreSuffixHashtag         = "#hashtag_"
	mdUnderscoreSuffixHashtagExpected = ""
	// BEWARE: sneaky unicode business going on.
	// the first ö is one rune, the second ö is an o with a combining diacritic.
	mdUnnormalizedHashtag         = "#hellöthere #hellöthere"
	mdUnnormalizedHashtagExpected = ""
)
type MarkdownTestSuite struct {
	TextStandardTestSuite
}
func (suite *MarkdownTestSuite) TestParseSimple() {
	formatted := suite.FromMarkdown(simpleMarkdown)
	suite.Equal(simpleMarkdownExpected, formatted.HTML)
}
func (suite *MarkdownTestSuite) TestParseWithCodeBlock() {
	formatted := suite.FromMarkdown(withCodeBlock)
	suite.Equal(withCodeBlockExpected, formatted.HTML)
}
func (suite *MarkdownTestSuite) TestParseWithInlineCode() {
	formatted := suite.FromMarkdown(withInlineCode)
	suite.Equal(withInlineCodeExpected, formatted.HTML)
}
func (suite *MarkdownTestSuite) TestParseWithInlineCode2() {
	formatted := suite.FromMarkdown(withInlineCode2)
	suite.Equal(withInlineCode2Expected, formatted.HTML)
}
func (suite *MarkdownTestSuite) TestParseWithHashtag() {
	formatted := suite.FromMarkdown(withHashtag)
	suite.Equal(withHashtagExpected, formatted.HTML)
}
func (suite *MarkdownTestSuite) TestParseWithHTML() {
	formatted := suite.FromMarkdown(mdWithHTML)
	suite.Equal(mdWithHTMLExpected, formatted.HTML)
}
func (suite *MarkdownTestSuite) TestParseWithCheekyHTML() {
	formatted := suite.FromMarkdown(mdWithCheekyHTML)
	suite.Equal(mdWithCheekyHTMLExpected, formatted.HTML)
}
func (suite *MarkdownTestSuite) TestParseWithHashtagInitial() {
	formatted := suite.FromMarkdown(mdWithHashtagInitial)
	suite.Equal(mdWithHashtagInitialExpected, formatted.HTML)
}
func (suite *MarkdownTestSuite) TestParseCodeBlockWithNewlines() {
	formatted := suite.FromMarkdown(mdCodeBlockWithNewlines)
	suite.Equal(mdCodeBlockWithNewlinesExpected, formatted.HTML)
}
func (suite *MarkdownTestSuite) TestParseWithFootnote() {
	formatted := suite.FromMarkdown(mdWithFootnote)
	suite.Equal(mdWithFootnoteExpected, formatted.HTML)
}
func (suite *MarkdownTestSuite) TestParseWithBlockquote() {
	formatted := suite.FromMarkdown(mdWithBlockQuote)
	suite.Equal(mdWithBlockQuoteExpected, formatted.HTML)
}
func (suite *MarkdownTestSuite) TestParseHashtagWithCodeBlock() {
	formatted := suite.FromMarkdown(mdHashtagAndCodeBlock)
	suite.Equal(mdHashtagAndCodeBlockExpected, formatted.HTML)
}
func (suite *MarkdownTestSuite) TestParseMentionWithCodeBlock() {
	formatted := suite.FromMarkdown(mdMentionAndCodeBlock)
	suite.Equal(mdMentionAndCodeBlockExpected, formatted.HTML)
}
func (suite *MarkdownTestSuite) TestParseSmartypants() {
	formatted := suite.FromMarkdown(mdWithSmartypants)
	suite.Equal(mdWithSmartypantsExpected, formatted.HTML)
}
func (suite *MarkdownTestSuite) TestParseAsciiHeart() {
	formatted := suite.FromMarkdown(mdWithAsciiHeart)
	suite.Equal(mdWithAsciiHeartExpected, formatted.HTML)
}
func (suite *MarkdownTestSuite) TestParseStrikethrough() {
	formatted := suite.FromMarkdown(mdWithStrikethrough)
	suite.Equal(mdWithStrikethroughExpected, formatted.HTML)
}
func (suite *MarkdownTestSuite) TestParseLink() {
	formatted := suite.FromMarkdown(mdWithLink)
	suite.Equal(mdWithLinkExpected, formatted.HTML)
}
func (suite *MarkdownTestSuite) TestParseObjectInCodeBlock() {
	formatted := suite.FromMarkdown(mdObjectInCodeBlock)
	suite.Equal(mdObjectInCodeBlockExpected, formatted.HTML)
	suite.Len(formatted.Mentions, 1)
	suite.Equal("@foss_satan@fossbros-anonymous.io", formatted.Mentions[0].NameString)
	suite.Empty(formatted.Tags)
	suite.Empty(formatted.Emojis)
}
func (suite *MarkdownTestSuite) TestParseItalicHashtag() {
	formatted := suite.FromMarkdown(mdItalicHashtag)
	suite.Equal(mdItalicHashtagExpected, formatted.HTML)
}
func (suite *MarkdownTestSuite) TestParseItalicHashtags() {
	formatted := suite.FromMarkdown(mdItalicHashtags)
	suite.Equal(mdItalicHashtagsExpected, formatted.HTML)
}
func (suite *MarkdownTestSuite) TestParseHashtagUnderscorePrefix() {
	formatted := suite.FromMarkdown(mdUnderscorePrefixHashtag)
	suite.Equal(mdUnderscorePrefixHashtagExpected, formatted.HTML)
	suite.Empty(formatted.Tags)
}
func (suite *MarkdownTestSuite) TestParseHashtagUnderscoreSuffix() {
	formatted := suite.FromMarkdown(mdUnderscoreSuffixHashtag)
	suite.Equal(mdUnderscoreSuffixHashtagExpected, formatted.HTML)
	suite.NotEmpty(formatted.Tags)
	suite.Equal("hashtag_", formatted.Tags[0].Name)
}
func (suite *MarkdownTestSuite) TestParseUnnormalizedHashtag() {
	formatted := suite.FromMarkdown(mdUnnormalizedHashtag)
	suite.Equal(mdUnnormalizedHashtagExpected, formatted.HTML)
}
func TestMarkdownTestSuite(t *testing.T) {
	suite.Run(t, new(MarkdownTestSuite))
}