232 lines
5.8 KiB
Go
232 lines
5.8 KiB
Go
package jason
|
|
|
|
import (
|
|
"log"
|
|
"testing"
|
|
)
|
|
|
|
type Assert struct {
|
|
T *testing.T
|
|
}
|
|
|
|
func NewAssert(t *testing.T) *Assert {
|
|
return &Assert{
|
|
T: t,
|
|
}
|
|
}
|
|
|
|
func (assert *Assert) True(value bool, message string) {
|
|
if value == false {
|
|
log.Panicln("Assert: ", message)
|
|
}
|
|
}
|
|
|
|
func TestFirst(t *testing.T) {
|
|
|
|
assert := NewAssert(t)
|
|
|
|
testJSON := `{
|
|
"name": "anton",
|
|
"age": 29,
|
|
"nothing": null,
|
|
"true": true,
|
|
"false": false,
|
|
"list": [
|
|
"first",
|
|
"second"
|
|
],
|
|
"list2": [
|
|
{
|
|
"street": "Street 42",
|
|
"city": "Stockholm"
|
|
},
|
|
{
|
|
"street": "Street 42",
|
|
"city": "Stockholm"
|
|
}
|
|
],
|
|
"address": {
|
|
"street": "Street 42",
|
|
"city": "Stockholm"
|
|
},
|
|
"country": {
|
|
"name": "Sweden"
|
|
}
|
|
}`
|
|
|
|
j, err := NewObjectFromBytes([]byte(testJSON))
|
|
|
|
a, err := j.GetObject("address")
|
|
assert.True(a != nil && err == nil, "failed to create json from string")
|
|
|
|
assert.True(err == nil, "failed to create json from string")
|
|
|
|
s, err := j.GetString("name")
|
|
|
|
assert.True(s == "anton" && err == nil, "name should be a string")
|
|
|
|
s, err = j.GetString("name")
|
|
assert.True(s == "anton" && err == nil, "name shoud match")
|
|
|
|
s, err = j.GetString("address", "street")
|
|
assert.True(s == "Street 42" && err == nil, "street shoud match")
|
|
//log.Println("s: ", s.String())
|
|
|
|
_, err = j.GetNumber("age")
|
|
log.Println("error: ", err)
|
|
assert.True(err == nil, "age should be a number")
|
|
|
|
n, err := j.GetInt64("age")
|
|
assert.True(n == 29 && err == nil, "age mismatch")
|
|
|
|
age, err := j.GetValue("age")
|
|
assert.True(age != nil && err == nil, "age should exist")
|
|
|
|
age2, err := j.GetValue("age2")
|
|
assert.True(age2 == nil && err != nil, "age2 should not exist")
|
|
|
|
address, err := j.GetObject("address")
|
|
assert.True(address != nil && err == nil, "address should be an object")
|
|
|
|
//log.Println("address: ", address)
|
|
|
|
s, err = address.GetString("street")
|
|
|
|
addressAsString, err := j.GetString("address")
|
|
assert.True(addressAsString == "" && err != nil, "address should not be an string")
|
|
|
|
s, err = j.GetString("address", "street")
|
|
assert.True(s == "Street 42" && err == nil, "street mismatching")
|
|
|
|
s, err = j.GetString("address", "name2")
|
|
assert.True(s == "" && err != nil, "nonexistent string fail")
|
|
|
|
b, err := j.GetBoolean("true")
|
|
assert.True(b == true && err == nil, "bool true test")
|
|
|
|
b, err = j.GetBoolean("false")
|
|
assert.True(b == false && err == nil, "bool false test")
|
|
|
|
b, err = j.GetBoolean("invalid_field")
|
|
assert.True(b == false && err != nil, "bool invalid test")
|
|
|
|
list, err := j.GetValueArray("list")
|
|
assert.True(list != nil && err == nil, "list should be an array")
|
|
|
|
list2, err := j.GetValueArray("list2")
|
|
assert.True(list2 != nil && err == nil, "list2 should be an array")
|
|
|
|
list2Array, err := j.GetValueArray("list2")
|
|
assert.True(err == nil, "List2 should not return error on AsArray")
|
|
assert.True(len(list2Array) == 2, "List2 should should have length 2")
|
|
|
|
for _, elementValue := range list2Array {
|
|
//assert.True(element.IsObject() == true, "first fail")
|
|
|
|
element, err := elementValue.Object()
|
|
|
|
s, err = element.GetString("street")
|
|
assert.True(s == "Street 42" && err == nil, "second fail")
|
|
}
|
|
|
|
obj, err := j.GetObject("country")
|
|
assert.True(obj != nil && err == nil, "country should not return error on AsObject")
|
|
for key, value := range obj.Map() {
|
|
|
|
assert.True(key == "name", "country name key incorrect")
|
|
|
|
s, err = value.String()
|
|
assert.True(s == "Sweden" && err == nil, "country name should be Sweden")
|
|
}
|
|
}
|
|
|
|
func TestSecond(t *testing.T) {
|
|
json := `
|
|
{
|
|
"data": [
|
|
{
|
|
"id": "X999_Y999",
|
|
"from": {
|
|
"name": "Tom Brady", "id": "X12"
|
|
},
|
|
"message": "Looking forward to 2010!",
|
|
"actions": [
|
|
{
|
|
"name": "Comment",
|
|
"link": "http://www.facebook.com/X999/posts/Y999"
|
|
},
|
|
{
|
|
"name": "Like",
|
|
"link": "http://www.facebook.com/X999/posts/Y999"
|
|
}
|
|
],
|
|
"type": "status",
|
|
"created_time": "2010-08-02T21:27:44+0000",
|
|
"updated_time": "2010-08-02T21:27:44+0000"
|
|
},
|
|
{
|
|
"id": "X998_Y998",
|
|
"from": {
|
|
"name": "Peyton Manning", "id": "X18"
|
|
},
|
|
"message": "Where's my contract?",
|
|
"actions": [
|
|
{
|
|
"name": "Comment",
|
|
"link": "http://www.facebook.com/X998/posts/Y998"
|
|
},
|
|
{
|
|
"name": "Like",
|
|
"link": "http://www.facebook.com/X998/posts/Y998"
|
|
}
|
|
],
|
|
"type": "status",
|
|
"created_time": "2010-08-02T21:27:44+0000",
|
|
"updated_time": "2010-08-02T21:27:44+0000"
|
|
}
|
|
]
|
|
}`
|
|
|
|
assert := NewAssert(t)
|
|
j, err := NewObjectFromBytes([]byte(json))
|
|
|
|
assert.True(j != nil && err == nil, "failed to parse json")
|
|
|
|
dataObject, err := j.GetObject("data")
|
|
assert.True(dataObject == nil && err != nil, "data should not be an object")
|
|
|
|
dataArray, err := j.GetObjectArray("data")
|
|
assert.True(dataArray != nil && err == nil, "data should be an object array")
|
|
|
|
for index, dataItem := range dataArray {
|
|
|
|
if index == 0 {
|
|
id, err := dataItem.GetString("id")
|
|
assert.True(id == "X999_Y999" && err == nil, "item id mismatch")
|
|
|
|
fromName, err := dataItem.GetString("from", "name")
|
|
assert.True(fromName == "Tom Brady" && err == nil, "fromName mismatch")
|
|
|
|
actions, err := dataItem.GetObjectArray("actions")
|
|
|
|
for index, action := range actions {
|
|
|
|
if index == 1 {
|
|
name, err := action.GetString("name")
|
|
assert.True(name == "Like" && err == nil, "name mismatch")
|
|
|
|
link, err := action.GetString("link")
|
|
assert.True(link == "http://www.facebook.com/X999/posts/Y999" && err == nil, "Like mismatch")
|
|
|
|
}
|
|
|
|
}
|
|
} else if index == 1 {
|
|
id, err := dataItem.GetString("id")
|
|
assert.True(id == "X998_Y998" && err == nil, "item id mismatch")
|
|
}
|
|
|
|
}
|
|
|
|
}
|