131 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// CookieJar - A contestant's algorithm toolbox
 | 
						|
// Copyright (c) 2013 Peter Szilagyi. All rights reserved.
 | 
						|
//
 | 
						|
// CookieJar is dual licensed: use of this source code is governed by a BSD
 | 
						|
// license that can be found in the LICENSE file. Alternatively, the CookieJar
 | 
						|
// toolbox may be used in accordance with the terms and conditions contained
 | 
						|
// in a signed written agreement between you and the author(s).
 | 
						|
 | 
						|
package prque
 | 
						|
 | 
						|
import (
 | 
						|
	"math/rand"
 | 
						|
	"testing"
 | 
						|
)
 | 
						|
 | 
						|
func TestPrque(t *testing.T) {
 | 
						|
	// Generate a batch of random data and a specific priority order
 | 
						|
	size := 16 * blockSize
 | 
						|
	prio := rand.Perm(size)
 | 
						|
	data := make([]int, size)
 | 
						|
	for i := 0; i < size; i++ {
 | 
						|
		data[i] = rand.Int()
 | 
						|
	}
 | 
						|
	queue := New(nil)
 | 
						|
	for rep := 0; rep < 2; rep++ {
 | 
						|
		// Fill a priority queue with the above data
 | 
						|
		for i := 0; i < size; i++ {
 | 
						|
			queue.Push(data[i], int64(prio[i]))
 | 
						|
			if queue.Size() != i+1 {
 | 
						|
				t.Errorf("queue size mismatch: have %v, want %v.", queue.Size(), i+1)
 | 
						|
			}
 | 
						|
		}
 | 
						|
		// Create a map the values to the priorities for easier verification
 | 
						|
		dict := make(map[int64]int)
 | 
						|
		for i := 0; i < size; i++ {
 | 
						|
			dict[int64(prio[i])] = data[i]
 | 
						|
		}
 | 
						|
		// Pop out the elements in priority order and verify them
 | 
						|
		prevPrio := int64(size + 1)
 | 
						|
		for !queue.Empty() {
 | 
						|
			val, prio := queue.Pop()
 | 
						|
			if prio > prevPrio {
 | 
						|
				t.Errorf("invalid priority order: %v after %v.", prio, prevPrio)
 | 
						|
			}
 | 
						|
			prevPrio = prio
 | 
						|
			if val != dict[prio] {
 | 
						|
				t.Errorf("push/pop mismatch: have %v, want %v.", val, dict[prio])
 | 
						|
			}
 | 
						|
			delete(dict, prio)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestReset(t *testing.T) {
 | 
						|
	// Generate a batch of random data and a specific priority order
 | 
						|
	size := 16 * blockSize
 | 
						|
	prio := rand.Perm(size)
 | 
						|
	data := make([]int, size)
 | 
						|
	for i := 0; i < size; i++ {
 | 
						|
		data[i] = rand.Int()
 | 
						|
	}
 | 
						|
	queue := New(nil)
 | 
						|
	for rep := 0; rep < 2; rep++ {
 | 
						|
		// Fill a priority queue with the above data
 | 
						|
		for i := 0; i < size; i++ {
 | 
						|
			queue.Push(data[i], int64(prio[i]))
 | 
						|
			if queue.Size() != i+1 {
 | 
						|
				t.Errorf("queue size mismatch: have %v, want %v.", queue.Size(), i+1)
 | 
						|
			}
 | 
						|
		}
 | 
						|
		// Create a map the values to the priorities for easier verification
 | 
						|
		dict := make(map[int64]int)
 | 
						|
		for i := 0; i < size; i++ {
 | 
						|
			dict[int64(prio[i])] = data[i]
 | 
						|
		}
 | 
						|
		// Pop out half the elements in priority order and verify them
 | 
						|
		prevPrio := int64(size + 1)
 | 
						|
		for i := 0; i < size/2; i++ {
 | 
						|
			val, prio := queue.Pop()
 | 
						|
			if prio > prevPrio {
 | 
						|
				t.Errorf("invalid priority order: %v after %v.", prio, prevPrio)
 | 
						|
			}
 | 
						|
			prevPrio = prio
 | 
						|
			if val != dict[prio] {
 | 
						|
				t.Errorf("push/pop mismatch: have %v, want %v.", val, dict[prio])
 | 
						|
			}
 | 
						|
			delete(dict, prio)
 | 
						|
		}
 | 
						|
		// Reset and ensure it's empty
 | 
						|
		queue.Reset()
 | 
						|
		if !queue.Empty() {
 | 
						|
			t.Errorf("priority queue not empty after reset: %v", queue)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func BenchmarkPush(b *testing.B) {
 | 
						|
	// Create some initial data
 | 
						|
	data := make([]int, b.N)
 | 
						|
	prio := make([]int64, b.N)
 | 
						|
	for i := 0; i < len(data); i++ {
 | 
						|
		data[i] = rand.Int()
 | 
						|
		prio[i] = rand.Int63()
 | 
						|
	}
 | 
						|
	// Execute the benchmark
 | 
						|
	b.ResetTimer()
 | 
						|
	queue := New(nil)
 | 
						|
	for i := 0; i < len(data); i++ {
 | 
						|
		queue.Push(data[i], prio[i])
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func BenchmarkPop(b *testing.B) {
 | 
						|
	// Create some initial data
 | 
						|
	data := make([]int, b.N)
 | 
						|
	prio := make([]int64, b.N)
 | 
						|
	for i := 0; i < len(data); i++ {
 | 
						|
		data[i] = rand.Int()
 | 
						|
		prio[i] = rand.Int63()
 | 
						|
	}
 | 
						|
	queue := New(nil)
 | 
						|
	for i := 0; i < len(data); i++ {
 | 
						|
		queue.Push(data[i], prio[i])
 | 
						|
	}
 | 
						|
	// Execute the benchmark
 | 
						|
	b.ResetTimer()
 | 
						|
	for !queue.Empty() {
 | 
						|
		queue.Pop()
 | 
						|
	}
 | 
						|
}
 |