This moves the following functions meant for use from tests into a
testutil subpackage.
func DoTestCase(m Markdown, testCase MarkdownTestCase, t TestingT)
func DoTestCaseFile(m Markdown, filename string, t TestingT)
func DoTestCases(m goldmark.Markdown, cases []MarkdownTestCase, t TestingT)
This will help keep the top-level goldmark package clean and limited to
core functionality.
(Note that tests in the top-level goldmark package that make use of
these functions must now use the package name `goldmark_test` so that
they're considered separate from the main `goldmark` package, otherwise
you'll see an import cycle: goldmark imports testutil imports goldmark.)
Currently, the DoTestCase, DoTestCaseFile, and DoTestCases functions,
are exposed as part of the public interface.
func DoTestCase(m Markdown, testCase MarkdownTestCase, t *testing.T)
func DoTestCaseFile(m Markdown, filename string, t *testing.T)
func DoTestCases(m goldmark.Markdown, cases []MarkdownTestCase, t *testing.T)
Implementing these functions requires importing the `testing` package.
Importing the `testing` package [automatically registers][1] a number of
global [command line flags][2].
[1]: https://golang.org/src/testing/testing.go#L252
[2]: https://golang.org/cmd/go/#hdr-Testing_flags
The effect of this is that any application using the standard `flag`
package with goldmark will automatically get a number of unwanted
command line flags. This is verifiable with the following program,
package main
import (
"flag"
_ "github.com/yuin/goldmark"
)
func main() {
flag.Parse()
}
To fix this, the `testing` import needs to be removed from all non-test
files. There are two ways to go about it,
- If the functions are meant for external use, you can define an
interface with a subset of the methods of `testing.T` and switch the
functions to consume that. This is what testing libraries like
[gomock] and [testify] do.
- If the functions are meant for internal use, you can remove them from
the public interface of the library and use them only from tests.
[gomock]: https://godoc.org/github.com/golang/mock/gomock#TestReporter
[testify]: https://godoc.org/github.com/stretchr/testify/require#TestingT
Since these functions are meant to be used by external extensions, I've
introduced a TestingT interface that is a subset of the functionality
provided by `testing.T`. It supports the standard operations: logging,
skiping, and failing tests,
Including the type of a constant improves discoverability because the
constant is listed next to the type in the godocs.
Before:
```
$ go doc -all . WalkStatus
type WalkStatus int
WalkStatus represents a current status of the Walk function.
```
After:
```shell
$ go doc -all . WalkStatus
type WalkStatus int
WalkStatus represents a current status of the Walk function.
const (
// WalkStop indicates no more walking needed.
WalkStop WalkStatus = iota + 1
// WalkSkipChildren indicates that Walk wont walk on children of current
// node.
WalkSkipChildren
// WalkContinue indicates that Walk can continue to walk.
WalkContinue
)
```
This commit the `iota`-based constants in the AST package to follow
this.