package core

import (
	"testing"

	"github.com/stretchr/testify/assert"
)

type TestJSON struct {
	FI int    `json:"f1"`
	FS string `json:"fs"`
}

type testDir struct {
	Directory
}

func (t testDir) ListEntry() ([]DirEntry, error) {
	return []DirEntry{
		{"t1", NewStringFile("text1"), nil},
		{"t2", nil, func() (Resource, error) {
			return NewJSON(TestJSON{FI: 233, FS: "In Json"}), nil
		}},
		{".", nil, func() (Resource, error) {
			return t, nil
		}},
	}, nil
}

func TestDirectory(t *testing.T) {
	dir := testDir{}
	dir.Init(&dir)

	var r Resource = dir
	content, err := GetContent(r)
	assert.NoError(t, err)
	assert.Equal(t, "{\"fileType\":\"directory\",\"subResources\":[{\"name\":\"t1\"},{\"name\":\"t2\"},{\"name\":\".\"}]}\n", string(content))

	self, err := r.GetSubResource(".")
	assert.NoError(t, err)

	t1, err := self.GetSubResource("t1")
	assert.NoError(t, err)
	t1Content, err := GetContent(t1)
	assert.NoError(t, err)
	assert.Equal(t, "text1", string(t1Content))

	t2, err := self.GetSubResource("t2")
	assert.NoError(t, err)
	t2Content, err := GetContent(t2)
	assert.NoError(t, err)
	assert.Equal(t, "{\"f1\":233,\"fs\":\"In Json\"}\n", string(t2Content))

	fs, err := t2.GetSubResource("fs")
	assert.NoError(t, err)
	fsc, err := GetContent(fs)
	assert.NoError(t, err)
	assert.Equal(t, "\"In Json\"\n", string(fsc))

	fss, err := fs.GetSubResource("toString")
	assert.NoError(t, err)
	fssc, err := GetContent(fss)
	assert.NoError(t, err)
	assert.Equal(t, "In Json", string(fssc))
}
