aboutsummaryrefslogtreecommitdiff
path: root/src/argaze.test/AreaOfInterest/AOI2DScene.py
diff options
context:
space:
mode:
authorThéo de la Hogue2022-11-21 16:57:58 +0100
committerThéo de la Hogue2022-11-21 16:57:58 +0100
commitb9c6bee54f5bce60636b01190c523a4faf448a08 (patch)
tree60d72c50fd4484d2f2eb5998922a5ff6ae4b7aff /src/argaze.test/AreaOfInterest/AOI2DScene.py
parenteb621720e5c9bdd94144557ea3190497de4a9aaa (diff)
downloadargaze-b9c6bee54f5bce60636b01190c523a4faf448a08.zip
argaze-b9c6bee54f5bce60636b01190c523a4faf448a08.tar.gz
argaze-b9c6bee54f5bce60636b01190c523a4faf448a08.tar.bz2
argaze-b9c6bee54f5bce60636b01190c523a4faf448a08.tar.xz
Testing AreaOfInterest submodule.
Diffstat (limited to 'src/argaze.test/AreaOfInterest/AOI2DScene.py')
-rw-r--r--src/argaze.test/AreaOfInterest/AOI2DScene.py154
1 files changed, 154 insertions, 0 deletions
diff --git a/src/argaze.test/AreaOfInterest/AOI2DScene.py b/src/argaze.test/AreaOfInterest/AOI2DScene.py
new file mode 100644
index 0000000..8a71ffb
--- /dev/null
+++ b/src/argaze.test/AreaOfInterest/AOI2DScene.py
@@ -0,0 +1,154 @@
+#!/usr/bin/env python
+
+import unittest
+import math
+
+from argaze.AreaOfInterest import AOIFeatures, AOI2DScene
+from argaze import GazeFeatures
+
+import numpy
+
+class TestAOI2DSceneClass(unittest.TestCase):
+ """Test AOI2DScene class."""
+
+ def test_new(self):
+ """Test AOI2DScene creation."""
+
+ # Check empty AOI2DScene creation
+ aoi_2d_scene = AOI2DScene.AOI2DScene()
+
+ self.assertEqual(aoi_2d_scene.dimension, 2)
+ self.assertEqual(len(aoi_2d_scene.items()), 0)
+
+ # Check AOI2DScene creation
+ aoi_2D_A = AOIFeatures.AreaOfInterest([[0, 0], [0, 1], [1, 1], [1, 0]])
+ aoi_2D_B = AOIFeatures.AreaOfInterest([[1, 1], [1, 2], [2, 2], [2, 1]])
+ aoi_2d_scene = AOI2DScene.AOI2DScene({"A": aoi_2D_A, "B": aoi_2D_B})
+
+ self.assertEqual(aoi_2d_scene.dimension, 2)
+
+ def test_raycast(self):
+ """Test AOI2DScene raycast method."""
+
+ aoi_2D_A = AOIFeatures.AreaOfInterest([[0, 0], [0, 1], [1, 1], [1, 0]])
+ aoi_2D_B = AOIFeatures.AreaOfInterest([[1, 1], [1, 2], [2, 2], [2, 1]])
+ aoi_2d_scene = AOI2DScene.AOI2DScene({"A": aoi_2D_A, "B": aoi_2D_B})
+
+ gaze_position_A = GazeFeatures.GazePosition((0.5, 0.5))
+ gaze_position_B = GazeFeatures.GazePosition((1.5, 1.5))
+ gaze_position_C = GazeFeatures.GazePosition((0.5, 1.5))
+
+ # Check raycast results for gaze postion A
+ for name, aoi, looked in aoi_2d_scene.raycast(gaze_position_A):
+
+ if name == "A":
+
+ self.assertIsNone(numpy.testing.assert_array_equal(aoi, aoi_2D_A))
+ self.assertEqual(looked, True)
+
+ elif name == "B":
+
+ self.assertIsNone(numpy.testing.assert_array_equal(aoi, aoi_2D_B))
+ self.assertEqual(looked, False)
+
+ # Check raycast results for gaze postion B
+ for name, aoi, looked in aoi_2d_scene.raycast(gaze_position_B):
+
+ if name == "A":
+
+ self.assertIsNone(numpy.testing.assert_array_equal(aoi, aoi_2D_A))
+ self.assertEqual(looked, False)
+
+ elif name == "B":
+
+ self.assertIsNone(numpy.testing.assert_array_equal(aoi, aoi_2D_B))
+ self.assertEqual(looked, True)
+
+ # Check raycast results for gaze postion C
+ for name, aoi, looked in aoi_2d_scene.raycast(gaze_position_C):
+
+ if name == "A":
+
+ self.assertIsNone(numpy.testing.assert_array_equal(aoi, aoi_2D_A))
+ self.assertEqual(looked, False)
+
+ elif name == "B":
+
+ self.assertIsNone(numpy.testing.assert_array_equal(aoi, aoi_2D_B))
+ self.assertEqual(looked, False)
+
+ def test_circlecast(self):
+ """Test AOI2DScene circlecast method."""
+
+ aoi_2D_A = AOIFeatures.AreaOfInterest([[0, 0], [0, 1], [1, 1], [1, 0]])
+ aoi_2D_B = AOIFeatures.AreaOfInterest([[1, 1], [1, 2], [2, 2], [2, 1]])
+ aoi_2d_scene = AOI2DScene.AOI2DScene({"A": aoi_2D_A, "B": aoi_2D_B})
+
+ gaze_position_A = GazeFeatures.GazePosition((0.5, 0.5), accuracy=0.5)
+ gaze_position_B = GazeFeatures.GazePosition((1.5, 1.5), accuracy=0.5)
+ gaze_position_C = GazeFeatures.GazePosition((1., 1.), accuracy=1)
+ gaze_position_D = GazeFeatures.GazePosition((0.5, 1.5), accuracy=0.25)
+
+ # Check circlecast results for gaze postion A
+ for name, aoi, looked_region, aoi_ratio, gaze_ratio in aoi_2d_scene.circlecast(gaze_position_A):
+
+ if name == "A":
+
+ self.assertIsNone(numpy.testing.assert_array_equal(aoi, aoi_2D_A))
+ self.assertTrue(math.isclose(aoi_ratio, math.pi / 4, abs_tol=1e-2))
+ self.assertTrue(math.isclose(gaze_ratio, 1., abs_tol=1e-3))
+
+ elif name == "B":
+
+ self.assertIsNone(numpy.testing.assert_array_equal(aoi, aoi_2D_B))
+ self.assertEqual(aoi_ratio, 0.)
+ self.assertEqual(gaze_ratio, 0.)
+
+ # Check circlecast results for gaze postion B
+ for name, aoi, looked_region, aoi_ratio, gaze_ratio in aoi_2d_scene.circlecast(gaze_position_B):
+
+ if name == "A":
+
+ self.assertIsNone(numpy.testing.assert_array_equal(aoi, aoi_2D_A))
+ self.assertEqual(aoi_ratio, 0.)
+ self.assertEqual(gaze_ratio, 0.)
+
+ elif name == "B":
+
+ self.assertIsNone(numpy.testing.assert_array_equal(aoi, aoi_2D_B))
+ self.assertTrue(math.isclose(aoi_ratio, math.pi / 4, abs_tol=1e-2))
+ self.assertTrue(math.isclose(gaze_ratio, 1., abs_tol=1e-3))
+
+ # Check circlecast results for gaze postion C
+ for name, aoi, looked_region, aoi_ratio, gaze_ratio in aoi_2d_scene.circlecast(gaze_position_C):
+
+ if name == "A":
+
+ self.assertIsNone(numpy.testing.assert_array_equal(aoi, aoi_2D_A))
+ self.assertTrue(math.isclose(aoi_ratio, math.pi / 4, abs_tol=1e-2))
+ self.assertTrue(math.isclose(gaze_ratio, 1 / 4, abs_tol=1e-3))
+
+ elif name == "B":
+
+ self.assertIsNone(numpy.testing.assert_array_equal(aoi, aoi_2D_B))
+ self.assertTrue(math.isclose(aoi_ratio, math.pi / 4, abs_tol=1e-2))
+ self.assertTrue(math.isclose(gaze_ratio, 1 / 4, abs_tol=1e-3))
+
+ # Check circlecast results for gaze postion D
+ for name, aoi, looked_region, aoi_ratio, gaze_ratio in aoi_2d_scene.circlecast(gaze_position_D):
+
+ if name == "A":
+
+ self.assertIsNone(numpy.testing.assert_array_equal(aoi, aoi_2D_A))
+ self.assertEqual(aoi_ratio, 0.)
+ self.assertEqual(gaze_ratio, 0.)
+
+ elif name == "B":
+
+ self.assertIsNone(numpy.testing.assert_array_equal(aoi, aoi_2D_B))
+ self.assertEqual(aoi_ratio, 0.)
+ self.assertEqual(gaze_ratio, 0.)
+
+if __name__ == '__main__':
+
+ unittest.main() \ No newline at end of file