// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package json import ( "container/vector"; "reflect"; "testing"; ) func TestDecodeInt64(t *testing.T) { nb := newDecoder(nil, nil); nb.Int64(-15); assertResult(t, nb.Data(), float64(-15)); } func TestDecodeUint64(t *testing.T) { nb := newDecoder(nil, nil); nb.Uint64(15); assertResult(t, nb.Data(), float64(15)); } func TestDecodeFloat64(t *testing.T) { nb := newDecoder(nil, nil); nb.Float64(3.14159); assertResult(t, nb.Data(), float64(3.14159)); } func TestDecodeString(t *testing.T) { nb := newDecoder(nil, nil); nb.String("Some string"); assertResult(t, nb.Data(), "Some string"); } func TestDecodeBool(t *testing.T) { nb := newDecoder(nil, nil); nb.Bool(true); assertResult(t, nb.Data(), true); } func TestDecodeNull(t *testing.T) { nb := newDecoder(nil, nil); nb.Null(); assertResult(t, nb.Data(), nil); } func TestDecodeEmptyArray(t *testing.T) { nb := newDecoder(nil, nil); nb.Array(); assertResult(t, nb.Data(), []interface{}{}); } func TestDecodeEmptyMap(t *testing.T) { nb := newDecoder(nil, nil); nb.Map(); assertResult(t, nb.Data(), map[string]interface{}{}); } func TestDecodeFlushElem(t *testing.T) { testVec := new(vector.Vector).Resize(2, 2); nb := newDecoder(testVec, 1); nb.Float64(3.14159); nb.Flush(); assertResult(t, testVec.Data(), []interface{}{nil, float64(3.14159)}); } func TestDecodeFlushKey(t *testing.T) { testMap := make(map[string]interface{}); nb := newDecoder(testMap, "key"); nb.Float64(3.14159); nb.Flush(); assertResult(t, testMap, map[string]interface{}{"key": float64(3.14159)}); } // Elem() and Key() are hard to test in isolation because all they do // is create a new, properly initialized, decoder, and modify state of // the underlying decoder. I'm testing them through already tested // Array(), String(), and Flush(). func TestDecodeElem(t *testing.T) { nb := newDecoder(nil, nil); nb.Array(); var b Builder = nb.Elem(0); b.String("0"); b.Flush(); assertResult(t, nb.Data(), []interface{}{"0"}); } func TestDecodeKey(t *testing.T) { nb := newDecoder(nil, nil); nb.Map(); var b Builder = nb.Key("a"); b.String("0"); b.Flush(); assertResult(t, nb.Data(), map[string]interface{}{"a": "0"}); } func assertResult(t *testing.T, results, expected interface{}) { if !reflect.DeepEqual(results, expected) { t.Fatalf("have %T(%#v) want %T(%#v)", results, results, expected, expected) } } type decodeTest struct { s string; r interface{}; } var tests = []decodeTest{ decodeTest{`null`, nil}, decodeTest{`true`, true}, decodeTest{`false`, false}, decodeTest{`"abc"`, "abc"}, decodeTest{`123`, float64(123)}, decodeTest{`0.1`, float64(0.1)}, decodeTest{`1e-10`, float64(1e-10)}, decodeTest{`[]`, []interface{}{}}, decodeTest{`[1,2,3,4]`, []interface{}{float64(1), float64(2), float64(3), float64(4)}}, decodeTest{`[1,2,"abc",null,true,false]`, []interface{}{float64(1), float64(2), "abc", nil, true, false}}, decodeTest{`{}`, map[string]interface{}{}}, decodeTest{`{"a":1}`, map[string]interface{}{"a": float64(1)}}, decodeTest{`"q\u0302"`, "q\u0302"}, } func TestDecode(t *testing.T) { for _, test := range tests { if val, err := Decode(test.s); err != nil || !reflect.DeepEqual(val, test.r) { t.Errorf("Decode(%#q) = %v, %v want %v, nil", test.s, val, err, test.r) } } }