Преглед на файлове

add test for EventBuffer

mikymod преди 12 години
родител
ревизия
b79bb5fc46
променени са 1 файла, в които са добавени 80 реда и са изтрити 12 реда
  1. 80 12
      engine/tests/events.cpp

+ 80 - 12
engine/tests/events.cpp

@@ -1,35 +1,103 @@
+#include <cstdlib>
+#include <ctime>
+
 #include "Crown.h"
 #include "EventBuffer.h"
 #include "OsTypes.h"
 #include "Mouse.h"
+#include "OsThread.h"
 #include "Log.h"
 
 using namespace crown;
 
+EventBuffer* g_buffer_1;
+EventBuffer* g_buffer_2;
+EventBuffer* g_tmp;
+
+OsThread g_thread("consumer-thread");
+Semaphore g_process_sem;
+Semaphore g_thread_sem;
+
+bool g_exit = false;
+
 //-----------------------------------------------------------------------------
-int main()
+void push_event()
 {
-	EventBuffer buffer;
+	uint32_t x = (rand() % 100) + 1;
+	uint32_t y = (rand() % 100) + 1;
 
 	OsMouseEvent ome;
 	ome.button = MouseButton::LEFT;
-	ome.x = 0;
-	ome.y = 0;
+	ome.x = x;
+	ome.y = y;
 	ome.pressed = true;
 
-	buffer.push_event((uint32_t)OsEvent::MOUSE, &ome, sizeof(OsMouseEvent));
+	g_buffer_1->push_event((uint32_t)OsEvent::MOUSE, &ome, sizeof(OsMouseEvent));
+	Log::i("Event pushed");
+}
 
-	OsEvent::Enum type = (OsEvent::Enum)buffer.get_next_event_type();
-	Log::d("type: %d", type);
+//-----------------------------------------------------------------------------
+void swap()
+{
+	g_tmp = g_buffer_1;
+	g_buffer_1 = g_buffer_2;
+	g_buffer_2 = g_tmp;
+	Log::i("Buffers swapped");
+}
 
+//-----------------------------------------------------------------------------
+int32_t thread_proc(void* /*user_data*/)
+{
 	OsMouseEvent* result;
 	uint32_t et; size_t es;
-	result = (OsMouseEvent*)buffer.get_next_event(et, es);
 
-	Log::d("button: %d", result->button);
-	Log::d("x: %d", result->x);
-	Log::d("y: %d", result->y);
-	Log::d("pressed: %d", result->pressed);
+	while (true)
+	{
+		while (!g_buffer_1->is_empty())
+		{
+			result = (OsMouseEvent*)g_buffer_1->get_next_event(et, es);
+
+			if (result != NULL)
+			{
+				Log::d("x: %d, y: %d", result->x, result->y);
+			}
+			else
+			{
+				g_buffer_1->clear();
+
+				swap();
+
+				g_process_sem.post();
+				g_thread_sem.wait();
+			}
+		}
+	}
+
+	return 0;
+}
+
+//-----------------------------------------------------------------------------
+int main()
+{
+	memory::init();
+	srand(time(NULL));
+
+	g_buffer_1 = CE_NEW(default_allocator(), EventBuffer);
+	g_buffer_2 = CE_NEW(default_allocator(), EventBuffer);
+
+	g_thread.start(thread_proc);
+
+	while (!g_exit)
+	{
+		push_event();
+
+		g_thread_sem.post();
+		g_process_sem.wait();
+	}
+
+	g_thread.stop();
+
+	memory::shutdown();
 
 	return 0;
 }