def test_methods():
    fn = mock.Mock()
    fn.__name__ = str('foo')
    fn.return_value = 'foobar'
    lazy_fn = mod.lazy(fn)
    lazy_obj = lazy_fn()
    assert lazy_obj.replace('bar', 'foo') == 'foofoo'
def test_hash():
    fn = mock.Mock()
    fn.__name__ = str('foo')
    fn.return_value = 'foo'
    lazy_fn = mod.lazy(fn)
    lazy_obj = lazy_fn()
    assert hash('foo') == hash(lazy_obj)
def test_subscript():
    fn = mock.Mock()
    fn.__name__ = str('foo')
    fn.return_value = 'foo'
    lazy_fn = mod.lazy(fn)
    lazy_obj = lazy_fn()
    assert lazy_obj[:2] == 'fo'
def test_decorator_with_kwargs():
    fn = mock.Mock()
    fn.__name__ = str('foo')
    fn.return_value = 'foo'
    lazy_fn = mod.lazy(fn)
    lazy_fn(1, 2, foo=3)._eval()
    fn.assert_called_once_with(1, 2, foo=3)
def test_decorator():
    """ Calling the lazy object will call function's return value """
    fn = mock.Mock()
    fn.__name__ = str('foo')
    lazy_fn = mod.lazy(fn)
    val = lazy_fn()
    assert fn.called == False, "Should not be called before value is accessed"
    assert isinstance(val, mod.Lazy), "Return value should be a Lazy instance"
def test_lazy_class():
    fn = mock.Mock()
    fn.__name__ = str('foo')
    fn.return_value = 1  # int
    lazy_fn = mod.lazy(fn)
    lazy_obj = lazy_fn()
    assert isinstance(lazy_obj, int)
    fn.return_value = 'str'  # str
    if PY2:
        assert isinstance(lazy_obj, unicode)
    else:
        assert isinstance(lazy_obj, str)
def test_caching_vs_noncaching():
    """ Testing use of different Lazy classes """
    fn1 = mock.Mock()
    fn1.__name__ = str('foo')
    fn2 = mock.Mock()
    fn2.__name__ = str('bar')
    lazy_fn = mod.lazy(fn1)
    lazy_caching_fn = mod.caching_lazy(fn2)
    val1 = lazy_fn()
    val1._eval()
    val1._eval()
    val1._eval()
    val2 = lazy_caching_fn()
    val2._eval()
    val2._eval()
    val2._eval()
    assert fn1.call_count == 3, "Expected 3 calls, got %s" % fn1.call_count
    assert fn2.call_count == 1, "Expected one call, got %s" % fn2.call_count
    assert isinstance(val1, mod.Lazy), "Expected Lazy instance"
    assert isinstance(val2, mod.CachingLazy), "Expected CachingLazy instance"
def test_interpolation():
    fn = mock.Mock()
    fn.__name__ = str('foo')
    fn.return_value = 'foo %s'
    lazy_fn = mod.lazy(fn)
    assert lazy_fn() % 'bar' == 'foo bar'