You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: json_test.go
    path of file: ./repos/ferret/pkg/stdlib/strings
    
    the code of the file until where you have to start completion: package strings_test

import (
	"context"
	"testing"

	. "github.com/smartystreets/goconvey/convey"

	"github.com/MontFerret/ferret/pkg/runtime/values"
	"github.com/MontFerret/ferret/pkg/runtime/values/types"
	"github.com/MontFerret/ferret/pkg/stdlib/strings"
)

func TestJSONParse(t *testing.T) {
	Convey("When args are not passed", t, func() {
		Convey("It should return an error", func() {
			var err error
			_, err = strings.JSONParse(context.Background())

			So(err, ShouldBeError)
		})
	})

	Convey("It should parse none", t, func() {
		val := values.None

		b, err := val.MarshalJSON()

		So(err, ShouldBeNil)

		out, err := strings.JSONParse(
			context.Background(),
			values.NewString(string(b)),
		)

		So(err, ShouldBeNil)
		So(out.Type().Equals(types.None), ShouldBeTrue)
	})

	Convey("It should parse a string", t, func() {
		val := values.NewString("foobar")

		b, err := val.MarshalJSON()

		So(err, ShouldBeNil)

		out, err := strings.JSONParse(
			context.Background(),
			values.NewString(string(b)),
		)

		So(err, ShouldBeNil)
		So(out.Type().Equals(types.String), ShouldBeTrue)
	})

	Convey("It should parse an int", t, func() {
		val := values.NewInt(1)

		b, err := val.MarshalJSON()

		So(err, ShouldBeNil)

		out, err := strings.JSONParse(
			context.Background(),
			values.NewString(string(b)),
		)

		So(err, ShouldBeNil)
		So(out.Type().Equals(types.Float), ShouldBeTrue)
	})

	Convey("It should parse a float", t, func() {
		val := values.NewFloat(1.1)

		b, err := val.MarshalJSON()

		So(err, ShouldBeNil)

		out, err := strings.JSONParse(
			context.Background(),
			values.NewString(string(b)),
		)

		So(err, ShouldBeNil)
		So(out.Type().Equals(types.Float), ShouldBeTrue)
	})

	Convey("It should parse a boolean", t, func() {
		val := values.True

		b, err := val.MarshalJSON()

		So(err, ShouldBeNil)

		out, err := strings.JSONParse(
			context.Background(),
			values.NewString(string(b)),
		)

		So(err, ShouldBeNil)
		So(out.Type().Equals(types.Boolean), ShouldBeTrue)
	})

	Convey("It should parse an array", t, func() {
		val := values.NewArrayWith(
			values.Int(1),
		
    
func TestJSONParse(t *testing.T) {
	Convey("When args are not passed", t, func() {
		Convey("It should return an error", func() {
			var err error
			_, err = strings.JSONParse(context.Background())

			So(err, ShouldBeError)
		})
	})

	Convey("It should parse none", t, func() {
		val := values.None

		b, err := val.MarshalJSON()

		So(err, ShouldBeNil)

		out, err := strings.JSONParse(
			context.Background(),
			values.NewString(string(b)),
		)

		So(err, ShouldBeNil)
		So(out.Type().Equals(types.None), ShouldBeTrue)
	})

	Convey("It should parse a string", t, func() {
		val := values.NewString("foobar")

		b, err := val.MarshalJSON()

		So(err, ShouldBeNil)

		out, err := strings.JSONParse(
			context.Background(),
			values.NewString(string(b)),
		)

		So(err, ShouldBeNil)
		So(out.Type().Equals(types.String), ShouldBeTrue)
	})

	Convey("It should parse an int", t, func() {
		val := values.NewInt(1)

		b, err := val.MarshalJSON()

		So(err, ShouldBeNil)

		out, err := strings.JSONParse(
			context.Background(),
			values.NewString(string(b)),
		)

		So(err, ShouldBeNil)
		So(out.Type().Equals(types.Float), ShouldBeTrue)
	})

	Convey("It should parse a float", t, func() {
		val := values.NewFloat(1.1)

		b, err := val.MarshalJSON()

		So(err, ShouldBeNil)

		out, err := strings.JSONParse(
			context.Background(),
			values.NewString(string(b)),
		)

		So(err, ShouldBeNil)
		So(out.Type().Equals(types.Float), ShouldBeTrue)
	})

	Convey("It should parse a boolean", t, func() {
		val := values.True

		b, err := val.MarshalJSON()

		So(err, ShouldBeNil)

		out, err := strings.JSONParse(
			context.Background(),
			values.NewString(string(b)),
		)

		So(err, ShouldBeNil)
		So(out.Type().Equals(types.Boolean), ShouldBeTrue)
	})

	Convey("It should parse an array", t, func() {
		val := values.NewArrayWith(
			values.Int(1),
			values.Int(2),
			values.Int(3),
		)

		b, err := val.MarshalJSON()

		So(err, ShouldBeNil)

		out, err := strings.JSONParse(
			context.Background(),
			values.NewString(string(b)),
		)

		So(err, ShouldBeNil)
		So(out.Type().Equals(types.Array), ShouldBeTrue)
		So(out.String(), ShouldEqual, "[1,2,3]")
	})

	Convey("It should parse an object", t, func() {
		val := values.NewObject()
		val.Set(values.NewString("foo"), values.NewString("bar"))

		b, err := val.MarshalJSON()

		So(err, ShouldBeNil)

		out, err := strings.JSONParse(
			context.Background(),
			values.NewString(string(b)),
		)

		So(err, ShouldBeNil)
		So(out.Type().Equals(types.Object), ShouldBeTrue)
		So(out.String(), ShouldEqual, `{"foo":"bar"}`)
	})
}