← Back to team overview

larry-discuss team mailing list archive

Can all larry methods handle empty larrys?

 

I'm making a unit test that passes an empty larry to all the larry
methods. I've tested about half the methods. So far I have found one
bug:

larry([]) == larry([])

crashes. It is fixed in my local copy. Once I've added all the
methods, I'll commit. Nose is nice. Too much work to write each test
out by hand.

Here's the unit test setup:

import numpy as np
from numpy.testing import assert_

from la import larry

def lar():
    return larry([])

def arr():
    return np.array([])

#               Method        Parameters     Returns
empty_tests = [('A'         , 'property',    arr()),
               ('T'         , 'property',    'use_numpy'),
               ('__abs__'   ,  None     ,    'use_numpy'),
               ('__add__'   ,  [lar()]  ,    lar()),
               ('__and__'   ,  [lar()]  ,    lar()),
               ('__div__'   ,  [lar()]  ,    lar()),
               ('__eq__'    ,  [lar()]  ,    lar()),
               ('__ge__'    ,  [lar()]  ,    lar()),
               ('__gt__'    ,  [lar()]  ,    lar()),
               ('__lt__'    ,  [lar()]  ,    lar()),
               ('__mul__'   ,  [lar()]  ,    lar()),
               ('__ne__'    ,  [lar()]  ,    lar()),
               ('__neg__'   ,  None     ,    'use_numpy'),
               ('__or__'    ,  [lar()]  ,    lar()),
               ('__pos__'   ,  None     ,    'use_numpy'),
               ('__pow__'   ,  [2]      ,    lar()),
               ('__radd__'  ,  [lar()]  ,    lar()),
               ('__rand__'  ,  [lar()]  ,    lar()),
               ('__rdiv__'  ,  [lar()]  ,    'skip'),
               ('__rmul__'  ,  [lar()]  ,    lar()),
               ('__ror__'   ,  [lar()]  ,    lar()),
               ('__rsub__'  ,  [lar()]  ,    lar()),
               ('__sub__'   ,  [lar()]  ,    lar()),
               ('abs'       ,  None     ,    lar()),
               ('all'       ,  None     ,    'use_numpy'),
               ('any'       ,  None     ,    'use_numpy'),
               ('clip'      ,  [-1, 1]  ,    'use_numpy'),
               ('copy'      ,  None     ,    'use_numpy'),
               ('copylabel' ,  None     ,    [[]]),
               ('copyx'     ,  None     ,    arr()),
              #('cov'       ,  None     ,    lar()),       # 2d only
               ('cumprod'   ,  [0]      ,    'use_numpy'),
               ('cumsum'    ,  [0]      ,    'use_numpy'),
               ('cut_missing', [0]      ,    lar()),
               ('demean'    ,  None     ,    lar()),
               ('dtype'     , 'property',    'use_numpy'),
              ]

def test_empty():
    for attr, parameters, desired in empty_tests:
        if str(desired) != 'skip':
            print attr
            method = getattr(lar(), attr)
            if parameters == 'property':
                actual = method
            elif parameters is None:
                actual = method()
            else:
                actual = method(*parameters)
            if str(desired) == 'use_numpy':
                method = getattr(arr(), attr)
                if parameters == 'property':
                    desired = method
                elif parameters is None:
                    desired = method()
                else:
                    desired = method(*parameters)
                if type(desired) == np.ndarray:
                    desired = larry(desired)
            result = actual == desired
            if type(result) == larry:
                result = result.all()
            else:
                result = np.all(result)
            result &= type(actual) == type(desired)
            msg = "method '" + attr + "' failed empty larry test"
            yield assert_, result, msg



Follow ups