// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package iobuf

import (
	"testing"
)

func TestExpandFront(t *testing.T) {
	pool := NewPool(iobufSize)
	calloc := NewAllocator(pool, 8)
	slice := calloc.Alloc(10)
	if slice.Size() != 10 {
		t.Errorf("Expected length 10, got %d", slice.Size())
	}
	copy(slice.Contents, []byte("0123456789"))
	ok := slice.ExpandFront(8)
	if !ok {
		t.Errorf("Expected ExpandFront to succeed")
	}
	if slice.Size() != 18 {
		t.Errorf("Expected length 18, got %d", slice.Size())
	}
	slice.TruncateFront(11)
	if slice.Size() != 7 {
		t.Errorf("Expected length 9, got %d", slice.Size())
	}
	ok = slice.ExpandFront(3)
	if slice.Size() != 10 {
		t.Errorf("Expected length 10, got %d", slice.Size())
	}
	if string(slice.Contents) != "0123456789" {
		t.Errorf("Expected 0123456789, got %q", string(slice.Contents))
	}
	ok = slice.ExpandFront(10)
	if ok {
		t.Errorf("Expected expansion to fail")
	}
}

func TestCoalesce(t *testing.T) {
	pool := NewPool(iobufSize)
	salloc := NewAllocator(pool, 0)
	const count = 100
	const blocksize = 1024
	var slices [count]*Slice
	for i := 0; i != count; i++ {
		var block [blocksize]byte
		for j := 0; j != blocksize; j++ {
			block[j] = charAt(i*blocksize + j)
		}
		slices[i] = salloc.Copy(block[:])
	}
	coalesced := Coalesce(slices[:], blocksize*4)
	expectEq(t, count/4, len(coalesced))

	off := 0
	for _, buf := range coalesced {
		checkBuf(t, buf.Contents, off)
		off += len(buf.Contents)
		buf.Release()
	}

	salloc.Release()
}

func charAt(i int) byte {
	return "0123456789abcedf"[i%16]
}

func checkBuf(t *testing.T, buf []byte, off int) {
	for i, c := range buf {
		expectEq(t, charAt(off+i), c)
	}
}
