blob: b712d65586ac36f031638f671f8567ec08e630e5 [file] [log] [blame]
// 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)
}
}
}