TEST(ViaFunc, isSticky) { ManualExecutor x; int count = 0; auto f = via(&x, [&]{ count++; }); x.run(); f.then([&]{ count++; }); EXPECT_EQ(1, count); x.run(); EXPECT_EQ(2, count); }
TEST(ManualExecutor, runIsStable) { ManualExecutor x; size_t count = 0; auto f1 = [&]() { count++; }; auto f2 = [&]() { x.add(f1); x.add(f1); }; x.add(f2); x.run(); }
TEST(ViaFunc, liftsVoid) { ManualExecutor x; int count = 0; Future<Unit> f = via(&x, [&]{ count++; }); EXPECT_EQ(0, count); x.run(); EXPECT_EQ(1, count); }
TEST(Via, then2Variadic) { struct Foo { bool a = false; void foo(Try<Unit>) { a = true; } }; Foo f; ManualExecutor x; makeFuture().then(&x, &Foo::foo, &f); EXPECT_FALSE(f.a); x.run(); EXPECT_TRUE(f.a); }
TEST(ManualExecutor, scheduleDur) { ManualExecutor x; size_t count = 0; std::chrono::milliseconds dur {10}; x.schedule([&]{ count++; }, dur); EXPECT_EQ(count, 0); x.run(); EXPECT_EQ(count, 0); x.advance(dur/2); EXPECT_EQ(count, 0); x.advance(dur/2); EXPECT_EQ(count, 1); }
TEST(Via, viaRaces) { ManualExecutor x; Promise<Unit> p; auto tid = std::this_thread::get_id(); bool done = false; std::thread t1([&] { p.getFuture() .via(&x) .then([&](Try<Unit>&&) { EXPECT_EQ(tid, std::this_thread::get_id()); }) .then([&](Try<Unit>&&) { EXPECT_EQ(tid, std::this_thread::get_id()); }) .then([&](Try<Unit>&&) { done = true; }); }); std::thread t2([&] { p.setValue(); }); while (!done) x.run(); t1.join(); t2.join(); }