TEST(BasicThreadTest, Stop)
{
	MockThread m;
	m.start(nullptr);

	boost::this_thread::sleep(boost::posix_time::milliseconds(100));

	EXPECT_TRUE(m.isRunning());
	m.stop();

	EXPECT_TRUE(m.didBeforeStop);
	EXPECT_FALSE(m.isRunning());
}
TEST(BasicThreadTest, RunTimeManagement)
{
	MockThread m;
	EXPECT_EQ(-1, m.count);
	std::shared_ptr<Barrier> barrier = std::make_shared<Barrier>(2);
	EXPECT_FALSE(m.didInitialize);
	EXPECT_FALSE(m.didStartUp);
	EXPECT_FALSE(m.isRunning());
	m.start(barrier);
	boost::this_thread::sleep(boost::posix_time::milliseconds(100));
	EXPECT_TRUE(m.isRunning());
	EXPECT_TRUE(m.didInitialize);
	EXPECT_FALSE(m.didStartUp);
	barrier->wait(true);
	boost::this_thread::sleep(boost::posix_time::milliseconds(100));
	EXPECT_TRUE(m.didInitialize);
	EXPECT_TRUE(m.didStartUp);
	barrier->wait(true);
	boost::this_thread::sleep(boost::posix_time::milliseconds(100));

	m.stop();
}
TEST(BasicThreadTest, StopWithoutSleep)
{
	for (int i = 0;  i < 10;  ++i)
	{
		MockThread m;
		m.count = 1000000;
		m.start(nullptr);

		// Stopping right away should not create a race condition.
		m.stop();

		EXPECT_TRUE(m.didBeforeStop);
		EXPECT_FALSE(m.isRunning());
	}
}