Replaced assert() with new macro TEST() in all tests, to check conditions also in Release configuration.

# Conflicts:
#	src/SparseBindingTest.cpp
#	src/Tests.cpp
#	src/VulkanSample.cpp
diff --git a/src/Common.h b/src/Common.h
index 111ccde..0e32c78 100644
--- a/src/Common.h
+++ b/src/Common.h
@@ -16,6 +16,7 @@
 #include <utility>

 #include <chrono>

 #include <string>

+#include <exception>

 

 #include <cassert>

 #include <cstdlib>

@@ -25,7 +26,21 @@
 typedef std::chrono::high_resolution_clock::time_point time_point;

 typedef std::chrono::high_resolution_clock::duration duration;

 

-#define ERR_GUARD_VULKAN(Expr) do { VkResult res__ = (Expr); if (res__ < 0) assert(0); } while(0)

+#ifdef _DEBUG

+    #define TEST(expr) do { \

+            if(!(expr)) { \

+                assert(0 && #expr); \

+            } \

+        } while(0)

+#else

+    #define TEST(expr) do { \

+            if(!(expr)) { \

+                throw std::runtime_error("TEST FAILED: " #expr); \

+            } \

+        } while(0)

+#endif

+

+#define ERR_GUARD_VULKAN(expr) TEST((expr) >= 0)

 

 extern VkPhysicalDevice g_hPhysicalDevice;

 extern VkDevice g_hDevice;

diff --git a/src/Tests.cpp b/src/Tests.cpp
index 6dc236a..ebd7366 100644
--- a/src/Tests.cpp
+++ b/src/Tests.cpp
@@ -401,7 +401,7 @@
         }

         else

         {

-            assert(0);

+            TEST(0);

         }

         return res;

     };

@@ -684,14 +684,14 @@
     {

         outAllocInfo.m_StartValue = (uint32_t)rand();

         uint32_t* data = (uint32_t*)vmaAllocInfo.pMappedData;

-        assert((data != nullptr) == persistentlyMapped);

+        TEST((data != nullptr) == persistentlyMapped);

         if(!persistentlyMapped)

         {

             ERR_GUARD_VULKAN( vmaMapMemory(g_hAllocator, outAllocInfo.m_Allocation, (void**)&data) );

         }

 

         uint32_t value = outAllocInfo.m_StartValue;

-        assert(bufCreateInfo.size % 4 == 0);

+        TEST(bufCreateInfo.size % 4 == 0);

         for(size_t i = 0; i < bufCreateInfo.size / sizeof(uint32_t); ++i)

             data[i] = value++;

 

@@ -726,7 +726,7 @@
 

         VkResult res = vmaCreateBuffer(allocator, &bufferInfo, &vmaMemReq, &outAllocation.m_Buffer, &outAllocation.m_Allocation, &allocInfo);

         outAllocation.m_BufferInfo = bufferInfo;

-        assert(res == VK_SUCCESS);

+        TEST(res == VK_SUCCESS);

     }

     else

     {

@@ -752,18 +752,18 @@
 

         VkResult res = vmaCreateImage(allocator, &imageInfo, &vmaMemReq, &outAllocation.m_Image, &outAllocation.m_Allocation, &allocInfo);

         outAllocation.m_ImageInfo = imageInfo;

-        assert(res == VK_SUCCESS);

+        TEST(res == VK_SUCCESS);

     }

 

     uint32_t* data = (uint32_t*)allocInfo.pMappedData;

     if(allocInfo.pMappedData == nullptr)

     {

         VkResult res = vmaMapMemory(allocator, outAllocation.m_Allocation, (void**)&data);

-        assert(res == VK_SUCCESS);

+        TEST(res == VK_SUCCESS);

     }

 

     uint32_t value = outAllocation.m_StartValue;

-    assert(allocInfo.size % 4 == 0);

+    TEST(allocInfo.size % 4 == 0);

     for(size_t i = 0; i < allocInfo.size / sizeof(uint32_t); ++i)

         data[i] = value++;

 

@@ -795,13 +795,13 @@
     if(allocInfo.pMappedData == nullptr)

     {

         VkResult res = vmaMapMemory(g_hAllocator, allocation.m_Allocation, (void**)&data);

-        assert(res == VK_SUCCESS);

+        TEST(res == VK_SUCCESS);

     }

 

     uint32_t value = allocation.m_StartValue;

     bool ok = true;

     size_t i;

-    assert(allocInfo.size % 4 == 0);

+    TEST(allocInfo.size % 4 == 0);

     for(i = 0; i < allocInfo.size / sizeof(uint32_t); ++i)

     {

         if(data[i] != value++)

@@ -810,7 +810,7 @@
             break;

         }

     }

-    assert(ok);

+    TEST(ok);

 

     if(allocInfo.pMappedData == nullptr)

         vmaUnmapMemory(g_hAllocator, allocation.m_Allocation);

@@ -826,29 +826,29 @@
         vkDestroyBuffer(g_hDevice, allocation.m_Buffer, nullptr);

 

         VkResult res = vkCreateBuffer(g_hDevice, &allocation.m_BufferInfo, nullptr, &allocation.m_Buffer);

-        assert(res == VK_SUCCESS);

+        TEST(res == VK_SUCCESS);

 

         // Just to silence validation layer warnings.

         VkMemoryRequirements vkMemReq;

         vkGetBufferMemoryRequirements(g_hDevice, allocation.m_Buffer, &vkMemReq);

-        assert(vkMemReq.size == allocation.m_BufferInfo.size);

+        TEST(vkMemReq.size == allocation.m_BufferInfo.size);

 

         res = vkBindBufferMemory(g_hDevice, allocation.m_Buffer, allocInfo.deviceMemory, allocInfo.offset);

-        assert(res == VK_SUCCESS);

+        TEST(res == VK_SUCCESS);

     }

     else

     {

         vkDestroyImage(g_hDevice, allocation.m_Image, nullptr);

 

         VkResult res = vkCreateImage(g_hDevice, &allocation.m_ImageInfo, nullptr, &allocation.m_Image);

-        assert(res == VK_SUCCESS);

+        TEST(res == VK_SUCCESS);

 

         // Just to silence validation layer warnings.

         VkMemoryRequirements vkMemReq;

         vkGetImageMemoryRequirements(g_hDevice, allocation.m_Image, &vkMemReq);

 

         res = vkBindImageMemory(g_hDevice, allocation.m_Image, allocInfo.deviceMemory, allocInfo.offset);

-        assert(res == VK_SUCCESS);

+        TEST(res == VK_SUCCESS);

     }

 }

 

@@ -942,8 +942,8 @@
 

             VmaDefragmentationStats defragStats;

             Defragment(allocations.data(), allocations.size(), nullptr, &defragStats);

-            assert(defragStats.allocationsMoved > 0 && defragStats.bytesMoved > 0);

-            assert(defragStats.deviceMemoryBlocksFreed >= 1);

+            TEST(defragStats.allocationsMoved > 0 && defragStats.bytesMoved > 0);

+            TEST(defragStats.deviceMemoryBlocksFreed >= 1);

 

             ValidateAllocationsData(allocations.data(), allocations.size());

 

@@ -976,7 +976,7 @@
             {

                 VmaDefragmentationStats defragStats;

                 Defragment(allocations.data(), allocations.size(), &defragInfo, &defragStats);

-                assert(defragStats.allocationsMoved > 0 && defragStats.bytesMoved > 0);

+                TEST(defragStats.allocationsMoved > 0 && defragStats.bytesMoved > 0);

             }

 

             ValidateAllocationsData(allocations.data(), allocations.size());

@@ -1089,7 +1089,7 @@
 

             VmaDefragmentationStats stats;

             VkResult res = vmaDefragment(g_hAllocator, vmaAllocations.data(), vmaAllocations.size(), allocationsChanged.data(), &defragmentationInfo, &stats);

