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()