from pytest import raises from sympy import ( symbols, Expr, Tuple, Integer, cos, solveset, FiniteSet, ImageSet) from sympy.plotting.utils import ( _create_ranges, _plot_sympify, extract_solution) from sympy.physics.mechanics import ReferenceFrame, Vector as MechVector from sympy.vector import CoordSys3D, Vector def test_plot_sympify(): x, y = symbols("x, y") # argument is already sympified args = x + y r = _plot_sympify(args) assert r == args # one argument needs to be sympified args = (x + y, 1) r = _plot_sympify(args) assert isinstance(r, (list, tuple, Tuple)) and len(r) == 2 assert isinstance(r[0], Expr) assert isinstance(r[1], Integer) # string and dict should not be sympified args = (x + y, (x, 0, 1), "str", 1, {1: 1, 2: 2.0}) r = _plot_sympify(args) assert isinstance(r, (list, tuple, Tuple)) and len(r) == 5 assert isinstance(r[0], Expr) assert isinstance(r[1], Tuple) assert isinstance(r[2], str) assert isinstance(r[3], Integer) assert isinstance(r[4], dict) and isinstance(r[4][1], int) and isinstance(r[4][2], float) # nested arguments containing strings args = ((x + y, (y, 0, 1), "a"), (x + 1, (x, 0, 1), "$f_{1}$")) r = _plot_sympify(args) assert isinstance(r, (list, tuple, Tuple)) and len(r) == 2 assert isinstance(r[0], Tuple) assert isinstance(r[0][1], Tuple) assert isinstance(r[0][1][1], Integer) assert isinstance(r[0][2], str) assert isinstance(r[1], Tuple) assert isinstance(r[1][1], Tuple) assert isinstance(r[1][1][1], Integer) assert isinstance(r[1][2], str) # vectors from sympy.physics.vectors module are not sympified # vectors from sympy.vectors are sympified # in both cases, no error should be raised R = ReferenceFrame("R") v1 = 2 * R.x + R.y C = CoordSys3D("C") v2 = 2 * C.i + C.j args = (v1, v2) r = _plot_sympify(args) assert isinstance(r, (list, tuple, Tuple)) and len(r) == 2 assert isinstance(v1, MechVector) assert isinstance(v2, Vector) def test_create_ranges(): x, y = symbols("x, y") # user don't provide any range -> return a default range r = _create_ranges({x}, [], 1) assert isinstance(r, (list, tuple, Tuple)) and len(r) == 1 assert isinstance(r[0], (Tuple, tuple)) assert r[0] == (x, -10, 10) r = _create_ranges({x, y}, [], 2) assert isinstance(r, (list, tuple, Tuple)) and len(r) == 2 assert isinstance(r[0], (Tuple, tuple)) assert isinstance(r[1], (Tuple, tuple)) assert r[0] == (x, -10, 10) or (y, -10, 10) assert r[1] == (y, -10, 10) or (x, -10, 10) assert r[0] != r[1] # not enough ranges provided by the user -> create default ranges r = _create_ranges( {x, y}, [ (x, 0, 1), ], 2, ) assert isinstance(r, (list, tuple, Tuple)) and len(r) == 2 assert isinstance(r[0], (Tuple, tuple)) assert isinstance(r[1], (Tuple, tuple)) assert r[0] == (x, 0, 1) or (y, -10, 10) assert r[1] == (y, -10, 10) or (x, 0, 1) assert r[0] != r[1] # too many free symbols raises(ValueError, lambda: _create_ranges({x, y}, [], 1)) raises(ValueError, lambda: _create_ranges({x, y}, [(x, 0, 5), (y, 0, 1)], 1)) def test_extract_solution(): x = symbols("x") sol = solveset(cos(10 * x)) assert sol.has(ImageSet) res = extract_solution(sol) assert len(res) == 20 assert isinstance(res, FiniteSet) res = extract_solution(sol, 20) assert len(res) == 40 assert isinstance(res, FiniteSet)