-            assert(res >= 0);

+            TEST(res >= 0);

 

             float defragmentDuration = ToFloatSeconds(std::chrono::high_resolution_clock::now() - begTime);

 

@@ -1142,15 +1142,15 @@
 

             VkBuffer buf; VmaAllocation alloc; VmaAllocationInfo allocInfo;

             res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo, &buf, &alloc, &allocInfo);

-            assert(res == VK_SUCCESS);

-            assert(allocInfo.pUserData = numberAsPointer);

+            TEST(res == VK_SUCCESS);

+            TEST(allocInfo.pUserData = numberAsPointer);

 

             vmaGetAllocationInfo(g_hAllocator, alloc, &allocInfo);

-            assert(allocInfo.pUserData == numberAsPointer);

+            TEST(allocInfo.pUserData == numberAsPointer);

 

             vmaSetAllocationUserData(g_hAllocator, alloc, pointerToSomething);

             vmaGetAllocationInfo(g_hAllocator, alloc, &allocInfo);

-            assert(allocInfo.pUserData == pointerToSomething);

+            TEST(allocInfo.pUserData == pointerToSomething);

 

             vmaDestroyBuffer(g_hAllocator, buf, alloc);

         }

@@ -1173,22 +1173,22 @@
 

             VkBuffer buf; VmaAllocation alloc; VmaAllocationInfo allocInfo;

             res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo, &buf, &alloc, &allocInfo);

-            assert(res == VK_SUCCESS);

-            assert(allocInfo.pUserData != nullptr && allocInfo.pUserData != name1Buf);

-            assert(strcmp(name1, (const char*)allocInfo.pUserData) == 0);

+            TEST(res == VK_SUCCESS);

+            TEST(allocInfo.pUserData != nullptr && allocInfo.pUserData != name1Buf);

+            TEST(strcmp(name1, (const char*)allocInfo.pUserData) == 0);

 

             delete[] name1Buf;

 

             vmaGetAllocationInfo(g_hAllocator, alloc, &allocInfo);

-            assert(strcmp(name1, (const char*)allocInfo.pUserData) == 0);

+            TEST(strcmp(name1, (const char*)allocInfo.pUserData) == 0);

 

             vmaSetAllocationUserData(g_hAllocator, alloc, (void*)name2);

             vmaGetAllocationInfo(g_hAllocator, alloc, &allocInfo);

-            assert(strcmp(name2, (const char*)allocInfo.pUserData) == 0);

+            TEST(strcmp(name2, (const char*)allocInfo.pUserData) == 0);

 

             vmaSetAllocationUserData(g_hAllocator, alloc, nullptr);

             vmaGetAllocationInfo(g_hAllocator, alloc, &allocInfo);

-            assert(allocInfo.pUserData == nullptr);

+            TEST(allocInfo.pUserData == nullptr);

 

             vmaDestroyBuffer(g_hAllocator, buf, alloc);

         }

@@ -1213,7 +1213,7 @@
 

     // No requirements.

     res = vmaCreateBuffer(g_hAllocator, &bufInfo, &allocCreateInfo, &buf, &alloc, &allocInfo);

-    assert(res == VK_SUCCESS);

+    TEST(res == VK_SUCCESS);

     vmaDestroyBuffer(g_hAllocator, buf, alloc);

 

     // Usage.

@@ -1223,8 +1223,8 @@
     allocCreateInfo.memoryTypeBits = UINT32_MAX;

 

     res = vmaCreateBuffer(g_hAllocator, &bufInfo, &allocCreateInfo, &buf, &alloc, &allocInfo);

-    assert(res == VK_SUCCESS);

-    assert(memProps->memoryTypes[allocInfo.memoryType].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);

+    TEST(res == VK_SUCCESS);

+    TEST(memProps->memoryTypes[allocInfo.memoryType].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);

     vmaDestroyBuffer(g_hAllocator, buf, alloc);

 

     // Required flags, preferred flags.

@@ -1234,9 +1234,9 @@
     allocCreateInfo.memoryTypeBits = 0;

 

     res = vmaCreateBuffer(g_hAllocator, &bufInfo, &allocCreateInfo, &buf, &alloc, &allocInfo);

-    assert(res == VK_SUCCESS);

-    assert(memProps->memoryTypes[allocInfo.memoryType].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);

-    assert(memProps->memoryTypes[allocInfo.memoryType].propertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);

+    TEST(res == VK_SUCCESS);

+    TEST(memProps->memoryTypes[allocInfo.memoryType].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);

+    TEST(memProps->memoryTypes[allocInfo.memoryType].propertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);

     vmaDestroyBuffer(g_hAllocator, buf, alloc);

 

     // memoryTypeBits.

@@ -1247,8 +1247,8 @@
     allocCreateInfo.memoryTypeBits = 1u << memType;

 

     res = vmaCreateBuffer(g_hAllocator, &bufInfo, &allocCreateInfo, &buf, &alloc, &allocInfo);

-    assert(res == VK_SUCCESS);

-    assert(allocInfo.memoryType == memType);

+    TEST(res == VK_SUCCESS);

+    TEST(allocInfo.memoryType == memType);

     vmaDestroyBuffer(g_hAllocator, buf, alloc);

 

 }

@@ -1263,12 +1263,12 @@
     {

         VmaAllocation alloc = VK_NULL_HANDLE;

         vmaCreateLostAllocation(g_hAllocator, &alloc);

-        assert(alloc != VK_NULL_HANDLE);

+        TEST(alloc != VK_NULL_HANDLE);

 

         VmaAllocationInfo allocInfo;

         vmaGetAllocationInfo(g_hAllocator, alloc, &allocInfo);

-        assert(allocInfo.deviceMemory == VK_NULL_HANDLE);

-        assert(allocInfo.size == 0);

+        TEST(allocInfo.deviceMemory == VK_NULL_HANDLE);

+        TEST(allocInfo.size == 0);

 

         vmaFreeMemory(g_hAllocator, alloc);

     }

@@ -1285,7 +1285,7 @@
 

         VkBuffer buf; VmaAllocation alloc; VmaAllocationInfo allocInfo;

         res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo, &buf, &alloc, &allocInfo);

-        assert(res == VK_SUCCESS);

+        TEST(res == VK_SUCCESS);

 

         vmaDestroyBuffer(g_hAllocator, buf, alloc);

 

@@ -1293,7 +1293,7 @@
         allocCreateInfo.flags |= VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT;

 

         res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo, &buf, &alloc, &allocInfo);

-        assert(res == VK_SUCCESS);

+        TEST(res == VK_SUCCESS);

 

         vmaDestroyBuffer(g_hAllocator, buf, alloc);

     }

@@ -1319,7 +1319,7 @@
 

     VmaAllocator hAllocator;

     VkResult res = vmaCreateAllocator(&allocatorCreateInfo, &hAllocator);

-    assert(res == VK_SUCCESS);

+    TEST(res == VK_SUCCESS);

 

     struct Item

     {

@@ -1344,7 +1344,7 @@
         {

             Item item;

             res = vmaCreateBuffer(hAllocator, &bufCreateInfo, &allocCreateInfo, &item.hBuf, &item.hAlloc, &ownAllocInfo);

-            assert(res == VK_SUCCESS);

+            TEST(res == VK_SUCCESS);

             items.push_back(item);

         }

     }

@@ -1356,7 +1356,7 @@
 

     VmaPool hPool;

     res = vmaCreatePool(hAllocator, &poolCreateInfo, &hPool);

-    assert(res == VK_SUCCESS);

+    TEST(res == VK_SUCCESS);

 

     // 2. Allocate normal buffers from all the remaining memory.

     {

@@ -1370,7 +1370,7 @@
         {

             Item item;

             res = vmaCreateBuffer(hAllocator, &bufCreateInfo, &allocCreateInfo, &item.hBuf, &item.hAlloc, nullptr);

-            assert(res == VK_SUCCESS);

+            TEST(res == VK_SUCCESS);

             items.push_back(item);

         }

     }

