// Testing support for go-toml

package toml

import (
	"testing"
)

func TestTomlHas(t *testing.T) {
	tree, _ := Load(`
		[test]
		key = "value"
	`)

	if !tree.Has("test.key") {
		t.Errorf("Has - expected test.key to exists")
	}
}

func TestTomlHasPath(t *testing.T) {
	tree, _ := Load(`
		[test]
		key = "value"
	`)

	if !tree.HasPath([]string{"test", "key"}) {
		t.Errorf("HasPath - expected test.key to exists")
	}
}

func TestTomlGetPath(t *testing.T) {
	node := newTomlTree()
	//TODO: set other node data

	for idx, item := range []struct {
		Path     []string
		Expected *TomlTree
	}{
		{ // empty path test
			[]string{},
			node,
		},
	} {
		result := node.GetPath(item.Path)
		if result != item.Expected {
			t.Errorf("GetPath[%d] %v - expected %v, got %v instead.", idx, item.Path, item.Expected, result)
		}
	}
}

func TestTomlQuery(t *testing.T) {
  tree, err := Load("[foo.bar]\na=1\nb=2\n[baz.foo]\na=3\nb=4\n[gorf.foo]\na=5\nb=6")
  if err != nil {
    t.Error(err)
    return
  }
  result, err := tree.Query("$.foo.bar")
  if err != nil {
    t.Error(err)
    return
  }
  values := result.Values()
  if len(values) != 1 {
    t.Errorf("Expected resultset of 1, got %d instead: %v", len(values), values)
  }

  if tt, ok := values[0].(*TomlTree); !ok {
    t.Errorf("Expected type of TomlTree: %T Tv", values[0], values[0])
  } else if tt.Get("a") != int64(1) {
    t.Errorf("Expected 'a' with a value 1: %v", tt.Get("a"))
  } else if tt.Get("b") != int64(2) {
    t.Errorf("Expected 'b' with a value 2: %v", tt.Get("b"))
  }
}
