148 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			148 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include <renderer/backend/vk/context/surface.hpp>
 | |
| #include <renderer/backend/vk/debug/messenger.hpp>
 | |
| #include <surface/components.hpp>
 | |
| #include <surface/system.hpp>
 | |
| #include <test/expects.hpp>
 | |
| #include <test/test.hpp>
 | |
| 
 | |
| using namespace lt;
 | |
| using renderer::vk::Messenger;
 | |
| using renderer::vk::Surface;
 | |
| using enum Messenger::Severity;
 | |
| using enum Messenger::Type;
 | |
| 
 | |
| void noop_callback(
 | |
|     Messenger::Severity message_severity,
 | |
|     Messenger::Type message_type,
 | |
|     Messenger::CallbackData_T vulkan_data,
 | |
|     void *user_data
 | |
| )
 | |
| {
 | |
| }
 | |
| 
 | |
| Suite raii = "messenger_raii"_suite = [] {
 | |
| 	Case { "happy path won't throw" } = [] {
 | |
| 		Messenger(
 | |
| 		    Messenger::CreateInfo {
 | |
| 		        .severity = all_severity,
 | |
| 		        .type = all_type,
 | |
| 		        .callback = &noop_callback,
 | |
| 		    }
 | |
| 		);
 | |
| 	};
 | |
| 
 | |
| 	Case { "unhappy path throws" } = [] {
 | |
| 		expect_throw([] {
 | |
| 			Messenger(
 | |
| 			    Messenger::CreateInfo {
 | |
| 			        .severity = all_severity,
 | |
| 			        .type = all_type,
 | |
| 			        .callback = {},
 | |
| 			    }
 | |
| 			);
 | |
| 		});
 | |
| 
 | |
| 		expect_throw([] {
 | |
| 			Messenger(
 | |
| 			    Messenger::CreateInfo {
 | |
| 			        .severity = {},
 | |
| 			        .type = all_type,
 | |
| 			        .callback = &noop_callback,
 | |
| 			    }
 | |
| 			);
 | |
| 		});
 | |
| 
 | |
| 		expect_throw([] {
 | |
| 			Messenger(
 | |
| 			    Messenger::CreateInfo {
 | |
| 			        .severity = all_severity,
 | |
| 			        .type = {},
 | |
| 			        .callback = &noop_callback,
 | |
| 			    }
 | |
| 			);
 | |
| 		});
 | |
| 	};
 | |
| };
 | |
| 
 | |
| // NOLINTNEXTLINE(cppcoreguidelines-interfaces-global-init)
 | |
| Suite callback = "messenger_callback"_suite = [] {
 | |
| 	Case { "callback gets called with correct arguments" } = [] {
 | |
| 		auto total_messages = 0u;
 | |
| 		auto first_message_is_severity = false;
 | |
| 		auto second_message_is_type = false;
 | |
| 		auto third_message_is_user_callback = false;
 | |
| 		auto all_messages_are_error = true;
 | |
| 		auto all_messages_are_validation = true;
 | |
| 		auto user_data_is_always_69 = true;
 | |
| 
 | |
| 		auto callback = [&](Messenger::Severity message_severity,
 | |
| 		                    Messenger::Type message_type,
 | |
| 		                    Messenger::CallbackData_T vulkan_data,
 | |
| 		                    void *user_data) {
 | |
| 			++total_messages;
 | |
| 			auto message = std::string_view { vulkan_data->pMessage };
 | |
| 
 | |
| 			// NOLINTNEXTLINE(cppcoreguidelines-pro-type-cstyle-cast)
 | |
| 			user_data_is_always_69 = user_data_is_always_69 && *(size_t *)user_data == 69u;
 | |
| 
 | |
| 			all_messages_are_validation = all_messages_are_validation && message_type == validation;
 | |
| 			all_messages_are_error = all_messages_are_error && message_severity == error;
 | |
| 
 | |
| 			if (total_messages == 1)
 | |
| 			{
 | |
| 				first_message_is_severity = message.starts_with(
 | |
| 				    "vkCreateDebugUtilsMessengerEXT(): pCreateInfo->messageSeverity is zero."
 | |
| 				);
 | |
| 				return;
 | |
| 			}
 | |
| 
 | |
| 
 | |
| 			if (total_messages == 2)
 | |
| 			{
 | |
| 				second_message_is_type = message.starts_with(
 | |
| 				    "vkCreateDebugUtilsMessengerEXT(): pCreateInfo->messageType is zero."
 | |
| 				);
 | |
| 				return;
 | |
| 			}
 | |
| 
 | |
| 			if (total_messages == 3)
 | |
| 			{
 | |
| 				third_message_is_user_callback = message.starts_with(
 | |
| 				    "vkCreateDebugUtilsMessengerEXT(): pCreateInfo->pfnUserCallback is NULL."
 | |
| 				);
 | |
| 				return;
 | |
| 			}
 | |
| 		};
 | |
| 
 | |
| 		auto user_data = size_t { 69 };
 | |
| 		auto messenger = Messenger(
 | |
| 		    Messenger::CreateInfo {
 | |
| 		        .severity = all_severity,
 | |
| 		        .type = all_type,
 | |
| 		        .callback = callback,
 | |
| 		        .user_data = &user_data,
 | |
| 		    }
 | |
| 		);
 | |
| 
 | |
| 		{
 | |
| 			auto *messenger = VkDebugUtilsMessengerEXT {};
 | |
| 			auto info = VkDebugUtilsMessengerCreateInfoEXT {
 | |
| 				.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT,
 | |
| 			};
 | |
| 			renderer::vk::vk_create_debug_messenger(
 | |
| 			    renderer::vk::Instance::get(),
 | |
| 			    &info,
 | |
| 			    nullptr,
 | |
| 			    &messenger
 | |
| 			);
 | |
| 		}
 | |
| 
 | |
| 		expect_eq(total_messages, 3u);
 | |
| 		expect_true(first_message_is_severity);
 | |
| 		expect_true(second_message_is_type);
 | |
| 		expect_true(third_message_is_user_callback);
 | |
| 		expect_true(all_messages_are_error);
 | |
| 		expect_true(all_messages_are_validation);
 | |
| 		expect_true(user_data_is_always_69);
 | |
| 	};
 | |
| };
 |