package syncutils

import (
	"fmt"
	"strconv"
	"testing"
)

func TestSyncSlice(t *testing.T) {
	syncSlice := NewSyncSlice([]string{"aaa", "bbb", "ccc"}, false)

	syncSlice.Append("ddd")
	fmt.Println("Len:", syncSlice.Len())
	fmt.Println("Cap:", syncSlice.Cap())
	fmt.Println()

	syncSlice.Range(func(index int, e string) bool {
		fmt.Println("Index", strconv.Itoa(index)+":", e)
		return false
	})
	fmt.Println()

	deleted := syncSlice.DeleteAt(3)
	fmt.Println("Deleted:", deleted)
	fmt.Println()

	syncSlice.Range(func(index int, e string) bool {
		fmt.Println("Index", strconv.Itoa(index)+":", e)
		return false
	})
	fmt.Println()

	syncSlice.Lock()

	syncSlice.AppendNoLock("ddd")
	fmt.Println("Len:", syncSlice.LenNoLock())
	fmt.Println("Cap:", syncSlice.CapNoLock())
	fmt.Println()

	syncSlice.RangeNoLock(func(index int, e string) bool {
		fmt.Println("Index", strconv.Itoa(index)+":", e)
		return false
	})
	fmt.Println()

	deleted = syncSlice.DeleteAtNoLock(3)
	fmt.Println("Deleted:", deleted)
	fmt.Println()

	syncSlice.RangeNoLock(func(index int, e string) bool {
		fmt.Println("Index", strconv.Itoa(index)+":", e)
		return false
	})
	fmt.Println()

	syncSlice.Unlock()

	rwSyncSlice := NewSyncSlice([]string{"aaa", "bbb", "ccc"}, true)

	rwSyncSlice.Append("ddd")
	fmt.Println("Len:", rwSyncSlice.Len())
	fmt.Println("Cap:", rwSyncSlice.Cap())
	fmt.Println()

	rwSyncSlice.Range(func(index int, e string) bool {
		fmt.Println("Index", strconv.Itoa(index)+":", e)
		return false
	})
	fmt.Println()

	deleted = rwSyncSlice.DeleteAt(3)
	fmt.Println("Deleted:", deleted)
	fmt.Println()

	rwSyncSlice.Range(func(index int, e string) bool {
		fmt.Println("Index", strconv.Itoa(index)+":", e)
		return false
	})
	fmt.Println()

	rwSyncSlice.Lock()
	rwSyncSlice.AppendNoLock("ddd")
	rwSyncSlice.Unlock()

	rwSyncSlice.RLock()
	fmt.Println("Len:", rwSyncSlice.LenNoLock())
	fmt.Println("Cap:", rwSyncSlice.CapNoLock())
	fmt.Println()

	rwSyncSlice.RangeNoLock(func(index int, e string) bool {
		fmt.Println("Index", strconv.Itoa(index)+":", e)
		return false
	})
	rwSyncSlice.RUnlock()

	fmt.Println()

	rwSyncSlice.Lock()
	deleted = rwSyncSlice.DeleteAtNoLock(3)
	rwSyncSlice.Unlock()
	fmt.Println("Deleted:", deleted)
	fmt.Println()

	rwSyncSlice.RLock()
	rwSyncSlice.RangeNoLock(func(index int, e string) bool {
		fmt.Println("Index", strconv.Itoa(index)+":", e)
		return false
	})
	rwSyncSlice.RUnlock()

	fmt.Println()
}