test_printing.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. # -*- coding: utf-8 -*-
  2. from sympy.core.function import Function
  3. from sympy.integrals.integrals import Integral
  4. from sympy.printing.latex import latex
  5. from sympy.printing.pretty import pretty as xpretty
  6. from sympy.vector import CoordSys3D, Del, Vector, express
  7. from sympy.abc import a, b, c
  8. from sympy.testing.pytest import XFAIL
  9. def pretty(expr):
  10. """ASCII pretty-printing"""
  11. return xpretty(expr, use_unicode=False, wrap_line=False)
  12. def upretty(expr):
  13. """Unicode pretty-printing"""
  14. return xpretty(expr, use_unicode=True, wrap_line=False)
  15. # Initialize the basic and tedious vector/dyadic expressions
  16. # needed for testing.
  17. # Some of the pretty forms shown denote how the expressions just
  18. # above them should look with pretty printing.
  19. N = CoordSys3D('N')
  20. C = N.orient_new_axis('C', a, N.k) # type: ignore
  21. v = []
  22. d = []
  23. v.append(Vector.zero)
  24. v.append(N.i) # type: ignore
  25. v.append(-N.i) # type: ignore
  26. v.append(N.i + N.j) # type: ignore
  27. v.append(a*N.i) # type: ignore
  28. v.append(a*N.i - b*N.j) # type: ignore
  29. v.append((a**2 + N.x)*N.i + N.k) # type: ignore
  30. v.append((a**2 + b)*N.i + 3*(C.y - c)*N.k) # type: ignore
  31. f = Function('f')
  32. v.append(N.j - (Integral(f(b)) - C.x**2)*N.k) # type: ignore
  33. upretty_v_8 = """\
  34. ⎛ 2 ⌠ ⎞ \n\
  35. j_N + ⎜x_C - ⎮ f(b) db⎟ k_N\n\
  36. ⎝ ⌡ ⎠ \
  37. """
  38. pretty_v_8 = """\
  39. j_N + / / \\\n\
  40. | 2 | |\n\
  41. |x_C - | f(b) db|\n\
  42. | | |\n\
  43. \\ / / \
  44. """
  45. v.append(N.i + C.k) # type: ignore
  46. v.append(express(N.i, C)) # type: ignore
  47. v.append((a**2 + b)*N.i + (Integral(f(b)))*N.k) # type: ignore
  48. upretty_v_11 = """\
  49. ⎛ 2 ⎞ ⎛⌠ ⎞ \n\
  50. ⎝a + b⎠ i_N + ⎜⎮ f(b) db⎟ k_N\n\
  51. ⎝⌡ ⎠ \
  52. """
  53. pretty_v_11 = """\
  54. / 2 \\ + / / \\\n\
  55. \\a + b/ i_N| | |\n\
  56. | | f(b) db|\n\
  57. | | |\n\
  58. \\/ / \
  59. """
  60. for x in v:
  61. d.append(x | N.k) # type: ignore
  62. s = 3*N.x**2*C.y # type: ignore
  63. upretty_s = """\
  64. 2\n\
  65. 3⋅y_C⋅x_N \
  66. """
  67. pretty_s = """\
  68. 2\n\
  69. 3*y_C*x_N \
  70. """
  71. # This is the pretty form for ((a**2 + b)*N.i + 3*(C.y - c)*N.k) | N.k
  72. upretty_d_7 = """\
  73. ⎛ 2 ⎞ \n\
  74. ⎝a + b⎠ (i_N|k_N) + (3⋅y_C - 3⋅c) (k_N|k_N)\
  75. """
  76. pretty_d_7 = """\
  77. / 2 \\ (i_N|k_N) + (3*y_C - 3*c) (k_N|k_N)\n\
  78. \\a + b/ \
  79. """
  80. def test_str_printing():
  81. assert str(v[0]) == '0'
  82. assert str(v[1]) == 'N.i'
  83. assert str(v[2]) == '(-1)*N.i'
  84. assert str(v[3]) == 'N.i + N.j'
  85. assert str(v[8]) == 'N.j + (C.x**2 - Integral(f(b), b))*N.k'
  86. assert str(v[9]) == 'C.k + N.i'
  87. assert str(s) == '3*C.y*N.x**2'
  88. assert str(d[0]) == '0'
  89. assert str(d[1]) == '(N.i|N.k)'
  90. assert str(d[4]) == 'a*(N.i|N.k)'
  91. assert str(d[5]) == 'a*(N.i|N.k) + (-b)*(N.j|N.k)'
  92. assert str(d[8]) == ('(N.j|N.k) + (C.x**2 - ' +
  93. 'Integral(f(b), b))*(N.k|N.k)')
  94. @XFAIL
  95. def test_pretty_printing_ascii():
  96. assert pretty(v[0]) == '0'
  97. assert pretty(v[1]) == 'i_N'
  98. assert pretty(v[5]) == '(a) i_N + (-b) j_N'
  99. assert pretty(v[8]) == pretty_v_8
  100. assert pretty(v[2]) == '(-1) i_N'
  101. assert pretty(v[11]) == pretty_v_11
  102. assert pretty(s) == pretty_s
  103. assert pretty(d[0]) == '(0|0)'
  104. assert pretty(d[5]) == '(a) (i_N|k_N) + (-b) (j_N|k_N)'
  105. assert pretty(d[7]) == pretty_d_7
  106. assert pretty(d[10]) == '(cos(a)) (i_C|k_N) + (-sin(a)) (j_C|k_N)'
  107. def test_pretty_print_unicode_v():
  108. assert upretty(v[0]) == '0'
  109. assert upretty(v[1]) == 'i_N'
  110. assert upretty(v[5]) == '(a) i_N + (-b) j_N'
  111. # Make sure the printing works in other objects
  112. assert upretty(v[5].args) == '((a) i_N, (-b) j_N)'
  113. assert upretty(v[8]) == upretty_v_8
  114. assert upretty(v[2]) == '(-1) i_N'
  115. assert upretty(v[11]) == upretty_v_11
  116. assert upretty(s) == upretty_s
  117. assert upretty(d[0]) == '(0|0)'
  118. assert upretty(d[5]) == '(a) (i_N|k_N) + (-b) (j_N|k_N)'
  119. assert upretty(d[7]) == upretty_d_7
  120. assert upretty(d[10]) == '(cos(a)) (i_C|k_N) + (-sin(a)) (j_C|k_N)'
  121. def test_latex_printing():
  122. assert latex(v[0]) == '\\mathbf{\\hat{0}}'
  123. assert latex(v[1]) == '\\mathbf{\\hat{i}_{N}}'
  124. assert latex(v[2]) == '- \\mathbf{\\hat{i}_{N}}'
  125. assert latex(v[5]) == ('\\left(a\\right)\\mathbf{\\hat{i}_{N}} + ' +
  126. '\\left(- b\\right)\\mathbf{\\hat{j}_{N}}')
  127. assert latex(v[6]) == ('\\left(\\mathbf{{x}_{N}} + a^{2}\\right)\\mathbf{\\hat{i}_' +
  128. '{N}} + \\mathbf{\\hat{k}_{N}}')
  129. assert latex(v[8]) == ('\\mathbf{\\hat{j}_{N}} + \\left(\\mathbf{{x}_' +
  130. '{C}}^{2} - \\int f{\\left(b \\right)}\\,' +
  131. ' db\\right)\\mathbf{\\hat{k}_{N}}')
  132. assert latex(s) == '3 \\mathbf{{y}_{C}} \\mathbf{{x}_{N}}^{2}'
  133. assert latex(d[0]) == '(\\mathbf{\\hat{0}}|\\mathbf{\\hat{0}})'
  134. assert latex(d[4]) == ('\\left(a\\right)\\left(\\mathbf{\\hat{i}_{N}}{\\middle|}' +
  135. '\\mathbf{\\hat{k}_{N}}\\right)')
  136. assert latex(d[9]) == ('\\left(\\mathbf{\\hat{k}_{C}}{\\middle|}' +
  137. '\\mathbf{\\hat{k}_{N}}\\right) + \\left(' +
  138. '\\mathbf{\\hat{i}_{N}}{\\middle|}\\mathbf{' +
  139. '\\hat{k}_{N}}\\right)')
  140. assert latex(d[11]) == ('\\left(a^{2} + b\\right)\\left(\\mathbf{\\hat{i}_{N}}' +
  141. '{\\middle|}\\mathbf{\\hat{k}_{N}}\\right) + ' +
  142. '\\left(\\int f{\\left(b \\right)}\\, db\\right)\\left(' +
  143. '\\mathbf{\\hat{k}_{N}}{\\middle|}\\mathbf{' +
  144. '\\hat{k}_{N}}\\right)')
  145. def test_issue_23058():
  146. from sympy import symbols, sin, cos, pi, UnevaluatedExpr
  147. delop = Del()
  148. CC_ = CoordSys3D("C")
  149. y = CC_.y
  150. xhat = CC_.i
  151. t = symbols("t")
  152. ten = symbols("10", positive=True)
  153. eps, mu = 4*pi*ten**(-11), ten**(-5)
  154. Bx = 2 * ten**(-4) * cos(ten**5 * t) * sin(ten**(-3) * y)
  155. vecB = Bx * xhat
  156. vecE = (1/eps) * Integral(delop.cross(vecB/mu).doit(), t)
  157. vecE = vecE.doit()
  158. vecB_str = """\
  159. ⎛ ⎛y_C⎞ ⎛ 5 ⎞⎞ \n\
  160. ⎜2⋅sin⎜───⎟⋅cos⎝10 ⋅t⎠⎟ i_C\n\
  161. ⎜ ⎜ 3⎟ ⎟ \n\
  162. ⎜ ⎝10 ⎠ ⎟ \n\
  163. ⎜─────────────────────⎟ \n\
  164. ⎜ 4 ⎟ \n\
  165. ⎝ 10 ⎠ \
  166. """
  167. vecE_str = """\
  168. ⎛ 4 ⎛ 5 ⎞ ⎛y_C⎞ ⎞ \n\
  169. ⎜-10 ⋅sin⎝10 ⋅t⎠⋅cos⎜───⎟ ⎟ k_C\n\
  170. ⎜ ⎜ 3⎟ ⎟ \n\
  171. ⎜ ⎝10 ⎠ ⎟ \n\
  172. ⎜─────────────────────────⎟ \n\
  173. ⎝ 2⋅π ⎠ \
  174. """
  175. assert upretty(vecB) == vecB_str
  176. assert upretty(vecE) == vecE_str
  177. ten = UnevaluatedExpr(10)
  178. eps, mu = 4*pi*ten**(-11), ten**(-5)
  179. Bx = 2 * ten**(-4) * cos(ten**5 * t) * sin(ten**(-3) * y)
  180. vecB = Bx * xhat
  181. vecB_str = """\
  182. ⎛ -4 ⎛ 5⎞ ⎛ -3⎞⎞ \n\
  183. ⎝2⋅10 ⋅cos⎝t⋅10 ⎠⋅sin⎝y_C⋅10 ⎠⎠ i_C \
  184. """
  185. assert upretty(vecB) == vecB_str
  186. def test_custom_names():
  187. A = CoordSys3D('A', vector_names=['x', 'y', 'z'],
  188. variable_names=['i', 'j', 'k'])
  189. assert A.i.__str__() == 'A.i'
  190. assert A.x.__str__() == 'A.x'
  191. assert A.i._pretty_form == 'i_A'
  192. assert A.x._pretty_form == 'x_A'
  193. assert A.i._latex_form == r'\mathbf{{i}_{A}}'
  194. assert A.x._latex_form == r"\mathbf{\hat{x}_{A}}"