181 lines
3.6 KiB
Go
181 lines
3.6 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os/exec"
|
|
"regexp"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestTestsToRegexp(t *testing.T) {
|
|
for _, test := range []struct {
|
|
in []string
|
|
want string
|
|
}{
|
|
{
|
|
in: []string{},
|
|
want: "",
|
|
},
|
|
{
|
|
in: []string{"TestOne"},
|
|
want: "^TestOne$",
|
|
},
|
|
{
|
|
in: []string{"TestOne", "TestTwo"},
|
|
want: "^(TestOne|TestTwo)$",
|
|
},
|
|
{
|
|
in: []string{"TestOne", "TestTwo", "TestThree"},
|
|
want: "^(TestOne|TestThree|TestTwo)$",
|
|
},
|
|
{
|
|
in: []string{"TestOne/Sub1"},
|
|
want: "^TestOne$/^Sub1$",
|
|
},
|
|
{
|
|
in: []string{
|
|
"TestOne/Sub1",
|
|
"TestTwo",
|
|
},
|
|
want: "^(TestOne|TestTwo)$/^Sub1$",
|
|
},
|
|
{
|
|
in: []string{
|
|
"TestOne/Sub1",
|
|
"TestOne/Sub2",
|
|
"TestTwo",
|
|
},
|
|
want: "^(TestOne|TestTwo)$/^(Sub1|Sub2)$",
|
|
},
|
|
{
|
|
in: []string{
|
|
"TestOne/Sub1",
|
|
"TestOne/Sub2/SubSub1",
|
|
"TestTwo",
|
|
},
|
|
want: "^(TestOne|TestTwo)$/^(Sub1|Sub2)$/^SubSub1$",
|
|
},
|
|
{
|
|
in: []string{
|
|
"TestTests/A1",
|
|
"TestTests/B/B1",
|
|
"TestTests/C/C3/C31",
|
|
},
|
|
want: "^TestTests$/^(A1|B|C)$/^(B1|C3)$/^C31$",
|
|
},
|
|
} {
|
|
got := testsToRegexp(test.in)
|
|
assert.Equal(t, test.want, got, fmt.Sprintf("in=%v want=%q got=%q", test.in, test.want, got))
|
|
}
|
|
}
|
|
|
|
var runRe = regexp.MustCompile(`(?m)^\s*=== RUN\s*(Test.*?)\s*$`)
|
|
|
|
// Test the regexp work with the -run flag in actually selecting the right tests
|
|
func TestTestsToRegexpLive(t *testing.T) {
|
|
for _, test := range []struct {
|
|
in []string
|
|
want []string
|
|
}{
|
|
{
|
|
in: []string{
|
|
"TestTests/A1",
|
|
"TestTests/C/C3",
|
|
},
|
|
want: []string{
|
|
"TestTests",
|
|
"TestTests/A1",
|
|
"TestTests/C",
|
|
"TestTests/C/C3",
|
|
"TestTests/C/C3/C31",
|
|
"TestTests/C/C3/C32",
|
|
},
|
|
},
|
|
{
|
|
in: []string{
|
|
"TestTests",
|
|
"TestTests/A1",
|
|
"TestTests/B",
|
|
"TestTests/B/B1",
|
|
"TestTests/C",
|
|
},
|
|
want: []string{
|
|
"TestTests",
|
|
"TestTests/A1",
|
|
"TestTests/B",
|
|
"TestTests/B/B1",
|
|
"TestTests/C",
|
|
// FIXME there doesn't seem to be a way to select a non-terminal test
|
|
// and all of its subtests if there is a longer path (in this case B/B1)
|
|
// "TestTests/C/C1",
|
|
// "TestTests/C/C2",
|
|
// "TestTests/C/C3",
|
|
// "TestTests/C/C3/C31",
|
|
// "TestTests/C/C3/C32",
|
|
},
|
|
},
|
|
{
|
|
in: []string{
|
|
"TestTests/A1",
|
|
"TestTests/B/B1",
|
|
"TestTests/C/C3/C31",
|
|
},
|
|
want: []string{
|
|
"TestTests",
|
|
"TestTests/A1",
|
|
"TestTests/B",
|
|
"TestTests/B/B1",
|
|
"TestTests/C",
|
|
"TestTests/C/C3",
|
|
"TestTests/C/C3/C31",
|
|
},
|
|
},
|
|
{
|
|
in: []string{
|
|
"TestTests/B/B1",
|
|
"TestTests/C/C3/C31",
|
|
},
|
|
want: []string{
|
|
"TestTests",
|
|
"TestTests/B",
|
|
"TestTests/B/B1",
|
|
"TestTests/C",
|
|
"TestTests/C/C3",
|
|
"TestTests/C/C3/C31",
|
|
},
|
|
},
|
|
} {
|
|
runRegexp := testsToRegexp(test.in)
|
|
cmd := exec.Command("go", "test", "-v", "-run", runRegexp)
|
|
out, err := cmd.CombinedOutput()
|
|
require.NoError(t, err)
|
|
var got []string
|
|
for _, match := range runRe.FindAllSubmatch(out, -1) {
|
|
got = append(got, string(match[1]))
|
|
}
|
|
assert.Equal(t, test.want, got, fmt.Sprintf("in=%v want=%v got=%v, runRegexp=%q", test.in, test.want, got, runRegexp))
|
|
}
|
|
}
|
|
|
|
var nilTest = func(t *testing.T) {}
|
|
|
|
// Nested tests for TestTestsToRegexpLive to run
|
|
func TestTests(t *testing.T) {
|
|
t.Run("A1", nilTest)
|
|
t.Run("A2", nilTest)
|
|
t.Run("B", func(t *testing.T) {
|
|
t.Run("B1", nilTest)
|
|
t.Run("B2", nilTest)
|
|
})
|
|
t.Run("C", func(t *testing.T) {
|
|
t.Run("C1", nilTest)
|
|
t.Run("C2", nilTest)
|
|
t.Run("C3", func(t *testing.T) {
|
|
t.Run("C31", nilTest)
|
|
t.Run("C32", nilTest)
|
|
})
|
|
})
|
|
}
|