def test_pintarray_creation(self):
     x = ureg.Quantity([1, 2, 3],"m")
     ys = [
         PintArray.from_1darray_quantity(x),
         PintArray._from_sequence([item for item in x])
     ]
     for y in ys:
         self.assertQuantityAlmostEqual(x,y.quantity)
 def test_mismatched_dimensions(self):
     x_and_ys=[
         (PintArray.from_1darray_quantity(ureg.Quantity([5], "m")), [1, 1]),
         (PintArray.from_1darray_quantity(ureg.Quantity([5, 5, 5], "m")), [1, 1]),
         (PintArray.from_1darray_quantity(self.Q_([5, 5], "m")), [1]),
     ]
     for x, y in x_and_ys:
         for op in comparative_ops + arithmetic_ops:
             self.assertRaises(ValueError, op, x, y)
 def test_initialisation(self, data):
     # fails with plain array
     # works with PintArray
     df = pd.DataFrame({
     "length" : pd.Series([2,3], dtype="pint[m]"),
     "width" : PintArray([2,3], dtype="pint[m]"),
     "distance" : PintArray([2,3], dtype="m"),
     "height" : PintArray([2,3], dtype=ureg.m),
     "depth" : PintArray.from_1darray_quantity(ureg.Quantity([2,3],ureg.m)),
 })
     
     for col in df.columns:
         assert all(df[col] == df.length)
    def test_pintarray_operations(self):
        # Perform operations with Quantities and PintArrays
        # The resulting Quantity and PintArray.Data should be the same
        # a op b == c
        # warnings ignored here as it these tests are to ensure
        # pint array behaviour is the same as quantity
        def test_op(a_pint, a_pint_array, b_, coerce=True):
            try:
                result_pint = op(a_pint, b_)
                if coerce:
                    # a PintArray is returned from arithmetics, so need the data
                    c_pint_array = op(a_pint_array, b_).quantity
                else:
                    # a boolean array is returned from comparatives
                    c_pint_array = op(a_pint_array, b_)

                self.assertQuantityAlmostEqual(result_pint, c_pint_array)

            except Exception as caught_exception:
                self.assertRaises(type(caught_exception), op, a_pint_array, b_)


        a_pints = [
            ureg.Quantity([3, 4], "m"),
            ureg.Quantity([3, 4], ""),
        ]

        a_pint_arrays = [PintArray.from_1darray_quantity(q) for q in a_pints]

        bs = [
            2,
            ureg.Quantity(3, "m"),
            [1., 3.],
            [3.3, 4.4],
            ureg.Quantity([6, 6], "m"),
            ureg.Quantity([7., np.nan]),
        ]

        for a_pint, a_pint_array in zip(a_pints, a_pint_arrays):
            for b in bs:
                for op in arithmetic_ops:
                    test_op(a_pint, a_pint_array, b)
                for op in comparative_ops:
                    test_op(a_pint, a_pint_array, b, coerce=False)
class TestSeriesAccessors(object):
    @pytest.mark.parametrize('attr', [
        'debug_used',
        'default_format',
        'dimensionality',
        'dimensionless',
        'force_ndarray',
        'shape',
        'u',
        'unitless',
        'units',
    ])
    def test_series_scalar_property_accessors(self, data, attr):
        s = pd.Series(data)
        assert getattr(s.pint, attr) == getattr(data.quantity,attr)

    @pytest.mark.parametrize('attr', [
        'm',
        'magnitude',
        #'imag', # failing, not sure why
        #'real', # failing, not sure why
    ])
    def test_series_property_accessors(self, data, attr):
        s = pd.Series(data)
        assert all(getattr(s.pint, attr) == pd.Series(getattr(data.quantity,attr)))

    @pytest.mark.parametrize('attr_args', [
        ('check', ({"[length]": 1})),
        ('compatible_units', ()),
        # ('format_babel', ()), Needs babel installed?
        # ('plus_minus', ()), Needs uncertanties
        #('to_tuple', ()),
        ('tolist', ())
    ])
    def test_series_scalar_method_accessors(self, data, attr_args):
        attr = attr_args[0]
        args = attr_args[1]
        s = pd.Series(data)
        assert getattr(s.pint, attr)(*args) == getattr(data.quantity, attr)(*args)

    @pytest.mark.parametrize('attr_args', [
        ('ito', ("mi",)),
        ('ito_base_units', ()),
        ('ito_reduced_units', ()),
        ('ito_root_units', ()),
        ('put', (1, 1 * ureg.nm))
    ])
    def test_series_inplace_method_accessors(self, data, attr_args):
        attr = attr_args[0]
        args = attr_args[1]
        from copy import deepcopy
        s = pd.Series(deepcopy(data))
        getattr(s.pint, attr)(*args)
        getattr(data.quantity, attr)(*args)
        assert all(s.values == data)

    @pytest.mark.parametrize('attr_args', [
        ('clip', (10 * ureg.nm, 20 * ureg.nm)),
        ('from_tuple', (PintArray(np.arange(1,101), dtype=ureg.m).quantity.to_tuple(),)),
        ('m_as', ("mi",)),
        ('searchsorted', (10 * ureg.nm,)),
        ('to', ("m")),
        ('to_base_units', ()),
        ('to_compact', ()),
        ('to_reduced_units', ()),
        ('to_root_units', ()),
        # ('to_timedelta', ()),
    ])
    def test_series_method_accessors(self, data, attr_args):
        attr=attr_args[0]
        args=attr_args[1]
        s = pd.Series(data)
        assert all(getattr(s.pint, attr)(*args) == getattr(data.quantity,attr)(*args))