112391Sjason@lowepower.comimport pytest
212391Sjason@lowepower.comfrom pybind11_tests import operators as m
312391Sjason@lowepower.comfrom pybind11_tests import ConstructorStats
412391Sjason@lowepower.com
512391Sjason@lowepower.com
611986Sandreas.sandberg@arm.comdef test_operator_overloading():
712391Sjason@lowepower.com    v1 = m.Vector2(1, 2)
812391Sjason@lowepower.com    v2 = m.Vector(3, -1)
911986Sandreas.sandberg@arm.com    assert str(v1) == "[1.000000, 2.000000]"
1011986Sandreas.sandberg@arm.com    assert str(v2) == "[3.000000, -1.000000]"
1111986Sandreas.sandberg@arm.com
1214299Sbbruce@ucdavis.edu    assert str(-v2) == "[-3.000000, 1.000000]"
1314299Sbbruce@ucdavis.edu
1411986Sandreas.sandberg@arm.com    assert str(v1 + v2) == "[4.000000, 1.000000]"
1511986Sandreas.sandberg@arm.com    assert str(v1 - v2) == "[-2.000000, 3.000000]"
1611986Sandreas.sandberg@arm.com    assert str(v1 - 8) == "[-7.000000, -6.000000]"
1711986Sandreas.sandberg@arm.com    assert str(v1 + 8) == "[9.000000, 10.000000]"
1811986Sandreas.sandberg@arm.com    assert str(v1 * 8) == "[8.000000, 16.000000]"
1911986Sandreas.sandberg@arm.com    assert str(v1 / 8) == "[0.125000, 0.250000]"
2011986Sandreas.sandberg@arm.com    assert str(8 - v1) == "[7.000000, 6.000000]"
2111986Sandreas.sandberg@arm.com    assert str(8 + v1) == "[9.000000, 10.000000]"
2211986Sandreas.sandberg@arm.com    assert str(8 * v1) == "[8.000000, 16.000000]"
2311986Sandreas.sandberg@arm.com    assert str(8 / v1) == "[8.000000, 4.000000]"
2412391Sjason@lowepower.com    assert str(v1 * v2) == "[3.000000, -2.000000]"
2512391Sjason@lowepower.com    assert str(v2 / v1) == "[3.000000, -0.500000]"
2611986Sandreas.sandberg@arm.com
2712391Sjason@lowepower.com    v1 += 2 * v2
2812391Sjason@lowepower.com    assert str(v1) == "[7.000000, 0.000000]"
2912391Sjason@lowepower.com    v1 -= v2
3012391Sjason@lowepower.com    assert str(v1) == "[4.000000, 1.000000]"
3111986Sandreas.sandberg@arm.com    v1 *= 2
3211986Sandreas.sandberg@arm.com    assert str(v1) == "[8.000000, 2.000000]"
3312391Sjason@lowepower.com    v1 /= 16
3412391Sjason@lowepower.com    assert str(v1) == "[0.500000, 0.125000]"
3512391Sjason@lowepower.com    v1 *= v2
3612391Sjason@lowepower.com    assert str(v1) == "[1.500000, -0.125000]"
3712391Sjason@lowepower.com    v2 /= v1
3812391Sjason@lowepower.com    assert str(v2) == "[2.000000, 8.000000]"
3911986Sandreas.sandberg@arm.com
4012391Sjason@lowepower.com    assert hash(v1) == 4
4112391Sjason@lowepower.com
4212391Sjason@lowepower.com    cstats = ConstructorStats.get(m.Vector2)
4311986Sandreas.sandberg@arm.com    assert cstats.alive() == 2
4411986Sandreas.sandberg@arm.com    del v1
4511986Sandreas.sandberg@arm.com    assert cstats.alive() == 1
4611986Sandreas.sandberg@arm.com    del v2
4711986Sandreas.sandberg@arm.com    assert cstats.alive() == 0
4811986Sandreas.sandberg@arm.com    assert cstats.values() == ['[1.000000, 2.000000]', '[3.000000, -1.000000]',
4914299Sbbruce@ucdavis.edu                               '[-3.000000, 1.000000]', '[4.000000, 1.000000]',
5014299Sbbruce@ucdavis.edu                               '[-2.000000, 3.000000]', '[-7.000000, -6.000000]',
5114299Sbbruce@ucdavis.edu                               '[9.000000, 10.000000]', '[8.000000, 16.000000]',
5214299Sbbruce@ucdavis.edu                               '[0.125000, 0.250000]', '[7.000000, 6.000000]',
5314299Sbbruce@ucdavis.edu                               '[9.000000, 10.000000]', '[8.000000, 16.000000]',
5414299Sbbruce@ucdavis.edu                               '[8.000000, 4.000000]', '[3.000000, -2.000000]',
5514299Sbbruce@ucdavis.edu                               '[3.000000, -0.500000]', '[6.000000, -2.000000]']
5611986Sandreas.sandberg@arm.com    assert cstats.default_constructions == 0
5711986Sandreas.sandberg@arm.com    assert cstats.copy_constructions == 0
5811986Sandreas.sandberg@arm.com    assert cstats.move_constructions >= 10
5911986Sandreas.sandberg@arm.com    assert cstats.copy_assignments == 0
6011986Sandreas.sandberg@arm.com    assert cstats.move_assignments == 0
6112391Sjason@lowepower.com
6212391Sjason@lowepower.com
6312391Sjason@lowepower.comdef test_operators_notimplemented():
6412391Sjason@lowepower.com    """#393: need to return NotSupported to ensure correct arithmetic operator behavior"""
6512391Sjason@lowepower.com
6612391Sjason@lowepower.com    c1, c2 = m.C1(), m.C2()
6712391Sjason@lowepower.com    assert c1 + c1 == 11
6812391Sjason@lowepower.com    assert c2 + c2 == 22
6912391Sjason@lowepower.com    assert c2 + c1 == 21
7012391Sjason@lowepower.com    assert c1 + c2 == 12
7112391Sjason@lowepower.com
7212391Sjason@lowepower.com
7312391Sjason@lowepower.comdef test_nested():
7412391Sjason@lowepower.com    """#328: first member in a class can't be used in operators"""
7512391Sjason@lowepower.com
7612391Sjason@lowepower.com    a = m.NestA()
7712391Sjason@lowepower.com    b = m.NestB()
7812391Sjason@lowepower.com    c = m.NestC()
7912391Sjason@lowepower.com
8012391Sjason@lowepower.com    a += 10
8112391Sjason@lowepower.com    assert m.get_NestA(a) == 13
8212391Sjason@lowepower.com    b.a += 100
8312391Sjason@lowepower.com    assert m.get_NestA(b.a) == 103
8412391Sjason@lowepower.com    c.b.a += 1000
8512391Sjason@lowepower.com    assert m.get_NestA(c.b.a) == 1003
8612391Sjason@lowepower.com    b -= 1
8712391Sjason@lowepower.com    assert m.get_NestB(b) == 3
8812391Sjason@lowepower.com    c.b -= 3
8912391Sjason@lowepower.com    assert m.get_NestB(c.b) == 1
9012391Sjason@lowepower.com    c *= 7
9112391Sjason@lowepower.com    assert m.get_NestC(c) == 35
9212391Sjason@lowepower.com
9312391Sjason@lowepower.com    abase = a.as_base()
9412391Sjason@lowepower.com    assert abase.value == -2
9512391Sjason@lowepower.com    a.as_base().value += 44
9612391Sjason@lowepower.com    assert abase.value == 42
9712391Sjason@lowepower.com    assert c.b.a.as_base().value == -2
9812391Sjason@lowepower.com    c.b.a.as_base().value += 44
9912391Sjason@lowepower.com    assert c.b.a.as_base().value == 42
10012391Sjason@lowepower.com
10112391Sjason@lowepower.com    del c
10212391Sjason@lowepower.com    pytest.gc_collect()
10314299Sbbruce@ucdavis.edu    del a  # Shouldn't delete while abase is still alive
10412391Sjason@lowepower.com    pytest.gc_collect()
10512391Sjason@lowepower.com
10612391Sjason@lowepower.com    assert abase.value == 42
10712391Sjason@lowepower.com    del abase, b
10812391Sjason@lowepower.com    pytest.gc_collect()
109