// Copyright 2021, Chef.  All rights reserved.
// https://github.com/q191201771/naza
//
// Use of this source code is governed by a MIT-style license
// that can be found in the License file.
//
// Author: Chef (191201771@qq.com)

package nazabytes

import (
	"bytes"
	"testing"

	"github.com/q191201771/naza/pkg/assert"
)

var inbuf = bytes.Repeat([]byte{'1', '2', '3', '4'}, 5678)
var instr = string(inbuf)

func TestSliceByteToStringTmp(t *testing.T) {
	str := Bytes2StringRef(inbuf)
	assert.Equal(t, instr, str)
}

func TestStringToSliceByteTmp(t *testing.T) {
	buf := String2BytesRef(instr)
	assert.Equal(t, inbuf, buf)
}

func TestSubSliceSafety(t *testing.T) {
	var b []byte
	assert.Equal(t, nil, Sub(b, 0, 1))
	assert.Equal(t, nil, Sub(b, 0, 2))
	b = []byte{1}
	assert.Equal(t, b, Sub(b, 0, 1))
	assert.Equal(t, b, Sub(b, 0, 2))
	b = []byte{1, 2}
	assert.Equal(t, []byte{1}, Sub(b, 0, 1))
	assert.Equal(t, b, Sub(b, 0, 2))
	assert.Equal(t, b, Sub(b, 0, 3))

	assert.Equal(t, []byte{2}, Sub(b, 1, 1))
	assert.Equal(t, []byte{2}, Sub(b, 1, 2))
	assert.Equal(t, nil, Sub(b, 2, 1))
}

func BenchmarkSliceByteToStringOrigin(b *testing.B) {
	var str string

	for i := 0; i < b.N; i++ {
		str = string(inbuf)
	}
	assert.Equal(b, instr, str)
}

func BenchmarkSliceByteToStringTmp(b *testing.B) {
	var str string

	for i := 0; i < b.N; i++ {
		str = Bytes2StringRef(inbuf)
	}
	assert.Equal(b, instr, str)
}

func BenchmarkStringToSliceByteOrigin(b *testing.B) {
	var buf []byte

	for i := 0; i < b.N; i++ {
		buf = []byte(instr)
	}
	assert.Equal(b, buf, inbuf)
}

func BenchmarkStringToSliceByteTmp(b *testing.B) {
	var buf []byte

	for i := 0; i < b.N; i++ {
		buf = String2BytesRef(instr)
	}
	assert.Equal(b, buf, inbuf)
}