diff --git a/.gitignore b/.gitignore index cf71be7..5fc3c13 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,12 @@ +# build edit CMakeLists.txt.user /msbuild.log /*std*.log /*build + +# python +tests/**/__pycache__ + +# IDE +.vscode diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 8389d7c..0d3ae26 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -2,14 +2,25 @@ cmake_minimum_required(VERSION 3.16) set(PYLIB_DIR ${CMAKE_CURRENT_BINARY_DIR}/pylibs) -add_custom_target(pytest - ${CMAKE_COMMAND} -E env PYTHONPATH=${PYLIB_DIR} +if (TARGET uibase) + set(UIBASE_PATH $) +else() + set(UIBASE_PATH "${MO2_INSTALL_PATH}/bin/uibase.dll") +endif() + +add_custom_target(pytest EXCLUDE_FROM_ALL + ${CMAKE_COMMAND} -E env + PYTHONPATH="${PYLIB_DIR}\\;$" + "UIBASE_PATH=${UIBASE_PATH}" "QT_ROOT=${QT_ROOT}" ${CMAKE_CURRENT_BINARY_DIR}/pylibs/bin/pytest.exe ${CMAKE_CURRENT_SOURCE_DIR}/../tests -s - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + WORKING_DIRECTORY ${MO2_INSTALL_PATH} + ) mo2_python_pip_install(pytest DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/pylibs PACKAGES pytest PyQt6==6.3.0) +add_dependencies(pytest mobase) + file(GLOB test_files "test_*.cpp") foreach (test_file ${test_files}) diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..a630475 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,7 @@ +import os +from pathlib import Path + + +def pytest_configure(): + os.add_dll_directory(Path(os.getenv("QT_ROOT")).joinpath("bin")) + os.add_dll_directory(Path(os.getenv("UIBASE_PATH")).parent) diff --git a/tests/test_guessed_string.cpp b/tests/test_guessed_string.cpp new file mode 100644 index 0000000..4256989 --- /dev/null +++ b/tests/test_guessed_string.cpp @@ -0,0 +1,34 @@ +#include "pybind11_qt/pybind11_qt.h" + +#include +#include + +#include "guessedvalue.h" + +using namespace MOBase; + +PYBIND11_MODULE(guessed_string, m) +{ + m.def("get_value", [](GuessedValue const& value) { + return value.operator const QString&(); + }); + m.def("get_variants", [](GuessedValue const& value) { + return value.variants(); + }); + + m.def("set_from_callback", + [](GuessedValue& value, + std::function&)> const& fn) { + fn(value); + }); + + // note: the function needs to take the guessed string by pointer if constructed + // from C++, this is to be taken into account when calling Python function (cf. + // installers) + m.def("get_from_callback", + [](std::function*)> const& fn) { + GuessedValue value; + fn(&value); + return (QString)value; + }); +} diff --git a/tests/test_guessed_string.py b/tests/test_guessed_string.py new file mode 100644 index 0000000..3f335f2 --- /dev/null +++ b/tests/test_guessed_string.py @@ -0,0 +1,35 @@ +import mobase +import pytest + +m = pytest.importorskip("mobase_tests.guessed_string") + + +def test_guessed_string(): + + # empty string + gs = mobase.GuessedString() + + assert len(gs.variants()) == 0 + assert not gs.variants() + assert str(gs) == "" + + # automatic conversion from string + assert m.get_value("test") == "test" + assert m.get_variants("test") == {"test"} + + # update + gs = mobase.GuessedString("fallback", mobase.GuessQuality.FALLBACK) + assert str(gs) == "fallback" + + gs.update("good", mobase.GuessQuality.GOOD) + assert str(gs) == "good" + assert gs.variants() == {"fallback", "good"} + + # back-and-forth + gs = mobase.GuessedString() + assert str(gs) == "" + + m.set_from_callback(gs, lambda gs: gs.update("test")) + assert str(gs) == "test" + + assert m.get_from_callback(lambda gs: gs.update("test")) == "test"