@@ -1385,7 +1385,7 @@
         VkBuffer hBuf;

         VmaAllocation hAlloc;

         res = vmaCreateBuffer(hAllocator, &bufCreateInfo, &allocCreateInfo, &hBuf, &hAlloc, nullptr);

-        assert(res == VK_ERROR_OUT_OF_DEVICE_MEMORY);

+        TEST(res == VK_ERROR_OUT_OF_DEVICE_MEMORY);

     }

 

     // Destroy everything.

@@ -1424,14 +1424,14 @@
         allocCreateInfo.flags = (i == BUF_COUNT - 1) ? VMA_ALLOCATION_CREATE_MAPPED_BIT : 0;

 

         VkResult res = vmaCreateBuffer(g_hAllocator, &bufInfo, &allocCreateInfo, &buffers[i].Buffer, &buffers[i].Allocation, &allocInfo[i]);

-        assert(res == VK_SUCCESS);

+        TEST(res == VK_SUCCESS);

         // Margin is preserved also at the beginning of a block.

-        assert(allocInfo[i].offset >= VMA_DEBUG_MARGIN);

+        TEST(allocInfo[i].offset >= VMA_DEBUG_MARGIN);

 

         if(i == BUF_COUNT - 1)

         {

             // Fill with data.

-            assert(allocInfo[i].pMappedData != nullptr);

+            TEST(allocInfo[i].pMappedData != nullptr);

             // Uncomment this "+ 1" to overwrite past end of allocation and check corruption detection.

             memset(allocInfo[i].pMappedData, 0xFF, bufInfo.size /* + 1 */);

         }

@@ -1450,12 +1450,12 @@
     {

         if(allocInfo[i].deviceMemory == allocInfo[i - 1].deviceMemory)

         {

-            assert(allocInfo[i].offset >= allocInfo[i - 1].offset + VMA_DEBUG_MARGIN);

+            TEST(allocInfo[i].offset >= allocInfo[i - 1].offset + VMA_DEBUG_MARGIN);

         }

     }

 

     VkResult res = vmaCheckCorruption(g_hAllocator, UINT32_MAX);

-    assert(res == VK_SUCCESS);

+    TEST(res == VK_SUCCESS);

 

     // Destroy all buffers.

     for(size_t i = BUF_COUNT; i--; )

@@ -1480,7 +1480,7 @@
 

     VmaPoolCreateInfo poolCreateInfo = {};

     VkResult res = vmaFindMemoryTypeIndexForBufferInfo(g_hAllocator, &sampleBufCreateInfo, &sampleAllocCreateInfo, &poolCreateInfo.memoryTypeIndex);

-    assert(res == VK_SUCCESS);

+    TEST(res == VK_SUCCESS);

 

     poolCreateInfo.blockSize = 1024 * 300;

     poolCreateInfo.flags = VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT;

@@ -1488,7 +1488,7 @@
 

     VmaPool pool = nullptr;

     res = vmaCreatePool(g_hAllocator, &poolCreateInfo, &pool);

-    assert(res == VK_SUCCESS);

+    TEST(res == VK_SUCCESS);

 

     VkBufferCreateInfo bufCreateInfo = sampleBufCreateInfo;

 

@@ -1514,8 +1514,8 @@
             BufferInfo newBufInfo;

             res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo,

                 &newBufInfo.Buffer, &newBufInfo.Allocation, &allocInfo);

-            assert(res == VK_SUCCESS);

-            assert(i == 0 || allocInfo.offset > prevOffset);

+            TEST(res == VK_SUCCESS);

+            TEST(i == 0 || allocInfo.offset > prevOffset);

             bufInfo.push_back(newBufInfo);

             prevOffset = allocInfo.offset;

             bufSumSize += bufCreateInfo.size;

@@ -1524,9 +1524,9 @@
         // Validate pool stats.

         VmaPoolStats stats;

         vmaGetPoolStats(g_hAllocator, pool, &stats);

-        assert(stats.size == poolCreateInfo.blockSize);

-        assert(stats.unusedSize = poolCreateInfo.blockSize - bufSumSize);

-        assert(stats.allocationCount == bufInfo.size());

+        TEST(stats.size == poolCreateInfo.blockSize);

+        TEST(stats.unusedSize = poolCreateInfo.blockSize - bufSumSize);

+        TEST(stats.allocationCount == bufInfo.size());

 

         // Destroy the buffers in random order.

         while(!bufInfo.empty())

@@ -1547,8 +1547,8 @@
             BufferInfo newBufInfo;

             res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo,

                 &newBufInfo.Buffer, &newBufInfo.Allocation, &allocInfo);

-            assert(res == VK_SUCCESS);

-            assert(i == 0 || allocInfo.offset > prevOffset);

+            TEST(res == VK_SUCCESS);

+            TEST(i == 0 || allocInfo.offset > prevOffset);

             bufInfo.push_back(newBufInfo);

             prevOffset = allocInfo.offset;

         }

@@ -1568,8 +1568,8 @@
             BufferInfo newBufInfo;

             res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo,

                 &newBufInfo.Buffer, &newBufInfo.Allocation, &allocInfo);

-            assert(res == VK_SUCCESS);

-            assert(i == 0 || allocInfo.offset > prevOffset);

+            TEST(res == VK_SUCCESS);

+            TEST(i == 0 || allocInfo.offset > prevOffset);

             bufInfo.push_back(newBufInfo);

             prevOffset = allocInfo.offset;

         }

@@ -1592,8 +1592,8 @@
             BufferInfo newBufInfo;

             res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo,

                 &newBufInfo.Buffer, &newBufInfo.Allocation, &allocInfo);

-            assert(res == VK_SUCCESS);

-            assert(i == 0 || allocInfo.offset > prevOffset);

+            TEST(res == VK_SUCCESS);

+            TEST(i == 0 || allocInfo.offset > prevOffset);

             bufInfo.push_back(newBufInfo);

             prevOffset = allocInfo.offset;

         }

@@ -1614,7 +1614,7 @@
                 BufferInfo newBufInfo;

                 res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo,

                     &newBufInfo.Buffer, &newBufInfo.Allocation, &allocInfo);

-                assert(res == VK_SUCCESS);

+                TEST(res == VK_SUCCESS);

                 bufInfo.push_back(newBufInfo);

             }

         }

@@ -1632,7 +1632,7 @@
             }

             else

             {

-                assert(res == VK_ERROR_OUT_OF_DEVICE_MEMORY);

+                TEST(res == VK_ERROR_OUT_OF_DEVICE_MEMORY);

             }

             ++debugIndex;

         }

@@ -1663,18 +1663,18 @@
             BufferInfo newBufInfo;

             res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo,

                 &newBufInfo.Buffer, &newBufInfo.Allocation, &allocInfo);

-            assert(res == VK_SUCCESS);

+            TEST(res == VK_SUCCESS);

             if(upperAddress)

             {

-                assert(allocInfo.offset < prevOffsetUpper);

+                TEST(allocInfo.offset < prevOffsetUpper);

                 prevOffsetUpper = allocInfo.offset;

             }

             else

             {

-                assert(allocInfo.offset >= prevOffsetLower);

+                TEST(allocInfo.offset >= prevOffsetLower);

                 prevOffsetLower = allocInfo.offset;

             }

-            assert(prevOffsetLower < prevOffsetUpper);

+            TEST(prevOffsetLower < prevOffsetUpper);

             bufInfo.push_back(newBufInfo);

         }

 

@@ -1698,7 +1698,7 @@
             BufferInfo newBufInfo;

             res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo,

                 &newBufInfo.Buffer, &newBufInfo.Allocation, &allocInfo);

-            assert(res == VK_SUCCESS);

