Files
fn-serverless/vendor/github.com/jmoiron/jsonq/jsonq_test.go
2017-06-11 02:05:36 -07:00

187 lines
3.7 KiB
Go

package jsonq
import (
"encoding/json"
"fmt"
"strings"
"testing"
)
const TestData = `{
"foo": 1,
"bar": 2,
"test": "Hello, world!",
"baz": 123.1,
"numstring": "42",
"floatstring": "42.1",
"array": [
{"foo": 1},
{"bar": 2},
{"baz": 3}
],
"subobj": {
"foo": 1,
"subarray": [1,2,3],
"subsubobj": {
"bar": 2,
"baz": 3,
"array": ["hello", "world"]
}
},
"collections": {
"bools": [false, true, false],
"strings": ["hello", "strings"],
"numbers": [1,2,3,4],
"arrays": [[1.0,2.0],[2.0,3.0],[4.0,3.0]],
"objects": [
{"obj1": 1},
{"obj2": 2}
]
},
"bool": true
}`
func tErr(t *testing.T, err error) {
if err != nil {
t.Errorf("Error: %v\n", err)
}
}
func TestQuery(t *testing.T) {
data := map[string]interface{}{}
dec := json.NewDecoder(strings.NewReader(TestData))
err := dec.Decode(&data)
tErr(t, err)
q := NewQuery(data)
ival, err := q.Int("foo")
if ival != 1 {
t.Errorf("Expecting 1, got %v\n", ival)
}
tErr(t, err)
ival, err = q.Int("bar")
if ival != 2 {
t.Errorf("Expecting 2, got %v\n", ival)
}
tErr(t, err)
ival, err = q.Int("subobj", "foo")
if ival != 1 {
t.Errorf("Expecting 1, got %v\n", ival)
}
tErr(t, err)
// test that strings can get int-ed
ival, err = q.Int("numstring")
if ival != 42 {
t.Errorf("Expecting 42, got %v\n", ival)
}
tErr(t, err)
for i := 0; i < 3; i++ {
ival, err := q.Int("subobj", "subarray", fmt.Sprintf("%d", i))
if ival != i+1 {
t.Errorf("Expecting %d, got %v\n", i+1, ival)
}
tErr(t, err)
}
fval, err := q.Float("baz")
if fval != 123.1 {
t.Errorf("Expecting 123.1, got %f\n", fval)
}
tErr(t, err)
// test that strings can get float-ed
fval, err = q.Float("floatstring")
if fval != 42.1 {
t.Errorf("Expecting 42.1, got %v\n", fval)
}
tErr(t, err)
sval, err := q.String("test")
if sval != "Hello, world!" {
t.Errorf("Expecting \"Hello, World!\", got \"%v\"\n", sval)
}
sval, err = q.String("subobj", "subsubobj", "array", "0")
if sval != "hello" {
t.Errorf("Expecting \"hello\", got \"%s\"\n", sval)
}
tErr(t, err)
bval, err := q.Bool("bool")
if !bval {
t.Errorf("Expecting true, got %v\n", bval)
}
tErr(t, err)
obj, err := q.Object("subobj", "subsubobj")
tErr(t, err)
q2 := NewQuery(obj)
sval, err = q2.String("array", "1")
if sval != "world" {
t.Errorf("Expecting \"world\", got \"%s\"\n", sval)
}
tErr(t, err)
aobj, err := q.Array("subobj", "subarray")
tErr(t, err)
if aobj[0].(float64) != 1 {
t.Errorf("Expecting 1, got %v\n", aobj[0])
}
iobj, err := q.Interface("numstring")
tErr(t, err)
if _, ok := iobj.(string); !ok {
t.Errorf("Expecting type string got: %s", iobj)
}
/*
Test Extraction of typed slices
*/
//test array of strings
astrings, err := q.ArrayOfStrings("collections", "strings")
tErr(t, err)
if astrings[0] != "hello" {
t.Errorf("Expecting hello, got %v\n", astrings[0])
}
//test array of ints
aints, err := q.ArrayOfInts("collections", "numbers")
tErr(t, err)
if aints[0] != 1 {
t.Errorf("Expecting 1, got %v\n", aints[0])
}
//test array of floats
afloats, err := q.ArrayOfFloats("collections", "numbers")
tErr(t, err)
if afloats[0] != 1.0 {
t.Errorf("Expecting 1.0, got %v\n", afloats[0])
}
//test array of bools
abools, err := q.ArrayOfBools("collections", "bools")
tErr(t, err)
if abools[0] {
t.Errorf("Expecting true, got %v\n", abools[0])
}
//test array of arrays
aa, err := q.ArrayOfArrays("collections", "arrays")
tErr(t, err)
if aa[0][0].(float64) != 1 {
t.Errorf("Expecting 1, got %v\n", aa[0][0])
}
//test array of objs
aobjs, err := q.ArrayOfObjects("collections", "objects")
tErr(t, err)
if aobjs[0]["obj1"].(float64) != 1 {
t.Errorf("Expecting 1, got %v\n", aobjs[0]["obj1"])
}
}