package page_writer

import (
	"github.com/stretchr/testify/assert"
	"os"
	"testing"
)

func TestChunkedFileWriter_toActualOffset(t *testing.T) {
	cw := NewChunkedFileWriter("", 16)

	writeToFile(cw, 50, 60)
	writeToFile(cw, 60, 64)

	writeToFile(cw, 32, 40)
	writeToFile(cw, 42, 48)

	writeToFile(cw, 48, 50)

	assert.Equal(t, 1, cw.chunkUsages[0].size(), "fully covered")
	assert.Equal(t, 2, cw.chunkUsages[1].size(), "2 intervals")

}

func writeToFile(cw *ChunkedFileWriter, startOffset int64, stopOffset int64) {

	_, chunkUsage := cw.toActualWriteOffset(startOffset)

	// skip doing actual writing

	innerOffset := startOffset % cw.ChunkSize
	chunkUsage.MarkWritten(innerOffset, innerOffset+stopOffset-startOffset)

}

func TestWriteChunkedFile(t *testing.T) {
	x := NewChunkedFileWriter(os.TempDir(), 20)
	defer x.Destroy()
	y := NewChunkedFileWriter(os.TempDir(), 12)
	defer y.Destroy()

	batchSize := 4
	buf := make([]byte, batchSize)
	for i := 0; i < 256; i++ {
		for x := 0; x < batchSize; x++ {
			buf[x] = byte(i)
		}
		x.WriteAt(buf, int64(i*batchSize))
		y.WriteAt(buf, int64((255-i)*batchSize))
	}

	a := make([]byte, 1)
	b := make([]byte, 1)
	for i := 0; i < 256*batchSize; i++ {
		x.ReadDataAt(a, int64(i))
		y.ReadDataAt(b, int64(256*batchSize-1-i))
		assert.Equal(t, a[0], b[0], "same read")
	}

}