1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
from hypothesis import given, strategies as st
from io import BytesIO, TextIOWrapper
import os
def translate_newlines(text):
text = text.replace('\r\n', '\n')
text = text.replace('\r', '\n')
return text.replace('\n', os.linesep)
@st.composite
def st_readline_universal(
draw, st_nlines=st.integers(min_value=0, max_value=10)):
n_lines = draw(st_nlines)
lines = draw(st.lists(
st.text(st.characters(blacklist_characters='\r\n')),
min_size=n_lines, max_size=n_lines))
limits = []
for line in lines:
limit = draw(st.integers(min_value=0, max_value=len(line) + 5))
limits.append(limit)
limits.append(-1)
endings = draw(st.lists(
st.sampled_from(['\n', '\r', '\r\n']),
min_size=n_lines, max_size=n_lines))
return (
''.join(line + ending for line, ending in zip(lines, endings)),
limits)
@given(data=st_readline_universal(),
mode=st.sampled_from(['\r', '\n', '\r\n', '', None]))
def test_readline(data, mode):
txt, limits = data
textio = TextIOWrapper(
BytesIO(txt.encode('utf-8', 'surrogatepass')),
encoding='utf-8', errors='surrogatepass', newline=mode)
lines = []
for limit in limits:
line = textio.readline(limit)
if limit >= 0:
assert len(line) <= limit
if line:
lines.append(line)
elif limit:
break
if mode is None:
txt = translate_newlines(txt)
assert txt.startswith(u''.join(lines))
|