Initial ui test.

This commit is contained in:
jmsgrogan 2023-01-05 13:16:52 +00:00
parent 7fcc8e43ae
commit 36515556b8
15 changed files with 178 additions and 28 deletions

View file

@ -16,32 +16,13 @@
#include <vector> #include <vector>
#include <string> #include <string>
void initializeCommandLineArgs(CommandLineArgs* args)
{
int nArgs{ 0 };
auto szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
if (szArglist == nullptr)
{
return;
}
std::vector<std::string> windowsArgs(nArgs);
for (int idx = 0; idx < nArgs; idx++)
{
windowsArgs[idx] = StringUtils::convert(szArglist[idx]);
}
LocalFree(szArglist);
args->process(windowsArgs);
}
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{ {
std::ofstream out("out.txt"); std::ofstream out("out.txt");
std::cout.rdbuf(out.rdbuf()); std::cout.rdbuf(out.rdbuf());
auto args = CommandLineArgs::Create(); auto args = CommandLineArgs::Create();
initializeCommandLineArgs(args.get()); CommandLineArgs::initialize(args.get());
args->recordLaunchPath(); args->recordLaunchPath();
// Start the main app // Start the main app

View file

@ -50,7 +50,7 @@ void ContentFile::doLinkTagSubstitution(const Path& basePath)
auto full_path = mFilename.parent_path() / Path(replaced_target); auto full_path = mFilename.parent_path() / Path(replaced_target);
auto base_relative_path = PathUtils::getRelativePath(full_path, basePath); auto base_relative_path = PathUtils::getRelativePath(full_path, basePath);
auto output_path = PathUtils::getPathDelimited(base_relative_path); auto output_path = PathUtils::getPathDelimited(base_relative_path);
link->setTarget(Path(output_path).replace_extension(".html")); link->setTarget(Path(output_path).replace_extension(".html").string());
} }
} }
} }

View file

