From 395636bbb06cb59d178420bf6235d77c0994a7ac Mon Sep 17 00:00:00 2001
From: Sebastian Hahta <joseha@utu.fi>
Date: Mon, 2 Nov 2020 13:55:04 +0200
Subject: [PATCH] add python tests

---
 SDK/C++/public/include/voltu/observer.hpp    |  2 +-
 SDK/C++/public/include/voltu/types/frame.hpp |  2 +-
 SDK/C++/public/python/CMakeLists.txt         | 11 +++++++++++
 SDK/C++/public/python/README.md              |  3 ++-
 SDK/C++/public/python/tests/__init__.py      |  0
 SDK/C++/public/python/tests/test_load.py     | 12 ++++++++++++
 SDK/C++/public/python/types/image.hpp        |  1 +
 7 files changed, 28 insertions(+), 3 deletions(-)
 create mode 100644 SDK/C++/public/python/tests/__init__.py
 create mode 100644 SDK/C++/public/python/tests/test_load.py

diff --git a/SDK/C++/public/include/voltu/observer.hpp b/SDK/C++/public/include/voltu/observer.hpp
index 8f9cad3b7..03323b079 100644
--- a/SDK/C++/public/include/voltu/observer.hpp
+++ b/SDK/C++/public/include/voltu/observer.hpp
@@ -37,7 +37,7 @@ public:
 
 	PY_API virtual void setPose(const Eigen::Matrix4f &) = 0;
 
-	PY_API virtual voltu::FramePtr getFrame() = 0;
+	PY_API PY_RV_LIFETIME_PARENT virtual voltu::FramePtr getFrame() = 0;
 
 	PY_API virtual voltu::PropertyPtr property(voltu::ObserverProperty) = 0;
 };
diff --git a/SDK/C++/public/include/voltu/types/frame.hpp b/SDK/C++/public/include/voltu/types/frame.hpp
index baea806fc..adbd84c26 100644
--- a/SDK/C++/public/include/voltu/types/frame.hpp
+++ b/SDK/C++/public/include/voltu/types/frame.hpp
@@ -18,7 +18,7 @@ public:
 
 	PY_API PY_RV_LIFETIME_PARENT virtual voltu::PointCloudPtr getPointCloud(voltu::PointCloudFormat cloudfmt, voltu::PointFormat pointfmt) = 0;
 
-	virtual int64_t getTimestamp() = 0;
+	PY_API virtual int64_t getTimestamp() = 0;
 };
 
 typedef std::shared_ptr<Frame> FramePtr;
diff --git a/SDK/C++/public/python/CMakeLists.txt b/SDK/C++/public/python/CMakeLists.txt
index 20c4ce7c6..40bd39c8b 100644
--- a/SDK/C++/public/python/CMakeLists.txt
+++ b/SDK/C++/public/python/CMakeLists.txt
@@ -31,3 +31,14 @@ target_include_directories(voltu_sdk_py PRIVATE .)
 
 target_link_libraries(voltu_sdk_py PUBLIC voltu_sdk)
 set_target_properties(voltu_sdk_py PROPERTIES OUTPUT_NAME voltu)
+
+enable_testing()
+find_package(Python3 COMPONENTS Interpreter)
+
+function(add_python_test TEST_NAME TEST_SCRIPT)
+    add_test(NAME ${TEST_NAME}
+        COMMAND Python3::Interpreter -m unittest ${TEST_SCRIPT}
+        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+endfunction()
+
+add_python_test(test_load tests/test_load.py)
diff --git a/SDK/C++/public/python/README.md b/SDK/C++/public/python/README.md
index a1a955eba..a5cd30d6d 100644
--- a/SDK/C++/public/python/README.md
+++ b/SDK/C++/public/python/README.md
@@ -1,7 +1,7 @@
 # Python API generator
 
 Dependencies
- * python3-ply (cpp header parser)
+ * python3-ply (build only)
 
 Build system uses Pybind11 to generate a python module. Most of the bindings are
 automatically generated by gen.py script which is automatically called by CMake
@@ -34,3 +34,4 @@ build. Several (empty) macros are used in headers to annoate Python API details.
  * Static members
  * Constructors
  * Automatic documentation (Doxygen)
+ * Generator does not verify that shared_ptr<> is used consistently/correctly
diff --git a/SDK/C++/public/python/tests/__init__.py b/SDK/C++/public/python/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/SDK/C++/public/python/tests/test_load.py b/SDK/C++/public/python/tests/test_load.py
new file mode 100644
index 000000000..8e5131d4d
--- /dev/null
+++ b/SDK/C++/public/python/tests/test_load.py
@@ -0,0 +1,12 @@
+import unittest
+
+class LoadLibrary(unittest.TestCase):
+
+    def test_get_instance(self):
+        import voltu
+        self.assertIsNotNone(voltu.instance())
+        # second call to instance() returns None
+        #self.assertIsNotNone(voltu.instance())
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/SDK/C++/public/python/types/image.hpp b/SDK/C++/public/python/types/image.hpp
index 15cd41034..8bbeae3e9 100644
--- a/SDK/C++/public/python/types/image.hpp
+++ b/SDK/C++/public/python/types/image.hpp
@@ -21,6 +21,7 @@ public:
     PYBIND11_TYPE_CASTER(voltu::ImageData, _("Image"));
 
     bool load(py::handle src, bool convert) {
+        // TODO: C++ api should copy or otherwise take (shared) ownership
         throw std::runtime_error("ImageData conversion python->c++ not supported");
         return true;
     }
-- 
GitLab