package core_test

import (
	"context"
	"testing"

	"github.com/MontFerret/ferret/pkg/runtime/core"
	"github.com/MontFerret/ferret/pkg/runtime/values"
	. "github.com/smartystreets/goconvey/convey"
)

func TestParamsWith(t *testing.T) {
	Convey("Should match", t, func() {
		p := make(map[string]core.Value)
		p["val1"] = values.NewInt(1)
		p["val2"] = values.NewString("test")

		pc := core.ParamsWith(context.Background(), p)
		So(pc, ShouldNotBeNil)

		out, err := core.ParamsFrom(pc)

		So(err, ShouldBeNil)
		So(out, ShouldEqual, p)
	})
}

func TestParamsFrom(t *testing.T) {
	Convey("Should match", t, func() {
		p := make(map[string]core.Value)
		p["val1"] = values.NewInt(1)
		p["val2"] = values.NewString("test")

		_, err := core.ParamsFrom(context.Background())

		So(err, ShouldNotBeNil)

		ctx := context.WithValue(context.Background(), "fail", p)
		pf, err := core.ParamsFrom(ctx)

		So(err, ShouldNotBeNil)
		So(pf, ShouldBeNil)

		ctx = context.WithValue(context.Background(), "params", p)
		pf, err = core.ParamsFrom(ctx)

		So(err, ShouldNotBeNil)
		So(pf, ShouldBeNil)

		ctx = core.ParamsWith(context.Background(), p)
		pf, err = core.ParamsFrom(ctx)

		So(err, ShouldBeNil)
		So(pf, ShouldEqual, p)
	})
}

func TestParamFrom(t *testing.T) {
	Convey("Should match", t, func() {
		p := make(map[string]core.Value)
		p["val1"] = values.NewInt(1)
		p["val2"] = values.NewString("test")

		_, err := core.ParamFrom(context.Background(), "")

		So(err, ShouldNotBeNil)

		ctx := context.WithValue(context.Background(), "fail", p)
		_, err = core.ParamFrom(ctx, "val1")

		So(err, ShouldNotBeNil)

		ctx = core.ParamsWith(context.Background(), p)
		v, err := core.ParamFrom(ctx, "val1")

		So(err, ShouldBeNil)
		So(v, ShouldEqual, values.NewInt(1))
	})
}
