package json

import (
	"fmt"
	"reflect"
	"testing"
)

func TestJSONObject_UnmarshalJSON(t *testing.T) {
	type fields struct {
		m map[string]interface{}
	}
	type args struct {
		data []byte
	}
	tests := []struct {
		name    string
		fields  fields
		args    args
		wantErr bool
	}{
		{
			name:   "TestUnmarshalJsonObject",
			fields: fields{m: make(map[string]interface{})},
			args: args{
				data: []byte(`{"name":"test","age":10, "class":["a","b"]}`),
			},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			j := &JSONObject{
				m: tt.fields.m,
			}
			if err := j.UnmarshalJSON(tt.args.data); (err != nil) != tt.wantErr {
				t.Errorf("JSONObject.UnmarshalJSON() error = %v, wantErr %v", err, tt.wantErr)
			}
			fmt.Println(j.m)
		})
	}
}

func TestJSONObject_getBySlice(t *testing.T) {
	type fields struct {
		m map[string]interface{}
	}
	type args struct {
		path []string
	}
	tests := []struct {
		name   string
		fields fields
		args   args
		want   interface{}
	}{
		// TODO: Add test cases.
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			j := &JSONObject{
				m: tt.fields.m,
			}
			if got := j.getBySlice(tt.args.path); !reflect.DeepEqual(got, tt.want) {
				t.Errorf("JSONObject.getBySlice() = %v, want %v", got, tt.want)
			}
		})
	}
}

func TestJSONObject_Get(t *testing.T) {
	type fields struct {
		m map[string]interface{}
	}
	type args struct {
		path string
	}
	tests := []struct {
		name   string
		fields fields
		args   args
		want   interface{}
	}{
		{
			name:   "can get direct property",
			fields: fields{m: map[string]interface{}{"m": 1}},
			args:   args{path: "m"},
			want:   1,
		},
		{
			name:   "can get object property by path",
			fields: fields{m: map[string]interface{}{"m": map[string]interface{}{"x": "a"}}},
			args:   args{path: "m.x"},
			want:   "a",
		},
		{
			name: "can get array property with index",
			fields: fields{m: map[string]interface{}{"m": map[string]interface{}{
				"data": []interface{}{"a", "b", "c"},
			}}},
			args: args{path: "m.0"},
			want: "a",
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			j := &JSONObject{
				m: tt.fields.m,
			}
			if got := j.Get(tt.args.path); !reflect.DeepEqual(got, tt.want) {
				t.Errorf("JSONObject.Get() = %v, want %v", got, tt.want)
			}
		})
	}
}