+            TEST(res == VK_SUCCESS);

             bufInfo.push_back(newBufInfo);

         }

 

@@ -1729,15 +1729,15 @@
             {

                 if(upperAddress)

                 {

-                    assert(allocInfo.offset < prevOffsetUpper);

+                    TEST(allocInfo.offset < prevOffsetUpper);

                     prevOffsetUpper = allocInfo.offset;

                 }

                 else

                 {

-                    assert(allocInfo.offset >= prevOffsetLower);

+                    TEST(allocInfo.offset >= prevOffsetLower);

                     prevOffsetLower = allocInfo.offset;

                 }

-                assert(prevOffsetLower < prevOffsetUpper);

+                TEST(prevOffsetLower < prevOffsetUpper);

                 bufInfo.push_back(newBufInfo);

             }

         }

@@ -1763,7 +1763,7 @@
                 &newBufInfo.Buffer, &newBufInfo.Allocation, &allocInfo);

             if(res == VK_SUCCESS)

             {

-                assert(allocInfo.offset < prevOffsetUpper);

+                TEST(allocInfo.offset < prevOffsetUpper);

                 prevOffsetUpper = allocInfo.offset;

                 bufInfo.push_back(newBufInfo);

             }

@@ -1834,13 +1834,13 @@
             BufferInfo newBufInfo;

             res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo,

                 &newBufInfo.Buffer, &newBufInfo.Allocation, &allocInfo);

-            assert(res == VK_SUCCESS);

+            TEST(res == VK_SUCCESS);

             bufInfo.push_back(newBufInfo);

             firstNewOffset = allocInfo.offset;

 

             // Make sure at least one buffer from the beginning became lost.

             vmaGetAllocationInfo(g_hAllocator, bufInfo[0].Allocation, &allocInfo);

-            assert(allocInfo.deviceMemory == VK_NULL_HANDLE);

+            TEST(allocInfo.deviceMemory == VK_NULL_HANDLE);

         }

 

         // Allocate more buffers that CAN_MAKE_OTHER_LOST until we wrap-around with this.

@@ -1854,7 +1854,7 @@
             BufferInfo newBufInfo;

             res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo,

                 &newBufInfo.Buffer, &newBufInfo.Allocation, &allocInfo);

-            assert(res == VK_SUCCESS);

+            TEST(res == VK_SUCCESS);

             bufInfo.push_back(newBufInfo);

             ++newCount;

             if(allocInfo.offset < firstNewOffset)

@@ -1878,7 +1878,7 @@
 

             size_t lostAllocCount = SIZE_MAX;

             vmaMakePoolAllocationsLost(g_hAllocator, pool, &lostAllocCount);

-            assert(lostAllocCount > 0);

+            TEST(lostAllocCount > 0);

 

             size_t realLostAllocCount = 0;

             for(size_t i = 0; i < bufInfo.size(); ++i)

@@ -1887,7 +1887,7 @@
                 if(allocInfo.deviceMemory == VK_NULL_HANDLE)

                     ++realLostAllocCount;

             }

-            assert(realLostAllocCount == lostAllocCount);

+            TEST(realLostAllocCount == lostAllocCount);

         }

 

         // Destroy all the buffers in forward order.

@@ -1915,11 +1915,11 @@
     VmaPoolCreateInfo poolCreateInfo = {};

     poolCreateInfo.flags = VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT;

     VkResult res = vmaFindMemoryTypeIndexForBufferInfo(g_hAllocator, &sampleBufCreateInfo, &sampleAllocCreateInfo, &poolCreateInfo.memoryTypeIndex);

-    assert(res == VK_SUCCESS);

+    TEST(res == VK_SUCCESS);

 

     VmaPool pool = nullptr;

     res = vmaCreatePool(g_hAllocator, &poolCreateInfo, &pool);

-    assert(res == VK_SUCCESS);

+    TEST(res == VK_SUCCESS);

 

     VkBufferCreateInfo bufCreateInfo = sampleBufCreateInfo;

 

@@ -1938,7 +1938,7 @@
             BufferInfo newBufInfo;

             res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo,

                 &newBufInfo.Buffer, &newBufInfo.Allocation, &allocInfo);

-            assert(res == VK_SUCCESS);

+            TEST(res == VK_SUCCESS);

             bufInfo.push_back(newBufInfo);

             if(lastMem && allocInfo.deviceMemory != lastMem)

             {

@@ -1947,12 +1947,12 @@
             lastMem = allocInfo.deviceMemory;

         }

 

-        assert(bufInfo.size() > 2);

+        TEST(bufInfo.size() > 2);

 

         // Make sure that pool has now two blocks.

         VmaPoolStats poolStats = {};

         vmaGetPoolStats(g_hAllocator, pool, &poolStats);

-        assert(poolStats.blockCount == 2);

+        TEST(poolStats.blockCount == 2);

 

         // Destroy all the buffers in random order.

         while(!bufInfo.empty())

@@ -1965,7 +1965,7 @@
 

         // Make sure that pool has now at most one block.

         vmaGetPoolStats(g_hAllocator, pool, &poolStats);

-        assert(poolStats.blockCount <= 1);

+        TEST(poolStats.blockCount <= 1);

     }

 

     // Test stack.

@@ -1977,7 +1977,7 @@
             BufferInfo newBufInfo;

             res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo,

                 &newBufInfo.Buffer, &newBufInfo.Allocation, &allocInfo);

-            assert(res == VK_SUCCESS);

+            TEST(res == VK_SUCCESS);

             bufInfo.push_back(newBufInfo);

             if(lastMem && allocInfo.deviceMemory != lastMem)

             {

@@ -1986,7 +1986,7 @@
             lastMem = allocInfo.deviceMemory;

         }

 

-        assert(bufInfo.size() > 2);

+        TEST(bufInfo.size() > 2);

 

         // Add few more buffers.

         for(uint32_t i = 0; i < 5; ++i)

@@ -1994,14 +1994,14 @@
             BufferInfo newBufInfo;

             res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo,

                 &newBufInfo.Buffer, &newBufInfo.Allocation, &allocInfo);

-            assert(res == VK_SUCCESS);

+            TEST(res == VK_SUCCESS);

             bufInfo.push_back(newBufInfo);

         }

 

         // Make sure that pool has now two blocks.

         VmaPoolStats poolStats = {};

         vmaGetPoolStats(g_hAllocator, pool, &poolStats);

-        assert(poolStats.blockCount == 2);

+        TEST(poolStats.blockCount == 2);

         

         // Delete half of buffers, LIFO.

         for(size_t i = 0, countToDelete = bufInfo.size() / 2; i < countToDelete; ++i)

@@ -2015,12 +2015,12 @@
         BufferInfo newBufInfo;

         res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo,

             &newBufInfo.Buffer, &newBufInfo.Allocation, &allocInfo);

-        assert(res == VK_SUCCESS);

+        TEST(res == VK_SUCCESS);

         bufInfo.push_back(newBufInfo);

 

         // Make sure that pool has now one block.

         vmaGetPoolStats(g_hAllocator, pool, &poolStats);

-        assert(poolStats.blockCount == 1);

+        TEST(poolStats.blockCount == 1);

 

         // Delete all the remaining buffers, LIFO.

         while(!bufInfo.empty())

@@ -2052,7 +2052,7 @@
 

     VmaPoolCreateInfo poolCreateInfo = {};

     VkResult res = vmaFindMemoryTypeIndexForBufferInfo(g_hAllocator, &sampleBufCreateInfo, &sampleAllocCreateInfo, &poolCreateInfo.memoryTypeIndex);

-    assert(res == VK_SUCCESS);

+    TEST(res == VK_SUCCESS);

 

     poolCreateInfo.blockSize = 10 * 1024;

     poolCreateInfo.flags = VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT;

