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