package conv

import (
	"runtime"
	"testing"
	"time"

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

func TestStringSuite(t *testing.T) {
	suite.Run(t, new(StringSuite))
}

type StringSuite struct{ suite.Suite }

func unsafeConvertStr() []byte {
	return UnsafeStrToBytes("abc")
}

func (s *StringSuite) TestUnsafeStrToBytes() {
	// we convert in other function to trigger GC. We want to check that
	// the underlying array in []bytes is accessible after GC will finish swapping.
	for i := 0; i < 5; i++ {
		b := unsafeConvertStr()
		runtime.GC()
		<-time.NewTimer(2 * time.Millisecond).C
		b2 := append(b, 'd')
		s.Equal("abc", string(b))
		s.Equal("abcd", string(b2))
	}
}

func unsafeConvertBytes() string {
	return UnsafeBytesToStr([]byte("abc"))
}

func (s *StringSuite) TestUnsafeBytesToStr() {
	// we convert in other function to trigger GC. We want to check that
	// the underlying array in []bytes is accessible after GC will finish swapping.
	for i := 0; i < 5; i++ {
		str := unsafeConvertBytes()
		runtime.GC()
		<-time.NewTimer(2 * time.Millisecond).C
		s.Equal("abc", str)
	}
}
