From b9c6bee54f5bce60636b01190c523a4faf448a08 Mon Sep 17 00:00:00 2001 From: Théo de la Hogue Date: Mon, 21 Nov 2022 16:57:58 +0100 Subject: Testing AreaOfInterest submodule. --- src/argaze.test/AreaOfInterest/AOI2DScene.py | 154 +++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 src/argaze.test/AreaOfInterest/AOI2DScene.py (limited to 'src/argaze.test/AreaOfInterest/AOI2DScene.py') 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 -- cgit v1.1