29 TEST_CASE(
"semaphore's can be constructed.",
"[semaphore]")
36 TEST_CASE(
"semaphore's 'wait' method waits until the semaphore can be " 37 "decremented.",
"[semaphore]")
39 SECTION(
"Single wait.")
42 auto future = std::async(std::launch::async, [&]()
46 REQUIRE(future.wait_for(0ms) != std::future_status::ready);
48 REQUIRE(future.wait_for(10ms) == std::future_status::ready);
51 SECTION(
"Multiple wait.")
54 auto future = std::async(std::launch::async, [&]()
59 REQUIRE(future.wait_for(0ms) != std::future_status::ready);
61 REQUIRE(future.wait_for(10ms) != std::future_status::ready);
63 REQUIRE(future.wait_for(10ms) == std::future_status::ready);
66 SECTION(
"Single wait, with initial value by notification.")
70 auto future = std::async(std::launch::async, [&]()
74 REQUIRE(future.wait_for(10ms) == std::future_status::ready);
77 SECTION(
"Multiple wait, with initial value by notification.")
81 auto future = std::async(std::launch::async, [&]()
86 REQUIRE(future.wait_for(10ms) != std::future_status::ready);
88 REQUIRE(future.wait_for(10ms) == std::future_status::ready);
91 SECTION(
"Single wait, with initial value in constructor.")
94 auto future = std::async(std::launch::async, [&]()
98 REQUIRE(future.wait_for(10ms) == std::future_status::ready);
101 SECTION(
"Multiple wait, with initial value in constructor.")
104 auto future = std::async(std::launch::async, [&]()
109 REQUIRE(future.wait_for(10ms) == std::future_status::ready);
115 TEST_CASE(
"semaphore's 'wait_for' method waits until the semaphore can be " 116 "decremented, or the timeout is reached (returning false if it " 117 "timed out).",
"[semaphore]")
119 SECTION(
"Single wait (no timeout).")
122 auto future = std::async(std::launch::async, [&]()
126 REQUIRE(future.wait_for(0ms) != std::future_status::ready);
128 REQUIRE(future.wait_for(5ms) == std::future_status::ready);
129 REQUIRE(future.get());
131 SECTION(
"Single wait (timeout).")
134 auto future = std::async(std::launch::async, [&]()
138 REQUIRE(future.wait_for(1ms) != std::future_status::ready);
139 REQUIRE(future.wait_for(20ms) == std::future_status::ready);
140 REQUIRE_FALSE(future.get());
143 future = std::async(std::launch::async, [&]()
147 REQUIRE(future.wait_for(1ms) != std::future_status::ready);
148 REQUIRE(future.wait_for(20ms) == std::future_status::ready);
149 REQUIRE_FALSE(future.get());
151 SECTION(
"Multiple wait (no timeout).")
154 auto future = std::async(std::launch::async, [&]()
158 REQUIRE(future.wait_for(0ms) != std::future_status::ready);
160 REQUIRE(future.wait_for(1ms) != std::future_status::ready);
162 REQUIRE(future.wait_for(10ms) == std::future_status::ready);
163 REQUIRE(future.get());
165 SECTION(
"Multiple wait (timeout).")
168 auto future = std::async(std::launch::async, [&]()
172 REQUIRE(future.wait_for(0ms) != std::future_status::ready);
173 REQUIRE(future.wait_for(10ms) == std::future_status::ready);
174 REQUIRE_FALSE(future.get());
177 future = std::async(std::launch::async, [&]()
181 REQUIRE(future.wait_for(0ms) != std::future_status::ready);
182 REQUIRE(future.wait_for(10ms) == std::future_status::ready);
183 REQUIRE_FALSE(future.get());
188 TEST_CASE(
"semaphore's 'wait_until' method waits until the semaphore can be " 189 "decremented, or the timeout timepoint is reached (returning false " 190 "if it timed out).",
"[semaphore]")
192 SECTION(
"Single wait (no timeout).")
195 auto future = std::async(std::launch::async, [&]()
197 return sp.
wait_until(std::chrono::steady_clock::now() + 20ms);
199 REQUIRE(future.wait_for(0ms) != std::future_status::ready);
201 REQUIRE(future.wait_for(10ms) == std::future_status::ready);
202 REQUIRE(future.get());
204 SECTION(
"Single wait (timeout).")
207 auto future = std::async(std::launch::async, [&]()
209 return sp.
wait_until(std::chrono::steady_clock::now() + 2ms);
211 REQUIRE(future.wait_for(0ms) != std::future_status::ready);
212 REQUIRE(future.wait_for(10ms) == std::future_status::ready);
213 REQUIRE_FALSE(future.get());
216 future = std::async(std::launch::async, [&]()
218 return sp.
wait_until(std::chrono::steady_clock::now() + 5ms);
220 REQUIRE(future.wait_for(1ms) != std::future_status::ready);
221 REQUIRE(future.wait_for(20ms) == std::future_status::ready);
222 REQUIRE_FALSE(future.get());
224 SECTION(
"Multiple wait (no timeout).")
227 auto future = std::async(std::launch::async, [&]()
229 return sp.
wait_until(std::chrono::steady_clock::now() + 100ms) &&
230 sp.
wait_until(std::chrono::steady_clock::now() + 100ms);
232 REQUIRE(future.wait_for(0ms) != std::future_status::ready);
234 REQUIRE(future.wait_for(10ms) != std::future_status::ready);
236 REQUIRE(future.wait_for(10ms) == std::future_status::ready);
237 REQUIRE(future.get());
239 SECTION(
"Multiple wait (timeout).")
242 auto future = std::async(std::launch::async, [&]()
244 return sp.
wait_until(std::chrono::steady_clock::now() + 1ms) &&
245 sp.
wait_until(std::chrono::steady_clock::now() + 1ms);
247 REQUIRE(future.wait_for(0ms) != std::future_status::ready);
248 REQUIRE(future.wait_for(10ms) == std::future_status::ready);
249 REQUIRE_FALSE(future.get());
252 future = std::async(std::launch::async, [&]()
254 return sp.
wait_until(std::chrono::steady_clock::now() + 1ms) &&
255 sp.
wait_until(std::chrono::steady_clock::now() + 1ms);
257 REQUIRE(future.wait_for(0ms) != std::future_status::ready);
258 REQUIRE(future.wait_for(10ms) == std::future_status::ready);
259 REQUIRE_FALSE(future.get());
bool wait_until(const std::chrono::time_point< Clock, Duration > &timeout_time)
TEST_CASE("semaphore's can be constructed.", "[semaphore]")
bool wait_for(const std::chrono::duration< Rep, Period > &rel_time)