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;
