// // Markdown Processor for Go // Available at https://github.com/gomarkdown/markdown // // Copyright © 2011 Russ Ross . // Distributed under the Simplified BSD License. // See README.md for details. // // // Helper functions for unit testing // package markdown import ( "io/ioutil" "path/filepath" "regexp" "testing" ) type TestParams struct { extensions Extensions referenceOverride ReferenceOverrideFunc HTMLFlags HTMLRendererParameters } func execRecoverableTestSuite(t *testing.T, tests []string, params TestParams, suite func(candidate *string)) { // Catch and report panics. This is useful when running 'go test -v' on // the integration server. When developing, though, crash dump is often // preferable, so recovery can be easily turned off with doRecover = false. var candidate string const doRecover = true if doRecover { defer func() { if err := recover(); err != nil { t.Errorf("\npanic while processing [%#v]: %s\n", candidate, err) } }() } suite(&candidate) } func runMarkdown(input string, params TestParams) string { params.HTMLRendererParameters.Flags = params.HTMLFlags parser := NewParserWithExtensions(params.extensions) parser.ReferenceOverride = params.referenceOverride renderer := NewHTMLRenderer(params.HTMLRendererParameters) d := ToHTML([]byte(input), parser, renderer) return string(d) } // doTests runs full document tests using MarkdownCommon configuration. func doTests(t *testing.T, tests []string) { doTestsParam(t, tests, TestParams{ extensions: CommonExtensions, HTMLRendererParameters: HTMLRendererParameters{ Flags: CommonHTMLFlags, }, }) } func doTestsBlock(t *testing.T, tests []string, extensions Extensions) { doTestsParam(t, tests, TestParams{ extensions: extensions, HTMLFlags: UseXHTML, }) } func doTestsParam(t *testing.T, tests []string, params TestParams) { execRecoverableTestSuite(t, tests, params, func(candidate *string) { for i := 0; i+1 < len(tests); i += 2 { input := tests[i] *candidate = input expected := tests[i+1] actual := runMarkdown(*candidate, params) if actual != expected { t.Errorf("\nInput [%#v]\nExpected[%#v]\nActual [%#v]", *candidate, expected, actual) } } }) } func doTestsInline(t *testing.T, tests []string) { doTestsInlineParam(t, tests, TestParams{}) } func doLinkTestsInline(t *testing.T, tests []string) { doTestsInline(t, tests) prefix := "http://localhost" params := HTMLRendererParameters{AbsolutePrefix: prefix} transformTests := transformLinks(tests, prefix) doTestsInlineParam(t, transformTests, TestParams{ HTMLRendererParameters: params, }) doTestsInlineParam(t, transformTests, TestParams{ HTMLFlags: UseXHTML, HTMLRendererParameters: params, }) } func doSafeTestsInline(t *testing.T, tests []string) { doTestsInlineParam(t, tests, TestParams{HTMLFlags: Safelink}) // All the links in this test should not have the prefix appended, so // just rerun it with different parameters and the same expectations. prefix := "http://localhost" params := HTMLRendererParameters{AbsolutePrefix: prefix} transformTests := transformLinks(tests, prefix) doTestsInlineParam(t, transformTests, TestParams{ HTMLFlags: Safelink, HTMLRendererParameters: params, }) } func doTestsInlineParam(t *testing.T, tests []string, params TestParams) { params.extensions |= Autolink | Strikethrough params.HTMLFlags |= UseXHTML doTestsParam(t, tests, params) } func transformLinks(tests []string, prefix string) []string { newTests := make([]string, len(tests)) anchorRe := regexp.MustCompile(`