// Copyright 2009 The Go 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 vector

import (
	"fmt"
	"runtime"
	"strings"
	"testing"
)


const memTestN = 1000000


func s(n uint64) string {
	str := fmt.Sprintf("%d", n)
	lens := len(str)
	a := make([]string, (lens+2)/3)
	start := lens
	for i, _ := range a {
		start -= 3
		if start < 0 {
			start = 0
		}
		a[len(a)-i-1] = str[start:lens]
		lens -= 3
	}
	return strings.Join(a, " ")
}


func TestVectorNums(t *testing.T) {
	var v Vector
	c := int(0)
	runtime.GC()
	m0 := runtime.MemStats
	v.Resize(memTestN, memTestN)
	for i := 0; i < memTestN; i++ {
		v.Set(i, c)
	}
	runtime.GC()
	m := runtime.MemStats
	v.Resize(0, 0)
	runtime.GC()
	n := m.Alloc - m0.Alloc
	t.Logf("%T.Push(%#v), n = %s: Alloc/n = %.2f\n", v, c, s(memTestN), float(n)/memTestN)
}


func TestIntVectorNums(t *testing.T) {
	var v IntVector
	c := int(0)
	runtime.GC()
	m0 := runtime.MemStats
	v.Resize(memTestN, memTestN)
	for i := 0; i < memTestN; i++ {
		v.Set(i, c)
	}
	runtime.GC()
	m := runtime.MemStats
	v.Resize(0, 0)
	runtime.GC()
	n := m.Alloc - m0.Alloc
	t.Logf("%T.Push(%#v), n = %s: Alloc/n = %.2f\n", v, c, s(memTestN), float(n)/memTestN)
}


func TestStringVectorNums(t *testing.T) {
	var v StringVector
	c := ""
	runtime.GC()
	m0 := runtime.MemStats
	v.Resize(memTestN, memTestN)
	for i := 0; i < memTestN; i++ {
		v.Set(i, c)
	}
	runtime.GC()
	m := runtime.MemStats
	v.Resize(0, 0)
	runtime.GC()
	n := m.Alloc - m0.Alloc
	t.Logf("%T.Push(%#v), n = %s: Alloc/n = %.2f\n", v, c, s(memTestN), float(n)/memTestN)
}


func BenchmarkVectorNums(b *testing.B) {
	c := int(0)
	var v Vector
	b.StopTimer()
	runtime.GC()
	b.StartTimer()
	for i := 0; i < b.N; i++ {
		v.Push(c)
	}
}


func BenchmarkIntVectorNums(b *testing.B) {
	c := int(0)
	var v IntVector
	b.StopTimer()
	runtime.GC()
	b.StartTimer()
	for i := 0; i < b.N; i++ {
		v.Push(c)
	}
}


func BenchmarkStringVectorNums(b *testing.B) {
	c := ""
	var v StringVector
	b.StopTimer()
	runtime.GC()
	b.StartTimer()
	for i := 0; i < b.N; i++ {
		v.Push(c)
	}
}
