1
0
mirror of https://github.com/golang/go synced 2024-09-25 01:20:13 -06:00

A quick fix to ensure that json.Marshal returns errors correctly, as well as some error-related tests

R=rsc
https://golang.org/cl/157151
This commit is contained in:
Michael Hoisie 2009-11-24 13:18:44 -08:00 committed by Russ Cox
parent 5f484ec118
commit 9da8d88499
2 changed files with 34 additions and 5 deletions

View File

@ -392,12 +392,12 @@ func writeValue(w io.Writer, val reflect.Value) (err os.Error) {
*reflect.InterfaceValue,
*reflect.PtrValue,
*reflect.UnsafePointerValue:
return &MarshalError{val.Type()}
err = &MarshalError{val.Type()}
default:
value := val.(reflect.Value);
fmt.Fprint(w, value.Interface());
}
return nil;
return;
}
func Marshal(w io.Writer, val interface{}) os.Error {

View File

@ -188,18 +188,47 @@ var marshalTests = []marshalTest{
marshalTest{map[string][]int{"3": []int{1, 2, 3}}, `{"3":[1,2,3]}`},
}
func TestJsonMarshal(t *testing.T) {
func TestMarshal(t *testing.T) {
for _, tt := range marshalTests {
var buf bytes.Buffer;
err := Marshal(&buf, tt.val);
if err != nil {
t.Errorf("Error converting %s to JSON: \n", err.String())
t.Fatalf("Marshal(%T): %s", tt.val, err)
}
s := buf.String();
if s != tt.out {
t.Errorf("Error converting to JSON. Expected: %q Actual %q\n", tt.out, s)
t.Errorf("Marshal(%T) = %q, want %q\n", tt.val, tt.out, s)
}
}
}
type marshalErrorTest struct {
val interface{};
error string;
}
type MTE string
var marshalErrorTests = []marshalErrorTest{
marshalErrorTest{map[chan int]string{make(chan int): "one"}, "json cannot encode value of type map[chan int] string"},
marshalErrorTest{map[string]*MTE{"hi": nil}, "json cannot encode value of type *json.MTE"},
}
func TestMarshalError(t *testing.T) {
for _, tt := range marshalErrorTests {
var buf bytes.Buffer;
err := Marshal(&buf, tt.val);
if err == nil {
t.Fatalf("Marshal(%T): no error, want error %s", tt.val, tt.error)
}
if err.String() != tt.error {
t.Fatalf("Marshal(%T) = error %s, want error %s", tt.val, err, tt.error)
}
}
}