Source code for scmdata.testing

"""
Testing utilities
"""

import numpy as np
import numpy.testing as npt
import packaging.version
import pandas as pd
import pandas.testing as pdt


def _check_pandas_less_110():
    return packaging.version.parse(pd.__version__) < packaging.version.Version("1.1.0")


def _check_pandas_less_120():
    return packaging.version.parse(pd.__version__) < packaging.version.Version("1.2.0")


def _assert_frame_equal(left, right, **kwargs):
    if _check_pandas_less_110():
        kwargs.pop("rtol", None)
        kwargs.pop("atol", None)

    pdt.assert_frame_equal(left.T, right.T, **kwargs)


[docs]def assert_scmdf_almost_equal( left, right, allow_unordered=False, check_ts_names=True, rtol=1e-5, atol=1e-8 ): """ Check that left and right :class:`ScmRun <scmdata.run.ScmRun>` are equal. Parameters ---------- left : :class:`ScmRun <scmdata.run.ScmRun>` right : :class:`ScmRun <scmdata.run.ScmRun>` allow_unordered : bool If true, the order of the timeseries is not checked check_ts_names : bool If true, check that the meta names are the same rtol : float Relative tolerance on numeric comparisons atol : float Absolute tolerance on numeric comparisons Raises ------ AssertionError ``left`` and ``right`` are not equal """ # Check that the meta data is close if allow_unordered or not check_ts_names: # Checks that all the timeseries are named the same if check_ts_names: df1_index = np.argsort(left.meta.index) df2_index = np.argsort(right.meta.index) _assert_frame_equal(left.meta, right.meta, check_like=True) npt.assert_allclose( left.values[df1_index], right.values[df2_index], rtol=rtol, atol=atol ) else: # ignore differing meta index labels # instead sort by meta values then check equality left_sorted = left.timeseries().sort_index() right_ts = right.timeseries() # check metadata columns are same set if set(left_sorted.index.names) != set(right_ts.index.names): raise AssertionError( "{} != {}".format( set(left_sorted.index.names), set(right_ts.index.names) ) ) right_sorted = right.timeseries(left_sorted.index.names).sort_index() # this checks both the index (i.e. sorted meta) and values are the same _assert_frame_equal(left_sorted, right_sorted, rtol=rtol, atol=atol) else: _assert_frame_equal(left.meta, right.meta) npt.assert_allclose(left.values, right.values, rtol=rtol, atol=atol)