Files
hot-step-cpp-ROCm/engine/vendor/vst3sdk/vstgui4/vstgui/tests/unittest/unittests.cpp
T
2026-08-16 18:24:52 +07:00

197 lines
5.7 KiB
C++

// This file is part of VSTGUI. It is subject to the license terms
// in the LICENSE file found in the top-level directory of this
// distribution and at http://github.com/steinbergmedia/vstgui/LICENSE
#include "unittests.h"
#if ENABLE_UNIT_TESTS
#include "../../lib/vstguidebug.h"
#include "../../lib/vstguiinit.h"
#include <chrono>
#include <cstdarg>
#include <cstdio>
#if WINDOWS
#ifndef NOMINMAX
#define NOMINMAX
#endif
#include <windows.h>
#include <objbase.h>
#endif
namespace VSTGUI {
namespace UnitTest {
#if WINDOWS
static void printf (const char* fmt, ...)
{
va_list args;
va_start (args, fmt);
auto numBytes = vsnprintf (nullptr, 0, fmt, args);
if (numBytes <= 0)
return;
numBytes++;
auto buffer = new char[numBytes];
if (vsnprintf (buffer, numBytes, fmt, args) > 0)
{
if (IsDebuggerPresent ())
OutputDebugStringA (buffer);
else
::printf_s ("%s", buffer);
}
delete[] buffer;
}
#endif
//----------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------
TestSuite::TestSuite (std::string&& name, TestSuiteFunction&& testCase)
: name (name)
{
tcf = std::move (testCase);
tcf (this);
}
//----------------------------------------------------------------------------------------------------
TestSuite::TestSuite (TestSuite&& tc) noexcept
{
*this = std::move (tc);
}
//----------------------------------------------------------------------------------------------------
TestSuite& TestSuite::operator=(TestSuite &&tc) noexcept
{
name = std::move (tc.name);
tests = std::move (tc.tests);
tcf = std::move (tc.tcf);
setupFunction = std::move (tc.setupFunction);
teardownFunction = std::move (tc.teardownFunction);
storage = std::move (tc.storage);
return *this;
}
//----------------------------------------------------------------------------------------------------
void TestSuite::registerTest (std::string&& testName, TestFunction&& testFunction)
{
tests.emplace_back (std::move (testName), std::move (testFunction));
}
//----------------------------------------------------------------------------------------------------
void TestSuite::setSetupFunction (SetupFunction&& _setupFunction)
{
setupFunction = std::move (_setupFunction);
}
//----------------------------------------------------------------------------------------------------
void TestSuite::setTeardownFunction (TeardownFunction&& _teardownFunction)
{
teardownFunction = std::move (_teardownFunction);
}
//----------------------------------------------------------------------------------------------------
void TestSuite::setStorage (std::any&& s)
{
storage = std::move (s);
}
//----------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------
UnitTestRegistry& UnitTestRegistry::instance ()
{
static UnitTestRegistry gUnitTestRegistry;
return gUnitTestRegistry;
}
//----------------------------------------------------------------------------------------------------
void UnitTestRegistry::registerTestSuite (TestSuite&& testCase)
{
testSuites.push_back (std::move (testCase));
}
//------------------------------------------------------------------------
TestSuite* UnitTestRegistry::find (const std::string& name)
{
auto it = std::find_if (testSuites.begin (), testSuites.end (),
[&name] (auto& tc) { return tc.getName () == name; });
if (it == testSuites.end ())
return nullptr;
return &(*it);
}
//------------------------------------------------------------------------
TestRegistrar::TestRegistrar (std::string&& suite, TestSuiteFunction&& testCase)
{
UnitTestRegistry::instance ().registerTestSuite (
TestSuite (std::move (suite), std::move (testCase)));
}
//------------------------------------------------------------------------
TestRegistrar::TestRegistrar (std::string&& suite, std::string&& testName, TestFunction&& testFunction)
{
auto& registry = UnitTestRegistry::instance ();
if (auto tc = registry.find (suite))
{
tc->registerTest (std::move (testName), std::move (testFunction));
}
else
{
TestSuite ts (std::move (suite), [] (auto) {});
ts.registerTest (std::move (testName), std::move (testFunction));
registry.registerTestSuite (std::move (ts));
}
}
//----------------------------------------------------------------------------------------------------
TestRegistrar::TestRegistrar (std::string&& suite, SetupFunction&& sotFunction, bool isSetupFunc)
{
auto& registry = UnitTestRegistry::instance ();
if (auto tc = registry.find (suite))
{
if (isSetupFunc)
tc->setSetupFunction (std::move (sotFunction));
else
tc->setTeardownFunction (std::move (sotFunction));
}
else
{
TestSuite ts (std::move (suite), [] (auto) {});
if (isSetupFunc)
ts.setSetupFunction (std::move (sotFunction));
else
ts.setTeardownFunction (std::move (sotFunction));
registry.registerTestSuite (std::move (ts));
}
}
//----------------------------------------------------------------------------------------------------
void Context::print (const char* fmt, ...)
{
va_list args;
va_start (args, fmt);
#if WINDOWS
auto numBytes = vsnprintf(nullptr, 0, fmt, args);
if (numBytes <= 0)
return;
auto buffer = new char[numBytes];
if (vsnprintf(buffer, numBytes, fmt, args) > 0)
printRaw (buffer);
delete[] buffer;
#else
char* str = nullptr;
if (vasprintf (&str, fmt, args) >= 0 && str != nullptr)
{
printRaw (str);
std::free (str);
}
#endif
}
}} // namespaces
#endif