You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.5 KiB
67 lines
1.5 KiB
package queue |
|
|
|
import ( |
|
"math/rand" |
|
"testing" |
|
"time" |
|
) |
|
|
|
type testQueueItem struct { |
|
Value int |
|
Expiry time.Time |
|
} |
|
|
|
func (e testQueueItem) Less(other PriorityQueueItem) bool { |
|
return e.Expiry.Before(other.(*testQueueItem).Expiry) |
|
} |
|
|
|
func TestExpiryQueue(t *testing.T) { |
|
// The number of elements we push to the queue. |
|
count := 100 |
|
// Generate a random permutation of a range [0, count) |
|
array := rand.Perm(count) |
|
// t0 holds a reference time point. |
|
t0 := time.Date(1975, time.April, 5, 12, 0, 0, 0, time.UTC) |
|
|
|
var testQueue PriorityQueue |
|
|
|
if testQueue.Len() != 0 && !testQueue.Empty() { |
|
t.Fatal("Expected the queue to be empty") |
|
} |
|
|
|
// Create elements with expiry of t0 + value * second. |
|
for _, value := range array { |
|
testQueue.Push(&testQueueItem{ |
|
Value: value, |
|
Expiry: t0.Add(time.Duration(value) * time.Second), |
|
}) |
|
} |
|
|
|
// Now expect that we can retrieve elements in order of their expiry. |
|
for i := 0; i < count; i++ { |
|
expectedQueueLen := count - i |
|
if testQueue.Len() != expectedQueueLen { |
|
t.Fatalf("Expected the queue len %v, got %v", |
|
expectedQueueLen, testQueue.Len()) |
|
} |
|
|
|
if testQueue.Empty() { |
|
t.Fatalf("Did not expect the queue to be empty") |
|
} |
|
|
|
top := testQueue.Top().(*testQueueItem) |
|
if top.Value != i { |
|
t.Fatalf("Expected queue top %v, got %v", i, top.Value) |
|
} |
|
|
|
popped := testQueue.Pop().(*testQueueItem) |
|
if popped != top { |
|
t.Fatalf("Expected queue top %v equal to popped: %v", |
|
top, popped) |
|
} |
|
} |
|
|
|
if testQueue.Len() != 0 || !testQueue.Empty() { |
|
t.Fatalf("Expected the queue to be empty") |
|
} |
|
}
|
|
|