pointer_test.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package flags
  2. import (
  3. "testing"
  4. )
  5. func TestPointerBool(t *testing.T) {
  6. var opts = struct {
  7. Value *bool `short:"v"`
  8. }{}
  9. ret := assertParseSuccess(t, &opts, "-v")
  10. assertStringArray(t, ret, []string{})
  11. if !*opts.Value {
  12. t.Errorf("Expected Value to be true")
  13. }
  14. }
  15. func TestPointerString(t *testing.T) {
  16. var opts = struct {
  17. Value *string `short:"v"`
  18. }{}
  19. ret := assertParseSuccess(t, &opts, "-v", "value")
  20. assertStringArray(t, ret, []string{})
  21. assertString(t, *opts.Value, "value")
  22. }
  23. func TestPointerSlice(t *testing.T) {
  24. var opts = struct {
  25. Value *[]string `short:"v"`
  26. }{}
  27. ret := assertParseSuccess(t, &opts, "-v", "value1", "-v", "value2")
  28. assertStringArray(t, ret, []string{})
  29. assertStringArray(t, *opts.Value, []string{"value1", "value2"})
  30. }
  31. func TestPointerMap(t *testing.T) {
  32. var opts = struct {
  33. Value *map[string]int `short:"v"`
  34. }{}
  35. ret := assertParseSuccess(t, &opts, "-v", "k1:2", "-v", "k2:-5")
  36. assertStringArray(t, ret, []string{})
  37. if v, ok := (*opts.Value)["k1"]; !ok {
  38. t.Errorf("Expected key \"k1\" to exist")
  39. } else if v != 2 {
  40. t.Errorf("Expected \"k1\" to be 2, but got %#v", v)
  41. }
  42. if v, ok := (*opts.Value)["k2"]; !ok {
  43. t.Errorf("Expected key \"k2\" to exist")
  44. } else if v != -5 {
  45. t.Errorf("Expected \"k2\" to be -5, but got %#v", v)
  46. }
  47. }
  48. type marshalledString string
  49. func (m *marshalledString) UnmarshalFlag(value string) error {
  50. *m = marshalledString(value)
  51. return nil
  52. }
  53. func (m marshalledString) MarshalFlag() (string, error) {
  54. return string(m), nil
  55. }
  56. func TestPointerStringMarshalled(t *testing.T) {
  57. var opts = struct {
  58. Value *marshalledString `short:"v"`
  59. }{}
  60. ret := assertParseSuccess(t, &opts, "-v", "value")
  61. assertStringArray(t, ret, []string{})
  62. if opts.Value == nil {
  63. t.Error("Expected value not to be nil")
  64. return
  65. }
  66. assertString(t, string(*opts.Value), "value")
  67. }
  68. type marshalledStruct struct {
  69. Value string
  70. }
  71. func (m *marshalledStruct) UnmarshalFlag(value string) error {
  72. m.Value = value
  73. return nil
  74. }
  75. func (m marshalledStruct) MarshalFlag() (string, error) {
  76. return m.Value, nil
  77. }
  78. func TestPointerStructMarshalled(t *testing.T) {
  79. var opts = struct {
  80. Value *marshalledStruct `short:"v"`
  81. }{}
  82. ret := assertParseSuccess(t, &opts, "-v", "value")
  83. assertStringArray(t, ret, []string{})
  84. if opts.Value == nil {
  85. t.Error("Expected value not to be nil")
  86. return
  87. }
  88. assertString(t, opts.Value.Value, "value")
  89. }
  90. type PointerGroup struct {
  91. Value bool `short:"v"`
  92. }
  93. func TestPointerGroup(t *testing.T) {
  94. var opts = struct {
  95. Group *PointerGroup `group:"Group Options"`
  96. }{}
  97. ret := assertParseSuccess(t, &opts, "-v")
  98. assertStringArray(t, ret, []string{})
  99. if !opts.Group.Value {
  100. t.Errorf("Expected Group.Value to be true")
  101. }
  102. }
  103. func TestDoNotChangeNonTaggedFields(t *testing.T) {
  104. var opts struct {
  105. A struct {
  106. Pointer *int
  107. }
  108. B *struct {
  109. Pointer *int
  110. }
  111. }
  112. ret := assertParseSuccess(t, &opts)
  113. assertStringArray(t, ret, []string{})
  114. if opts.A.Pointer != nil {
  115. t.Error("Expected A.Pointer to be nil")
  116. }
  117. if opts.B != nil {
  118. t.Error("Expected B to be nil")
  119. }
  120. if opts.B != nil && opts.B.Pointer != nil {
  121. t.Error("Expected B.Pointer to be nil")
  122. }
  123. }