| import expecttest | |
| import unittest | |
| import string | |
| import textwrap | |
| import doctest | |
| import hypothesis | |
| from hypothesis.strategies import text, integers, composite, sampled_from, booleans | |
| @composite | |
| def text_lineno(draw): | |
| t = draw(text("a\n")) | |
| lineno = draw(integers(min_value=1, max_value=t.count("\n") + 1)) | |
| return (t, lineno) | |
| class TestExpectTest(expecttest.TestCase): | |
| @hypothesis.given(text_lineno()) | |
| def test_nth_line_ref(self, t_lineno): | |
| t, lineno = t_lineno | |
| hypothesis.event("lineno = {}".format(lineno)) | |
| def nth_line_ref(src, lineno): | |
| xs = src.split("\n")[:lineno] | |
| xs[-1] = '' | |
| return len("\n".join(xs)) | |
| self.assertEqual(expecttest.nth_line(t, lineno), nth_line_ref(t, lineno)) | |
| @hypothesis.given(text(string.printable), booleans(), sampled_from(['"', "'"])) | |
| def test_replace_string_literal_roundtrip(self, t, raw, quote): | |
| if raw: | |
| hypothesis.assume(expecttest.ok_for_raw_triple_quoted_string(t, quote=quote)) | |
| prog = """\ | |
| r = {r}{quote}placeholder{quote} | |
| r2 = {r}{quote}placeholder2{quote} | |
| r3 = {r}{quote}placeholder3{quote} | |
| """.format(r='r' if raw else '', quote=quote * 3) | |
| new_prog = expecttest.replace_string_literal(textwrap.dedent(prog), 2, t)[0] | |
| ns = {} | |
| exec(new_prog, ns) | |
| msg = "program was:\n{}".format(new_prog) | |
| self.assertEqual(ns['r'], 'placeholder', msg=msg) # noqa: F821 | |
| self.assertEqual(ns['r2'], expecttest.normalize_nl(t), msg=msg) # noqa: F821 | |
| self.assertEqual(ns['r3'], 'placeholder3', msg=msg) # noqa: F821 | |
| def test_sample(self): | |
| prog = r""" | |
| single_single('''0''') | |
| single_multi('''1''') | |
| multi_single('''\ | |
| 2 | |
| ''') | |
| multi_multi_less('''\ | |
| 3 | |
| 4 | |
| ''') | |
| multi_multi_same('''\ | |
| 5 | |
| ''') | |
| multi_multi_more('''\ | |
| 6 | |
| ''') | |
| """ | |
| # NB: These are the end of the statements, not beginning | |
| # TODO: Test other permutations of these edits | |
| edits = [(2, "a"), | |
| (3, "b\n"), | |
| (6, "c"), | |
| (10, "d\n"), | |
| (13, "e\n"), | |
| (16, "f\ng\n")] | |
| history = expecttest.EditHistory() | |
| fn = 'not_a_real_file.py' | |
| for lineno, actual in edits: | |
| lineno = history.adjust_lineno(fn, lineno) | |
| prog, delta = expecttest.replace_string_literal(prog, lineno, actual) | |
| history.record_edit(fn, lineno, delta) | |
| self.assertExpectedInline(prog, r""" | |
| single_single('''a''') | |
| single_multi('''\ | |
| b | |
| ''') | |
| multi_single('''c''') | |
| multi_multi_less('''\ | |
| d | |
| ''') | |
| multi_multi_same('''\ | |
| e | |
| ''') | |
| multi_multi_more('''\ | |
| f | |
| g | |
| ''') | |
| """) | |
| def load_tests(loader, tests, ignore): | |
| tests.addTests(doctest.DocTestSuite(expecttest)) | |
| return tests | |
| if __name__ == '__main__': | |
| unittest.main() |