diff --git a/internal/queue/queue_test.go b/internal/queue/queue_test.go index b5079ed..a46d1d8 100644 --- a/internal/queue/queue_test.go +++ b/internal/queue/queue_test.go @@ -1 +1,87 @@ package queue_test + +import ( + "testing" + + "github.com/StevanFreeborn/advent-of-code-2025/internal/queue" +) + +func TestQueue_EnqueueDequeue(t *testing.T) { + q := queue.New[int]() + + q.Enqueue(1) + q.Enqueue(2) + q.Enqueue(3) + + expectedValues := []int{1, 2, 3} + + for _, expected := range expectedValues { + value, ok := q.Dequeue() + + if !ok { + t.Errorf("expected dequeue to be successful, but it failed") + } + + if value != expected { + t.Errorf("expected value to be %d, got %d", expected, value) + } + + } + + _, ok := q.Dequeue() + + if ok { + t.Errorf("expected dequeue to fail on empty queue, but it succeeded") + } + + if !q.IsEmpty() { + t.Errorf("expected queue to be empty, but it is not") + } +} + +func TestQueue_Size(t *testing.T) { + q := queue.New[string]() + + if q.Size() != 0 { + t.Errorf("expected size to be 0, got %d", q.Size()) + } + + q.Enqueue("a") + q.Enqueue("b") + + if q.Size() != 2 { + t.Errorf("expected size to be 2, got %d", q.Size()) + } + + q.Dequeue() + + if q.Size() != 1 { + t.Errorf("expected size to be 1, got %d", q.Size()) + } +} + +func TestQueue_ConcurrentAccess(t *testing.T) { + q := queue.New[int]() + done := make(chan bool) + numGoroutines := 100 + numItemsPerGoroutine := 100 + + for i := range numGoroutines { + go func(start int) { + for j := range numItemsPerGoroutine { + q.Enqueue(start + j) + } + done <- true + }(i * numItemsPerGoroutine) + } + + for range numGoroutines { + <-done + } + + expectedSize := numGoroutines * numItemsPerGoroutine + + if q.Size() != expectedSize { + t.Errorf("expected size to be %d, got %d", expectedSize, q.Size()) + } +}