options_test.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package options
  2. import (
  3. "reflect"
  4. "strings"
  5. "testing"
  6. )
  7. func TestGenerate(t *testing.T) {
  8. gen := NewGeneric()
  9. gen["Int"] = 1
  10. gen["Rune"] = 'b'
  11. gen["Float64"] = 2.0
  12. type Model struct {
  13. Int int
  14. Rune rune
  15. Float64 float64
  16. }
  17. result, err := GenerateFromModel(gen, Model{})
  18. if err != nil {
  19. t.Fatal(err)
  20. }
  21. cast, ok := result.(Model)
  22. if !ok {
  23. t.Fatalf("result has unexpected type %s", reflect.TypeOf(result))
  24. }
  25. if expected := 1; cast.Int != expected {
  26. t.Fatalf("wrong value for field Int: expected %v, got %v", expected, cast.Int)
  27. }
  28. if expected := 'b'; cast.Rune != expected {
  29. t.Fatalf("wrong value for field Rune: expected %v, got %v", expected, cast.Rune)
  30. }
  31. if expected := 2.0; cast.Float64 != expected {
  32. t.Fatalf("wrong value for field Int: expected %v, got %v", expected, cast.Float64)
  33. }
  34. }
  35. func TestGeneratePtr(t *testing.T) {
  36. gen := NewGeneric()
  37. gen["Int"] = 1
  38. gen["Rune"] = 'b'
  39. gen["Float64"] = 2.0
  40. type Model struct {
  41. Int int
  42. Rune rune
  43. Float64 float64
  44. }
  45. result, err := GenerateFromModel(gen, &Model{})
  46. if err != nil {
  47. t.Fatal(err)
  48. }
  49. cast, ok := result.(*Model)
  50. if !ok {
  51. t.Fatalf("result has unexpected type %s", reflect.TypeOf(result))
  52. }
  53. if expected := 1; cast.Int != expected {
  54. t.Fatalf("wrong value for field Int: expected %v, got %v", expected, cast.Int)
  55. }
  56. if expected := 'b'; cast.Rune != expected {
  57. t.Fatalf("wrong value for field Rune: expected %v, got %v", expected, cast.Rune)
  58. }
  59. if expected := 2.0; cast.Float64 != expected {
  60. t.Fatalf("wrong value for field Int: expected %v, got %v", expected, cast.Float64)
  61. }
  62. }
  63. func TestGenerateMissingField(t *testing.T) {
  64. type Model struct{}
  65. _, err := GenerateFromModel(Generic{"foo": "bar"}, Model{})
  66. if _, ok := err.(NoSuchFieldError); !ok {
  67. t.Fatalf("expected NoSuchFieldError, got %#v", err)
  68. } else if expected := "no field"; !strings.Contains(err.Error(), expected) {
  69. t.Fatalf("expected %q in error message, got %s", expected, err.Error())
  70. }
  71. }
  72. func TestFieldCannotBeSet(t *testing.T) {
  73. type Model struct{ foo int } // nolint:structcheck
  74. _, err := GenerateFromModel(Generic{"foo": "bar"}, Model{})
  75. if _, ok := err.(CannotSetFieldError); !ok {
  76. t.Fatalf("expected CannotSetFieldError, got %#v", err)
  77. } else if expected := "cannot set field"; !strings.Contains(err.Error(), expected) {
  78. t.Fatalf("expected %q in error message, got %s", expected, err.Error())
  79. }
  80. }
  81. func TestTypeMismatchError(t *testing.T) {
  82. type Model struct{ Foo int }
  83. _, err := GenerateFromModel(Generic{"Foo": "bar"}, Model{})
  84. if _, ok := err.(TypeMismatchError); !ok {
  85. t.Fatalf("expected TypeMismatchError, got %#v", err)
  86. } else if expected := "type mismatch"; !strings.Contains(err.Error(), expected) {
  87. t.Fatalf("expected %q in error message, got %s", expected, err.Error())
  88. }
  89. }