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