File: test_fundamental.py

package info (click to toggle)
pygobject 3.55.3-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 5,728 kB
  • sloc: ansic: 39,419; python: 26,856; sh: 114; makefile: 81; xml: 35; cpp: 1
file content (189 lines) | stat: -rw-r--r-- 4,606 bytes parent folder | download | duplicates (3)
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
import gc
import weakref

import pytest
from gi.repository import GObject, Regress

try:
    from gi.repository import Gtk

    GTK4 = Gtk._version == "4.0"
except ImportError:
    Gtk = None
    GTK4 = False


def test_constructor_no_data():
    obj = Regress.TestFundamentalSubObject()

    assert isinstance(obj, Regress.TestFundamentalSubObject)
    assert isinstance(obj, Regress.TestFundamentalObject)
    assert obj.refcount == 1
    assert obj.data is None


def test_constructor_with_data():
    with pytest.raises(TypeError):
        Regress.TestFundamentalSubObject(data="foo")


def test_create_fundamental_new_with_data():
    obj = Regress.TestFundamentalSubObject.new("foo")

    assert isinstance(obj, Regress.TestFundamentalSubObject)
    assert isinstance(obj, Regress.TestFundamentalObject)
    assert obj.refcount == 1
    assert obj.data == "foo"


def test_change_field():
    obj = Regress.TestFundamentalObjectNoGetSetFunc.new("foo")

    obj.data = "bar"

    assert obj.get_data() == "bar"


def test_call_method():
    obj = Regress.TestFundamentalObjectNoGetSetFunc.new("foo")

    assert obj.get_data() == "foo"


def test_create_fundamental_hidden_class_instance():
    obj = Regress.test_create_fundamental_hidden_class_instance()

    assert isinstance(obj, Regress.TestFundamentalObject)


def test_create_fundamental_refcount():
    obj = Regress.TestFundamentalSubObject.new("foo")

    assert obj.refcount == 1


def test_delete_fundamental_refcount():
    obj = Regress.TestFundamentalSubObject.new("foo")
    del obj

    gc.collect()


def test_value_set_fundamental_object():
    val = GObject.Value(Regress.TestFundamentalSubObject.__gtype__)
    obj = Regress.TestFundamentalSubObject()

    val.set_value(obj)

    assert val.get_value() == obj


def test_value_set_wrong_value():
    val = GObject.Value(Regress.TestFundamentalSubObject.__gtype__)

    with pytest.raises(TypeError, match="Fundamental type is required"):
        val.set_value(1)


def test_value_set_wrong_fundamental():
    class MyCustomFundamentalObject(Regress.TestFundamentalObject):
        pass

    val = GObject.Value(Regress.TestFundamentalSubObject.__gtype__)

    with pytest.raises(TypeError, match="Invalid fundamental type for assignment"):
        val.set_value(MyCustomFundamentalObject())


def test_array_of_fundamental_objects_in():
    assert Regress.test_array_of_fundamental_objects_in(
        [Regress.TestFundamentalSubObject()]
    )


def test_array_of_fundamental_objects_out():
    objs = Regress.test_array_of_fundamental_objects_out()

    assert len(objs) == 2
    assert all(isinstance(o, Regress.TestFundamentalObject) for o in objs)


def test_fundamental_argument_in():
    obj = Regress.TestFundamentalSubObject()

    assert Regress.test_fundamental_argument_in(obj)


def test_abstract_fundamental_type():
    with pytest.raises(TypeError):
        Regress.TestFundamentalObject()


def test_fundamental_argument_out():
    obj = Regress.TestFundamentalSubObject.new("data")
    other = Regress.test_fundamental_argument_out(obj)

    assert type(obj) is type(other)
    assert obj is not other
    assert obj.data == other.data


def test_multiple_objects():
    obj1 = Regress.TestFundamentalSubObject()
    obj2 = Regress.TestFundamentalSubObject()

    assert obj1 != obj2


def test_fundamental_weak_ref():
    obj = Regress.TestFundamentalSubObject()
    weak = weakref.ref(obj)

    assert weak() == obj

    del obj
    gc.collect()

    assert weak() is None


def test_fundamental_primitive_object():
    bitmask = Regress.Bitmask(2)

    assert bitmask.v == 2


def test_custom_fundamental_type_vfunc_override():
    class MyCustomFundamentalObject(Regress.TestFundamentalObject):
        def __init__(self):
            super().__init__()
            invocations["__init__"] = True

        def do_finalize(self):
            invocations["do_finalize"] = True

    invocations = {}
    obj = MyCustomFundamentalObject()
    del obj
    gc.collect()

    assert "__init__" in invocations
    assert "do_finalize" in invocations


@pytest.mark.skipif(not GTK4, reason="requires GTK 4")
def test_gtk_expression():
    obj = object()
    con = Gtk.ConstantExpression.new_for_value(obj)

    assert con.get_value() is obj


@pytest.mark.skipif(not GTK4, reason="requires GTK 4")
def test_gtk_string_filter_fundamental_property():
    expr = Gtk.ConstantExpression.new_for_value("one")
    filter = Gtk.StringFilter.new(expr)
    filter.props.expression = expr

    assert filter.get_expression() == expr
    assert filter.props.expression == expr