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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
|
import sys
import pytest
from hypothesis import strategies as st
from hypothesis import given, settings, example
from unicodedata import normalize
# For every (n1, n2, n3) triple, applying n1 then n2 must be the same
# as applying n3.
# Reference: http://unicode.org/reports/tr15/#Design_Goals
compositions = [
('NFC', 'NFC', 'NFC'),
('NFC', 'NFD', 'NFD'),
('NFC', 'NFKC', 'NFKC'),
('NFC', 'NFKD', 'NFKD'),
('NFD', 'NFC', 'NFC'),
('NFD', 'NFD', 'NFD'),
('NFD', 'NFKC', 'NFKC'),
('NFD', 'NFKD', 'NFKD'),
('NFKC', 'NFC', 'NFKC'),
('NFKC', 'NFD', 'NFKD'),
('NFKC', 'NFKC', 'NFKC'),
('NFKC', 'NFKD', 'NFKD'),
('NFKD', 'NFC', 'NFKC'),
('NFKD', 'NFD', 'NFKD'),
('NFKD', 'NFKC', 'NFKC'),
('NFKD', 'NFKD', 'NFKD'),
]
@pytest.mark.parametrize('norm1, norm2, norm3', compositions)
@settings(max_examples=1000)
@example(s=u'---\uafb8\u11a7---') # issue 2289
@given(s=st.text())
def test_composition(s, norm1, norm2, norm3):
assert normalize(norm2, normalize(norm1, s)) == normalize(norm3, s)
@given(st.text(), st.text(), st.text())
def test_find(u, prefix, suffix):
s = prefix + u + suffix
assert 0 <= s.find(u) <= len(prefix)
assert s.find(u, len(prefix), len(s) - len(suffix)) == len(prefix)
@given(st.text(), st.text(), st.text())
def test_index(u, prefix, suffix):
s = prefix + u + suffix
assert 0 <= s.index(u) <= len(prefix)
assert s.index(u, len(prefix), len(s) - len(suffix)) == len(prefix)
@given(st.text(), st.text(), st.text())
def test_rfind(u, prefix, suffix):
s = prefix + u + suffix
assert s.rfind(u) >= len(prefix)
assert s.rfind(u, len(prefix), len(s) - len(suffix)) == len(prefix)
@given(st.text(), st.text(), st.text())
def test_rindex(u, prefix, suffix):
s = prefix + u + suffix
assert s.rindex(u) >= len(prefix)
assert s.rindex(u, len(prefix), len(s) - len(suffix)) == len(prefix)
def adjust_indices(u, start, end):
if end < 0:
end = max(end + len(u), 0)
else:
end = min(end, len(u))
if start < 0:
start = max(start + len(u), 0)
return start, end
@given(st.text(), st.text())
def test_startswith_basic(u, v):
assert u.startswith(v) is (u[:len(v)] == v)
@example(u'x', u'', 1)
@example(u'x', u'', 2)
@given(st.text(), st.text(), st.integers())
def test_startswith_2(u, v, start):
if v or sys.version_info[0] == 2:
expected = u[start:].startswith(v)
else: # CPython leaks implementation details in this case
expected = start <= len(u)
assert u.startswith(v, start) is expected
@example(u'x', u'', 1, 0)
@example(u'xx', u'', -1, 0)
@given(st.text(), st.text(), st.integers(), st.integers())
def test_startswith_3(u, v, start, end):
if v or sys.version_info[0] == 2:
expected = u[start:end].startswith(v)
else: # CPython leaks implementation details in this case
start0, end0 = adjust_indices(u, start, end)
expected = start0 <= len(u) and start0 <= end0
assert u.startswith(v, start, end) is expected
@given(st.text(), st.text())
def test_endswith_basic(u, v):
if len(v) > len(u):
assert u.endswith(v) is False
else:
assert u.endswith(v) is (u[len(u) - len(v):] == v)
@example(u'x', u'', 1)
@example(u'x', u'', 2)
@given(st.text(), st.text(), st.integers())
def test_endswith_2(u, v, start):
if v or sys.version_info[0] == 2:
expected = u[start:].endswith(v)
else: # CPython leaks implementation details in this case
expected = start <= len(u)
assert u.endswith(v, start) is expected
@example(u'x', u'', 1, 0)
@example(u'xx', u'', -1, 0)
@given(st.text(), st.text(), st.integers(), st.integers())
def test_endswith_3(u, v, start, end):
if v or sys.version_info[0] == 2:
expected = u[start:end].endswith(v)
else: # CPython leaks implementation details in this case
start0, end0 = adjust_indices(u, start, end)
expected = start0 <= len(u) and start0 <= end0
assert u.endswith(v, start, end) is expected
|