# -*- coding: utf-8 -*-
from unittest import TestCase
from ddt import ddt, data
from ....Classes.Segment import Segment
from ....Methods.Geometry.Segment.check import PointSegmentError
from ....Methods.Geometry.Segment.discretize import NbPointSegmentDError
from numpy import pi, array, exp
# For AlmostEqual
DELTA = 1e-6
discretize_test = list()
# Horizontal segment (in complex) : 0 to 10
discretize_test.append({"nb_point": 3, "begin": 0, "end": 10})
discretize_test[0]["result"] = array([0 + 0j, 2.5 + 0j, 5 + 0j, 7.5 + 0j, 10 + 0j])
# X= Y segment (in complex) : 0 to 10+10j
discretize_test.append(
{"nb_point": 0, "begin": 0, "end": 14.1421356237 * exp(1j * pi / 4)}
)
discretize_test[1]["result"] = array([0j, 10.0 + 10.0j])
# X= Y segment (in complex) : 0 to 10+10j
discretize_test.append(
{"nb_point": 1, "begin": 0, "end": 14.1421356237 * exp(1j * pi / 4)}
)
discretize_test[2]["result"] = array([0j, 5 + 5j, 10.0 + 10.0j])
comp_length_test = list()
comp_length_test.append(
{"begin": 0, "end": 14.1421356237 * exp(1j * pi / 4), "length": 14.1421356237}
)
comp_length_test.append({"begin": 0, "end": 10, "length": 10})
comp_length_test.append({"begin": 1, "end": 10, "length": 9})
comp_length_test.append({"begin": 1j, "end": 10j, "length": 9})
comp_length_test.append({"begin": 0, "end": 3 + 4j, "length": 5})
split_half_test = list()
split_half_test.append(
{"begin": 0, "end": 10 + 10j, "is_begin": True, "N_begin": 0, "N_end": 5 + 5j}
)
split_half_test.append(
{"begin": -10, "end": 10, "is_begin": False, "N_begin": 0, "N_end": 10}
)
split_half_test.append(
{
"begin": 2 + 2j,
"end": 1 + 1j,
"is_begin": True,
"N_begin": 2 + 2j,
"N_end": 1.5 + 1.5j,
}
)
split_half_test.append(
{"begin": -2j, "end": -6j, "is_begin": False, "N_begin": -4j, "N_end": -6j}
)
[docs]@ddt
class test_Segment_meth(TestCase):
"""unittest for Segment methods"""
[docs] def test_check(self):
"""Check that you can detect a one point segment
"""
segment = Segment(0, 0)
with self.assertRaises(PointSegmentError):
segment.check()
@data(*discretize_test)
def test_dicretize(self, test_dict):
"""Check that you can discretize a segment
"""
segment = Segment(test_dict["begin"], test_dict["end"])
result = segment.discretize(test_dict["nb_point"])
self.assertEqual(result.size, test_dict["result"].size)
for i in range(0, result.size):
self.assertAlmostEqual(result[i], test_dict["result"][i], delta=DELTA)
[docs] def test_discretize_Point_error(self):
"""Check that dicretize can detect a one point segment
"""
segment = Segment(0, 0)
with self.assertRaises(PointSegmentError):
segment.discretize(5)
[docs] def test_discretize_Nb_error(self):
"""Check that you can detect a wrong argument
"""
segment = Segment(0, 10)
with self.assertRaises(NbPointSegmentDError):
segment.discretize(-1)
@data(*comp_length_test)
def test_comp_length(self, test_dict):
"""Check that you the length return by comp_length is correct
"""
segment = Segment(test_dict["begin"], test_dict["end"])
self.assertAlmostEqual(segment.comp_length(), test_dict["length"])
[docs] def test_comp_length_Point_error(self):
"""Check that comp_length can detect a one point segment
"""
segment = Segment(0, 0)
with self.assertRaises(PointSegmentError):
segment.comp_length()
[docs] def test_get_middle(self):
"""Check that you can compute the middle of the segment
"""
segment = Segment(0, 10)
result = segment.get_middle()
expect = 5.0
self.assertAlmostEqual(abs(result - expect), 0)
segment = Segment(10, 10 * exp(1j * pi / 2))
result = segment.get_middle()
expect = 5 + 5j
self.assertAlmostEqual(abs(result - expect), 0)
[docs] def test_rotate(self):
"""Check that you can rotate the segment
"""
segment = Segment(0, 1)
segment.rotate(pi / 2)
expect_begin = 0
expect_end = 1j
self.assertAlmostEqual(abs(expect_begin - segment.begin), 0)
self.assertAlmostEqual(abs(expect_end - segment.end), 0)
segment = Segment(1 + 1j, 1)
segment.rotate(-pi / 2)
expect_begin = 1 - 1j
expect_end = -1j
self.assertAlmostEqual(abs(expect_begin - segment.begin), 0)
self.assertAlmostEqual(abs(expect_end - segment.end), 0)
[docs] def test_translate(self):
"""Check that you can translate the segment
"""
segment = Segment(0, 3j)
segment.translate(2)
expect_begin = 2
expect_end = 2 + 3j
self.assertAlmostEqual(abs(expect_begin - segment.begin), 0)
self.assertAlmostEqual(abs(expect_end - segment.end), 0)
segment = Segment(-2 + 1j, 2 + 3j)
segment.translate(-2 - 3j)
expect_begin = -4 - 2j
expect_end = 0
self.assertAlmostEqual(abs(expect_begin - segment.begin), 0)
self.assertAlmostEqual(abs(expect_end - segment.end), 0)
@data(*split_half_test)
def test_split_half(self, test_dict):
"""Check that the segment split is correct
"""
seg = Segment(begin=test_dict["begin"], end=test_dict["end"])
seg.split_half(is_begin=test_dict["is_begin"])
self.assertAlmostEqual(seg.begin, test_dict["N_begin"])
self.assertAlmostEqual(seg.end, test_dict["N_end"])