package apobject import ( "strings" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "golang.org/x/net/html" ) const testCodeBlockFacetType = "social.coves.richtext.facet#codeBlock" func TestBuildNote_CodeBlockExpandsPartialMultilineRangeAndPreservesLiteralSource(t *testing.T) { const ( plaintext = "before\nfmt.Println(\"``` * © C:\\\\tmp\")\nsecond_line # [x]\nafter" codeText = "fmt.Println(\"``` * © C:\\\\tmp\")\nsecond_line # [x]" ) start := strings.Index(plaintext, "Println") end := strings.Index(plaintext, " # [x]") markdown, content := buildTestNote(t, plaintext, []any{ testFacet(start, end, testCodeBlockFeature("go_1+x-")), }) const expectedMarkdown = "before\n\n````go_1+x-\n" + codeText + "\n````\n\nafter" assert.Equal(t, expectedMarkdown, markdown) assert.Equal(t, "

before

\n
"+
		"fmt.Println("``` * <tag> &copy; C:\\\\tmp")\nsecond_line # [x]"+
		"
\n

after

\n", content) requireCodeBlock(t, parseTestHTML(t, content), codeText, "language-go_1+x-") requireCodeBlock(t, parseRenderedMarkdown(t, markdown), codeText+"\n", "language-go_1+x-") } func TestBuildNote_CodeBlockUsesMinimumFenceAndValidatesLanguage(t *testing.T) { const plaintext = "a*b © C:\\tmp" tests := []struct { name string feature map[string]any info string language string }{ {name: "language absent", feature: testCodeBlockFeature(""), info: ""}, {name: "safe forty byte language", feature: testCodeBlockFeature(strings.Repeat("a", 37) + "_+-"), info: strings.Repeat("a", 37) + "_+-", language: "language-" + strings.Repeat("a", 37) + "_+-"}, {name: "over forty bytes", feature: testCodeBlockFeature(strings.Repeat("a", 41)), info: ""}, {name: "space", feature: testCodeBlockFeature("go lang"), info: ""}, {name: "non ASCII", feature: testCodeBlockFeature("gö"), info: ""}, {name: "HTML", feature: testCodeBlockFeature("