1# -*- coding: utf-8 -*-
2from _pytest._io.saferepr import saferepr
3
4
5def test_simple_repr():
6    assert saferepr(1) == "1"
7    assert saferepr(None) == "None"
8
9
10def test_maxsize():
11    s = saferepr("x" * 50, maxsize=25)
12    assert len(s) == 25
13    expected = repr("x" * 10 + "..." + "x" * 10)
14    assert s == expected
15
16
17def test_maxsize_error_on_instance():
18    class A:
19        def __repr__():
20            raise ValueError("...")
21
22    s = saferepr(("*" * 50, A()), maxsize=25)
23    assert len(s) == 25
24    assert s[0] == "(" and s[-1] == ")"
25
26
27def test_exceptions():
28    class BrokenRepr:
29        def __init__(self, ex):
30            self.ex = ex
31
32        def __repr__(self):
33            raise self.ex
34
35    class BrokenReprException(Exception):
36        __str__ = None
37        __repr__ = None
38
39    assert "Exception" in saferepr(BrokenRepr(Exception("broken")))
40    s = saferepr(BrokenReprException("really broken"))
41    assert "TypeError" in s
42    assert "TypeError" in saferepr(BrokenRepr("string"))
43
44    s2 = saferepr(BrokenRepr(BrokenReprException("omg even worse")))
45    assert "NameError" not in s2
46    assert "unknown" in s2
47
48
49def test_big_repr():
50    from _pytest._io.saferepr import SafeRepr
51
52    assert len(saferepr(range(1000))) <= len("[" + SafeRepr().maxlist * "1000" + "]")
53
54
55def test_repr_on_newstyle():
56    class Function(object):
57        def __repr__(self):
58            return "<%s>" % (self.name)
59
60    assert saferepr(Function())
61
62
63def test_unicode():
64    val = u"£€"
65    reprval = u"'£€'"
66    assert saferepr(val) == reprval
67