@@ -2060,7 +2060,7 @@
 

     VmaPool pool = nullptr;

     res = vmaCreatePool(g_hAllocator, &poolCreateInfo, &pool);

-    assert(res == VK_SUCCESS);

+    TEST(res == VK_SUCCESS);

 

     VkBufferCreateInfo bufCreateInfo = sampleBufCreateInfo;

 

@@ -2087,19 +2087,19 @@
         bufCreateInfo.size = 32;

         res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo,

             &newBufInfo.Buffer, &newBufInfo.Allocation, &allocInfo);

-        assert(res == VK_SUCCESS);

+        TEST(res == VK_SUCCESS);

         bufInfo.push_back(newBufInfo);

 

         bufCreateInfo.size = 1024;

         res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo,

             &newBufInfo.Buffer, &newBufInfo.Allocation, &allocInfo);

-        assert(res == VK_SUCCESS);

+        TEST(res == VK_SUCCESS);

         bufInfo.push_back(newBufInfo);

 

         bufCreateInfo.size = 32;

         res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo,

             &newBufInfo.Buffer, &newBufInfo.Allocation, &allocInfo);

-        assert(res == VK_SUCCESS);

+        TEST(res == VK_SUCCESS);

         bufInfo.push_back(newBufInfo);

 

         allocCreateInfo.flags |= VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT;

@@ -2107,19 +2107,19 @@
         bufCreateInfo.size = 128;

         res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo,

             &newBufInfo.Buffer, &newBufInfo.Allocation, &allocInfo);

-        assert(res == VK_SUCCESS);

+        TEST(res == VK_SUCCESS);

         bufInfo.push_back(newBufInfo);

 

         bufCreateInfo.size = 1024;

         res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo,

             &newBufInfo.Buffer, &newBufInfo.Allocation, &allocInfo);

-        assert(res == VK_SUCCESS);

+        TEST(res == VK_SUCCESS);

         bufInfo.push_back(newBufInfo);

 

         bufCreateInfo.size = 16;

         res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo,

             &newBufInfo.Buffer, &newBufInfo.Allocation, &allocInfo);

-        assert(res == VK_SUCCESS);

+        TEST(res == VK_SUCCESS);

         bufInfo.push_back(newBufInfo);

 

         VmaStats currStats;

@@ -2170,7 +2170,7 @@
 

     VmaPoolCreateInfo poolCreateInfo = {};

     VkResult res = vmaFindMemoryTypeIndexForBufferInfo(g_hAllocator, &sampleBufCreateInfo, &sampleAllocCreateInfo, &poolCreateInfo.memoryTypeIndex);

-    assert(res == VK_SUCCESS);

+    TEST(res == VK_SUCCESS);

 

     poolCreateInfo.blockSize = bufSizeMax * maxBufCapacity;

     poolCreateInfo.flags |= algorithm;

@@ -2178,12 +2178,12 @@
 

     VmaPool pool = nullptr;

     res = vmaCreatePool(g_hAllocator, &poolCreateInfo, &pool);

-    assert(res == VK_SUCCESS);

+    TEST(res == VK_SUCCESS);

 

     // Buffer created just to get memory requirements. Never bound to any memory.

     VkBuffer dummyBuffer = VK_NULL_HANDLE;

     res = vkCreateBuffer(g_hDevice, &sampleBufCreateInfo, nullptr, &dummyBuffer);

-    assert(res == VK_SUCCESS && dummyBuffer);

+    TEST(res == VK_SUCCESS && dummyBuffer);

 

     VkMemoryRequirements memReq = {};

     vkGetBufferMemoryRequirements(g_hDevice, dummyBuffer, &memReq);

@@ -2205,7 +2205,7 @@
         {

             memReq.size = bufSizeMin + rand.Generate() % (bufSizeMax - bufSizeMin);

             res = vmaAllocateMemory(g_hAllocator, &memReq, &allocCreateInfo, &alloc, nullptr);

-            assert(res == VK_SUCCESS);

+            TEST(res == VK_SUCCESS);

             baseAllocations.push_back(alloc);

             totalSize += memReq.size;

         }

@@ -2234,7 +2234,7 @@
         {

             memReq.size = bufSizeMin + rand.Generate() % (bufSizeMax - bufSizeMin);

             res = vmaAllocateMemory(g_hAllocator, &memReq, &allocCreateInfo, &alloc, nullptr);

-            assert(res == VK_SUCCESS);

+            TEST(res == VK_SUCCESS);

             testAllocations.push_back(alloc);

         }

         allocTotalDuration += std::chrono::high_resolution_clock::now() - allocTimeBeg;

@@ -2392,7 +2392,7 @@
     {

         VkBuffer dummyBuffer;

         res = vkCreateBuffer(g_hDevice, &bufferInfo, nullptr, &dummyBuffer);

-        assert(res == VK_SUCCESS);

+        TEST(res == VK_SUCCESS);

 

         VkMemoryRequirements memReq;

         vkGetBufferMemoryRequirements(g_hDevice, dummyBuffer, &memReq);

@@ -2419,7 +2419,7 @@
 

     VmaPool pool;

     res = vmaCreatePool(g_hAllocator, &poolCreateInfo, &pool);

-    assert(res == VK_SUCCESS);

+    TEST(res == VK_SUCCESS);

 

     vmaSetCurrentFrameIndex(g_hAllocator, 1);

 

@@ -2440,7 +2440,7 @@
     {

         BufItem item;

         res = vmaCreateBuffer(g_hAllocator, &bufferInfo, &allocInfo, &item.Buf, &item.Alloc, nullptr);

-        assert(res == VK_SUCCESS);

+        TEST(res == VK_SUCCESS);

         items.push_back(item);

     }

 

@@ -2448,7 +2448,7 @@
     {

         BufItem item;

         res = vmaCreateBuffer(g_hAllocator, &bufferInfo, &allocInfo, &item.Buf, &item.Alloc, nullptr);

-        assert(res == VK_ERROR_OUT_OF_DEVICE_MEMORY);

+        TEST(res == VK_ERROR_OUT_OF_DEVICE_MEMORY);

     }

 

     // Validate that no buffer is lost. Also check that they are not mapped.

@@ -2456,8 +2456,8 @@
     {

         VmaAllocationInfo allocInfo;

         vmaGetAllocationInfo(g_hAllocator, items[i].Alloc, &allocInfo);

-        assert(allocInfo.deviceMemory != VK_NULL_HANDLE);

-        assert(allocInfo.pMappedData == nullptr);

+        TEST(allocInfo.deviceMemory != VK_NULL_HANDLE);

+        TEST(allocInfo.pMappedData == nullptr);

     }

 

     // Free some percent of random items.

@@ -2484,7 +2484,7 @@
                 {

                     BufItem item;

                     res = vmaCreateBuffer(g_hAllocator, &bufferInfo, &allocInfo, &item.Buf, &item.Alloc, nullptr);

-                    assert(res == VK_SUCCESS);

+                    TEST(res == VK_SUCCESS);

                     items.push_back(item);

                }

             }

@@ -2505,7 +2505,7 @@
     {

         BufItem item;

         res = vmaCreateBuffer(g_hAllocator, &bufferInfo, &allocInfo, &item.Buf, &item.Alloc, nullptr);

-        assert(res == VK_SUCCESS);

+        TEST(res == VK_SUCCESS);

         items.push_back(item);

     }

 

@@ -2514,7 +2514,7 @@
     {

         VmaAllocationInfo allocInfo;

         vmaGetAllocationInfo(g_hAllocator, items[i].Alloc, &allocInfo);

-        assert(allocInfo.deviceMemory != VK_NULL_HANDLE);

+        TEST(allocInfo.deviceMemory != VK_NULL_HANDLE);

     }

     

     // Next frame.

