| | import warnings |
| | import sys |
| | import os |
| | import itertools |
| | import pytest |
| | import weakref |
| | import re |
| |
|
| | import numpy as np |
| | import numpy._core._multiarray_umath as ncu |
| | from numpy.testing import ( |
| | assert_equal, assert_array_equal, assert_almost_equal, |
| | assert_array_almost_equal, assert_array_less, build_err_msg, |
| | assert_raises, assert_warns, assert_no_warnings, assert_allclose, |
| | assert_approx_equal, assert_array_almost_equal_nulp, assert_array_max_ulp, |
| | clear_and_catch_warnings, suppress_warnings, assert_string_equal, assert_, |
| | tempdir, temppath, assert_no_gc_cycles, HAS_REFCOUNT |
| | ) |
| |
|
| |
|
| | class _GenericTest: |
| |
|
| | def _test_equal(self, a, b): |
| | self._assert_func(a, b) |
| |
|
| | def _test_not_equal(self, a, b): |
| | with assert_raises(AssertionError): |
| | self._assert_func(a, b) |
| |
|
| | def test_array_rank1_eq(self): |
| | """Test two equal array of rank 1 are found equal.""" |
| | a = np.array([1, 2]) |
| | b = np.array([1, 2]) |
| |
|
| | self._test_equal(a, b) |
| |
|
| | def test_array_rank1_noteq(self): |
| | """Test two different array of rank 1 are found not equal.""" |
| | a = np.array([1, 2]) |
| | b = np.array([2, 2]) |
| |
|
| | self._test_not_equal(a, b) |
| |
|
| | def test_array_rank2_eq(self): |
| | """Test two equal array of rank 2 are found equal.""" |
| | a = np.array([[1, 2], [3, 4]]) |
| | b = np.array([[1, 2], [3, 4]]) |
| |
|
| | self._test_equal(a, b) |
| |
|
| | def test_array_diffshape(self): |
| | """Test two arrays with different shapes are found not equal.""" |
| | a = np.array([1, 2]) |
| | b = np.array([[1, 2], [1, 2]]) |
| |
|
| | self._test_not_equal(a, b) |
| |
|
| | def test_objarray(self): |
| | """Test object arrays.""" |
| | a = np.array([1, 1], dtype=object) |
| | self._test_equal(a, 1) |
| |
|
| | def test_array_likes(self): |
| | self._test_equal([1, 2, 3], (1, 2, 3)) |
| |
|
| |
|
| | class TestArrayEqual(_GenericTest): |
| |
|
| | def setup_method(self): |
| | self._assert_func = assert_array_equal |
| |
|
| | def test_generic_rank1(self): |
| | """Test rank 1 array for all dtypes.""" |
| | def foo(t): |
| | a = np.empty(2, t) |
| | a.fill(1) |
| | b = a.copy() |
| | c = a.copy() |
| | c.fill(0) |
| | self._test_equal(a, b) |
| | self._test_not_equal(c, b) |
| |
|
| | |
| | for t in '?bhilqpBHILQPfdgFDG': |
| | foo(t) |
| |
|
| | |
| | for t in ['S1', 'U1']: |
| | foo(t) |
| |
|
| | def test_0_ndim_array(self): |
| | x = np.array(473963742225900817127911193656584771) |
| | y = np.array(18535119325151578301457182298393896) |
| |
|
| | with pytest.raises(AssertionError) as exc_info: |
| | self._assert_func(x, y) |
| | msg = str(exc_info.value) |
| | assert_('Mismatched elements: 1 / 1 (100%)\n' |
| | in msg) |
| |
|
| | y = x |
| | self._assert_func(x, y) |
| |
|
| | x = np.array(4395065348745.5643764887869876) |
| | y = np.array(0) |
| | expected_msg = ('Mismatched elements: 1 / 1 (100%)\n' |
| | 'Max absolute difference among violations: ' |
| | '4.39506535e+12\n' |
| | 'Max relative difference among violations: inf\n') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func(x, y) |
| |
|
| | x = y |
| | self._assert_func(x, y) |
| |
|
| | def test_generic_rank3(self): |
| | """Test rank 3 array for all dtypes.""" |
| | def foo(t): |
| | a = np.empty((4, 2, 3), t) |
| | a.fill(1) |
| | b = a.copy() |
| | c = a.copy() |
| | c.fill(0) |
| | self._test_equal(a, b) |
| | self._test_not_equal(c, b) |
| |
|
| | |
| | for t in '?bhilqpBHILQPfdgFDG': |
| | foo(t) |
| |
|
| | |
| | for t in ['S1', 'U1']: |
| | foo(t) |
| |
|
| | def test_nan_array(self): |
| | """Test arrays with nan values in them.""" |
| | a = np.array([1, 2, np.nan]) |
| | b = np.array([1, 2, np.nan]) |
| |
|
| | self._test_equal(a, b) |
| |
|
| | c = np.array([1, 2, 3]) |
| | self._test_not_equal(c, b) |
| |
|
| | def test_string_arrays(self): |
| | """Test two arrays with different shapes are found not equal.""" |
| | a = np.array(['floupi', 'floupa']) |
| | b = np.array(['floupi', 'floupa']) |
| |
|
| | self._test_equal(a, b) |
| |
|
| | c = np.array(['floupipi', 'floupa']) |
| |
|
| | self._test_not_equal(c, b) |
| |
|
| | def test_recarrays(self): |
| | """Test record arrays.""" |
| | a = np.empty(2, [('floupi', float), ('floupa', float)]) |
| | a['floupi'] = [1, 2] |
| | a['floupa'] = [1, 2] |
| | b = a.copy() |
| |
|
| | self._test_equal(a, b) |
| |
|
| | c = np.empty(2, [('floupipi', float), |
| | ('floupi', float), ('floupa', float)]) |
| | c['floupipi'] = a['floupi'].copy() |
| | c['floupa'] = a['floupa'].copy() |
| |
|
| | with pytest.raises(TypeError): |
| | self._test_not_equal(c, b) |
| |
|
| | def test_masked_nan_inf(self): |
| | |
| | a = np.ma.MaskedArray([3., 4., 6.5], mask=[False, True, False]) |
| | b = np.array([3., np.nan, 6.5]) |
| | self._test_equal(a, b) |
| | self._test_equal(b, a) |
| | a = np.ma.MaskedArray([3., 4., 6.5], mask=[True, False, False]) |
| | b = np.array([np.inf, 4., 6.5]) |
| | self._test_equal(a, b) |
| | self._test_equal(b, a) |
| |
|
| | def test_subclass_that_overrides_eq(self): |
| | |
| | |
| | |
| | |
| | class MyArray(np.ndarray): |
| | def __eq__(self, other): |
| | return bool(np.equal(self, other).all()) |
| |
|
| | def __ne__(self, other): |
| | return not self == other |
| |
|
| | a = np.array([1., 2.]).view(MyArray) |
| | b = np.array([2., 3.]).view(MyArray) |
| | assert_(type(a == a), bool) |
| | assert_(a == a) |
| | assert_(a != b) |
| | self._test_equal(a, a) |
| | self._test_not_equal(a, b) |
| | self._test_not_equal(b, a) |
| |
|
| | expected_msg = ('Mismatched elements: 1 / 2 (50%)\n' |
| | 'Max absolute difference among violations: 1.\n' |
| | 'Max relative difference among violations: 0.5') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._test_equal(a, b) |
| |
|
| | c = np.array([0., 2.9]).view(MyArray) |
| | expected_msg = ('Mismatched elements: 1 / 2 (50%)\n' |
| | 'Max absolute difference among violations: 2.\n' |
| | 'Max relative difference among violations: inf') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._test_equal(b, c) |
| |
|
| | def test_subclass_that_does_not_implement_npall(self): |
| | class MyArray(np.ndarray): |
| | def __array_function__(self, *args, **kwargs): |
| | return NotImplemented |
| |
|
| | a = np.array([1., 2.]).view(MyArray) |
| | b = np.array([2., 3.]).view(MyArray) |
| | with assert_raises(TypeError): |
| | np.all(a) |
| | self._test_equal(a, a) |
| | self._test_not_equal(a, b) |
| | self._test_not_equal(b, a) |
| |
|
| | def test_suppress_overflow_warnings(self): |
| | |
| | with pytest.raises(AssertionError): |
| | with np.errstate(all="raise"): |
| | np.testing.assert_array_equal( |
| | np.array([1, 2, 3], np.float32), |
| | np.array([1, 1e-40, 3], np.float32)) |
| |
|
| | def test_array_vs_scalar_is_equal(self): |
| | """Test comparing an array with a scalar when all values are equal.""" |
| | a = np.array([1., 1., 1.]) |
| | b = 1. |
| |
|
| | self._test_equal(a, b) |
| |
|
| | def test_array_vs_array_not_equal(self): |
| | """Test comparing an array with a scalar when not all values equal.""" |
| | a = np.array([34986, 545676, 439655, 563766]) |
| | b = np.array([34986, 545676, 439655, 0]) |
| |
|
| | expected_msg = ('Mismatched elements: 1 / 4 (25%)\n' |
| | 'Max absolute difference among violations: 563766\n' |
| | 'Max relative difference among violations: inf') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func(a, b) |
| |
|
| | a = np.array([34986, 545676, 439655.2, 563766]) |
| | expected_msg = ('Mismatched elements: 2 / 4 (50%)\n' |
| | 'Max absolute difference among violations: ' |
| | '563766.\n' |
| | 'Max relative difference among violations: ' |
| | '4.54902139e-07') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func(a, b) |
| |
|
| | def test_array_vs_scalar_strict(self): |
| | """Test comparing an array with a scalar with strict option.""" |
| | a = np.array([1., 1., 1.]) |
| | b = 1. |
| |
|
| | with pytest.raises(AssertionError): |
| | self._assert_func(a, b, strict=True) |
| |
|
| | def test_array_vs_array_strict(self): |
| | """Test comparing two arrays with strict option.""" |
| | a = np.array([1., 1., 1.]) |
| | b = np.array([1., 1., 1.]) |
| |
|
| | self._assert_func(a, b, strict=True) |
| |
|
| | def test_array_vs_float_array_strict(self): |
| | """Test comparing two arrays with strict option.""" |
| | a = np.array([1, 1, 1]) |
| | b = np.array([1., 1., 1.]) |
| |
|
| | with pytest.raises(AssertionError): |
| | self._assert_func(a, b, strict=True) |
| |
|
| |
|
| | class TestBuildErrorMessage: |
| |
|
| | def test_build_err_msg_defaults(self): |
| | x = np.array([1.00001, 2.00002, 3.00003]) |
| | y = np.array([1.00002, 2.00003, 3.00004]) |
| | err_msg = 'There is a mismatch' |
| |
|
| | a = build_err_msg([x, y], err_msg) |
| | b = ('\nItems are not equal: There is a mismatch\n ACTUAL: array([' |
| | '1.00001, 2.00002, 3.00003])\n DESIRED: array([1.00002, ' |
| | '2.00003, 3.00004])') |
| | assert_equal(a, b) |
| |
|
| | def test_build_err_msg_no_verbose(self): |
| | x = np.array([1.00001, 2.00002, 3.00003]) |
| | y = np.array([1.00002, 2.00003, 3.00004]) |
| | err_msg = 'There is a mismatch' |
| |
|
| | a = build_err_msg([x, y], err_msg, verbose=False) |
| | b = '\nItems are not equal: There is a mismatch' |
| | assert_equal(a, b) |
| |
|
| | def test_build_err_msg_custom_names(self): |
| | x = np.array([1.00001, 2.00002, 3.00003]) |
| | y = np.array([1.00002, 2.00003, 3.00004]) |
| | err_msg = 'There is a mismatch' |
| |
|
| | a = build_err_msg([x, y], err_msg, names=('FOO', 'BAR')) |
| | b = ('\nItems are not equal: There is a mismatch\n FOO: array([' |
| | '1.00001, 2.00002, 3.00003])\n BAR: array([1.00002, 2.00003, ' |
| | '3.00004])') |
| | assert_equal(a, b) |
| |
|
| | def test_build_err_msg_custom_precision(self): |
| | x = np.array([1.000000001, 2.00002, 3.00003]) |
| | y = np.array([1.000000002, 2.00003, 3.00004]) |
| | err_msg = 'There is a mismatch' |
| |
|
| | a = build_err_msg([x, y], err_msg, precision=10) |
| | b = ('\nItems are not equal: There is a mismatch\n ACTUAL: array([' |
| | '1.000000001, 2.00002 , 3.00003 ])\n DESIRED: array([' |
| | '1.000000002, 2.00003 , 3.00004 ])') |
| | assert_equal(a, b) |
| |
|
| |
|
| | class TestEqual(TestArrayEqual): |
| |
|
| | def setup_method(self): |
| | self._assert_func = assert_equal |
| |
|
| | def test_nan_items(self): |
| | self._assert_func(np.nan, np.nan) |
| | self._assert_func([np.nan], [np.nan]) |
| | self._test_not_equal(np.nan, [np.nan]) |
| | self._test_not_equal(np.nan, 1) |
| |
|
| | def test_inf_items(self): |
| | self._assert_func(np.inf, np.inf) |
| | self._assert_func([np.inf], [np.inf]) |
| | self._test_not_equal(np.inf, [np.inf]) |
| |
|
| | def test_datetime(self): |
| | self._test_equal( |
| | np.datetime64("2017-01-01", "s"), |
| | np.datetime64("2017-01-01", "s") |
| | ) |
| | self._test_equal( |
| | np.datetime64("2017-01-01", "s"), |
| | np.datetime64("2017-01-01", "m") |
| | ) |
| |
|
| | |
| | self._test_not_equal( |
| | np.datetime64("2017-01-01", "s"), |
| | np.datetime64("2017-01-02", "s") |
| | ) |
| | self._test_not_equal( |
| | np.datetime64("2017-01-01", "s"), |
| | np.datetime64("2017-01-02", "m") |
| | ) |
| |
|
| | def test_nat_items(self): |
| | |
| | nadt_no_unit = np.datetime64("NaT") |
| | nadt_s = np.datetime64("NaT", "s") |
| | nadt_d = np.datetime64("NaT", "ns") |
| | |
| | natd_no_unit = np.timedelta64("NaT") |
| | natd_s = np.timedelta64("NaT", "s") |
| | natd_d = np.timedelta64("NaT", "ns") |
| |
|
| | dts = [nadt_no_unit, nadt_s, nadt_d] |
| | tds = [natd_no_unit, natd_s, natd_d] |
| | for a, b in itertools.product(dts, dts): |
| | self._assert_func(a, b) |
| | self._assert_func([a], [b]) |
| | self._test_not_equal([a], b) |
| |
|
| | for a, b in itertools.product(tds, tds): |
| | self._assert_func(a, b) |
| | self._assert_func([a], [b]) |
| | self._test_not_equal([a], b) |
| |
|
| | for a, b in itertools.product(tds, dts): |
| | self._test_not_equal(a, b) |
| | self._test_not_equal(a, [b]) |
| | self._test_not_equal([a], [b]) |
| | self._test_not_equal([a], np.datetime64("2017-01-01", "s")) |
| | self._test_not_equal([b], np.datetime64("2017-01-01", "s")) |
| | self._test_not_equal([a], np.timedelta64(123, "s")) |
| | self._test_not_equal([b], np.timedelta64(123, "s")) |
| |
|
| | def test_non_numeric(self): |
| | self._assert_func('ab', 'ab') |
| | self._test_not_equal('ab', 'abb') |
| |
|
| | def test_complex_item(self): |
| | self._assert_func(complex(1, 2), complex(1, 2)) |
| | self._assert_func(complex(1, np.nan), complex(1, np.nan)) |
| | self._test_not_equal(complex(1, np.nan), complex(1, 2)) |
| | self._test_not_equal(complex(np.nan, 1), complex(1, np.nan)) |
| | self._test_not_equal(complex(np.nan, np.inf), complex(np.nan, 2)) |
| |
|
| | def test_negative_zero(self): |
| | self._test_not_equal(ncu.PZERO, ncu.NZERO) |
| |
|
| | def test_complex(self): |
| | x = np.array([complex(1, 2), complex(1, np.nan)]) |
| | y = np.array([complex(1, 2), complex(1, 2)]) |
| | self._assert_func(x, x) |
| | self._test_not_equal(x, y) |
| |
|
| | def test_object(self): |
| | |
| | import datetime |
| | a = np.array([datetime.datetime(2000, 1, 1), |
| | datetime.datetime(2000, 1, 2)]) |
| | self._test_not_equal(a, a[::-1]) |
| |
|
| |
|
| | class TestArrayAlmostEqual(_GenericTest): |
| |
|
| | def setup_method(self): |
| | self._assert_func = assert_array_almost_equal |
| |
|
| | def test_closeness(self): |
| | |
| | |
| | |
| | |
| | |
| |
|
| | |
| | expected_msg = ('Mismatched elements: 1 / 1 (100%)\n' |
| | 'Max absolute difference among violations: 1.5\n' |
| | 'Max relative difference among violations: inf') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func(1.5, 0.0, decimal=0) |
| |
|
| | |
| | self._assert_func([1.499999], [0.0], decimal=0) |
| |
|
| | expected_msg = ('Mismatched elements: 1 / 1 (100%)\n' |
| | 'Max absolute difference among violations: 1.5\n' |
| | 'Max relative difference among violations: inf') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func([1.5], [0.0], decimal=0) |
| |
|
| | a = [1.4999999, 0.00003] |
| | b = [1.49999991, 0] |
| | expected_msg = ('Mismatched elements: 1 / 2 (50%)\n' |
| | 'Max absolute difference among violations: 3.e-05\n' |
| | 'Max relative difference among violations: inf') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func(a, b, decimal=7) |
| |
|
| | expected_msg = ('Mismatched elements: 1 / 2 (50%)\n' |
| | 'Max absolute difference among violations: 3.e-05\n' |
| | 'Max relative difference among violations: 1.') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func(b, a, decimal=7) |
| |
|
| | def test_simple(self): |
| | x = np.array([1234.2222]) |
| | y = np.array([1234.2223]) |
| |
|
| | self._assert_func(x, y, decimal=3) |
| | self._assert_func(x, y, decimal=4) |
| |
|
| | expected_msg = ('Mismatched elements: 1 / 1 (100%)\n' |
| | 'Max absolute difference among violations: ' |
| | '1.e-04\n' |
| | 'Max relative difference among violations: ' |
| | '8.10226812e-08') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func(x, y, decimal=5) |
| |
|
| | def test_array_vs_scalar(self): |
| | a = [5498.42354, 849.54345, 0.00] |
| | b = 5498.42354 |
| | expected_msg = ('Mismatched elements: 2 / 3 (66.7%)\n' |
| | 'Max absolute difference among violations: ' |
| | '5498.42354\n' |
| | 'Max relative difference among violations: 1.') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func(a, b, decimal=9) |
| |
|
| | expected_msg = ('Mismatched elements: 2 / 3 (66.7%)\n' |
| | 'Max absolute difference among violations: ' |
| | '5498.42354\n' |
| | 'Max relative difference among violations: 5.4722099') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func(b, a, decimal=9) |
| |
|
| | a = [5498.42354, 0.00] |
| | expected_msg = ('Mismatched elements: 1 / 2 (50%)\n' |
| | 'Max absolute difference among violations: ' |
| | '5498.42354\n' |
| | 'Max relative difference among violations: inf') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func(b, a, decimal=7) |
| |
|
| | b = 0 |
| | expected_msg = ('Mismatched elements: 1 / 2 (50%)\n' |
| | 'Max absolute difference among violations: ' |
| | '5498.42354\n' |
| | 'Max relative difference among violations: inf') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func(a, b, decimal=7) |
| |
|
| | def test_nan(self): |
| | anan = np.array([np.nan]) |
| | aone = np.array([1]) |
| | ainf = np.array([np.inf]) |
| | self._assert_func(anan, anan) |
| | assert_raises(AssertionError, |
| | lambda: self._assert_func(anan, aone)) |
| | assert_raises(AssertionError, |
| | lambda: self._assert_func(anan, ainf)) |
| | assert_raises(AssertionError, |
| | lambda: self._assert_func(ainf, anan)) |
| |
|
| | def test_inf(self): |
| | a = np.array([[1., 2.], [3., 4.]]) |
| | b = a.copy() |
| | a[0, 0] = np.inf |
| | assert_raises(AssertionError, |
| | lambda: self._assert_func(a, b)) |
| | b[0, 0] = -np.inf |
| | assert_raises(AssertionError, |
| | lambda: self._assert_func(a, b)) |
| |
|
| | def test_subclass(self): |
| | a = np.array([[1., 2.], [3., 4.]]) |
| | b = np.ma.masked_array([[1., 2.], [0., 4.]], |
| | [[False, False], [True, False]]) |
| | self._assert_func(a, b) |
| | self._assert_func(b, a) |
| | self._assert_func(b, b) |
| |
|
| | |
| | a = np.ma.MaskedArray(3.5, mask=True) |
| | b = np.array([3., 4., 6.5]) |
| | self._test_equal(a, b) |
| | self._test_equal(b, a) |
| | a = np.ma.masked |
| | b = np.array([3., 4., 6.5]) |
| | self._test_equal(a, b) |
| | self._test_equal(b, a) |
| | a = np.ma.MaskedArray([3., 4., 6.5], mask=[True, True, True]) |
| | b = np.array([1., 2., 3.]) |
| | self._test_equal(a, b) |
| | self._test_equal(b, a) |
| | a = np.ma.MaskedArray([3., 4., 6.5], mask=[True, True, True]) |
| | b = np.array(1.) |
| | self._test_equal(a, b) |
| | self._test_equal(b, a) |
| |
|
| | def test_subclass_2(self): |
| | |
| | |
| | |
| | |
| | class MyArray(np.ndarray): |
| | def __eq__(self, other): |
| | return super().__eq__(other).view(np.ndarray) |
| |
|
| | def __lt__(self, other): |
| | return super().__lt__(other).view(np.ndarray) |
| |
|
| | def all(self, *args, **kwargs): |
| | return all(self) |
| |
|
| | a = np.array([1., 2.]).view(MyArray) |
| | self._assert_func(a, a) |
| |
|
| | z = np.array([True, True]).view(MyArray) |
| | all(z) |
| | b = np.array([1., 202]).view(MyArray) |
| | expected_msg = ('Mismatched elements: 1 / 2 (50%)\n' |
| | 'Max absolute difference among violations: 200.\n' |
| | 'Max relative difference among violations: 0.99009') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func(a, b) |
| |
|
| | def test_subclass_that_cannot_be_bool(self): |
| | |
| | |
| | |
| | |
| | class MyArray(np.ndarray): |
| | def __eq__(self, other): |
| | return super().__eq__(other).view(np.ndarray) |
| |
|
| | def __lt__(self, other): |
| | return super().__lt__(other).view(np.ndarray) |
| |
|
| | def all(self, *args, **kwargs): |
| | raise NotImplementedError |
| |
|
| | a = np.array([1., 2.]).view(MyArray) |
| | self._assert_func(a, a) |
| |
|
| |
|
| | class TestAlmostEqual(_GenericTest): |
| |
|
| | def setup_method(self): |
| | self._assert_func = assert_almost_equal |
| |
|
| | def test_closeness(self): |
| | |
| | |
| | |
| | |
| | |
| |
|
| | |
| | self._assert_func(1.499999, 0.0, decimal=0) |
| | assert_raises(AssertionError, |
| | lambda: self._assert_func(1.5, 0.0, decimal=0)) |
| |
|
| | |
| | self._assert_func([1.499999], [0.0], decimal=0) |
| | assert_raises(AssertionError, |
| | lambda: self._assert_func([1.5], [0.0], decimal=0)) |
| |
|
| | def test_nan_item(self): |
| | self._assert_func(np.nan, np.nan) |
| | assert_raises(AssertionError, |
| | lambda: self._assert_func(np.nan, 1)) |
| | assert_raises(AssertionError, |
| | lambda: self._assert_func(np.nan, np.inf)) |
| | assert_raises(AssertionError, |
| | lambda: self._assert_func(np.inf, np.nan)) |
| |
|
| | def test_inf_item(self): |
| | self._assert_func(np.inf, np.inf) |
| | self._assert_func(-np.inf, -np.inf) |
| | assert_raises(AssertionError, |
| | lambda: self._assert_func(np.inf, 1)) |
| | assert_raises(AssertionError, |
| | lambda: self._assert_func(-np.inf, np.inf)) |
| |
|
| | def test_simple_item(self): |
| | self._test_not_equal(1, 2) |
| |
|
| | def test_complex_item(self): |
| | self._assert_func(complex(1, 2), complex(1, 2)) |
| | self._assert_func(complex(1, np.nan), complex(1, np.nan)) |
| | self._assert_func(complex(np.inf, np.nan), complex(np.inf, np.nan)) |
| | self._test_not_equal(complex(1, np.nan), complex(1, 2)) |
| | self._test_not_equal(complex(np.nan, 1), complex(1, np.nan)) |
| | self._test_not_equal(complex(np.nan, np.inf), complex(np.nan, 2)) |
| |
|
| | def test_complex(self): |
| | x = np.array([complex(1, 2), complex(1, np.nan)]) |
| | z = np.array([complex(1, 2), complex(np.nan, 1)]) |
| | y = np.array([complex(1, 2), complex(1, 2)]) |
| | self._assert_func(x, x) |
| | self._test_not_equal(x, y) |
| | self._test_not_equal(x, z) |
| |
|
| | def test_error_message(self): |
| | """Check the message is formatted correctly for the decimal value. |
| | Also check the message when input includes inf or nan (gh12200)""" |
| | x = np.array([1.00000000001, 2.00000000002, 3.00003]) |
| | y = np.array([1.00000000002, 2.00000000003, 3.00004]) |
| |
|
| | |
| | expected_msg = ('Mismatched elements: 3 / 3 (100%)\n' |
| | 'Max absolute difference among violations: 1.e-05\n' |
| | 'Max relative difference among violations: ' |
| | '3.33328889e-06\n' |
| | ' ACTUAL: array([1.00000000001, ' |
| | '2.00000000002, ' |
| | '3.00003 ])\n' |
| | ' DESIRED: array([1.00000000002, 2.00000000003, ' |
| | '3.00004 ])') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func(x, y, decimal=12) |
| |
|
| | |
| | |
| | |
| | expected_msg = ('Mismatched elements: 1 / 3 (33.3%)\n' |
| | 'Max absolute difference among violations: 1.e-05\n' |
| | 'Max relative difference among violations: ' |
| | '3.33328889e-06\n' |
| | ' ACTUAL: array([1. , 2. , 3.00003])\n' |
| | ' DESIRED: array([1. , 2. , 3.00004])') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func(x, y) |
| |
|
| | |
| | x = np.array([np.inf, 0]) |
| | y = np.array([np.inf, 1]) |
| | expected_msg = ('Mismatched elements: 1 / 2 (50%)\n' |
| | 'Max absolute difference among violations: 1.\n' |
| | 'Max relative difference among violations: 1.\n' |
| | ' ACTUAL: array([inf, 0.])\n' |
| | ' DESIRED: array([inf, 1.])') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func(x, y) |
| |
|
| | |
| | x = np.array([1, 2]) |
| | y = np.array([0, 0]) |
| | expected_msg = ('Mismatched elements: 2 / 2 (100%)\n' |
| | 'Max absolute difference among violations: 2\n' |
| | 'Max relative difference among violations: inf') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func(x, y) |
| |
|
| | def test_error_message_2(self): |
| | """Check the message is formatted correctly """ |
| | """when either x or y is a scalar.""" |
| | x = 2 |
| | y = np.ones(20) |
| | expected_msg = ('Mismatched elements: 20 / 20 (100%)\n' |
| | 'Max absolute difference among violations: 1.\n' |
| | 'Max relative difference among violations: 1.') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func(x, y) |
| |
|
| | y = 2 |
| | x = np.ones(20) |
| | expected_msg = ('Mismatched elements: 20 / 20 (100%)\n' |
| | 'Max absolute difference among violations: 1.\n' |
| | 'Max relative difference among violations: 0.5') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func(x, y) |
| |
|
| | def test_subclass_that_cannot_be_bool(self): |
| | |
| | |
| | |
| | |
| | class MyArray(np.ndarray): |
| | def __eq__(self, other): |
| | return super().__eq__(other).view(np.ndarray) |
| |
|
| | def __lt__(self, other): |
| | return super().__lt__(other).view(np.ndarray) |
| |
|
| | def all(self, *args, **kwargs): |
| | raise NotImplementedError |
| |
|
| | a = np.array([1., 2.]).view(MyArray) |
| | self._assert_func(a, a) |
| |
|
| |
|
| | class TestApproxEqual: |
| |
|
| | def setup_method(self): |
| | self._assert_func = assert_approx_equal |
| |
|
| | def test_simple_0d_arrays(self): |
| | x = np.array(1234.22) |
| | y = np.array(1234.23) |
| |
|
| | self._assert_func(x, y, significant=5) |
| | self._assert_func(x, y, significant=6) |
| | assert_raises(AssertionError, |
| | lambda: self._assert_func(x, y, significant=7)) |
| |
|
| | def test_simple_items(self): |
| | x = 1234.22 |
| | y = 1234.23 |
| |
|
| | self._assert_func(x, y, significant=4) |
| | self._assert_func(x, y, significant=5) |
| | self._assert_func(x, y, significant=6) |
| | assert_raises(AssertionError, |
| | lambda: self._assert_func(x, y, significant=7)) |
| |
|
| | def test_nan_array(self): |
| | anan = np.array(np.nan) |
| | aone = np.array(1) |
| | ainf = np.array(np.inf) |
| | self._assert_func(anan, anan) |
| | assert_raises(AssertionError, lambda: self._assert_func(anan, aone)) |
| | assert_raises(AssertionError, lambda: self._assert_func(anan, ainf)) |
| | assert_raises(AssertionError, lambda: self._assert_func(ainf, anan)) |
| |
|
| | def test_nan_items(self): |
| | anan = np.array(np.nan) |
| | aone = np.array(1) |
| | ainf = np.array(np.inf) |
| | self._assert_func(anan, anan) |
| | assert_raises(AssertionError, lambda: self._assert_func(anan, aone)) |
| | assert_raises(AssertionError, lambda: self._assert_func(anan, ainf)) |
| | assert_raises(AssertionError, lambda: self._assert_func(ainf, anan)) |
| |
|
| |
|
| | class TestArrayAssertLess: |
| |
|
| | def setup_method(self): |
| | self._assert_func = assert_array_less |
| |
|
| | def test_simple_arrays(self): |
| | x = np.array([1.1, 2.2]) |
| | y = np.array([1.2, 2.3]) |
| |
|
| | self._assert_func(x, y) |
| | assert_raises(AssertionError, lambda: self._assert_func(y, x)) |
| |
|
| | y = np.array([1.0, 2.3]) |
| |
|
| | assert_raises(AssertionError, lambda: self._assert_func(x, y)) |
| | assert_raises(AssertionError, lambda: self._assert_func(y, x)) |
| |
|
| | a = np.array([1, 3, 6, 20]) |
| | b = np.array([2, 4, 6, 8]) |
| |
|
| | expected_msg = ('Mismatched elements: 2 / 4 (50%)\n' |
| | 'Max absolute difference among violations: 12\n' |
| | 'Max relative difference among violations: 1.5') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func(a, b) |
| |
|
| | def test_rank2(self): |
| | x = np.array([[1.1, 2.2], [3.3, 4.4]]) |
| | y = np.array([[1.2, 2.3], [3.4, 4.5]]) |
| |
|
| | self._assert_func(x, y) |
| | expected_msg = ('Mismatched elements: 4 / 4 (100%)\n' |
| | 'Max absolute difference among violations: 0.1\n' |
| | 'Max relative difference among violations: 0.09090909') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func(y, x) |
| |
|
| | y = np.array([[1.0, 2.3], [3.4, 4.5]]) |
| | assert_raises(AssertionError, lambda: self._assert_func(x, y)) |
| | assert_raises(AssertionError, lambda: self._assert_func(y, x)) |
| |
|
| | def test_rank3(self): |
| | x = np.ones(shape=(2, 2, 2)) |
| | y = np.ones(shape=(2, 2, 2))+1 |
| |
|
| | self._assert_func(x, y) |
| | assert_raises(AssertionError, lambda: self._assert_func(y, x)) |
| |
|
| | y[0, 0, 0] = 0 |
| | expected_msg = ('Mismatched elements: 1 / 8 (12.5%)\n' |
| | 'Max absolute difference among violations: 1.\n' |
| | 'Max relative difference among violations: inf') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func(x, y) |
| |
|
| | assert_raises(AssertionError, lambda: self._assert_func(y, x)) |
| |
|
| | def test_simple_items(self): |
| | x = 1.1 |
| | y = 2.2 |
| |
|
| | self._assert_func(x, y) |
| | expected_msg = ('Mismatched elements: 1 / 1 (100%)\n' |
| | 'Max absolute difference among violations: 1.1\n' |
| | 'Max relative difference among violations: 1.') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func(y, x) |
| |
|
| | y = np.array([2.2, 3.3]) |
| |
|
| | self._assert_func(x, y) |
| | assert_raises(AssertionError, lambda: self._assert_func(y, x)) |
| |
|
| | y = np.array([1.0, 3.3]) |
| |
|
| | assert_raises(AssertionError, lambda: self._assert_func(x, y)) |
| |
|
| | def test_simple_items_and_array(self): |
| | x = np.array([[621.345454, 390.5436, 43.54657, 626.4535], |
| | [54.54, 627.3399, 13., 405.5435], |
| | [543.545, 8.34, 91.543, 333.3]]) |
| | y = 627.34 |
| | self._assert_func(x, y) |
| |
|
| | y = 8.339999 |
| | self._assert_func(y, x) |
| |
|
| | x = np.array([[3.4536, 2390.5436, 435.54657, 324525.4535], |
| | [5449.54, 999090.54, 130303.54, 405.5435], |
| | [543.545, 8.34, 91.543, 999090.53999]]) |
| | y = 999090.54 |
| |
|
| | expected_msg = ('Mismatched elements: 1 / 12 (8.33%)\n' |
| | 'Max absolute difference among violations: 0.\n' |
| | 'Max relative difference among violations: 0.') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func(x, y) |
| |
|
| | expected_msg = ('Mismatched elements: 12 / 12 (100%)\n' |
| | 'Max absolute difference among violations: ' |
| | '999087.0864\n' |
| | 'Max relative difference among violations: ' |
| | '289288.5934676') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func(y, x) |
| |
|
| | def test_zeroes(self): |
| | x = np.array([546456., 0, 15.455]) |
| | y = np.array(87654.) |
| |
|
| | expected_msg = ('Mismatched elements: 1 / 3 (33.3%)\n' |
| | 'Max absolute difference among violations: 458802.\n' |
| | 'Max relative difference among violations: 5.23423917') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func(x, y) |
| |
|
| | expected_msg = ('Mismatched elements: 2 / 3 (66.7%)\n' |
| | 'Max absolute difference among violations: 87654.\n' |
| | 'Max relative difference among violations: ' |
| | '5670.5626011') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func(y, x) |
| |
|
| | y = 0 |
| |
|
| | expected_msg = ('Mismatched elements: 3 / 3 (100%)\n' |
| | 'Max absolute difference among violations: 546456.\n' |
| | 'Max relative difference among violations: inf') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func(x, y) |
| |
|
| | expected_msg = ('Mismatched elements: 1 / 3 (33.3%)\n' |
| | 'Max absolute difference among violations: 0.\n' |
| | 'Max relative difference among violations: inf') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | self._assert_func(y, x) |
| |
|
| | def test_nan_noncompare(self): |
| | anan = np.array(np.nan) |
| | aone = np.array(1) |
| | ainf = np.array(np.inf) |
| | self._assert_func(anan, anan) |
| | assert_raises(AssertionError, lambda: self._assert_func(aone, anan)) |
| | assert_raises(AssertionError, lambda: self._assert_func(anan, aone)) |
| | assert_raises(AssertionError, lambda: self._assert_func(anan, ainf)) |
| | assert_raises(AssertionError, lambda: self._assert_func(ainf, anan)) |
| |
|
| | def test_nan_noncompare_array(self): |
| | x = np.array([1.1, 2.2, 3.3]) |
| | anan = np.array(np.nan) |
| |
|
| | assert_raises(AssertionError, lambda: self._assert_func(x, anan)) |
| | assert_raises(AssertionError, lambda: self._assert_func(anan, x)) |
| |
|
| | x = np.array([1.1, 2.2, np.nan]) |
| |
|
| | assert_raises(AssertionError, lambda: self._assert_func(x, anan)) |
| | assert_raises(AssertionError, lambda: self._assert_func(anan, x)) |
| |
|
| | y = np.array([1.0, 2.0, np.nan]) |
| |
|
| | self._assert_func(y, x) |
| | assert_raises(AssertionError, lambda: self._assert_func(x, y)) |
| |
|
| | def test_inf_compare(self): |
| | aone = np.array(1) |
| | ainf = np.array(np.inf) |
| |
|
| | self._assert_func(aone, ainf) |
| | self._assert_func(-ainf, aone) |
| | self._assert_func(-ainf, ainf) |
| | assert_raises(AssertionError, lambda: self._assert_func(ainf, aone)) |
| | assert_raises(AssertionError, lambda: self._assert_func(aone, -ainf)) |
| | assert_raises(AssertionError, lambda: self._assert_func(ainf, ainf)) |
| | assert_raises(AssertionError, lambda: self._assert_func(ainf, -ainf)) |
| | assert_raises(AssertionError, lambda: self._assert_func(-ainf, -ainf)) |
| |
|
| | def test_inf_compare_array(self): |
| | x = np.array([1.1, 2.2, np.inf]) |
| | ainf = np.array(np.inf) |
| |
|
| | assert_raises(AssertionError, lambda: self._assert_func(x, ainf)) |
| | assert_raises(AssertionError, lambda: self._assert_func(ainf, x)) |
| | assert_raises(AssertionError, lambda: self._assert_func(x, -ainf)) |
| | assert_raises(AssertionError, lambda: self._assert_func(-x, -ainf)) |
| | assert_raises(AssertionError, lambda: self._assert_func(-ainf, -x)) |
| | self._assert_func(-ainf, x) |
| |
|
| | def test_strict(self): |
| | """Test the behavior of the `strict` option.""" |
| | x = np.zeros(3) |
| | y = np.ones(()) |
| | self._assert_func(x, y) |
| | with pytest.raises(AssertionError): |
| | self._assert_func(x, y, strict=True) |
| | y = np.broadcast_to(y, x.shape) |
| | self._assert_func(x, y) |
| | with pytest.raises(AssertionError): |
| | self._assert_func(x, y.astype(np.float32), strict=True) |
| |
|
| |
|
| | class TestWarns: |
| |
|
| | def test_warn(self): |
| | def f(): |
| | warnings.warn("yo") |
| | return 3 |
| |
|
| | before_filters = sys.modules['warnings'].filters[:] |
| | assert_equal(assert_warns(UserWarning, f), 3) |
| | after_filters = sys.modules['warnings'].filters |
| |
|
| | assert_raises(AssertionError, assert_no_warnings, f) |
| | assert_equal(assert_no_warnings(lambda x: x, 1), 1) |
| |
|
| | |
| | assert_equal(before_filters, after_filters, |
| | "assert_warns does not preserver warnings state") |
| |
|
| | def test_context_manager(self): |
| |
|
| | before_filters = sys.modules['warnings'].filters[:] |
| | with assert_warns(UserWarning): |
| | warnings.warn("yo") |
| | after_filters = sys.modules['warnings'].filters |
| |
|
| | def no_warnings(): |
| | with assert_no_warnings(): |
| | warnings.warn("yo") |
| |
|
| | assert_raises(AssertionError, no_warnings) |
| | assert_equal(before_filters, after_filters, |
| | "assert_warns does not preserver warnings state") |
| |
|
| | def test_args(self): |
| | def f(a=0, b=1): |
| | warnings.warn("yo") |
| | return a + b |
| |
|
| | assert assert_warns(UserWarning, f, b=20) == 20 |
| |
|
| | with pytest.raises(RuntimeError) as exc: |
| | |
| | with assert_warns(UserWarning, match="A"): |
| | warnings.warn("B", UserWarning) |
| | assert "assert_warns" in str(exc) |
| | assert "pytest.warns" in str(exc) |
| |
|
| | with pytest.raises(RuntimeError) as exc: |
| | |
| | with assert_warns(UserWarning, wrong="A"): |
| | warnings.warn("B", UserWarning) |
| | assert "assert_warns" in str(exc) |
| | assert "pytest.warns" not in str(exc) |
| |
|
| | def test_warn_wrong_warning(self): |
| | def f(): |
| | warnings.warn("yo", DeprecationWarning) |
| |
|
| | failed = False |
| | with warnings.catch_warnings(): |
| | warnings.simplefilter("error", DeprecationWarning) |
| | try: |
| | |
| | assert_warns(UserWarning, f) |
| | failed = True |
| | except DeprecationWarning: |
| | pass |
| |
|
| | if failed: |
| | raise AssertionError("wrong warning caught by assert_warn") |
| |
|
| |
|
| | class TestAssertAllclose: |
| |
|
| | def test_simple(self): |
| | x = 1e-3 |
| | y = 1e-9 |
| |
|
| | assert_allclose(x, y, atol=1) |
| | assert_raises(AssertionError, assert_allclose, x, y) |
| |
|
| | expected_msg = ('Mismatched elements: 1 / 1 (100%)\n' |
| | 'Max absolute difference among violations: 0.001\n' |
| | 'Max relative difference among violations: 999999.') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | assert_allclose(x, y) |
| |
|
| | z = 0 |
| | expected_msg = ('Mismatched elements: 1 / 1 (100%)\n' |
| | 'Max absolute difference among violations: 1.e-09\n' |
| | 'Max relative difference among violations: inf') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | assert_allclose(y, z) |
| |
|
| | expected_msg = ('Mismatched elements: 1 / 1 (100%)\n' |
| | 'Max absolute difference among violations: 1.e-09\n' |
| | 'Max relative difference among violations: 1.') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | assert_allclose(z, y) |
| |
|
| | a = np.array([x, y, x, y]) |
| | b = np.array([x, y, x, x]) |
| |
|
| | assert_allclose(a, b, atol=1) |
| | assert_raises(AssertionError, assert_allclose, a, b) |
| |
|
| | b[-1] = y * (1 + 1e-8) |
| | assert_allclose(a, b) |
| | assert_raises(AssertionError, assert_allclose, a, b, rtol=1e-9) |
| |
|
| | assert_allclose(6, 10, rtol=0.5) |
| | assert_raises(AssertionError, assert_allclose, 10, 6, rtol=0.5) |
| |
|
| | b = np.array([x, y, x, x]) |
| | c = np.array([x, y, x, z]) |
| | expected_msg = ('Mismatched elements: 1 / 4 (25%)\n' |
| | 'Max absolute difference among violations: 0.001\n' |
| | 'Max relative difference among violations: inf') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | assert_allclose(b, c) |
| |
|
| | expected_msg = ('Mismatched elements: 1 / 4 (25%)\n' |
| | 'Max absolute difference among violations: 0.001\n' |
| | 'Max relative difference among violations: 1.') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | assert_allclose(c, b) |
| |
|
| | def test_min_int(self): |
| | a = np.array([np.iinfo(np.int_).min], dtype=np.int_) |
| | |
| | assert_allclose(a, a) |
| |
|
| | def test_report_fail_percentage(self): |
| | a = np.array([1, 1, 1, 1]) |
| | b = np.array([1, 1, 1, 2]) |
| |
|
| | expected_msg = ('Mismatched elements: 1 / 4 (25%)\n' |
| | 'Max absolute difference among violations: 1\n' |
| | 'Max relative difference among violations: 0.5') |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | assert_allclose(a, b) |
| |
|
| | def test_equal_nan(self): |
| | a = np.array([np.nan]) |
| | b = np.array([np.nan]) |
| | |
| | assert_allclose(a, b, equal_nan=True) |
| |
|
| | def test_not_equal_nan(self): |
| | a = np.array([np.nan]) |
| | b = np.array([np.nan]) |
| | assert_raises(AssertionError, assert_allclose, a, b, equal_nan=False) |
| |
|
| | def test_equal_nan_default(self): |
| | |
| | |
| | |
| | a = np.array([np.nan]) |
| | b = np.array([np.nan]) |
| | assert_array_equal(a, b) |
| | assert_array_almost_equal(a, b) |
| | assert_array_less(a, b) |
| | assert_allclose(a, b) |
| |
|
| | def test_report_max_relative_error(self): |
| | a = np.array([0, 1]) |
| | b = np.array([0, 2]) |
| |
|
| | expected_msg = 'Max relative difference among violations: 0.5' |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | assert_allclose(a, b) |
| |
|
| | def test_timedelta(self): |
| | |
| | a = np.array([[1, 2, 3, "NaT"]], dtype="m8[ns]") |
| | assert_allclose(a, a) |
| |
|
| | def test_error_message_unsigned(self): |
| | """Check the message is formatted correctly when overflow can occur |
| | (gh21768)""" |
| | |
| | |
| | |
| | |
| | x = np.asarray([0, 1, 8], dtype='uint8') |
| | y = np.asarray([4, 4, 4], dtype='uint8') |
| | expected_msg = 'Max absolute difference among violations: 4' |
| | with pytest.raises(AssertionError, match=re.escape(expected_msg)): |
| | assert_allclose(x, y, atol=3) |
| |
|
| | def test_strict(self): |
| | """Test the behavior of the `strict` option.""" |
| | x = np.ones(3) |
| | y = np.ones(()) |
| | assert_allclose(x, y) |
| | with pytest.raises(AssertionError): |
| | assert_allclose(x, y, strict=True) |
| | assert_allclose(x, x) |
| | with pytest.raises(AssertionError): |
| | assert_allclose(x, x.astype(np.float32), strict=True) |
| |
|
| |
|
| | class TestArrayAlmostEqualNulp: |
| |
|
| | def test_float64_pass(self): |
| | |
| | |
| | nulp = 5 |
| | x = np.linspace(-20, 20, 50, dtype=np.float64) |
| | x = 10**x |
| | x = np.r_[-x, x] |
| |
|
| | |
| | eps = np.finfo(x.dtype).eps |
| | y = x + x*eps*nulp/2. |
| | assert_array_almost_equal_nulp(x, y, nulp) |
| |
|
| | |
| | epsneg = np.finfo(x.dtype).epsneg |
| | y = x - x*epsneg*nulp/2. |
| | assert_array_almost_equal_nulp(x, y, nulp) |
| |
|
| | def test_float64_fail(self): |
| | nulp = 5 |
| | x = np.linspace(-20, 20, 50, dtype=np.float64) |
| | x = 10**x |
| | x = np.r_[-x, x] |
| |
|
| | eps = np.finfo(x.dtype).eps |
| | y = x + x*eps*nulp*2. |
| | assert_raises(AssertionError, assert_array_almost_equal_nulp, |
| | x, y, nulp) |
| |
|
| | epsneg = np.finfo(x.dtype).epsneg |
| | y = x - x*epsneg*nulp*2. |
| | assert_raises(AssertionError, assert_array_almost_equal_nulp, |
| | x, y, nulp) |
| |
|
| | def test_float64_ignore_nan(self): |
| | |
| | |
| | |
| | offset = np.uint64(0xffffffff) |
| | nan1_i64 = np.array(np.nan, dtype=np.float64).view(np.uint64) |
| | nan2_i64 = nan1_i64 ^ offset |
| | nan1_f64 = nan1_i64.view(np.float64) |
| | nan2_f64 = nan2_i64.view(np.float64) |
| | assert_array_max_ulp(nan1_f64, nan2_f64, 0) |
| |
|
| | def test_float32_pass(self): |
| | nulp = 5 |
| | x = np.linspace(-20, 20, 50, dtype=np.float32) |
| | x = 10**x |
| | x = np.r_[-x, x] |
| |
|
| | eps = np.finfo(x.dtype).eps |
| | y = x + x*eps*nulp/2. |
| | assert_array_almost_equal_nulp(x, y, nulp) |
| |
|
| | epsneg = np.finfo(x.dtype).epsneg |
| | y = x - x*epsneg*nulp/2. |
| | assert_array_almost_equal_nulp(x, y, nulp) |
| |
|
| | def test_float32_fail(self): |
| | nulp = 5 |
| | x = np.linspace(-20, 20, 50, dtype=np.float32) |
| | x = 10**x |
| | x = np.r_[-x, x] |
| |
|
| | eps = np.finfo(x.dtype).eps |
| | y = x + x*eps*nulp*2. |
| | assert_raises(AssertionError, assert_array_almost_equal_nulp, |
| | x, y, nulp) |
| |
|
| | epsneg = np.finfo(x.dtype).epsneg |
| | y = x - x*epsneg*nulp*2. |
| | assert_raises(AssertionError, assert_array_almost_equal_nulp, |
| | x, y, nulp) |
| |
|
| | def test_float32_ignore_nan(self): |
| | |
| | |
| | |
| | offset = np.uint32(0xffff) |
| | nan1_i32 = np.array(np.nan, dtype=np.float32).view(np.uint32) |
| | nan2_i32 = nan1_i32 ^ offset |
| | nan1_f32 = nan1_i32.view(np.float32) |
| | nan2_f32 = nan2_i32.view(np.float32) |
| | assert_array_max_ulp(nan1_f32, nan2_f32, 0) |
| |
|
| | def test_float16_pass(self): |
| | nulp = 5 |
| | x = np.linspace(-4, 4, 10, dtype=np.float16) |
| | x = 10**x |
| | x = np.r_[-x, x] |
| |
|
| | eps = np.finfo(x.dtype).eps |
| | y = x + x*eps*nulp/2. |
| | assert_array_almost_equal_nulp(x, y, nulp) |
| |
|
| | epsneg = np.finfo(x.dtype).epsneg |
| | y = x - x*epsneg*nulp/2. |
| | assert_array_almost_equal_nulp(x, y, nulp) |
| |
|
| | def test_float16_fail(self): |
| | nulp = 5 |
| | x = np.linspace(-4, 4, 10, dtype=np.float16) |
| | x = 10**x |
| | x = np.r_[-x, x] |
| |
|
| | eps = np.finfo(x.dtype).eps |
| | y = x + x*eps*nulp*2. |
| | assert_raises(AssertionError, assert_array_almost_equal_nulp, |
| | x, y, nulp) |
| |
|
| | epsneg = np.finfo(x.dtype).epsneg |
| | y = x - x*epsneg*nulp*2. |
| | assert_raises(AssertionError, assert_array_almost_equal_nulp, |
| | x, y, nulp) |
| |
|
| | def test_float16_ignore_nan(self): |
| | |
| | |
| | |
| | offset = np.uint16(0xff) |
| | nan1_i16 = np.array(np.nan, dtype=np.float16).view(np.uint16) |
| | nan2_i16 = nan1_i16 ^ offset |
| | nan1_f16 = nan1_i16.view(np.float16) |
| | nan2_f16 = nan2_i16.view(np.float16) |
| | assert_array_max_ulp(nan1_f16, nan2_f16, 0) |
| |
|
| | def test_complex128_pass(self): |
| | nulp = 5 |
| | x = np.linspace(-20, 20, 50, dtype=np.float64) |
| | x = 10**x |
| | x = np.r_[-x, x] |
| | xi = x + x*1j |
| |
|
| | eps = np.finfo(x.dtype).eps |
| | y = x + x*eps*nulp/2. |
| | assert_array_almost_equal_nulp(xi, x + y*1j, nulp) |
| | assert_array_almost_equal_nulp(xi, y + x*1j, nulp) |
| | |
| | |
| | y = x + x*eps*nulp/4. |
| | assert_array_almost_equal_nulp(xi, y + y*1j, nulp) |
| |
|
| | epsneg = np.finfo(x.dtype).epsneg |
| | y = x - x*epsneg*nulp/2. |
| | assert_array_almost_equal_nulp(xi, x + y*1j, nulp) |
| | assert_array_almost_equal_nulp(xi, y + x*1j, nulp) |
| | y = x - x*epsneg*nulp/4. |
| | assert_array_almost_equal_nulp(xi, y + y*1j, nulp) |
| |
|
| | def test_complex128_fail(self): |
| | nulp = 5 |
| | x = np.linspace(-20, 20, 50, dtype=np.float64) |
| | x = 10**x |
| | x = np.r_[-x, x] |
| | xi = x + x*1j |
| |
|
| | eps = np.finfo(x.dtype).eps |
| | y = x + x*eps*nulp*2. |
| | assert_raises(AssertionError, assert_array_almost_equal_nulp, |
| | xi, x + y*1j, nulp) |
| | assert_raises(AssertionError, assert_array_almost_equal_nulp, |
| | xi, y + x*1j, nulp) |
| | |
| | |
| | y = x + x*eps*nulp |
| | assert_raises(AssertionError, assert_array_almost_equal_nulp, |
| | xi, y + y*1j, nulp) |
| |
|
| | epsneg = np.finfo(x.dtype).epsneg |
| | y = x - x*epsneg*nulp*2. |
| | assert_raises(AssertionError, assert_array_almost_equal_nulp, |
| | xi, x + y*1j, nulp) |
| | assert_raises(AssertionError, assert_array_almost_equal_nulp, |
| | xi, y + x*1j, nulp) |
| | y = x - x*epsneg*nulp |
| | assert_raises(AssertionError, assert_array_almost_equal_nulp, |
| | xi, y + y*1j, nulp) |
| |
|
| | def test_complex64_pass(self): |
| | nulp = 5 |
| | x = np.linspace(-20, 20, 50, dtype=np.float32) |
| | x = 10**x |
| | x = np.r_[-x, x] |
| | xi = x + x*1j |
| |
|
| | eps = np.finfo(x.dtype).eps |
| | y = x + x*eps*nulp/2. |
| | assert_array_almost_equal_nulp(xi, x + y*1j, nulp) |
| | assert_array_almost_equal_nulp(xi, y + x*1j, nulp) |
| | y = x + x*eps*nulp/4. |
| | assert_array_almost_equal_nulp(xi, y + y*1j, nulp) |
| |
|
| | epsneg = np.finfo(x.dtype).epsneg |
| | y = x - x*epsneg*nulp/2. |
| | assert_array_almost_equal_nulp(xi, x + y*1j, nulp) |
| | assert_array_almost_equal_nulp(xi, y + x*1j, nulp) |
| | y = x - x*epsneg*nulp/4. |
| | assert_array_almost_equal_nulp(xi, y + y*1j, nulp) |
| |
|
| | def test_complex64_fail(self): |
| | nulp = 5 |
| | x = np.linspace(-20, 20, 50, dtype=np.float32) |
| | x = 10**x |
| | x = np.r_[-x, x] |
| | xi = x + x*1j |
| |
|
| | eps = np.finfo(x.dtype).eps |
| | y = x + x*eps*nulp*2. |
| | assert_raises(AssertionError, assert_array_almost_equal_nulp, |
| | xi, x + y*1j, nulp) |
| | assert_raises(AssertionError, assert_array_almost_equal_nulp, |
| | xi, y + x*1j, nulp) |
| | y = x + x*eps*nulp |
| | assert_raises(AssertionError, assert_array_almost_equal_nulp, |
| | xi, y + y*1j, nulp) |
| |
|
| | epsneg = np.finfo(x.dtype).epsneg |
| | y = x - x*epsneg*nulp*2. |
| | assert_raises(AssertionError, assert_array_almost_equal_nulp, |
| | xi, x + y*1j, nulp) |
| | assert_raises(AssertionError, assert_array_almost_equal_nulp, |
| | xi, y + x*1j, nulp) |
| | y = x - x*epsneg*nulp |
| | assert_raises(AssertionError, assert_array_almost_equal_nulp, |
| | xi, y + y*1j, nulp) |
| |
|
| |
|
| | class TestULP: |
| |
|
| | def test_equal(self): |
| | x = np.random.randn(10) |
| | assert_array_max_ulp(x, x, maxulp=0) |
| |
|
| | def test_single(self): |
| | |
| | x = np.ones(10).astype(np.float32) |
| | x += 0.01 * np.random.randn(10).astype(np.float32) |
| | eps = np.finfo(np.float32).eps |
| | assert_array_max_ulp(x, x+eps, maxulp=20) |
| |
|
| | def test_double(self): |
| | |
| | x = np.ones(10).astype(np.float64) |
| | x += 0.01 * np.random.randn(10).astype(np.float64) |
| | eps = np.finfo(np.float64).eps |
| | assert_array_max_ulp(x, x+eps, maxulp=200) |
| |
|
| | def test_inf(self): |
| | for dt in [np.float32, np.float64]: |
| | inf = np.array([np.inf]).astype(dt) |
| | big = np.array([np.finfo(dt).max]) |
| | assert_array_max_ulp(inf, big, maxulp=200) |
| |
|
| | def test_nan(self): |
| | |
| | for dt in [np.float32, np.float64]: |
| | if dt == np.float32: |
| | maxulp = 1e6 |
| | else: |
| | maxulp = 1e12 |
| | inf = np.array([np.inf]).astype(dt) |
| | nan = np.array([np.nan]).astype(dt) |
| | big = np.array([np.finfo(dt).max]) |
| | tiny = np.array([np.finfo(dt).tiny]) |
| | zero = np.array([0.0]).astype(dt) |
| | nzero = np.array([-0.0]).astype(dt) |
| | assert_raises(AssertionError, |
| | lambda: assert_array_max_ulp(nan, inf, |
| | maxulp=maxulp)) |
| | assert_raises(AssertionError, |
| | lambda: assert_array_max_ulp(nan, big, |
| | maxulp=maxulp)) |
| | assert_raises(AssertionError, |
| | lambda: assert_array_max_ulp(nan, tiny, |
| | maxulp=maxulp)) |
| | assert_raises(AssertionError, |
| | lambda: assert_array_max_ulp(nan, zero, |
| | maxulp=maxulp)) |
| | assert_raises(AssertionError, |
| | lambda: assert_array_max_ulp(nan, nzero, |
| | maxulp=maxulp)) |
| |
|
| |
|
| | class TestStringEqual: |
| | def test_simple(self): |
| | assert_string_equal("hello", "hello") |
| | assert_string_equal("hello\nmultiline", "hello\nmultiline") |
| |
|
| | with pytest.raises(AssertionError) as exc_info: |
| | assert_string_equal("foo\nbar", "hello\nbar") |
| | msg = str(exc_info.value) |
| | assert_equal(msg, "Differences in strings:\n- foo\n+ hello") |
| |
|
| | assert_raises(AssertionError, |
| | lambda: assert_string_equal("foo", "hello")) |
| |
|
| | def test_regex(self): |
| | assert_string_equal("a+*b", "a+*b") |
| |
|
| | assert_raises(AssertionError, |
| | lambda: assert_string_equal("aaa", "a+b")) |
| |
|
| |
|
| | def assert_warn_len_equal(mod, n_in_context): |
| | try: |
| | mod_warns = mod.__warningregistry__ |
| | except AttributeError: |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | mod_warns = {} |
| |
|
| | num_warns = len(mod_warns) |
| |
|
| | if 'version' in mod_warns: |
| | |
| | |
| | num_warns -= 1 |
| |
|
| | assert_equal(num_warns, n_in_context) |
| |
|
| |
|
| | def test_warn_len_equal_call_scenarios(): |
| | |
| | |
| | |
| | |
| | |
| |
|
| | |
| | class mod: |
| | pass |
| |
|
| | mod_inst = mod() |
| |
|
| | assert_warn_len_equal(mod=mod_inst, |
| | n_in_context=0) |
| |
|
| | |
| | |
| | class mod: |
| | def __init__(self): |
| | self.__warningregistry__ = {'warning1': 1, |
| | 'warning2': 2} |
| |
|
| | mod_inst = mod() |
| | assert_warn_len_equal(mod=mod_inst, |
| | n_in_context=2) |
| |
|
| |
|
| | def _get_fresh_mod(): |
| | |
| | my_mod = sys.modules[__name__] |
| | try: |
| | my_mod.__warningregistry__.clear() |
| | except AttributeError: |
| | |
| | |
| | pass |
| | return my_mod |
| |
|
| |
|
| | def test_clear_and_catch_warnings(): |
| | |
| | my_mod = _get_fresh_mod() |
| | assert_equal(getattr(my_mod, '__warningregistry__', {}), {}) |
| | with clear_and_catch_warnings(modules=[my_mod]): |
| | warnings.simplefilter('ignore') |
| | warnings.warn('Some warning') |
| | assert_equal(my_mod.__warningregistry__, {}) |
| | |
| | |
| | with clear_and_catch_warnings(): |
| | warnings.simplefilter('ignore') |
| | warnings.warn('Some warning') |
| | assert_warn_len_equal(my_mod, 0) |
| |
|
| | |
| | my_mod.__warningregistry__ = {'warning1': 1, |
| | 'warning2': 2} |
| |
|
| | |
| | with clear_and_catch_warnings(modules=[my_mod]): |
| | warnings.simplefilter('ignore') |
| | warnings.warn('Another warning') |
| | assert_warn_len_equal(my_mod, 2) |
| |
|
| | |
| | with clear_and_catch_warnings(): |
| | warnings.simplefilter('ignore') |
| | warnings.warn('Another warning') |
| | assert_warn_len_equal(my_mod, 0) |
| |
|
| |
|
| | def test_suppress_warnings_module(): |
| | |
| | my_mod = _get_fresh_mod() |
| | assert_equal(getattr(my_mod, '__warningregistry__', {}), {}) |
| |
|
| | def warn_other_module(): |
| | |
| | |
| | def warn(arr): |
| | warnings.warn("Some warning 2", stacklevel=2) |
| | return arr |
| | np.apply_along_axis(warn, 0, [0]) |
| |
|
| | |
| | assert_warn_len_equal(my_mod, 0) |
| | with suppress_warnings() as sup: |
| | sup.record(UserWarning) |
| | |
| | |
| | sup.filter(module=np.lib._shape_base_impl) |
| | warnings.warn("Some warning") |
| | warn_other_module() |
| | |
| | |
| | assert_equal(len(sup.log), 1) |
| | assert_equal(sup.log[0].message.args[0], "Some warning") |
| | assert_warn_len_equal(my_mod, 0) |
| | sup = suppress_warnings() |
| | |
| | sup.filter(module=my_mod) |
| | with sup: |
| | warnings.warn('Some warning') |
| | assert_warn_len_equal(my_mod, 0) |
| | |
| | sup.filter(module=my_mod) |
| | with sup: |
| | warnings.warn('Some warning') |
| | assert_warn_len_equal(my_mod, 0) |
| |
|
| | |
| | with suppress_warnings(): |
| | warnings.simplefilter('ignore') |
| | warnings.warn('Some warning') |
| | assert_warn_len_equal(my_mod, 0) |
| |
|
| |
|
| | def test_suppress_warnings_type(): |
| | |
| | my_mod = _get_fresh_mod() |
| | assert_equal(getattr(my_mod, '__warningregistry__', {}), {}) |
| |
|
| | |
| | with suppress_warnings() as sup: |
| | sup.filter(UserWarning) |
| | warnings.warn('Some warning') |
| | assert_warn_len_equal(my_mod, 0) |
| | sup = suppress_warnings() |
| | sup.filter(UserWarning) |
| | with sup: |
| | warnings.warn('Some warning') |
| | assert_warn_len_equal(my_mod, 0) |
| | |
| | sup.filter(module=my_mod) |
| | with sup: |
| | warnings.warn('Some warning') |
| | assert_warn_len_equal(my_mod, 0) |
| |
|
| | |
| | with suppress_warnings(): |
| | warnings.simplefilter('ignore') |
| | warnings.warn('Some warning') |
| | assert_warn_len_equal(my_mod, 0) |
| |
|
| |
|
| | def test_suppress_warnings_decorate_no_record(): |
| | sup = suppress_warnings() |
| | sup.filter(UserWarning) |
| |
|
| | @sup |
| | def warn(category): |
| | warnings.warn('Some warning', category) |
| |
|
| | with warnings.catch_warnings(record=True) as w: |
| | warnings.simplefilter("always") |
| | warn(UserWarning) |
| | warn(RuntimeWarning) |
| | assert_equal(len(w), 1) |
| |
|
| |
|
| | def test_suppress_warnings_record(): |
| | sup = suppress_warnings() |
| | log1 = sup.record() |
| |
|
| | with sup: |
| | log2 = sup.record(message='Some other warning 2') |
| | sup.filter(message='Some warning') |
| | warnings.warn('Some warning') |
| | warnings.warn('Some other warning') |
| | warnings.warn('Some other warning 2') |
| |
|
| | assert_equal(len(sup.log), 2) |
| | assert_equal(len(log1), 1) |
| | assert_equal(len(log2), 1) |
| | assert_equal(log2[0].message.args[0], 'Some other warning 2') |
| |
|
| | |
| | with sup: |
| | log2 = sup.record(message='Some other warning 2') |
| | sup.filter(message='Some warning') |
| | warnings.warn('Some warning') |
| | warnings.warn('Some other warning') |
| | warnings.warn('Some other warning 2') |
| |
|
| | assert_equal(len(sup.log), 2) |
| | assert_equal(len(log1), 1) |
| | assert_equal(len(log2), 1) |
| | assert_equal(log2[0].message.args[0], 'Some other warning 2') |
| |
|
| | |
| | with suppress_warnings() as sup: |
| | sup.record() |
| | with suppress_warnings() as sup2: |
| | sup2.record(message='Some warning') |
| | warnings.warn('Some warning') |
| | warnings.warn('Some other warning') |
| | assert_equal(len(sup2.log), 1) |
| | assert_equal(len(sup.log), 1) |
| |
|
| |
|
| | def test_suppress_warnings_forwarding(): |
| | def warn_other_module(): |
| | |
| | |
| | def warn(arr): |
| | warnings.warn("Some warning", stacklevel=2) |
| | return arr |
| | np.apply_along_axis(warn, 0, [0]) |
| |
|
| | with suppress_warnings() as sup: |
| | sup.record() |
| | with suppress_warnings("always"): |
| | for i in range(2): |
| | warnings.warn("Some warning") |
| |
|
| | assert_equal(len(sup.log), 2) |
| |
|
| | with suppress_warnings() as sup: |
| | sup.record() |
| | with suppress_warnings("location"): |
| | for i in range(2): |
| | warnings.warn("Some warning") |
| | warnings.warn("Some warning") |
| |
|
| | assert_equal(len(sup.log), 2) |
| |
|
| | with suppress_warnings() as sup: |
| | sup.record() |
| | with suppress_warnings("module"): |
| | for i in range(2): |
| | warnings.warn("Some warning") |
| | warnings.warn("Some warning") |
| | warn_other_module() |
| |
|
| | assert_equal(len(sup.log), 2) |
| |
|
| | with suppress_warnings() as sup: |
| | sup.record() |
| | with suppress_warnings("once"): |
| | for i in range(2): |
| | warnings.warn("Some warning") |
| | warnings.warn("Some other warning") |
| | warn_other_module() |
| |
|
| | assert_equal(len(sup.log), 2) |
| |
|
| |
|
| | def test_tempdir(): |
| | with tempdir() as tdir: |
| | fpath = os.path.join(tdir, 'tmp') |
| | with open(fpath, 'w'): |
| | pass |
| | assert_(not os.path.isdir(tdir)) |
| |
|
| | raised = False |
| | try: |
| | with tempdir() as tdir: |
| | raise ValueError() |
| | except ValueError: |
| | raised = True |
| | assert_(raised) |
| | assert_(not os.path.isdir(tdir)) |
| |
|
| |
|
| | def test_temppath(): |
| | with temppath() as fpath: |
| | with open(fpath, 'w'): |
| | pass |
| | assert_(not os.path.isfile(fpath)) |
| |
|
| | raised = False |
| | try: |
| | with temppath() as fpath: |
| | raise ValueError() |
| | except ValueError: |
| | raised = True |
| | assert_(raised) |
| | assert_(not os.path.isfile(fpath)) |
| |
|
| |
|
| | class my_cacw(clear_and_catch_warnings): |
| |
|
| | class_modules = (sys.modules[__name__],) |
| |
|
| |
|
| | def test_clear_and_catch_warnings_inherit(): |
| | |
| | my_mod = _get_fresh_mod() |
| | with my_cacw(): |
| | warnings.simplefilter('ignore') |
| | warnings.warn('Some warning') |
| | assert_equal(my_mod.__warningregistry__, {}) |
| |
|
| |
|
| | @pytest.mark.skipif(not HAS_REFCOUNT, reason="Python lacks refcounts") |
| | class TestAssertNoGcCycles: |
| | """ Test assert_no_gc_cycles """ |
| |
|
| | def test_passes(self): |
| | def no_cycle(): |
| | b = [] |
| | b.append([]) |
| | return b |
| |
|
| | with assert_no_gc_cycles(): |
| | no_cycle() |
| |
|
| | assert_no_gc_cycles(no_cycle) |
| |
|
| | def test_asserts(self): |
| | def make_cycle(): |
| | a = [] |
| | a.append(a) |
| | a.append(a) |
| | return a |
| |
|
| | with assert_raises(AssertionError): |
| | with assert_no_gc_cycles(): |
| | make_cycle() |
| |
|
| | with assert_raises(AssertionError): |
| | assert_no_gc_cycles(make_cycle) |
| |
|
| | @pytest.mark.slow |
| | def test_fails(self): |
| | """ |
| | Test that in cases where the garbage cannot be collected, we raise an |
| | error, instead of hanging forever trying to clear it. |
| | """ |
| |
|
| | class ReferenceCycleInDel: |
| | """ |
| | An object that not only contains a reference cycle, but creates new |
| | cycles whenever it's garbage-collected and its __del__ runs |
| | """ |
| | make_cycle = True |
| |
|
| | def __init__(self): |
| | self.cycle = self |
| |
|
| | def __del__(self): |
| | |
| | self.cycle = None |
| |
|
| | if ReferenceCycleInDel.make_cycle: |
| | |
| | |
| | ReferenceCycleInDel() |
| |
|
| | try: |
| | w = weakref.ref(ReferenceCycleInDel()) |
| | try: |
| | with assert_raises(RuntimeError): |
| | |
| | assert_no_gc_cycles(lambda: None) |
| | except AssertionError: |
| | |
| | |
| | if w() is not None: |
| | pytest.skip("GC does not call __del__ on cyclic objects") |
| | raise |
| |
|
| | finally: |
| | |
| | ReferenceCycleInDel.make_cycle = False |
| |
|
| |
|
| | @pytest.mark.parametrize('assert_func', [assert_array_equal, |
| | assert_array_almost_equal]) |
| | def test_xy_rename(assert_func): |
| | |
| | |
| | |
| | assert_func(1, 1) |
| | assert_func(actual=1, desired=1) |
| |
|
| | assert_message = "Arrays are not..." |
| | with pytest.raises(AssertionError, match=assert_message): |
| | assert_func(1, 2) |
| | with pytest.raises(AssertionError, match=assert_message): |
| | assert_func(actual=1, desired=2) |
| |
|
| | dep_message = 'Use of keyword argument...' |
| | with pytest.warns(DeprecationWarning, match=dep_message): |
| | assert_func(x=1, desired=1) |
| | with pytest.warns(DeprecationWarning, match=dep_message): |
| | assert_func(1, y=1) |
| |
|
| | type_message = '...got multiple values for argument' |
| | with (pytest.warns(DeprecationWarning, match=dep_message), |
| | pytest.raises(TypeError, match=type_message)): |
| | assert_func(1, x=1) |
| | assert_func(1, 2, y=2) |
| |
|