Dean Moldovan | bdfb50f | 2017-06-07 16:52:50 +0200 | [diff] [blame] | 1 | import pytest |
| 2 | from pybind11_tests import ConstructorStats |
| 3 | |
| 4 | |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 5 | def test_operator_overloading(): |
Dean Moldovan | bdfb50f | 2017-06-07 16:52:50 +0200 | [diff] [blame] | 6 | from pybind11_tests.operators import Vector2, Vector |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 7 | |
| 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 Rhinelander | acad05c | 2017-05-20 20:19:26 -0400 | [diff] [blame] | 23 | assert str(v1 * v2) == "[3.000000, -2.000000]" |
| 24 | assert str(v2 / v1) == "[3.000000, -0.500000]" |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 25 | |
Jason Rhinelander | acad05c | 2017-05-20 20:19:26 -0400 | [diff] [blame] | 26 | v1 += 2 * v2 |
| 27 | assert str(v1) == "[7.000000, 0.000000]" |
| 28 | v1 -= v2 |
| 29 | assert str(v1) == "[4.000000, 1.000000]" |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 30 | v1 *= 2 |
| 31 | assert str(v1) == "[8.000000, 2.000000]" |
Jason Rhinelander | acad05c | 2017-05-20 20:19:26 -0400 | [diff] [blame] | 32 | 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 Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 38 | |
| 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 Rhinelander | acad05c | 2017-05-20 20:19:26 -0400 | [diff] [blame] | 50 | '[8.000000, 16.000000]', '[8.000000, 4.000000]', |
| 51 | '[3.000000, -2.000000]', '[3.000000, -0.500000]', |
| 52 | '[6.000000, -2.000000]'] |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 53 | 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 Moldovan | bdfb50f | 2017-06-07 16:52:50 +0200 | [diff] [blame] | 58 | |
| 59 | |
| 60 | def 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 | |
| 71 | def 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() |