@@ -2525,7 +2525,7 @@
     {

         BufItem item;

         res = vmaCreateBuffer(g_hAllocator, &bufferInfo, &allocInfo, &item.Buf, &item.Alloc, nullptr);

-        assert(res == VK_SUCCESS);

+        TEST(res == VK_SUCCESS);

         items.push_back(item);

     }

 

@@ -2534,7 +2534,7 @@
     {

         VmaAllocationInfo allocInfo;

         vmaGetAllocationInfo(g_hAllocator, items[i].Alloc, &allocInfo);

-        assert(allocInfo.deviceMemory == VK_NULL_HANDLE);

+        TEST(allocInfo.deviceMemory == VK_NULL_HANDLE);

         vmaDestroyBuffer(g_hAllocator, items[i].Buf, items[i].Alloc);

     }

     items.erase(items.begin(), items.begin() + BUF_COUNT);

@@ -2544,7 +2544,7 @@
     {

         VmaAllocationInfo allocInfo;

         vmaGetAllocationInfo(g_hAllocator, items[i].Alloc, &allocInfo);

-        assert(allocInfo.deviceMemory != VK_NULL_HANDLE);

+        TEST(allocInfo.deviceMemory != VK_NULL_HANDLE);

     }

 

     // Free one item.

@@ -2555,11 +2555,11 @@
     {

         VmaPoolStats poolStats = {};

         vmaGetPoolStats(g_hAllocator, pool, &poolStats);

-        assert(poolStats.allocationCount == items.size());

-        assert(poolStats.size = BUF_COUNT * BUF_SIZE);

-        assert(poolStats.unusedRangeCount == 1);

-        assert(poolStats.unusedRangeSizeMax == BUF_SIZE);

-        assert(poolStats.unusedSize == BUF_SIZE);

+        TEST(poolStats.allocationCount == items.size());

+        TEST(poolStats.size = BUF_COUNT * BUF_SIZE);

+        TEST(poolStats.unusedRangeCount == 1);

+        TEST(poolStats.unusedRangeSizeMax == BUF_SIZE);

+        TEST(poolStats.unusedSize == BUF_SIZE);

     }

 

     // Free all remaining items.

@@ -2572,7 +2572,7 @@
     {

         BufItem item;

         res = vmaCreateBuffer(g_hAllocator, &bufferInfo, &allocInfo, &item.Buf, &item.Alloc, nullptr);

-        assert(res == VK_SUCCESS);

+        TEST(res == VK_SUCCESS);

         items.push_back(item);

     }

 

@@ -2591,8 +2591,8 @@
 

         VmaDefragmentationStats defragmentationStats;

         res = vmaDefragment(g_hAllocator, allocationsToDefragment.data(), items.size(), nullptr, nullptr, &defragmentationStats);

-        assert(res == VK_SUCCESS);

-        assert(defragmentationStats.deviceMemoryBlocksFreed == 2);

+        TEST(res == VK_SUCCESS);

+        TEST(defragmentationStats.deviceMemoryBlocksFreed == 2);

     }

 

     // Free all remaining items.

@@ -2609,7 +2609,7 @@
     {

         BufItem item;

         res = vmaCreateBuffer(g_hAllocator, &bufferInfo, &allocInfo, &item.Buf, &item.Alloc, nullptr);

-        assert(res == VK_SUCCESS);

+        TEST(res == VK_SUCCESS);

         items.push_back(item);

     }

 

@@ -2624,11 +2624,11 @@
     // vmaMakePoolAllocationsLost. Only remaining 2 should be lost.

     size_t lostCount = 0xDEADC0DE;

     vmaMakePoolAllocationsLost(g_hAllocator, pool, &lostCount);

-    assert(lostCount == 2);

+    TEST(lostCount == 2);

 

     // Make another call. Now 0 should be lost.

     vmaMakePoolAllocationsLost(g_hAllocator, pool, &lostCount);

-    assert(lostCount == 0);

+    TEST(lostCount == 0);

 

     // Make another call, with null count. Should not crash.

     vmaMakePoolAllocationsLost(g_hAllocator, pool, nullptr);

@@ -2653,7 +2653,7 @@
         

         VmaAllocation alloc = nullptr;

         res = vmaAllocateMemory(g_hAllocator, &memReq, &allocCreateInfo, &alloc, nullptr);

-        assert(res == VK_ERROR_OUT_OF_DEVICE_MEMORY && alloc == nullptr);

+        TEST(res == VK_ERROR_OUT_OF_DEVICE_MEMORY && alloc == nullptr);

     }

 

     vmaDestroyPool(g_hAllocator, pool);

@@ -2692,11 +2692,11 @@
     poolCreateInfo.minBlockCount = 1; // To keep memory alive while pool exists.

     poolCreateInfo.maxBlockCount = 1;

     res = vmaFindMemoryTypeIndexForBufferInfo(g_hAllocator, &bufInfo, &dummyBufAllocCreateInfo, &poolCreateInfo.memoryTypeIndex);

-    assert(res == VK_SUCCESS);

+    TEST(res == VK_SUCCESS);

 

     VmaAllocationCreateInfo bufAllocCreateInfo = {};

     res = vmaCreatePool(g_hAllocator, &poolCreateInfo, &bufAllocCreateInfo.pool);

-    assert(res == VK_SUCCESS);

+    TEST(res == VK_SUCCESS);

 

     // Create one persistently mapped buffer to keep memory of this block mapped,

     // so that pointer to mapped data will remain (more or less...) valid even

@@ -2706,7 +2706,7 @@
     VkBuffer firstBuf;

     VmaAllocation firstAlloc;

     res = vmaCreateBuffer(g_hAllocator, &bufInfo, &bufAllocCreateInfo, &firstBuf, &firstAlloc, nullptr);

-    assert(res == VK_SUCCESS);

+    TEST(res == VK_SUCCESS);

 

     // Test buffers.

 

@@ -2718,13 +2718,13 @@
         VmaAllocation alloc;

         VmaAllocationInfo allocInfo;

         res = vmaCreateBuffer(g_hAllocator, &bufInfo, &bufAllocCreateInfo, &buf, &alloc, &allocInfo);

-        assert(res == VK_SUCCESS);

