blob: 63dd546193d469e4c8010e8df5e0474326747f48 [file] [log] [blame]
Dean Moldovanbdfb50f2017-06-07 16:52:50 +02001import pytest
2from pybind11_tests import ConstructorStats
3
4
Dean Moldovana0c1ccf2016-08-12 13:50:00 +02005def test_operator_overloading():
Dean Moldovanbdfb50f2017-06-07 16:52:50 +02006 from pybind11_tests.operators import Vector2, Vector
Dean Moldovana0c1ccf2016-08-12 13:50:00 +02007
8 v1 = Vector2(1, 2)
9 v2 = Vector(3, -1)
10 assert str(v1) == "[1.000000, 2.000000]"
11 assert str(v2) == "[3.000000, -1.000000]"
12
13 assert str(v1 + v2) == "[4.000000, 1.000000]"
14 assert str(v1 - v2) == "[-2.000000, 3.000000]"
15 assert str(v1 - 8) == "[-7.000000, -6.000000]"
16 assert str(v1 + 8) == "[9.000000, 10.000000]"
17 assert str(v1 * 8) == "[8.000000, 16.000000]"
18 assert str(v1 / 8) == "[0.125000, 0.250000]"
19 assert str(8 - v1) == "[7.000000, 6.000000]"
20 assert str(8 + v1) == "[9.000000, 10.000000]"
21 assert str(8 * v1) == "[8.000000, 16.000000]"
22 assert str(8 / v1) == "[8.000000, 4.000000]"
Jason Rhinelanderacad05c2017-05-20 20:19:26 -040023 assert str(v1 * v2) == "[3.000000, -2.000000]"
24 assert str(v2 / v1) == "[3.000000, -0.500000]"
Dean Moldovana0c1ccf2016-08-12 13:50:00 +020025
Jason Rhinelanderacad05c2017-05-20 20:19:26 -040026 v1 += 2 * v2
27 assert str(v1) == "[7.000000, 0.000000]"
28 v1 -= v2
29 assert str(v1) == "[4.000000, 1.000000]"
Dean Moldovana0c1ccf2016-08-12 13:50:00 +020030 v1 *= 2
31 assert str(v1) == "[8.000000, 2.000000]"
Jason Rhinelanderacad05c2017-05-20 20:19:26 -040032 v1 /= 16
33 assert str(v1) == "[0.500000, 0.125000]"
34 v1 *= v2
35 assert str(v1) == "[1.500000, -0.125000]"
36 v2 /= v1
37 assert str(v2) == "[2.000000, 8.000000]"
Dean Moldovana0c1ccf2016-08-12 13:50:00 +020038
39 cstats = ConstructorStats.get(Vector2)
40 assert cstats.alive() == 2
41 del v1
42 assert cstats.alive() == 1
43 del v2
44 assert cstats.alive() == 0
45 assert cstats.values() == ['[1.000000, 2.000000]', '[3.000000, -1.000000]',
46 '[4.000000, 1.000000]', '[-2.000000, 3.000000]',
47 '[-7.000000, -6.000000]', '[9.000000, 10.000000]',
48 '[8.000000, 16.000000]', '[0.125000, 0.250000]',
49 '[7.000000, 6.000000]', '[9.000000, 10.000000]',
Jason Rhinelanderacad05c2017-05-20 20:19:26 -040050 '[8.000000, 16.000000]', '[8.000000, 4.000000]',
51 '[3.000000, -2.000000]', '[3.000000, -0.500000]',
52 '[6.000000, -2.000000]']
Dean Moldovana0c1ccf2016-08-12 13:50:00 +020053 assert cstats.default_constructions == 0
54 assert cstats.copy_constructions == 0
55 assert cstats.move_constructions >= 10
56 assert cstats.copy_assignments == 0
57 assert cstats.move_assignments == 0
Dean Moldovanbdfb50f2017-06-07 16:52:50 +020058
59
60def test_operators_notimplemented():
61 """#393: need to return NotSupported to ensure correct arithmetic operator behavior"""
62 from pybind11_tests.operators import C1, C2
63
64 c1, c2 = C1(), C2()
65 assert c1 + c1 == 11
66 assert c2 + c2 == 22
67 assert c2 + c1 == 21
68 assert c1 + c2 == 12
69
70
71def test_nested():
72 """#328: first member in a class can't be used in operators"""
73 from pybind11_tests.operators import NestA, NestB, NestC, get_NestA, get_NestB, get_NestC
74
75 a = NestA()
76 b = NestB()
77 c = NestC()
78
79 a += 10
80 assert get_NestA(a) == 13
81 b.a += 100
82 assert get_NestA(b.a) == 103
83 c.b.a += 1000
84 assert get_NestA(c.b.a) == 1003
85 b -= 1
86 assert get_NestB(b) == 3
87 c.b -= 3
88 assert get_NestB(c.b) == 1
89 c *= 7
90 assert get_NestC(c) == 35
91
92 abase = a.as_base()
93 assert abase.value == -2
94 a.as_base().value += 44
95 assert abase.value == 42
96 assert c.b.a.as_base().value == -2
97 c.b.a.as_base().value += 44
98 assert c.b.a.as_base().value == 42
99
100 del c
101 pytest.gc_collect()
102 del a # Should't delete while abase is still alive
103 pytest.gc_collect()
104
105 assert abase.value == 42
106 del abase, b
107 pytest.gc_collect()