#include "gtest/gtest.h"
#include "gmock/gmock.h"

#include "piconditionvar.h"
#include "pithread.h"
#include "testutil.h"

class ConditionLock : public ::testing::Test, public TestUtil {
public:
	PIMutex* m = new PIMutex();
	bool isProtect;
	bool isReleased;
};


TEST_F(ConditionLock, DISABLED_lock_is_protect) {
	m->lock();
	isProtect = true;
	createThread([&](){
		m->lock();
		isProtect = false;
	});
	EXPECT_FALSE(thread->waitForFinish(WAIT_THREAD_TIME_MS));
	ASSERT_TRUE(isProtect);

}

TEST_F(ConditionLock, DISABLED_unlock_is_release) {
	m->lock();
	isReleased = false;
	m->unlock();

	createThread([&](){
		m->lock();
		isReleased = true;
		m->unlock();
	});
	ASSERT_TRUE(isReleased);
}

TEST_F(ConditionLock, tryLock_is_false_when_locked) {
	createThread([&](){
		m->lock();
		piMSleep(WAIT_THREAD_TIME_MS);
	});
	ASSERT_FALSE(m->tryLock());
}

TEST_F(ConditionLock, tryLock_is_true_when_unlocked) {
	ASSERT_TRUE(m->tryLock());
}

TEST_F(ConditionLock, tryLock_is_recursive_lock_enable) {
	m->lock();
	ASSERT_TRUE(m->tryLock());
}
