test_kind.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import sys
  2. import pytest
  3. import platform
  4. from numpy.f2py.crackfortran import (
  5. _selected_int_kind_func as selected_int_kind,
  6. _selected_real_kind_func as selected_real_kind,
  7. )
  8. from . import util
  9. class TestKind(util.F2PyTest):
  10. sources = [util.getpath("tests", "src", "kind", "foo.f90")]
  11. @pytest.mark.skipif(sys.maxsize < 2 ** 31 + 1,
  12. reason="Fails for 32 bit machines")
  13. def test_int(self):
  14. """Test `int` kind_func for integers up to 10**40."""
  15. selectedintkind = self.module.selectedintkind
  16. for i in range(40):
  17. assert selectedintkind(i) == selected_int_kind(
  18. i
  19. ), f"selectedintkind({i}): expected {selected_int_kind(i)!r} but got {selectedintkind(i)!r}"
  20. def test_real(self):
  21. """
  22. Test (processor-dependent) `real` kind_func for real numbers
  23. of up to 31 digits precision (extended/quadruple).
  24. """
  25. selectedrealkind = self.module.selectedrealkind
  26. for i in range(32):
  27. assert selectedrealkind(i) == selected_real_kind(
  28. i
  29. ), f"selectedrealkind({i}): expected {selected_real_kind(i)!r} but got {selectedrealkind(i)!r}"
  30. @pytest.mark.xfail(platform.machine().lower().startswith("ppc"),
  31. reason="Some PowerPC may not support full IEEE 754 precision")
  32. def test_quad_precision(self):
  33. """
  34. Test kind_func for quadruple precision [`real(16)`] of 32+ digits .
  35. """
  36. selectedrealkind = self.module.selectedrealkind
  37. for i in range(32, 40):
  38. assert selectedrealkind(i) == selected_real_kind(
  39. i
  40. ), f"selectedrealkind({i}): expected {selected_real_kind(i)!r} but got {selectedrealkind(i)!r}"