Merge pull request #3615 from marcelotrevisani/bug-3593-pytest-approx

Bug fix #3593 - approx repr in a 0-d numpy array
This commit is contained in:
Ronny Pfannschmidt 2018-06-26 13:04:23 +02:00 committed by GitHub
commit 8133d1955e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 28 additions and 5 deletions

View File

@ -126,6 +126,7 @@ Maik Figura
Mandeep Bhutani Mandeep Bhutani
Manuel Krebber Manuel Krebber
Marc Schlaich Marc Schlaich
Marcelo Duarte Trevisani
Marcin Bachry Marcin Bachry
Mark Abramowitz Mark Abramowitz
Markus Unterwaditzer Markus Unterwaditzer

View File

@ -0,0 +1,5 @@
If the user pass as a expected value a numpy array created like
numpy.array(5); it will creates an array with one element without shape,
when used with approx it will raise an error for the `repr`
'TypeError: iteration over a 0-d array'. With this PR pytest will iterate
properly in the numpy array even with 0 dimension.

View File

@ -86,9 +86,11 @@ class ApproxNumpy(ApproxBase):
# shape of the array... # shape of the array...
import numpy as np import numpy as np
return "approx({!r})".format( list_scalars = []
list(self._approx_scalar(x) for x in np.asarray(self.expected)) for x in np.ndindex(self.expected.shape):
) list_scalars.append(self._approx_scalar(np.asscalar(self.expected[x])))
return "approx({!r})".format(list_scalars)
if sys.version_info[0] == 2: if sys.version_info[0] == 2:
__cmp__ = _cmp_raises_type_error __cmp__ = _cmp_raises_type_error

View File

@ -27,8 +27,11 @@ class MyDocTestRunner(doctest.DocTestRunner):
class TestApprox(object): class TestApprox(object):
def test_repr_string(self): @pytest.fixture
plus_minus = u"\u00b1" if sys.version_info[0] > 2 else u"+-" def plus_minus(self):
return u"\u00b1" if sys.version_info[0] > 2 else u"+-"
def test_repr_string(self, plus_minus):
tol1, tol2, infr = "1.0e-06", "2.0e-06", "inf" tol1, tol2, infr = "1.0e-06", "2.0e-06", "inf"
assert repr(approx(1.0)) == "1.0 {pm} {tol1}".format(pm=plus_minus, tol1=tol1) assert repr(approx(1.0)) == "1.0 {pm} {tol1}".format(pm=plus_minus, tol1=tol1)
assert ( assert (
@ -61,6 +64,18 @@ class TestApprox(object):
), ),
) )
def test_repr_0d_array(self, plus_minus):
np = pytest.importorskip("numpy")
np_array = np.array(5.)
assert approx(np_array) == 5.0
string_expected = "approx([5.0 {} 5.0e-06])".format(plus_minus)
assert repr(approx(np_array)) == string_expected
np_array = np.array([5.])
assert approx(np_array) == 5.0
assert repr(approx(np_array)) == string_expected
def test_operator_overloading(self): def test_operator_overloading(self):
assert 1 == approx(1, rel=1e-6, abs=1e-12) assert 1 == approx(1, rel=1e-6, abs=1e-12)
assert not (1 != approx(1, rel=1e-6, abs=1e-12)) assert not (1 != approx(1, rel=1e-6, abs=1e-12))