## Description Ref #12556 This PR continues with basic codegen infrastructure for depinject, this time adding the ability to generate `ast.Expr`'s for `reflect.Type` and `reflect.Value`. --- ### Author Checklist *All items are required. Please add a note to the item if the item is not applicable and please add links to any relevant follow up issues.* I have... - [ ] included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title - [ ] added `!` to the type prefix if API or client breaking change - [ ] targeted the correct branch (see [PR Targeting](https://github.com/cosmos/cosmos-sdk/blob/main/CONTRIBUTING.md#pr-targeting)) - [ ] provided a link to the relevant issue or specification - [ ] followed the guidelines for [building modules](https://github.com/cosmos/cosmos-sdk/blob/main/docs/building-modules) - [ ] included the necessary unit and integration [tests](https://github.com/cosmos/cosmos-sdk/blob/main/CONTRIBUTING.md#testing) - [ ] added a changelog entry to `CHANGELOG.md` - [ ] included comments for [documenting Go code](https://blog.golang.org/godoc) - [ ] updated the relevant documentation or specification - [ ] reviewed "Files changed" and left comments if necessary - [ ] confirmed all CI checks have passed ### Reviewers Checklist *All items are required. Please add a note if the item is not applicable and please add your handle next to the items reviewed if you only reviewed selected items.* I have... - [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title - [ ] confirmed `!` in the type prefix if API or client breaking change - [ ] confirmed all author checklist items have been addressed - [ ] reviewed state machine logic - [ ] reviewed API design and naming - [ ] reviewed documentation is accurate - [ ] reviewed tests and test coverage - [ ] manually tested (if applicable)
71 lines
1.7 KiB
Go
71 lines
1.7 KiB
Go
package codegen
|
|
|
|
import (
|
|
"go/ast"
|
|
"reflect"
|
|
"testing"
|
|
|
|
"gotest.tools/v3/assert"
|
|
)
|
|
|
|
func TestValueExpr(t *testing.T) {
|
|
// bool
|
|
expectValueExpr(t, true, `true`)
|
|
expectValueExpr(t, false, `false`)
|
|
|
|
// uints
|
|
expectValueExpr(t, uint(0), `0`)
|
|
expectValueExpr(t, uint8(1), `1`)
|
|
expectValueExpr(t, uint16(2), `2`)
|
|
expectValueExpr(t, uint32(3), `3`)
|
|
expectValueExpr(t, uint64(12345678), `12345678`)
|
|
|
|
// ints
|
|
expectValueExpr(t, 0, `0`)
|
|
expectValueExpr(t, int8(-1), `-1`)
|
|
expectValueExpr(t, int16(-2), `-2`)
|
|
expectValueExpr(t, int32(-3), `-3`)
|
|
expectValueExpr(t, int64(-12345678), `-12345678`)
|
|
|
|
// floats
|
|
expectValueExpr(t, float32(0.0), `0e+00`)
|
|
expectValueExpr(t, float64(1.32e-9), `1.32e-09`)
|
|
|
|
// complex
|
|
expectValueExpr(t, complex64(1+2i), `(1e+00+2e+00i)`)
|
|
expectValueExpr(t, complex128(1.32e-9+-3.03i), `(1.32e-09-3.03e+00i)`)
|
|
|
|
// array
|
|
expectValueExpr(t, [3]uint32{1, 4, 9}, `[3]uint32{1, 4, 9}`)
|
|
|
|
// slice
|
|
expectValueExpr(t, []uint32{1, 4, 9}, `[]uint32{1, 4, 9}`)
|
|
|
|
// map
|
|
expectValueExpr(t, map[string]int{"a": 1}, `map[string]int{"a": 1}`)
|
|
|
|
// struct
|
|
expectValueExpr(t, AStruct{Foo: 2}, `codegen.AStruct{Foo: 2}`)
|
|
expectValueExpr(t, AStruct{}, `codegen.AStruct{}`) // empty default fields
|
|
|
|
// struct pointer
|
|
expectValueExpr(t, &AStruct{Foo: 2}, `&codegen.AStruct{Foo: 2}`)
|
|
var nilStruct *AStruct
|
|
expectValueExpr(t, nilStruct, `nil`)
|
|
|
|
// struct wrapper
|
|
expectValueExpr(t, &AStructWrapper{Foo: 2}, `&codegen.AStructWrapper{Foo: 2}`)
|
|
|
|
// string
|
|
expectValueExpr(t, "abc", `"abc"`)
|
|
}
|
|
|
|
func expectValueExpr(t *testing.T, value interface{}, expected string) {
|
|
t.Helper()
|
|
g, err := NewFileGen(&ast.File{}, "")
|
|
assert.NilError(t, err)
|
|
e, err := g.ValueExpr(reflect.ValueOf(value))
|
|
assert.NilError(t, err)
|
|
expectExpr(t, e, expected)
|
|
}
|