11 func TestSafeString(t *testing.T) {
12 _, ok := safeString((*stringStringer)(nil))
13 if got, want := ok, false; got != want {
14 t.Errorf(" got %v, want %v", got, want)
18 func TestSafeMarshal(t *testing.T) {
19 kb, err := safeMarshal((*stringMarshaler)(nil))
20 if got := kb; got != nil {
21 t.Errorf(" got %v, want nil", got)
23 if got, want := err, error(nil); got != want {
24 t.Errorf(" got %v, want %v", got, want)
28 func TestWriteKeyStrings(t *testing.T) {
29 keygen := []func(string) interface{}{
30 func(s string) interface{} { return s },
31 func(s string) interface{} { return stringData(s) },
32 func(s string) interface{} { return stringStringer(s) },
33 func(s string) interface{} { return stringMarshaler(s) },
41 {key: "k", want: "k"},
42 {key: `\`, want: `\`},
43 {key: "\n", err: ErrInvalidKey},
44 {key: "\x00", err: ErrInvalidKey},
45 {key: "\x10", err: ErrInvalidKey},
46 {key: "\x1F", err: ErrInvalidKey},
47 {key: "", err: ErrInvalidKey},
48 {key: " ", err: ErrInvalidKey},
49 {key: "=", err: ErrInvalidKey},
50 {key: `"`, err: ErrInvalidKey},
53 for _, g := range keygen {
54 for _, d := range data {
57 err := writeKey(w, key)
59 t.Errorf("%#v (%[1]T): got error: %v, want error: %v", key, err, d.err)
64 if got, want := w.String(), d.want; got != want {
65 t.Errorf("%#v (%[1]T): got '%s', want '%s'", key, got, want)
71 func TestWriteKey(t *testing.T) {
83 {key: nil, err: ErrNilKey},
84 {key: nilPtr, err: ErrNilKey},
85 {key: (*stringStringer)(nil), err: ErrNilKey},
86 {key: (*stringMarshaler)(nil), err: ErrNilKey},
87 {key: (*stringerMarshaler)(nil), err: ErrNilKey},
88 {key: ptr, want: "1"},
90 {key: errorMarshaler{}, err: &MarshalerError{Type: reflect.TypeOf(errorMarshaler{}), Err: errMarshaling}},
91 {key: make(chan int), err: ErrUnsupportedKeyType},
92 {key: []int{}, err: ErrUnsupportedKeyType},
93 {key: map[int]int{}, err: ErrUnsupportedKeyType},
94 {key: [2]int{}, err: ErrUnsupportedKeyType},
95 {key: struct{}{}, err: ErrUnsupportedKeyType},
96 {key: fmt.Sprint, err: ErrUnsupportedKeyType},
99 for _, d := range data {
101 err := writeKey(w, d.key)
102 if !reflect.DeepEqual(err, d.err) {
103 t.Errorf("%#v: got error: %v, want error: %v", d.key, err, d.err)
108 if got, want := w.String(), d.want; got != want {
109 t.Errorf("%#v: got '%s', want '%s'", d.key, got, want)
114 func TestWriteValueStrings(t *testing.T) {
115 keygen := []func(string) interface{}{
116 func(s string) interface{} { return s },
117 func(s string) interface{} { return errors.New(s) },
118 func(s string) interface{} { return stringData(s) },
119 func(s string) interface{} { return stringStringer(s) },
120 func(s string) interface{} { return stringMarshaler(s) },
128 {value: "", want: ""},
129 {value: "v", want: "v"},
130 {value: " ", want: `" "`},
131 {value: "=", want: `"="`},
132 {value: `\`, want: `\`},
133 {value: `"`, want: `"\""`},
134 {value: `\"`, want: `"\\\""`},
135 {value: "\n", want: `"\n"`},
136 {value: "\x00", want: `"\u0000"`},
137 {value: "\x10", want: `"\u0010"`},
138 {value: "\x1F", want: `"\u001f"`},
139 {value: "µ", want: `µ`},
142 for _, g := range keygen {
143 for _, d := range data {
146 err := writeValue(w, value)
148 t.Errorf("%#v (%[1]T): got error: %v, want error: %v", value, err, d.err)
153 if got, want := w.String(), d.want; got != want {
154 t.Errorf("%#v (%[1]T): got '%s', want '%s'", value, got, want)
160 func TestWriteValue(t *testing.T) {
172 {value: nil, want: "null"},
173 {value: nilPtr, want: "null"},
174 {value: (*stringStringer)(nil), want: "null"},
175 {value: (*stringMarshaler)(nil), want: "null"},
176 {value: (*stringerMarshaler)(nil), want: "null"},
177 {value: ptr, want: "1"},
179 {value: errorMarshaler{}, err: &MarshalerError{Type: reflect.TypeOf(errorMarshaler{}), Err: errMarshaling}},
180 {value: make(chan int), err: ErrUnsupportedValueType},
181 {value: []int{}, err: ErrUnsupportedValueType},
182 {value: map[int]int{}, err: ErrUnsupportedValueType},
183 {value: [2]int{}, err: ErrUnsupportedValueType},
184 {value: struct{}{}, err: ErrUnsupportedValueType},
185 {value: fmt.Sprint, err: ErrUnsupportedValueType},
188 for _, d := range data {
190 err := writeValue(w, d.value)
191 if !reflect.DeepEqual(err, d.err) {
192 t.Errorf("%#v: got error: %v, want error: %v", d.value, err, d.err)
197 if got, want := w.String(), d.want; got != want {
198 t.Errorf("%#v: got '%s', want '%s'", d.value, got, want)
203 type stringData string
205 type stringStringer string
207 func (s stringStringer) String() string {
211 type stringMarshaler string
213 func (s stringMarshaler) MarshalText() ([]byte, error) {
214 return []byte(s), nil
217 type stringerMarshaler string
219 func (s stringerMarshaler) String() string {
220 return "String() called"
223 func (s stringerMarshaler) MarshalText() ([]byte, error) {
224 return []byte(s), nil
227 var errMarshaling = errors.New("marshal error")
229 type errorMarshaler struct{}
231 func (errorMarshaler) MarshalText() ([]byte, error) {
232 return nil, errMarshaling