49 lines
1.7 KiB
Python
49 lines
1.7 KiB
Python
"""
|
|
Tests specific to the bezier module.
|
|
"""
|
|
|
|
import pytest
|
|
import numpy as np
|
|
from numpy.testing import assert_allclose
|
|
|
|
from matplotlib.bezier import (
|
|
_real_roots_in_01, inside_circle, split_bezier_intersecting_with_closedpath
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize("roots, expected_in_01", [
|
|
([0.5], [0.5]),
|
|
([0.25, 0.75], [0.25, 0.75]),
|
|
([0.2, 0.5, 0.8], [0.2, 0.5, 0.8]),
|
|
([0.1, 0.2, 0.3, 0.4], [0.1, 0.2, 0.3, 0.4]),
|
|
([0.0, 0.5], [0.0, 0.5]),
|
|
([0.5, 1.0], [0.5, 1.0]),
|
|
([2.0], []), # outside [0, 1]
|
|
([0.5, 2.0], [0.5]), # one in, one out
|
|
([-1j, 1j], []), # complex roots
|
|
([0.5, -1j, 1j], [0.5]), # mix of real and complex
|
|
([0.3, 0.3], [0.3, 0.3]), # repeated root
|
|
])
|
|
def test_real_roots_in_01(roots, expected_in_01):
|
|
roots = np.array(roots)
|
|
coeffs = np.poly(roots)[::-1] # np.poly gives descending, we need ascending
|
|
result = _real_roots_in_01(coeffs.real)
|
|
assert_allclose(result, expected_in_01, atol=1e-10)
|
|
|
|
|
|
@pytest.mark.parametrize("coeffs", [[5], [0, 0, 0]])
|
|
def test_real_roots_in_01_no_roots(coeffs):
|
|
assert len(_real_roots_in_01(coeffs)) == 0
|
|
|
|
|
|
def test_split_bezier_with_large_values():
|
|
# These numbers come from gh-27753
|
|
arrow_path = [(96950809781500.0, 804.7503795623779),
|
|
(96950809781500.0, 859.6242585800646),
|
|
(96950809781500.0, 914.4981375977513)]
|
|
in_f = inside_circle(96950809781500.0, 804.7503795623779, 0.06)
|
|
split_bezier_intersecting_with_closedpath(arrow_path, in_f)
|
|
# All we are testing is that this completes
|
|
# The failure case is an infinite loop resulting from floating point precision
|
|
# pytest will timeout if that occurs
|