1import pickle
2import re
3import platform
4
5import pytest
6import cairo
7
8
9# https://bitbucket.org/pypy/pypy/issues/2742
10@pytest.mark.skipif(platform.python_implementation() == "PyPy", reason="PyPy")
11def test_type():
12    t = cairo.Antialias
13    assert int in t.__mro__
14    assert isinstance(t(42), int)
15    assert isinstance(t(0), int)
16    assert issubclass(t, int)
17
18    with pytest.raises(TypeError):
19        t()
20
21    with pytest.raises(TypeError):
22        t(object())
23
24    with pytest.raises(TypeError):
25        type("foo", (t,), {})
26
27    assert hasattr(t, "DEFAULT")
28    assert t.DEFAULT == 0
29    assert t.__name__ == "Antialias"
30    assert t.__module__ == "cairo"
31
32    assert repr(t.DEFAULT) == "cairo.Antialias.DEFAULT"
33    assert repr(t(123456)) == "123456"
34    assert repr(t(0)) == "cairo.Antialias.DEFAULT"
35    assert str(t(0)) == "0"
36
37    assert isinstance(cairo.ANTIALIAS_DEFAULT, t)
38
39
40def test_misc():
41    cairo.Status.JBIG2_GLOBAL_MISSING
42
43
44def test_format_methods():
45    assert cairo.Format.RGB24.stride_for_width(8) == 32
46    assert cairo.Format.stride_for_width(cairo.Format.RGB24, 8) == 32
47
48
49def test_text_cluster_flags():
50    assert cairo.TextClusterFlags.BACKWARD == 1
51
52
53def test_surface_observer_mode():
54    assert cairo.SurfaceObserverMode.NORMAL == 0
55
56
57def test_aliases():
58    types_ = [
59        cairo.Antialias,
60        cairo.Content,
61        cairo.Extend,
62        cairo.FillRule,
63        cairo.Filter,
64        cairo.FontWeight,
65        cairo.FontSlant,
66        cairo.Format,
67        cairo.HintMetrics,
68        cairo.HintStyle,
69        cairo.LineCap,
70        cairo.LineJoin,
71        cairo.Operator,
72        cairo.PathDataType,
73        cairo.RegionOverlap,
74        cairo.SubpixelOrder,
75    ]
76
77    def get_prefix(t):
78        name = t.__name__
79        # special case..
80        if name == "PathDataType":
81            name = "Path"
82        return"_".join([s.upper() for s in re.findall('[A-Z][^A-Z]*', name)])
83
84    for t in types_:
85        for name in dir(t):
86            if name.upper() != name:
87                continue
88            value = getattr(t, name)
89            assert isinstance(value, t)
90            prefix = get_prefix(t)
91            assert getattr(cairo, prefix + "_" + name) == value
92
93    for name in dir(cairo):
94        for t in types_:
95            prefix = get_prefix(t)
96            if name.startswith(prefix + "_"):
97                postfix = name[len(prefix) + 1:]
98                value = getattr(cairo, name)
99                assert getattr(t, postfix) == value
100
101    # some enums are different, check manually
102    assert cairo.SVG_VERSION_1_1 == cairo.SVGVersion.VERSION_1_1
103    assert isinstance(cairo.SVG_VERSION_1_1, cairo.SVGVersion)
104    assert isinstance(cairo.SVGVersion.VERSION_1_1, cairo.SVGVersion)
105    assert cairo.SVG_VERSION_1_2 == cairo.SVGVersion.VERSION_1_2
106    assert isinstance(cairo.SVG_VERSION_1_2, cairo.SVGVersion)
107    assert isinstance(cairo.SVGVersion.VERSION_1_2, cairo.SVGVersion)
108
109    assert cairo.PDF_VERSION_1_4 == cairo.PDFVersion.VERSION_1_4
110    assert isinstance(cairo.PDF_VERSION_1_4, cairo.PDFVersion)
111    assert isinstance(cairo.PDFVersion.VERSION_1_4, cairo.PDFVersion)
112    assert cairo.PDF_VERSION_1_5 == cairo.PDFVersion.VERSION_1_5
113    assert isinstance(cairo.PDF_VERSION_1_5, cairo.PDFVersion)
114    assert isinstance(cairo.PDFVersion.VERSION_1_5, cairo.PDFVersion)
115
116    assert cairo.PS_LEVEL_2 == cairo.PSLevel.LEVEL_2
117    assert isinstance(cairo.PS_LEVEL_2, cairo.PSLevel)
118    assert isinstance(cairo.PSLevel.LEVEL_2, cairo.PSLevel)
119    assert cairo.PS_LEVEL_3 == cairo.PSLevel.LEVEL_3
120    assert isinstance(cairo.PS_LEVEL_3, cairo.PSLevel)
121    assert isinstance(cairo.PSLevel.LEVEL_3, cairo.PSLevel)
122
123
124def test_pickle():
125    # These constants used to be plain int. Try to pickle to int so that
126    # there is no dependency on pycairo when unpickling.
127
128    value = cairo.Antialias(42)
129    new_value = pickle.loads(pickle.dumps(value))
130    assert type(new_value) == int
131