Kano001's picture
Upload 3077 files
6a86ad5 verified
raw
history blame
3.6 kB
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)