package json
import (
"sort"
"strings"
"testing"
)
func parseString(s string) (*Node, error) {
return Parse(strings.NewReader(s))
}
func TestParseJsonNumberArray(t *testing.T) {
s := `[1,2,3,4,5,6]`
doc, err := parseString(s)
if err != nil {
t.Fatal(err)
}
// output like below:
// 1
// 2
// ...
// 6
if e, g := 6, len(doc.ChildNodes()); e != g {
t.Fatalf("excepted %v but got %v", e, g)
}
var v []string
for _, n := range doc.ChildNodes() {
v = append(v, n.InnerText())
}
if got, expected := strings.Join(v, ","), "1,2,3,4,5,6"; got != expected {
t.Fatalf("got %v but expected %v", got, expected)
}
}
func TestParseJsonObject(t *testing.T) {
s := `{
"name":"John",
"age":31,
"city":"New York"
}`
doc, err := parseString(s)
if err != nil {
t.Fatal(err)
}
// output like below:
// John
// 31
// New York
m := make(map[string]string)
for _, n := range doc.ChildNodes() {
m[n.Data()] = n.InnerText()
}
expected := []struct {
name, value string
}{
{"name", "John"},
{"age", "31"},
{"city", "New York"},
}
for _, v := range expected {
if e, g := v.value, m[v.name]; e != g {
t.Fatalf("expected %v=%v,but %v=%v", v.name, e, v.name, g)
}
}
}
func TestParseJsonObjectArray(t *testing.T) {
s := `[
{ "name":"Ford", "models":[ "Fiesta", "Focus", "Mustang" ] },
{ "name":"BMW", "models":[ "320", "X3", "X5" ] },
{ "name":"Fiat", "models":[ "500", "Panda" ] }
]`
doc, err := parseString(s)
//doc.PrintTree(0)
if err != nil {
t.Fatal(err)
}
/**
Ford
Fiesta
Focus
Mustang
BMW
320
X3
X5
....
*/
if e, g := 3, len(doc.ChildNodes()); e != g {
t.Fatalf("expected %v, but %v", e, g)
}
m := make(map[string][]string)
for _, n := range doc.ChildNodes() {
// Go to the next of the element list.
var name string
var models []string
for _, e := range n.ChildNodes() {
if e.data == "name" {
// a name node.
name = e.InnerText()
} else {
// a models node.
for _, k := range e.ChildNodes() {
models = append(models, k.InnerText())
}
}
}
// Sort models list.
sort.Strings(models)
m[name] = models
}
expected := []struct {
name, value string
}{
{"Ford", "Fiesta,Focus,Mustang"},
{"BMW", "320,X3,X5"},
{"Fiat", "500,Panda"},
}
for _, v := range expected {
if e, g := v.value, strings.Join(m[v.name], ","); e != g {
t.Fatalf("expected %v=%v,but %v=%v", v.name, e, v.name, g)
}
}
}
func TestParseJson(t *testing.T) {
s := `{
"name":"John",
"age":30,
"cars": [
{ "name":"Ford", "models":[ "Fiesta", "Focus", "Mustang" ] },
{ "name":"BMW", "models":[ "320", "X3", "X5" ] },
{ "name":"Fiat", "models":[ "500", "Panda" ] }
]
}`
doc, err := parseString(s)
if err != nil {
t.Fatal(err)
}
n := doc.SelectElement("name")
if n == nil {
t.Fatal("n is nil")
}
if n.NextSibling() != nil {
t.Fatal("next sibling shoud be nil")
}
if e, g := "John", n.InnerText(); e != g {
t.Fatalf("expected %v but %v", e, g)
}
cars := doc.SelectElement("cars")
if e, g := 3, len(cars.ChildNodes()); e != g {
t.Fatalf("expected %v but %v", e, g)
}
}
func TestLargeFloat(t *testing.T) {
s := `{
"large_number": 365823929453
}`
doc, err := parseString(s)
if err != nil {
t.Fatal(err)
}
n := doc.SelectElement("large_number")
if n.InnerText() != "365823929453" {
t.Fatalf("expected %v but %v", "365823929453", n.InnerText())
}
}