| package options | |
| import ( | |
| "reflect" | |
| "strings" | |
| "testing" | |
| ) | |
| func TestGenerate(t *testing.T) { | |
| gen := Generic{ | |
| "Int": 1, | |
| "Rune": 'b', | |
| "Float64": 2.0, | |
| } | |
| type Model struct { | |
| Int int | |
| Rune rune | |
| Float64 float64 | |
| } | |
| result, err := GenerateFromModel(gen, Model{}) | |
| if err != nil { | |
| t.Fatal(err) | |
| } | |
| cast, ok := result.(Model) | |
| if !ok { | |
| t.Fatalf("result has unexpected type %s", reflect.TypeOf(result)) | |
| } | |
| if expected := 1; cast.Int != expected { | |
| t.Fatalf("wrong value for field Int: expected %v, got %v", expected, cast.Int) | |
| } | |
| if expected := 'b'; cast.Rune != expected { | |
| t.Fatalf("wrong value for field Rune: expected %v, got %v", expected, cast.Rune) | |
| } | |
| if expected := 2.0; cast.Float64 != expected { | |
| t.Fatalf("wrong value for field Int: expected %v, got %v", expected, cast.Float64) | |
| } | |
| } | |
| func TestGeneratePtr(t *testing.T) { | |
| gen := Generic{ | |
| "Int": 1, | |
| "Rune": 'b', | |
| "Float64": 2.0, | |
| } | |
| type Model struct { | |
| Int int | |
| Rune rune | |
| Float64 float64 | |
| } | |
| result, err := GenerateFromModel(gen, &Model{}) | |
| if err != nil { | |
| t.Fatal(err) | |
| } | |
| cast, ok := result.(*Model) | |
| if !ok { | |
| t.Fatalf("result has unexpected type %s", reflect.TypeOf(result)) | |
| } | |
| if expected := 1; cast.Int != expected { | |
| t.Fatalf("wrong value for field Int: expected %v, got %v", expected, cast.Int) | |
| } | |
| if expected := 'b'; cast.Rune != expected { | |
| t.Fatalf("wrong value for field Rune: expected %v, got %v", expected, cast.Rune) | |
| } | |
| if expected := 2.0; cast.Float64 != expected { | |
| t.Fatalf("wrong value for field Int: expected %v, got %v", expected, cast.Float64) | |
| } | |
| } | |
| func TestGenerateMissingField(t *testing.T) { | |
| type Model struct{} | |
| _, err := GenerateFromModel(Generic{"foo": "bar"}, Model{}) | |
| if _, ok := err.(NoSuchFieldError); !ok { | |
| t.Fatalf("expected NoSuchFieldError, got %#v", err) | |
| } | |
| const expected = "no field" | |
| if !strings.Contains(err.Error(), expected) { | |
| t.Fatalf("expected %q in error message, got %s", expected, err.Error()) | |
| } | |
| } | |
| func TestFieldCannotBeSet(t *testing.T) { | |
| type Model struct{ foo int } //nolint:nolintlint,unused // un-exported field is used to test error-handling | |
| _, err := GenerateFromModel(Generic{"foo": "bar"}, Model{}) | |
| if _, ok := err.(CannotSetFieldError); !ok { | |
| t.Fatalf("expected CannotSetFieldError, got %#v", err) | |
| } | |
| const expected = "cannot set field" | |
| if !strings.Contains(err.Error(), expected) { | |
| t.Fatalf("expected %q in error message, got %s", expected, err.Error()) | |
| } | |
| } | |
| func TestTypeMismatchError(t *testing.T) { | |
| type Model struct{ Foo int } | |
| _, err := GenerateFromModel(Generic{"Foo": "bar"}, Model{}) | |
| if _, ok := err.(TypeMismatchError); !ok { | |
| t.Fatalf("expected TypeMismatchError, got %#v", err) | |
| } | |
| const expected = "type mismatch" | |
| if !strings.Contains(err.Error(), expected) { | |
| t.Fatalf("expected %q in error message, got %s", expected, err.Error()) | |
| } | |
| } |