@ -1,5 +1,10 @@
#include "CommandLineArgs.h" #include "CommandLineArgs.h"
#include "StringUtils.h"
#ifdef _WIN32
#include "Windows.h"
#endif
CommandLineArgs::CommandLineArgs() CommandLineArgs::CommandLineArgs()
: mArugments(), : mArugments(),
mLaunchPath() mLaunchPath()
@ -7,6 +12,27 @@ CommandLineArgs::CommandLineArgs()
} }
void CommandLineArgs::initialize(CommandLineArgs* args)
{
#ifdef _WIN32
int nArgs{ 0 };
auto szArglist = ::CommandLineToArgvW(::GetCommandLineW(), &nArgs);
if (szArglist == nullptr)
{
return;
}
std::vector<std::string> windowsArgs(nArgs);
for (int idx = 0; idx < nArgs; idx++)
{
windowsArgs[idx] = StringUtils::convert(szArglist[idx]);
}
::LocalFree(szArglist);
args->process(windowsArgs);
#endif
}
std::unique_ptr<CommandLineArgs> CommandLineArgs::Create() std::unique_ptr<CommandLineArgs> CommandLineArgs::Create()
{ {
return std::make_unique<CommandLineArgs>(); return std::make_unique<CommandLineArgs>();

View file

@ -26,6 +26,7 @@ public:
std::vector<std::string> getUserArgs() const; std::vector<std::string> getUserArgs() const;
static void initialize(CommandLineArgs* args);
private: private:
std::vector<std::string> mArugments; std::vector<std::string> mArugments;
std::filesystem::path mLaunchPath; std::filesystem::path mLaunchPath;

View file

@ -26,10 +26,20 @@ foreach(module ${TEST_MODULES})
list(APPEND INTEGRATION_TEST_FILES ${${MODULE_UPPER}_INTEGRATION_TEST_FILES}) list(APPEND INTEGRATION_TEST_FILES ${${MODULE_UPPER}_INTEGRATION_TEST_FILES})
list(APPEND INTEGRATION_TEST_DEPENDENCIES ${${MODULE_UPPER}_INTEGRATION_TEST_DEPENDENCIES}) list(APPEND INTEGRATION_TEST_DEPENDENCIES ${${MODULE_UPPER}_INTEGRATION_TEST_DEPENDENCIES})
list(APPEND UI_TEST_FILES ${${MODULE_UPPER}_UI_TEST_FILES})
list(APPEND UI_TEST_DEPENDENCIES ${${MODULE_UPPER}_UI_TEST_DEPENDENCIES})
endforeach() endforeach()
add_executable(unit_tests test_runner.cpp ${UNIT_TEST_FILES}) add_executable(unit_tests test_runner.cpp ${UNIT_TEST_FILES})
target_link_libraries(unit_tests PUBLIC test_utils ${UNIT_TEST_DEPENDENCIES}) target_link_libraries(unit_tests PUBLIC test_utils ${UNIT_TEST_DEPENDENCIES})
set_property(TARGET unit_tests PROPERTY FOLDER test)
add_executable(integration_tests test_runner.cpp ${INTEGRATION_TEST_FILES}) add_executable(integration_tests test_runner.cpp ${INTEGRATION_TEST_FILES})
target_link_libraries(integration_tests PUBLIC test_utils ${INTEGRATION_TEST_DEPENDENCIES}) target_link_libraries(integration_tests PUBLIC test_utils ${INTEGRATION_TEST_DEPENDENCIES})
set_property(TARGET integration_tests PROPERTY FOLDER test)
add_executable(ui_tests WIN32 ui_test_runner.cpp ${UI_TEST_FILES})
target_link_libraries(ui_tests PUBLIC test_utils ${UI_TEST_DEPENDENCIES})
set_property(TARGET ui_tests PROPERTY FOLDER test)

View file

@ -3,11 +3,16 @@
#include "AudioSample.h" #include "AudioSample.h"
#include "AudioSynth.h" #include "AudioSynth.h"
#include "AudioDevice.h"
#include "WasapiInterface.h" #include "WasapiInterface.h"
TEST_CASE(TestWasapiInterface, "audio") TEST_CASE(TestWasapiInterface, "audio")
{ {
WasapiInterface audio_interface; WasapiInterface audio_interface;
auto device = AudioDevice::Create(); auto device = AudioDevice::Create();
audio_interface.Play(device);
AudioSynth synth;
const auto sample = synth.getSineWave(240, 5);
audio_interface.play(device.get(), sample.get(), 1000);
}; };

View file

@ -13,8 +13,20 @@ set(GRAPHICS_UNIT_TEST_FILES
${PLATFORM_UNIT_TEST_FILES} ${PLATFORM_UNIT_TEST_FILES}
PARENT_SCOPE PARENT_SCOPE
) )
if(WIN32)
set(GRAPHICS_UI_TEST_FILES
graphics/TestDirectXRendering.cpp
PARENT_SCOPE
)
endif()
set(GRAPHICS_UNIT_TEST_DEPENDENCIES set(GRAPHICS_UNIT_TEST_DEPENDENCIES
graphics client graphics client
PARENT_SCOPE PARENT_SCOPE
)
set(GRAPHICS_UI_TEST_DEPENDENCIES
graphics client
PARENT_SCOPE
) )

View file

@ -0,0 +1,18 @@
#include "TestCase.h"
#include "TestCaseRunner.h"
#include "MainApplication.h"
#include "GuiApplication.h"
#include "TestFramework.h"
#include <memory>
#include <string>
#include <iostream>
TEST_CASE(TestDirectXRendering, "graphics")
{
auto gui_app = TestCaseRunner::getInstance().getTestApplication();
gui_app->run();
};

View file

@ -1,6 +1,7 @@
#include "TestCase.h" #include "TestCase.h"
#include "TestCaseRunner.h" #include "TestCaseRunner.h"
#include "MainApplication.h"
#include "GuiApplication.h" #include "GuiApplication.h"
#include "TestFramework.h" #include "TestFramework.h"

View file

@ -1,9 +1,13 @@
add_library(test_utils STATIC add_library(test_utils STATIC
TestCase.h TestCase.h
TestUtils.h
TestCaseRunner.h
TestFramework.h
TestCaseRunner.cpp TestCaseRunner.cpp
) )
target_include_directories(test_utils PUBLIC target_include_directories(test_utils PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
${CMAKE_CURRENT_SOURCE_DIR} target_link_libraries(test_utils core)
) set_property(TARGET test_utils PROPERTY FOLDER test)
target_link_libraries(test_utils core)
configure_file(TestDataLocations.h.in TestDataLocations.h)

View file

@ -18,6 +18,16 @@ TestCaseRunner::~TestCaseRunner()
} }
GuiApplication* TestCaseRunner::getTestApplication()
{
return mTestApplication;
}
void TestCaseRunner::setTestApplication(GuiApplication* app)
{
mTestApplication = app;
}
TestCaseRunner& TestCaseRunner::getInstance() TestCaseRunner& TestCaseRunner::getInstance()
{ {
static TestCaseRunner instance; static TestCaseRunner instance;

View file

@ -5,6 +5,8 @@
#include <vector> #include <vector>
#include <string> #include <string>
class GuiApplication;
class TestCaseRunner class TestCaseRunner
{ {
public: public:
@ -14,13 +16,18 @@ public:
~TestCaseRunner(); ~TestCaseRunner();
GuiApplication* getTestApplication();
void addTestCase(const std::string& label, const std::string& tag, TestCase::TestCaseFunction func); void addTestCase(const std::string& label, const std::string& tag, TestCase::TestCaseFunction func);
void markTestFailure(const std::string& line); void markTestFailure(const std::string& line);
bool run(const std::vector<std::string>& args); bool run(const std::vector<std::string>& args);
void setTestApplication(GuiApplication* app);
private: private:
GuiApplication* mTestApplication{ nullptr };
std::vector<std::string> mFailingTests; std::vector<std::string> mFailingTests;
static bool sLastTestFailed; static bool sLastTestFailed;
static std::string sFailureLine; static std::string sFailureLine;

View file

@ -0,0 +1,13 @@
#pragma once
#include <filesystem>
using Path = std::filesystem::path;
namespace TestDataLocations
{
static Path getTestDataDir()
{
return std::filesystem::path("${CMAKE_RUNTIME_OUTPUT_DIRECTORY}") / "test_data";
}
}

View file

@ -1,5 +1,7 @@
#pragma once #pragma once
#include "TestDataLocations.h"
#include <filesystem> #include <filesystem>
using Path = std::filesystem::path; using Path = std::filesystem::path;
@ -22,6 +24,6 @@ public:
static Path getTestDataDir() static Path getTestDataDir()
{ {
return std::filesystem::current_path() / "test_data"; return TestDataLocations::getTestDataDir();
} }
}; };

60
test/ui_test_runner.cpp Normal file
View file

@ -0,0 +1,60 @@
#include "TestFramework.h"
#include "CommandLineArgs.h"
#include "MainApplication.h"
#include "GuiApplication.h"
#include "Widget.h"
#ifdef _WIN32
#include "Win32WindowInterface.h"
#include <windows.h>
#endif
#include <iostream>
class TestApp : public GuiApplication
{
public:
TestApp(std::unique_ptr<CommandLineArgs> args = nullptr, std::unique_ptr<MainApplication> mainApp = nullptr)
: GuiApplication(std::move(args), std::move(mainApp))
{
}
};
#ifdef _WIN32
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
std::ofstream out("out.txt");
std::cout.rdbuf(out.rdbuf());
CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
auto args = CommandLineArgs::Create();
CommandLineArgs::initialize(args.get());
auto main_app = MainApplication::Create();
auto applicationContext = std::make_unique<Win32ApplicationContext>();
applicationContext->hInstance = reinterpret_cast<void*>(hInstance);
applicationContext->nCmdShow = nCmdShow;
main_app->initialize(std::move(args), std::move(applicationContext));
auto gui_app = std::make_unique<TestApp>(nullptr, std::move(main_app));
#else
int main(int argc, char *argv[])
{
auto args = CommandLineArgs::Create();
args->process(argc, argv);
#endif
TestCaseRunner::getInstance().setTestApplication(gui_app.get());
auto result = TestCaseRunner::getInstance().run({});
#ifdef _WIN32
CoUninitialize();
#endif
return 0;
}