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() | ||
|  | 	} | ||
|  | } |