Skip to content
File

Blob: src/workerd/util/checked-queue-test.c++

3.4 KB
1#include "checked-queue.h"
2 
3#include <kj/test.h>
4 
5namespace workerd::util {
6 
7struct MovableNotCopyable {
8 MovableNotCopyable(int value): value(value) {}
9 MovableNotCopyable(MovableNotCopyable&&) = default;
10 MovableNotCopyable& operator=(MovableNotCopyable&&) = default;
11 KJ_DISALLOW_COPY(MovableNotCopyable);
12 
13 int value = 0;
14};
15 
16struct Regular {
17 int value = 0;
18};
19 
20KJ_TEST("CheckedQueue works - Regular") {
21 Queue<Regular> queue;
22 KJ_ASSERT(queue.empty());
23 KJ_ASSERT(queue.size() == 0);
24 KJ_ASSERT(queue.pop() == kj::none);
25 KJ_ASSERT(queue.peek() == kj::none);
26 KJ_ASSERT(
27 queue.drainTo([](Regular&&) { KJ_FAIL_ASSERT("Should not be called on empty queue"); }) == 0);
28 queue.clear();
29 queue.push(Regular{1});
30 KJ_ASSERT(!queue.empty());
31 KJ_ASSERT(queue.size() == 1);
32 KJ_ASSERT(KJ_ASSERT_NONNULL(queue.peek()).value == 1);
33 KJ_ASSERT(KJ_ASSERT_NONNULL(queue.peek()).value == 1);
34 KJ_ASSERT(KJ_ASSERT_NONNULL(queue.pop()).value == 1);
35 KJ_ASSERT(queue.empty());
36 KJ_ASSERT(queue.size() == 0);
37 KJ_ASSERT(queue.pop() == kj::none);
38 KJ_ASSERT(queue.peek() == kj::none);
39 queue.push(Regular{2});
40 KJ_ASSERT(queue.drainTo([](Regular&& item) { KJ_ASSERT(item.value == 2); }) == 1);
41 KJ_ASSERT(queue.empty());
42 KJ_ASSERT(queue.size() == 0);
43}
44 
45KJ_TEST("CheckedQueue works - MovableNotCopyable") {
46 Queue<MovableNotCopyable> queue;
47 KJ_ASSERT(queue.empty());
48 KJ_ASSERT(queue.size() == 0);
49 KJ_ASSERT(queue.pop() == kj::none);
50 KJ_ASSERT(queue.peek() == kj::none);
51 KJ_ASSERT(queue.drainTo([](MovableNotCopyable&&) {
52 KJ_FAIL_ASSERT("Should not be called on empty queue");
53 }) == 0);
54 queue.clear();
55 queue.push(MovableNotCopyable(1));
56 KJ_ASSERT(!queue.empty());
57 KJ_ASSERT(queue.size() == 1);
58 KJ_ASSERT(KJ_ASSERT_NONNULL(queue.peek()).value == 1);
59 KJ_ASSERT(KJ_ASSERT_NONNULL(queue.peek()).value == 1);
60 KJ_ASSERT(KJ_ASSERT_NONNULL(queue.pop()).value == 1);
61 KJ_ASSERT(queue.empty());
62 KJ_ASSERT(queue.size() == 0);
63 KJ_ASSERT(queue.pop() == kj::none);
64 KJ_ASSERT(queue.peek() == kj::none);
65 queue.push(MovableNotCopyable(2));
66 KJ_ASSERT(queue.drainTo([](MovableNotCopyable&& item) { KJ_ASSERT(item.value == 2); }) == 1);
67 KJ_ASSERT(queue.empty());
68 KJ_ASSERT(queue.size() == 0);
69 
70 queue.emplace(1);
71 KJ_ASSERT(!queue.empty());
72 KJ_ASSERT(queue.size() == 1);
73 KJ_ASSERT(KJ_ASSERT_NONNULL(queue.peek()).value == 1);
74 KJ_ASSERT(KJ_ASSERT_NONNULL(queue.peek()).value == 1);
75 KJ_ASSERT(KJ_ASSERT_NONNULL(queue.pop()).value == 1);
76 KJ_ASSERT(queue.empty());
77 
78 Queue<MovableNotCopyable> queue2;
79 queue2.push(MovableNotCopyable(3));
80 KJ_ASSERT(!queue2.empty());
81 KJ_ASSERT(queue2.size() == 1);
82 queue.swap(queue2);
83 KJ_ASSERT(queue.size() == 1);
84 KJ_ASSERT(KJ_ASSERT_NONNULL(queue.peek()).value == 3);
85 KJ_ASSERT(queue2.size() == 0);
86 KJ_ASSERT(queue2.peek() == kj::none);
87 
88 queue.emplace(2);
89 KJ_ASSERT(queue.size() == 2);
90 KJ_ASSERT(queue.deleteIf([](const auto& item) { return item.value == 3; }) == 1);
91 KJ_ASSERT(queue.size() == 1);
92 KJ_ASSERT(KJ_ASSERT_NONNULL(queue.peek()).value == 2);
93 
94 queue.emplace(4);
95 KJ_ASSERT(queue.size() == 2);
96 KJ_ASSERT(queue.forEach([](const auto& item) {
97 KJ_ASSERT(item.value == 2);
98 return false;
99 }) == 1);
100 
101 queue.emplace(5);
102 KJ_ASSERT(queue.size() == 3);
103 auto removed = KJ_ASSERT_NONNULL(queue.takeIf([](const auto& item) { return item.value == 5; }));
104 KJ_ASSERT(removed.value == 5);
105 KJ_ASSERT(queue.size() == 2);
106}
107 
108} // namespace workerd::util