+        TEST(res == VK_SUCCESS);

 

         void* pMappedData;

         if(!persistentlyMapped)

         {

             res = vmaMapMemory(g_hAllocator, alloc, &pMappedData);

-            assert(res == VK_SUCCESS);

+            TEST(res == VK_SUCCESS);

         }

         else

         {

@@ -2733,7 +2733,7 @@
 

         // Validate initialized content

         bool valid = ValidatePattern(pMappedData, BUF_SIZE, 0xDC);

-        assert(valid);

+        TEST(valid);

 

         if(!persistentlyMapped)

         {

@@ -2744,7 +2744,7 @@
 

         // Validate freed content

         valid = ValidatePattern(pMappedData, BUF_SIZE, 0xEF);

-        assert(valid);

+        TEST(valid);

     }

 

     vmaDestroyBuffer(g_hAllocator, firstBuf, firstAlloc);

@@ -2755,7 +2755,7 @@
     PoolTestResult& outResult,

     const PoolTestConfig& config)

 {

-    assert(config.ThreadCount > 0);

+    TEST(config.ThreadCount > 0);

 

     RandomNumberGenerator mainRand{config.RandSeed};

 

@@ -2788,7 +2788,7 @@
     {

         VkBuffer dummyBuffer;

         VkResult res = vkCreateBuffer(g_hDevice, &bufferInfo, nullptr, &dummyBuffer);

-        assert(res == VK_SUCCESS);

+        TEST(res == VK_SUCCESS);

 

         VkMemoryRequirements memReq;

         vkGetBufferMemoryRequirements(g_hDevice, dummyBuffer, &memReq);

@@ -2801,7 +2801,7 @@
     {

         VkImage dummyImage;

         VkResult res = vkCreateImage(g_hDevice, &imageInfo, nullptr, &dummyImage);

-        assert(res == VK_SUCCESS);

+        TEST(res == VK_SUCCESS);

 

         VkMemoryRequirements memReq;

         vkGetImageMemoryRequirements(g_hDevice, dummyImage, &memReq);

@@ -2825,7 +2825,7 @@
     else if(config.UsesImages())

         memoryTypeBits = imageMemoryTypeBits;

     else

-        assert(0);

+        TEST(0);

 

     VmaPoolCreateInfo poolCreateInfo = {};

     poolCreateInfo.memoryTypeIndex = 0;

@@ -2840,7 +2840,7 @@
 

     VmaPool pool;

     VkResult res = vmaCreatePool(g_hAllocator, &poolCreateInfo, &pool);

-    assert(res == VK_SUCCESS);

+    TEST(res == VK_SUCCESS);

 

     // Start time measurement - after creating pool and initializing data structures.

     time_point timeBeg = std::chrono::high_resolution_clock::now();

@@ -2899,8 +2899,8 @@
             const AllocationSize& allocSize = config.AllocationSizes[allocSizeIndex];

             if(allocSize.BufferSizeMax > 0)

             {

-                assert(allocSize.BufferSizeMin > 0);

-                assert(allocSize.ImageSizeMin == 0 && allocSize.ImageSizeMax == 0);

+                TEST(allocSize.BufferSizeMin > 0);

+                TEST(allocSize.ImageSizeMin == 0 && allocSize.ImageSizeMax == 0);

                 if(allocSize.BufferSizeMax == allocSize.BufferSizeMin)

                     item.BufferSize = allocSize.BufferSizeMin;

                 else

@@ -2911,7 +2911,7 @@
             }

             else

             {

-                assert(allocSize.ImageSizeMin > 0 && allocSize.ImageSizeMax > 0);

+                TEST(allocSize.ImageSizeMin > 0 && allocSize.ImageSizeMax > 0);

                 if(allocSize.ImageSizeMax == allocSize.ImageSizeMin)

                     item.ImageSize.width = item.ImageSize.height = allocSize.ImageSizeMax;

                 else

@@ -2939,7 +2939,7 @@
             }

             else

             {

-                assert(item.ImageSize.width && item.ImageSize.height);

+                TEST(item.ImageSize.width && item.ImageSize.height);

 

                 imageInfo.extent.width = item.ImageSize.width;

                 imageInfo.extent.height = item.ImageSize.height;

@@ -2966,7 +2966,7 @@
             // Determine which bufs we want to use in this frame.

             const size_t usedBufCount = (threadRand.Generate() % (config.UsedItemCountMax - config.UsedItemCountMin) + config.UsedItemCountMin)

                 / config.ThreadCount;

-            assert(usedBufCount < usedItems.size() + unusedItems.size());

+            TEST(usedBufCount < usedItems.size() + unusedItems.size());

             // Move some used to unused.

             while(usedBufCount < usedItems.size())

             {

@@ -3100,7 +3100,7 @@
     }

 

     // Execute frames.

-    assert(config.ThreadCount <= MAXIMUM_WAIT_OBJECTS);

+    TEST(config.ThreadCount <= MAXIMUM_WAIT_OBJECTS);

     for(uint32_t frameIndex = 0; frameIndex < config.FrameCount; ++frameIndex)

     {

         vmaSetCurrentFrameIndex(g_hAllocator, frameIndex);

@@ -3186,11 +3186,11 @@
         VmaPool pool = nullptr;

         if(testIndex == TEST_POOL)

         {

-            assert(memTypeIndex != UINT32_MAX);

+            TEST(memTypeIndex != UINT32_MAX);

             VmaPoolCreateInfo poolInfo = {};

             poolInfo.memoryTypeIndex = memTypeIndex;

             res = vmaCreatePool(g_hAllocator, &poolInfo, &pool);

-            assert(res == VK_SUCCESS);

+            TEST(res == VK_SUCCESS);

         }

 

         VkBufferCreateInfo bufInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };

@@ -3213,56 +3213,56 @@
         {

             res = vmaCreateBuffer(g_hAllocator, &bufInfo, &allocCreateInfo,

                 &bufferInfos[i].Buffer, &bufferInfos[i].Allocation, &allocInfo);

-            assert(res == VK_SUCCESS);

-            assert(allocInfo.pMappedData == nullptr);

+            TEST(res == VK_SUCCESS);

+            TEST(allocInfo.pMappedData == nullptr);

             memTypeIndex = allocInfo.memoryType;

         }

     

         // Map buffer 0.

         char* data00 = nullptr;

         res = vmaMapMemory(g_hAllocator, bufferInfos[0].Allocation, (void**)&data00);

-        assert(res == VK_SUCCESS && data00 != nullptr);

+        TEST(res == VK_SUCCESS && data00 != nullptr);

         data00[0xFFFF] = data00[0];

 

         // Map buffer 0 second time.

         char* data01 = nullptr;

         res = vmaMapMemory(g_hAllocator, bufferInfos[0].Allocation, (void**)&data01);

-        assert(res == VK_SUCCESS && data01 == data00);

+        TEST(res == VK_SUCCESS && data01 == data00);

 

         // Map buffer 1.

         char* data1 = nullptr;

         res = vmaMapMemory(g_hAllocator, bufferInfos[1].Allocation, (void**)&data1);

-        assert(res == VK_SUCCESS && data1 != nullptr);

-        assert(!MemoryRegionsOverlap(data00, (size_t)bufInfo.size, data1, (size_t)bufInfo.size));

+        TEST(res == VK_SUCCESS && data1 != nullptr);

+        TEST(!MemoryRegionsOverlap(data00, (size_t)bufInfo.size, data1, (size_t)bufInfo.size));

         data1[0xFFFF] = data1[0];

 

         // Unmap buffer 0 two times.

         vmaUnmapMemory(g_hAllocator, bufferInfos[0].Allocation);

         vmaUnmapMemory(g_hAllocator, bufferInfos[0].Allocation);

         vmaGetAllocationInfo(g_hAllocator, bufferInfos[0].Allocation, &allocInfo);

-        assert(allocInfo.pMappedData == nullptr);

+        TEST(allocInfo.pMappedData == nullptr);

 

         // Unmap buffer 1.

         vmaUnmapMemory(g_hAllocator, bufferInfos[1].Allocation);

         vmaGetAllocationInfo(g_hAllocator, bufferInfos[1].Allocation, &allocInfo);

-        assert(allocInfo.pMappedData == nullptr);

+        TEST(allocInfo.pMappedData == nullptr);

 

         // Create 3rd buffer - persistently mapped.

         allocCreateInfo.flags |= VMA_ALLOCATION_CREATE_MAPPED_BIT;

         res = vmaCreateBuffer(g_hAllocator, &bufInfo, &allocCreateInfo,

             &bufferInfos[2].Buffer, &bufferInfos[2].Allocation, &allocInfo);

-        assert(res == VK_SUCCESS && allocInfo.pMappedData != nullptr);

+        TEST(res == VK_SUCCESS && allocInfo.pMappedData != nullptr);

 

         // Map buffer 2.

         char* data2 = nullptr;

         res = vmaMapMemory(g_hAllocator, bufferInfos[2].Allocation, (void**)&data2);

-        assert(res == VK_SUCCESS && data2 == allocInfo.pMappedData);

+        TEST(res == VK_SUCCESS && data2 == allocInfo.pMappedData);

         data2[0xFFFF] = data2[0];

 

         // Unmap buffer 2.

         vmaUnmapMemory(g_hAllocator, bufferInfos[2].Allocation);

         vmaGetAllocationInfo(g_hAllocator, bufferInfos[2].Allocation, &allocInfo);

-        assert(allocInfo.pMappedData == data2);

+        TEST(allocInfo.pMappedData == data2);

 

         // Destroy all buffers.

         for(size_t i = 3; i--; )

@@ -3295,11 +3295,11 @@
         VmaPool pool = nullptr;

         if(testIndex == TEST_POOL)

         {

-            assert(memTypeIndex != UINT32_MAX);

+            TEST(memTypeIndex != UINT32_MAX);

             VmaPoolCreateInfo poolInfo = {};

             poolInfo.memoryTypeIndex = memTypeIndex;

             res = vmaCreatePool(g_hAllocator, &poolInfo, &pool);

-            assert(res == VK_SUCCESS);

+            TEST(res == VK_SUCCESS);

         }

 

         VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };

@@ -3350,7 +3350,7 @@
                     VmaAllocationInfo allocInfo;

                     VkResult res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &localAllocCreateInfo,

                         &bufInfo.Buffer, &bufInfo.Allocation, &allocInfo);

-                    assert(res == VK_SUCCESS);

+                    TEST(res == VK_SUCCESS);

                     

                     if(memTypeIndex == UINT32_MAX)

                         memTypeIndex = allocInfo.memoryType;

@@ -3360,28 +3360,28 @@
                     if(mode == MODE::PERSISTENTLY_MAPPED)

                     {

                         data = (char*)allocInfo.pMappedData;

-                        assert(data != nullptr);

+                        TEST(data != nullptr);

                     }

                     else if(mode == MODE::MAP_FOR_MOMENT || mode == MODE::MAP_FOR_LONGER ||

                         mode == MODE::MAP_TWO_TIMES)

                     {

-                        assert(data == nullptr);

+                        TEST(data == nullptr);

                         res = vmaMapMemory(g_hAllocator, bufInfo.Allocation, (void**)&data);

-                        assert(res == VK_SUCCESS && data != nullptr);

+                        TEST(res == VK_SUCCESS && data != nullptr);

 

                         if(mode == MODE::MAP_TWO_TIMES)

                         {

                             char* data2 = nullptr;

                             res = vmaMapMemory(g_hAllocator, bufInfo.Allocation, (void**)&data2);

-                            assert(res == VK_SUCCESS && data2 == data);

+                            TEST(res == VK_SUCCESS && data2 == data);

                         }

                     }

                     else if(mode == MODE::DONT_MAP)

                     {

-                        assert(allocInfo.pMappedData == nullptr);

+                        TEST(allocInfo.pMappedData == nullptr);

                     }

                     else

-                        assert(0);

+                        TEST(0);

 

                     // Test if reading and writing from the beginning and end of mapped memory doesn't crash.

                     if(data)

@@ -3394,9 +3394,9 @@
                         VmaAllocationInfo allocInfo;

                         vmaGetAllocationInfo(g_hAllocator, bufInfo.Allocation, &allocInfo);

                         if(mode == MODE::MAP_FOR_MOMENT)

-                            assert(allocInfo.pMappedData == nullptr);

+                            TEST(allocInfo.pMappedData == nullptr);

                         else

-                            assert(allocInfo.pMappedData == data);

+                            TEST(allocInfo.pMappedData == data);

                     }

 

                     switch(rand.Generate() % 3)

@@ -3420,7 +3420,7 @@
 

                         VmaAllocationInfo allocInfo;

                         vmaGetAllocationInfo(g_hAllocator, bufInfos[bufferIndex].Allocation, &allocInfo);

-                        assert(allocInfo.pMappedData == nullptr);

+                        TEST(allocInfo.pMappedData == nullptr);

                     }

 

                     vmaDestroyBuffer(g_hAllocator, bufInfos[bufferIndex].Buffer, bufInfos[bufferIndex].Allocation);

