mirror of https://github.com/flaggo/pydu.git
add test for super_len
This commit is contained in:
parent
56067956ee
commit
79d6896a01
|
@ -148,7 +148,6 @@ def memoize_when_activated(fun):
|
||||||
return wrapper
|
return wrapper
|
||||||
|
|
||||||
|
|
||||||
# todo doc test
|
|
||||||
# https://github.com/requests/requests/blob/master/requests/utils.py
|
# https://github.com/requests/requests/blob/master/requests/utils.py
|
||||||
def super_len(o):
|
def super_len(o):
|
||||||
total_length = None
|
total_length = None
|
||||||
|
|
|
@ -2,7 +2,8 @@ import sys
|
||||||
import time
|
import time
|
||||||
import pytest
|
import pytest
|
||||||
from pydu import WINDOWS
|
from pydu import WINDOWS
|
||||||
from pydu.misc import trace, unix_timeout, TimeoutError, memoize, memoize_when_activated
|
from pydu.misc import trace, unix_timeout, TimeoutError, memoize, memoize_when_activated, super_len
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from cStringIO import StringIO # py2
|
from cStringIO import StringIO # py2
|
||||||
except ImportError:
|
except ImportError:
|
||||||
|
@ -66,14 +67,14 @@ def test_memoize():
|
||||||
# with args
|
# with args
|
||||||
for x in range(2):
|
for x in range(2):
|
||||||
ret = foo(1)
|
ret = foo(1)
|
||||||
expected = ((1, ), {})
|
expected = ((1,), {})
|
||||||
assert ret == expected
|
assert ret == expected
|
||||||
assert len(calls) == 2
|
assert len(calls) == 2
|
||||||
|
|
||||||
# with args + kwargs
|
# with args + kwargs
|
||||||
for x in range(2):
|
for x in range(2):
|
||||||
ret = foo(1, bar=2)
|
ret = foo(1, bar=2)
|
||||||
expected = ((1, ), {'bar': 2})
|
expected = ((1,), {'bar': 2})
|
||||||
assert ret == expected
|
assert ret == expected
|
||||||
assert len(calls) == 3
|
assert len(calls) == 3
|
||||||
|
|
||||||
|
@ -90,7 +91,6 @@ def test_memoize():
|
||||||
|
|
||||||
def test_memoize_when_activated():
|
def test_memoize_when_activated():
|
||||||
class Foo:
|
class Foo:
|
||||||
|
|
||||||
@memoize_when_activated
|
@memoize_when_activated
|
||||||
def foo(self):
|
def foo(self):
|
||||||
calls.append(None)
|
calls.append(None)
|
||||||
|
@ -114,3 +114,89 @@ def test_memoize_when_activated():
|
||||||
f.foo()
|
f.foo()
|
||||||
f.foo()
|
f.foo()
|
||||||
assert len(calls) == 2
|
assert len(calls) == 2
|
||||||
|
|
||||||
|
|
||||||
|
class TestSuperLen:
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
'stream, value', (
|
||||||
|
(StringIO, 'Test'),
|
||||||
|
))
|
||||||
|
def test_io_streams(self, stream, value):
|
||||||
|
"""Ensures that we properly deal with different kinds of IO streams."""
|
||||||
|
assert super_len(stream()) == 0
|
||||||
|
assert super_len(stream(value)) == 4
|
||||||
|
|
||||||
|
def test_super_len_correctly_calculates_len_of_partially_read_file(self):
|
||||||
|
"""Ensure that we handle partially consumed file like objects."""
|
||||||
|
s = StringIO()
|
||||||
|
s.write('foobarbogus')
|
||||||
|
assert super_len(s) == 0
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('error', [IOError, OSError])
|
||||||
|
def test_super_len_handles_files_raising_weird_errors_in_tell(self, error):
|
||||||
|
"""If tell() raises errors, assume the cursor is at position zero."""
|
||||||
|
|
||||||
|
class BoomFile(object):
|
||||||
|
def __len__(self):
|
||||||
|
return 5
|
||||||
|
|
||||||
|
def tell(self):
|
||||||
|
raise error()
|
||||||
|
|
||||||
|
assert super_len(BoomFile()) == 0
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('error', [IOError, OSError])
|
||||||
|
def test_super_len_tell_ioerror(self, error):
|
||||||
|
"""Ensure that if tell gives an IOError super_len doesn't fail"""
|
||||||
|
|
||||||
|
class NoLenBoomFile(object):
|
||||||
|
def tell(self):
|
||||||
|
raise error()
|
||||||
|
|
||||||
|
def seek(self, offset, whence):
|
||||||
|
pass
|
||||||
|
|
||||||
|
assert super_len(NoLenBoomFile()) == 0
|
||||||
|
|
||||||
|
def test_string(self):
|
||||||
|
assert super_len('Test') == 4
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
'mode, warnings_num', (
|
||||||
|
('r', 0),
|
||||||
|
('rb', 0),
|
||||||
|
))
|
||||||
|
def test_file(self, tmpdir, mode, warnings_num, recwarn):
|
||||||
|
file_obj = tmpdir.join('test.txt')
|
||||||
|
file_obj.write('Test')
|
||||||
|
with file_obj.open(mode) as fd:
|
||||||
|
assert super_len(fd) == 4
|
||||||
|
assert len(recwarn) == warnings_num
|
||||||
|
|
||||||
|
def test_super_len_with__len__(self):
|
||||||
|
foo = [1, 2, 3, 4]
|
||||||
|
len_foo = super_len(foo)
|
||||||
|
assert len_foo == 4
|
||||||
|
|
||||||
|
def test_super_len_with_no__len__(self):
|
||||||
|
class LenFile(object):
|
||||||
|
def __init__(self):
|
||||||
|
self.len = 5
|
||||||
|
|
||||||
|
assert super_len(LenFile()) == 5
|
||||||
|
|
||||||
|
def test_super_len_with_tell(self):
|
||||||
|
foo = StringIO('12345')
|
||||||
|
assert super_len(foo) == 5
|
||||||
|
foo.read(2)
|
||||||
|
assert super_len(foo) == 3
|
||||||
|
|
||||||
|
def test_super_len_with_fileno(self):
|
||||||
|
with open(__file__, 'rb') as f:
|
||||||
|
length = super_len(f)
|
||||||
|
file_data = f.read()
|
||||||
|
assert length == len(file_data)
|
||||||
|
|
||||||
|
def test_super_len_with_no_matches(self):
|
||||||
|
"""Ensure that objects without any length methods default to 0"""
|
||||||
|
assert super_len(object()) == 0
|
||||||
|
|
Loading…
Reference in New Issue