mirror of
https://github.com/dutchcoders/transfer.sh.git
synced 2020-11-18 19:53:40 -08:00
270 lines
7.0 KiB
Go
270 lines
7.0 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"regexp"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/golang/mock/mockgen/model"
|
|
)
|
|
|
|
func TestMakeArgString(t *testing.T) {
|
|
testCases := []struct {
|
|
argNames []string
|
|
argTypes []string
|
|
argString string
|
|
}{
|
|
{
|
|
argNames: nil,
|
|
argTypes: nil,
|
|
argString: "",
|
|
},
|
|
{
|
|
argNames: []string{"arg0"},
|
|
argTypes: []string{"int"},
|
|
argString: "arg0 int",
|
|
},
|
|
{
|
|
argNames: []string{"arg0", "arg1"},
|
|
argTypes: []string{"int", "bool"},
|
|
argString: "arg0 int, arg1 bool",
|
|
},
|
|
{
|
|
argNames: []string{"arg0", "arg1"},
|
|
argTypes: []string{"int", "int"},
|
|
argString: "arg0, arg1 int",
|
|
},
|
|
{
|
|
argNames: []string{"arg0", "arg1", "arg2"},
|
|
argTypes: []string{"bool", "int", "int"},
|
|
argString: "arg0 bool, arg1, arg2 int",
|
|
},
|
|
{
|
|
argNames: []string{"arg0", "arg1", "arg2"},
|
|
argTypes: []string{"int", "bool", "int"},
|
|
argString: "arg0 int, arg1 bool, arg2 int",
|
|
},
|
|
{
|
|
argNames: []string{"arg0", "arg1", "arg2"},
|
|
argTypes: []string{"int", "int", "bool"},
|
|
argString: "arg0, arg1 int, arg2 bool",
|
|
},
|
|
{
|
|
argNames: []string{"arg0", "arg1", "arg2"},
|
|
argTypes: []string{"int", "int", "int"},
|
|
argString: "arg0, arg1, arg2 int",
|
|
},
|
|
{
|
|
argNames: []string{"arg0", "arg1", "arg2", "arg3"},
|
|
argTypes: []string{"bool", "int", "int", "int"},
|
|
argString: "arg0 bool, arg1, arg2, arg3 int",
|
|
},
|
|
{
|
|
argNames: []string{"arg0", "arg1", "arg2", "arg3"},
|
|
argTypes: []string{"int", "bool", "int", "int"},
|
|
argString: "arg0 int, arg1 bool, arg2, arg3 int",
|
|
},
|
|
{
|
|
argNames: []string{"arg0", "arg1", "arg2", "arg3"},
|
|
argTypes: []string{"int", "int", "bool", "int"},
|
|
argString: "arg0, arg1 int, arg2 bool, arg3 int",
|
|
},
|
|
{
|
|
argNames: []string{"arg0", "arg1", "arg2", "arg3"},
|
|
argTypes: []string{"int", "int", "int", "bool"},
|
|
argString: "arg0, arg1, arg2 int, arg3 bool",
|
|
},
|
|
{
|
|
argNames: []string{"arg0", "arg1", "arg2", "arg3", "arg4"},
|
|
argTypes: []string{"bool", "int", "int", "int", "bool"},
|
|
argString: "arg0 bool, arg1, arg2, arg3 int, arg4 bool",
|
|
},
|
|
{
|
|
argNames: []string{"arg0", "arg1", "arg2", "arg3", "arg4"},
|
|
argTypes: []string{"int", "bool", "int", "int", "bool"},
|
|
argString: "arg0 int, arg1 bool, arg2, arg3 int, arg4 bool",
|
|
},
|
|
{
|
|
argNames: []string{"arg0", "arg1", "arg2", "arg3", "arg4"},
|
|
argTypes: []string{"int", "int", "bool", "int", "bool"},
|
|
argString: "arg0, arg1 int, arg2 bool, arg3 int, arg4 bool",
|
|
},
|
|
{
|
|
argNames: []string{"arg0", "arg1", "arg2", "arg3", "arg4"},
|
|
argTypes: []string{"int", "int", "int", "bool", "bool"},
|
|
argString: "arg0, arg1, arg2 int, arg3, arg4 bool",
|
|
},
|
|
{
|
|
argNames: []string{"arg0", "arg1", "arg2", "arg3", "arg4"},
|
|
argTypes: []string{"int", "int", "bool", "bool", "int"},
|
|
argString: "arg0, arg1 int, arg2, arg3 bool, arg4 int",
|
|
},
|
|
}
|
|
|
|
for i, tc := range testCases {
|
|
t.Run(fmt.Sprintf("#%d", i), func(t *testing.T) {
|
|
s := makeArgString(tc.argNames, tc.argTypes)
|
|
if s != tc.argString {
|
|
t.Errorf("result == %q, want %q", s, tc.argString)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestNewIdentifierAllocator(t *testing.T) {
|
|
a := newIdentifierAllocator([]string{"taken1", "taken2"})
|
|
if len(a) != 2 {
|
|
t.Fatalf("expected 2 items, got %v", len(a))
|
|
}
|
|
|
|
_, ok := a["taken1"]
|
|
if !ok {
|
|
t.Errorf("allocator doesn't contain 'taken1': %#v", a)
|
|
}
|
|
|
|
_, ok = a["taken2"]
|
|
if !ok {
|
|
t.Errorf("allocator doesn't contain 'taken2': %#v", a)
|
|
}
|
|
}
|
|
|
|
func allocatorContainsIdentifiers(a identifierAllocator, ids []string) bool {
|
|
if len(a) != len(ids) {
|
|
return false
|
|
}
|
|
|
|
for _, id := range ids {
|
|
_, ok := a[id]
|
|
if !ok {
|
|
return false
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
func TestIdentifierAllocator_allocateIdentifier(t *testing.T) {
|
|
a := newIdentifierAllocator([]string{"taken"})
|
|
|
|
t2 := a.allocateIdentifier("taken_2")
|
|
if t2 != "taken_2" {
|
|
t.Fatalf("expected 'taken_2', got %q", t2)
|
|
}
|
|
expected := []string{"taken", "taken_2"}
|
|
if !allocatorContainsIdentifiers(a, expected) {
|
|
t.Fatalf("allocator doesn't contain the expected items - allocator: %#v, expected items: %#v", a, expected)
|
|
}
|
|
|
|
t3 := a.allocateIdentifier("taken")
|
|
if t3 != "taken_3" {
|
|
t.Fatalf("expected 'taken_3', got %q", t3)
|
|
}
|
|
expected = []string{"taken", "taken_2", "taken_3"}
|
|
if !allocatorContainsIdentifiers(a, expected) {
|
|
t.Fatalf("allocator doesn't contain the expected items - allocator: %#v, expected items: %#v", a, expected)
|
|
}
|
|
|
|
t4 := a.allocateIdentifier("taken")
|
|
if t4 != "taken_4" {
|
|
t.Fatalf("expected 'taken_4', got %q", t4)
|
|
}
|
|
expected = []string{"taken", "taken_2", "taken_3", "taken_4"}
|
|
if !allocatorContainsIdentifiers(a, expected) {
|
|
t.Fatalf("allocator doesn't contain the expected items - allocator: %#v, expected items: %#v", a, expected)
|
|
}
|
|
|
|
id := a.allocateIdentifier("id")
|
|
if id != "id" {
|
|
t.Fatalf("expected 'id', got %q", id)
|
|
}
|
|
expected = []string{"taken", "taken_2", "taken_3", "taken_4", "id"}
|
|
if !allocatorContainsIdentifiers(a, expected) {
|
|
t.Fatalf("allocator doesn't contain the expected items - allocator: %#v, expected items: %#v", a, expected)
|
|
}
|
|
}
|
|
|
|
func TestGenerateMockInterface_Helper(t *testing.T) {
|
|
for _, test := range []struct {
|
|
Name string
|
|
Identifier string
|
|
HelperLine string
|
|
Methods []*model.Method
|
|
}{
|
|
{Name: "mock", Identifier: "MockSomename", HelperLine: "m.ctrl.T.Helper()"},
|
|
{Name: "recorder", Identifier: "MockSomenameMockRecorder", HelperLine: "mr.mock.ctrl.T.Helper()"},
|
|
{
|
|
Name: "mock identifier conflict",
|
|
Identifier: "MockSomename",
|
|
HelperLine: "m_2.ctrl.T.Helper()",
|
|
Methods: []*model.Method{
|
|
{
|
|
Name: "MethodA",
|
|
In: []*model.Parameter{
|
|
{
|
|
Name: "m",
|
|
Type: &model.NamedType{Type: "int"},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
Name: "recorder identifier conflict",
|
|
Identifier: "MockSomenameMockRecorder",
|
|
HelperLine: "mr_2.mock.ctrl.T.Helper()",
|
|
Methods: []*model.Method{
|
|
{
|
|
Name: "MethodA",
|
|
In: []*model.Parameter{
|
|
{
|
|
Name: "mr",
|
|
Type: &model.NamedType{Type: "int"},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
} {
|
|
t.Run(test.Name, func(t *testing.T) {
|
|
g := generator{}
|
|
|
|
if len(test.Methods) == 0 {
|
|
test.Methods = []*model.Method{
|
|
{Name: "MethodA"},
|
|
{Name: "MethodB"},
|
|
}
|
|
}
|
|
|
|
if err := g.GenerateMockInterface(&model.Interface{
|
|
Name: "Somename",
|
|
Methods: test.Methods,
|
|
}, "somepackage"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
lines := strings.Split(g.buf.String(), "\n")
|
|
|
|
// T.Helper() should be the first line
|
|
for _, method := range test.Methods {
|
|
if strings.TrimSpace(lines[findMethod(t, test.Identifier, method.Name, lines)+1]) != test.HelperLine {
|
|
t.Fatalf("method %s.%s did not declare itself a Helper method", test.Identifier, method.Name)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func findMethod(t *testing.T, identifier, methodName string, lines []string) int {
|
|
t.Helper()
|
|
r := regexp.MustCompile(fmt.Sprintf(`func\s+\(.+%s\)\s*%s`, identifier, methodName))
|
|
for i, line := range lines {
|
|
if r.MatchString(line) {
|
|
return i
|
|
}
|
|
}
|
|
|
|
t.Fatalf("unable to find 'func (m %s) %s'", identifier, methodName)
|
|
panic("unreachable")
|
|
}
|