@@ -3578,7 +3578,7 @@
 

     Result result{};

     VkResult res = MainTest(result, config);

-    assert(res == VK_SUCCESS);

+    TEST(res == VK_SUCCESS);

     WriteMainTestResult(file, "Foo", "CustomTest", config, result);

 }

 

@@ -3868,7 +3868,7 @@
 

                                 Result result{};

                                 VkResult res = MainTest(result, config);

-                                assert(res == VK_SUCCESS);

+                                TEST(res == VK_SUCCESS);

                                 if(file)

                                 {

                                     WriteMainTestResult(file, CODE_DESCRIPTION, testDescription, config, result);

@@ -4123,7 +4123,7 @@
 

     VmaPoolCreateInfo poolCreateInfo = {};

     VkResult res = vmaFindMemoryTypeIndexForBufferInfo(g_hAllocator, &sampleBufCreateInfo, &sampleAllocCreateInfo, &poolCreateInfo.memoryTypeIndex);

-    assert(res == VK_SUCCESS);

+    TEST(res == VK_SUCCESS);

 

     // Deliberately adding 1023 to test usable size smaller than memory block size.

     poolCreateInfo.blockSize = 1024 * 1024 + 1023;

@@ -4132,7 +4132,7 @@
 

     VmaPool pool = nullptr;

     res = vmaCreatePool(g_hAllocator, &poolCreateInfo, &pool);

-    assert(res == VK_SUCCESS);

+    TEST(res == VK_SUCCESS);

 

     VkBufferCreateInfo bufCreateInfo = sampleBufCreateInfo;

 

@@ -4146,26 +4146,26 @@
     bufCreateInfo.size = 1024 * 256;

     res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo,

         &newBufInfo.Buffer, &newBufInfo.Allocation, &allocInfo);

-    assert(res == VK_SUCCESS);

+    TEST(res == VK_SUCCESS);

     bufInfo.push_back(newBufInfo);

 

     bufCreateInfo.size = 1024 * 512;

     res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo,

         &newBufInfo.Buffer, &newBufInfo.Allocation, &allocInfo);

-    assert(res == VK_SUCCESS);

+    TEST(res == VK_SUCCESS);

     bufInfo.push_back(newBufInfo);

 

     bufCreateInfo.size = 1024 * 128;

     res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo,

         &newBufInfo.Buffer, &newBufInfo.Allocation, &allocInfo);

-    assert(res == VK_SUCCESS);

+    TEST(res == VK_SUCCESS);

     bufInfo.push_back(newBufInfo);

     

     // Test very small allocation, smaller than minimum node size.

     bufCreateInfo.size = 1;

     res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo,

         &newBufInfo.Buffer, &newBufInfo.Allocation, &allocInfo);

-    assert(res == VK_SUCCESS);

+    TEST(res == VK_SUCCESS);

     bufInfo.push_back(newBufInfo);

 

     // Test some small allocation with alignment requirement.

@@ -4178,8 +4178,8 @@
         newBufInfo.Buffer = VK_NULL_HANDLE;

         res = vmaAllocateMemory(g_hAllocator, &memReq, &allocCreateInfo,

             &newBufInfo.Allocation, &allocInfo);

-        assert(res == VK_SUCCESS);

-        assert(allocInfo.offset % memReq.alignment == 0);

+        TEST(res == VK_SUCCESS);

+        TEST(allocInfo.offset % memReq.alignment == 0);

         bufInfo.push_back(newBufInfo);

     }

 

@@ -4195,7 +4195,7 @@
         bufCreateInfo.size = 1024 * (rand.Generate() % 32 + 1);

         res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo,

             &newBufInfo.Buffer, &newBufInfo.Allocation, &allocInfo);

-        assert(res == VK_SUCCESS);

+        TEST(res == VK_SUCCESS);

         bufInfo.push_back(newBufInfo);

     }

 

diff --git a/src/VulkanSample.cpp b/src/VulkanSample.cpp
index d33861e..99727f3 100644
--- a/src/VulkanSample.cpp
+++ b/src/VulkanSample.cpp
@@ -1714,7 +1714,14 @@
             PostMessage(hWnd, WM_CLOSE, 0, 0);

             break;

         case 'T':

-            Test();

+            try

+            {

+                Test();

+            }

+            catch(const std::exception& ex)

+            {

+                printf("ERROR: %s\n", ex.what());

+            }

             break;

         }

         return 0;