packages feed

moonlight-triangulation-1.0.1.0: bindings/python/tests/test_binding.py

from __future__ import annotations

import math
import os
import unittest
from typing import ClassVar

from moonlight_triangulation import Moonlight, MoonlightError


class MoonlightBindingTest(unittest.TestCase):
    engine: ClassVar[Moonlight]

    @classmethod
    def setUpClass(cls) -> None:
        cls.engine = Moonlight(os.environ["MOONLIGHT_TRIANGULATION_LIBRARY"])

    def test_immutable_mesh_algebra_and_dense_projection(self) -> None:
        left = self.engine.delaunay([(0, 0), (2, 0), (0, 2), (2, 2)])
        right = self.engine.delaunay([(2, 0), (4, 0), (2, 2), (4, 2)])
        union = left.union(right)
        intersection = left.intersection(right)
        difference = left.difference(right)
        symmetric = left.symmetric_difference(right)
        extended = left.insert_many([(1, 1), (3, 1)])
        self.addCleanup(left.close)
        self.addCleanup(right.close)
        self.addCleanup(union.close)
        self.addCleanup(intersection.close)
        self.addCleanup(difference.close)
        self.addCleanup(symmetric.close)
        self.addCleanup(extended.close)

        self.assertEqual(left.vertex_count, 4)
        self.assertEqual(union.vertex_count, 6)
        self.assertEqual(intersection.vertex_count, 2)
        self.assertEqual(difference.vertex_count, 2)
        self.assertEqual(symmetric.vertex_count, 4)
        self.assertEqual(extended.vertex_count, 6)
        self.assertEqual(len(left.vertices), left.vertex_count)
        self.assertEqual(len(left.triangles), left.triangle_count)
        self.assertTrue(all(max(triangle) < left.vertex_count for triangle in left.triangles))

    def test_invalid_coordinate_preserves_typed_witness(self) -> None:
        with self.assertRaises(MoonlightError) as raised:
            self.engine.delaunay([(0, 0), (math.nan, 1), (1, 0)])
        self.assertEqual(raised.exception.status, 4)
        self.assertEqual(raised.exception.code, 1)
        self.assertEqual(raised.exception.coordinate_error, 1)
        self.assertEqual(raised.exception.input_index, 1)


if __name__ == "__main__":
    unittest.main()