// Copyright 2015 The Vanadium 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 main

import (
	"testing"
)

func TestObject(t *testing.T) {
	o := make(object)
	o.set("foo", "bar")
	o.set("slice", []interface{}{"a", "b", "c"})
	o.set("obj", object{"name": "Bob"})
	o.set("x.y.z", 5)
	o.append("slice", "d")

	out, err := o.json()
	if err != nil {
		t.Fatalf("Unexpected error: %v", err)
	}
	expected := `{
  "foo": "bar",
  "obj": {
    "name": "Bob"
  },
  "slice": [
    "a",
    "b",
    "c",
    "d"
  ],
  "x": {
    "y": {
      "z": 5
    }
  }
}`
	if got := string(out); got != expected {
		t.Errorf("Unexpected output. Got %q, expected %q", got, expected)
	}
}

func TestObjectJSON(t *testing.T) {
	json := `{
          "foo": "bar",
          "bar": 10,
          "list": [ { "x":0 }, { "x":1 }, { "x":2 } ],
          "x": { "y": [ 1, 2, 3 ] }
        }`

	o := make(object)
	if err := o.importJSON([]byte(json)); err != nil {
		t.Fatalf("Unexpected error: %v", err)
	}
	if got, expected := o.getString("foo"), "bar"; got != expected {
		t.Errorf("Unexpected value. Got %#v, expected %#v", got, expected)
	}
	if got, expected := o.getInt("bar"), 10; got != expected {
		t.Errorf("Unexpected value. Got %#v, expected %#v", got, expected)
	}
	if got, expected := o.getString("notthere"), ""; got != expected {
		t.Errorf("Unexpected value. Got %#v, expected %#v", got, expected)
	}
	if got, expected := o.getString("x.y"), "[1 2 3]"; got != expected {
		t.Errorf("Unexpected value. Got %#v, expected %#v", got, expected)
	}
	o.append("x.y", 4)
	list := o.getObjectArray("list")
	for i, item := range list {
		if got, expected := item.get("x"), float64(i); got != expected {
			t.Errorf("Unexpected value for x. Got %#v, expected %#v", got, expected)
		}
	}
	list = append(list, object{"x": "y"})
	o.set("list", list)

	out, err := o.json()
	if err != nil {
		t.Fatalf("Unexpected error: %v", err)
	}
	expected := `{
  "bar": 10,
  "foo": "bar",
  "list": [
    {
      "x": 0
    },
    {
      "x": 1
    },
    {
      "x": 2
    },
    {
      "x": "y"
    }
  ],
  "x": {
    "y": [
      1,
      2,
      3,
      4
    ]
  }
}`
	if got := string(out); got != expected {
		t.Errorf("Unexpected output. Got %q, expected %q", got, expected)
	}
}
