1from sympy import symbols 2from sympy.functions import beta, Ei, zeta, Max, Min, sqrt 3from sympy.printing.cxx import CXX98CodePrinter, CXX11CodePrinter, CXX17CodePrinter, cxxcode 4from sympy.codegen.cfunctions import log1p 5 6from sympy.testing.pytest import warns_deprecated_sympy 7 8x, y, u, v = symbols('x y u v') 9 10 11def test_CXX98CodePrinter(): 12 assert CXX98CodePrinter().doprint(Max(x, 3)) in ('std::max(x, 3)', 'std::max(3, x)') 13 assert CXX98CodePrinter().doprint(Min(x, 3, sqrt(x))) == 'std::min(3, std::min(x, std::sqrt(x)))' 14 cxx98printer = CXX98CodePrinter() 15 assert cxx98printer.language == 'C++' 16 assert cxx98printer.standard == 'C++98' 17 assert 'template' in cxx98printer.reserved_words 18 assert 'alignas' not in cxx98printer.reserved_words 19 20 21def test_CXX11CodePrinter(): 22 assert CXX11CodePrinter().doprint(log1p(x)) == 'std::log1p(x)' 23 24 cxx11printer = CXX11CodePrinter() 25 assert cxx11printer.language == 'C++' 26 assert cxx11printer.standard == 'C++11' 27 assert 'operator' in cxx11printer.reserved_words 28 assert 'noexcept' in cxx11printer.reserved_words 29 assert 'concept' not in cxx11printer.reserved_words 30 31 32def test_subclass_print_method(): 33 class MyPrinter(CXX11CodePrinter): 34 def _print_log1p(self, expr): 35 return 'my_library::log1p(%s)' % ', '.join(map(self._print, expr.args)) 36 37 assert MyPrinter().doprint(log1p(x)) == 'my_library::log1p(x)' 38 39 40def test_subclass_print_method__ns(): 41 class MyPrinter(CXX11CodePrinter): 42 _ns = 'my_library::' 43 44 p = CXX11CodePrinter() 45 myp = MyPrinter() 46 47 assert p.doprint(log1p(x)) == 'std::log1p(x)' 48 assert myp.doprint(log1p(x)) == 'my_library::log1p(x)' 49 50 51def test_CXX17CodePrinter(): 52 assert CXX17CodePrinter().doprint(beta(x, y)) == 'std::beta(x, y)' 53 assert CXX17CodePrinter().doprint(Ei(x)) == 'std::expint(x)' 54 assert CXX17CodePrinter().doprint(zeta(x)) == 'std::riemann_zeta(x)' 55 56 57def test_cxxcode(): 58 assert sorted(cxxcode(sqrt(x)*.5).split('*')) == sorted(['0.5', 'std::sqrt(x)']) 59 60def test_cxxcode_submodule(): 61 # Test the compatibility sympy.printing.cxxcode module imports 62 with warns_deprecated_sympy(): 63 import sympy.printing.cxxcode # noqa:F401 64 65def test_cxxcode_nested_minmax(): 66 assert cxxcode(Max(Min(x, y), Min(u, v))) \ 67 == 'std::max(std::min(u, v), std::min(x, y))' 68 assert cxxcode(Min(Max(x, y), Max(u, v))) \ 69 == 'std::min(std::max(u, v), std::max(x, y))' 70