Skip to content

Commit

Permalink
Start adding tests (and fix some bugs revealed by the tests)
Browse files Browse the repository at this point in the history
  • Loading branch information
lesiw committed Aug 12, 2024
1 parent 540eead commit f932729
Show file tree
Hide file tree
Showing 8 changed files with 1,727 additions and 20 deletions.
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ go 1.22.5

require (
golang.org/x/tools v0.23.0
lesiw.io/cmdio v0.0.0-20240811224450-823cd2a17758
lesiw.io/flag v0.7.0
)

Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,7 @@ golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg=
golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI=
gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU=
gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
lesiw.io/cmdio v0.0.0-20240811224450-823cd2a17758 h1:QIfzABD/gjhQjq0sJeaEREqIbxKur1726LCFWZNKZbA=
lesiw.io/cmdio v0.0.0-20240811224450-823cd2a17758/go.mod h1:1QvHpQzUItUIaITiA5aQAdZEvaNXn5c98EOaRxVsfXs=
lesiw.io/flag v0.7.0 h1:+8rTdoplDMBhOSKok5eKP6ZuLLPTodkDABRY7jfX5JU=
lesiw.io/flag v0.7.0/go.mod h1:bJx6Hir8MAXkNiO6BbrvhwZuaJF4rQWthQ7pc1DlWZY=
74 changes: 60 additions & 14 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,16 +35,16 @@ func main() {
var code int
defer func() { os.Exit(code) }()

if err := run(); err != nil {
if err := run(os.Args[1:]...); err != nil {
if err.Error() != "" {
fmt.Fprintln(os.Stderr, err)
}
code = 1
}
}

func run() error {
if err := flags.Parse(os.Args[1:]...); err != nil {
func run(args ...string) error {
if err := flags.Parse(args...); err != nil {
return errors.New("")
}
if *printver {
Expand Down Expand Up @@ -147,19 +147,20 @@ func generate(typ types.Type) error {
func(p *types.Package) string { return "" },
)
origin = strings.TrimLeft(origin, "*")
sig := types.SelectionString(sel, qualifier)
for range 2 {
_, sig, _ = strings.Cut(sig, " ") // Discard field.
}
mname, sig, _ := strings.Cut(sig, "(")
sig = "(" + sig
// sig := types.SelectionString(sel, qualifier)
// for range 2 {
// _, sig, _ = strings.Cut(sig, " ") // Discard field.
// }
// mname, sig, _ := strings.Cut(sig, "(")
// sig = "(" + sig
tsig := sel.Obj().Type().(*types.Signature)
mname := sel.Obj().Name()
out.WriteString(
fmt.Sprintf(
fn,
tname,
mname,
sig,
sig(sel),
args(tsig.Params(), tsig.Variadic()),
origin,
args(tsig.Params(), false),
Expand Down Expand Up @@ -192,14 +193,53 @@ func snakecase(s string) string {
return result.String()
}

func sig(sel *types.Selection) string {
var b strings.Builder
b.WriteString(sel.Obj().Name())
sig := sel.Obj().Type().(*types.Signature)
b.WriteString("(")
for i := range sig.Params().Len() {
p := sig.Params().At(i)
if i > 0 {
b.WriteString(", ")
}
b.WriteString(cmp.Or(p.Name(), fmt.Sprintf("p%d", i)))
b.WriteString(" ")
if i == sig.Params().Len()-1 && sig.Variadic() {
b.WriteString("...")
b.WriteString(p.Type().String()[2:])
} else {
b.WriteString(p.Type().String())
}
}
b.WriteString(")")
if sig.Results().Len() > 0 {
b.WriteString(" ")
if sig.Results().Len() > 1 {
b.WriteString("(")
}
for i := range sig.Results().Len() {
r := sig.Results().At(i)
if i > 0 {
b.WriteString(", ")
}
b.WriteString(r.Type().String())
}
if sig.Results().Len() > 1 {
b.WriteString(")")
}
}
return b.String()
}

func args(tup *types.Tuple, variadic bool) string {
var b strings.Builder
for i := range tup.Len() {
v := tup.At(i)
if i > 0 {
b.WriteString(", ")
}
b.WriteString(v.Name())
b.WriteString(cmp.Or(v.Name(), fmt.Sprintf("p%d", i)))
if i == tup.Len()-1 && variadic {
b.WriteString("...")
}
Expand Down Expand Up @@ -310,21 +350,27 @@ func importblock() string {
}

func paramfields(sig *types.Signature) string {
var b strings.Builder
params := sig.Params()
if params.Len() == 0 {
return ""
}
var b strings.Builder
b.WriteString("\n")
for i := range params.Len() {
if i > 0 {
b.WriteString("\n")
}
param := params.At(i)
b.WriteString(fmt.Sprintf("\t%s %s", param.Name(),
b.WriteString(fmt.Sprintf("\t%s %s",
cmp.Or(param.Name(), fmt.Sprintf("p%d", i)),
types.TypeString(param.Type(), qualifier),
))
}
b.WriteString("\n")
return b.String()
}

func ternary[T any](cond bool, t T, f T) T {
func ternary[T any](cond bool, t, f T) T {
if cond {
return t
} else {
Expand Down
30 changes: 30 additions & 0 deletions main_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package main

import (
"os"
"path/filepath"
"testing"

"lesiw.io/cmdio/sys"
)

func TestMoxie(t *testing.T) {
if err := os.Chdir("testdata/"); err != nil {
t.Fatalf("failed to change directory: %s", err)
}
matches, err := filepath.Glob("mock_*.go")
if err != nil {
t.Fatalf("failed to match mock files: %s", err)
}
for _, file := range matches {
if err := os.Remove(file); err != nil {
t.Fatalf("failed to remove %q: %s", file, err)
}
}
if err := run("M0"); err != nil {
t.Fatalf("failed to run moxie: %s", err)
}
if err := sys.Run("go", "test", "."); err != nil {
t.Fatalf("failed to run tests: %s", err)
}
}
9 changes: 3 additions & 6 deletions template.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,7 @@ func _%[1]sPtrData(t *%[1]s) *_%[1]sData {
// 1: type
// 2: method name
// 3: structified parameters
const calltype = `type _%[1]s_%[2]s_Call struct {
%[3]s
}
const calltype = `type _%[1]s_%[2]s_Call struct {%[3]s}
`

// offsets
Expand All @@ -65,7 +62,8 @@ const calltype = `type _%[1]s_%[2]s_Call struct {
// 11: "return " if method has return values
//
//nolint:lll
const fn = `func (_recv *%[1]s) %[2]s%[3]s {
const fn = `
func (_recv *%[1]s) %[3]s {
if _recv == nil {
panic("%[1]s.%[2]s: nil pointer receiver")
}
Expand Down Expand Up @@ -122,5 +120,4 @@ func (_recv *%[1]s) _%[2]s_Calls() []_%[1]s_%[2]s_Call {
_dat.mutex.Lock()
return _dat.%[2]sCalls
}
`
Loading

0 comments on commit f932729

Please sign in to comment.