from contextlib import contextmanager
from datetime import datetime, timedelta
from inspect import getfile
from os.path import abspath, dirname, join
from unittest import TestCase, main

import salome
salome.salome_init_without_session()

from salome.geom import geomBuilder
geom_builder = geomBuilder.New()

data_dir = abspath(join(dirname(getfile(lambda: None)), 'data'))

@contextmanager
def no_longer_than(seconds):
    """
    Context mananger to check that an execution of given code does not
    exceed maximum expected time.   

    Example of usage:

        with wait(5):
            do_something_that_should_take_no_more_than_five_seconds()

    Arguments:
        seconds: max time limit

    Raises:
        AssertionError: if time limit is exceeded.
    """
    expected = timedelta(seconds=seconds)
    start = datetime.now()
    yield
    end = datetime.now()
    spent = end-start
    assert spent <= expected, f'Expected maximum delay is exceeded: {spent.total_seconds():.2f} > {seconds:.2f}!'

class TesselationTest(TestCase):
    """Test Tesselate() method."""

    def test_performance_01(self):
        """Check performance of Tesselate() method: case 01."""
        shape = geom_builder.ImportBREP(join(data_dir, 'test_performance_01.brep'))
        with no_longer_than(5):
            geom_builder.Tesselate(shape, 0.17, False, 20)

if __name__ == "__main__":
    main()