math_test.py 74 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612
  1. # -*- coding: utf-8 -*-
  2. import sys
  3. import unittest
  4. import math
  5. from time import clock
  6. import platform
  7. import pygame.math
  8. from pygame.math import Vector2, Vector3
  9. IS_PYPY = 'PyPy' == platform.python_implementation()
  10. PY3 = sys.version_info.major == 3
  11. class Vector2TypeTest(unittest.TestCase):
  12. def setUp(self):
  13. pygame.math.enable_swizzling()
  14. self.zeroVec = Vector2()
  15. self.e1 = Vector2(1, 0)
  16. self.e2 = Vector2(0, 1)
  17. self.t1 = (1.2, 3.4)
  18. self.l1 = list(self.t1)
  19. self.v1 = Vector2(self.t1)
  20. self.t2 = (5.6, 7.8)
  21. self.l2 = list(self.t2)
  22. self.v2 = Vector2(self.t2)
  23. self.s1 = 5.6
  24. self.s2 = 7.8
  25. def tearDown(self):
  26. pygame.math.enable_swizzling()
  27. def testConstructionDefault(self):
  28. v = Vector2()
  29. self.assertEqual(v.x, 0.)
  30. self.assertEqual(v.y, 0.)
  31. def testConstructionScalar(self):
  32. v = Vector2(1)
  33. self.assertEqual(v.x, 1.)
  34. self.assertEqual(v.y, 1.)
  35. def testConstructionScalarKeywords(self):
  36. v = Vector2(x=1)
  37. self.assertEqual(v.x, 1.)
  38. self.assertEqual(v.y, 1.)
  39. def testConstructionKeywords(self):
  40. v = Vector2(x=1, y=2)
  41. self.assertEqual(v.x, 1.)
  42. self.assertEqual(v.y, 2.)
  43. def testConstructionXY(self):
  44. v = Vector2(1.2, 3.4)
  45. self.assertEqual(v.x, 1.2)
  46. self.assertEqual(v.y, 3.4)
  47. def testConstructionTuple(self):
  48. v = Vector2((1.2, 3.4))
  49. self.assertEqual(v.x, 1.2)
  50. self.assertEqual(v.y, 3.4)
  51. def testConstructionList(self):
  52. v = Vector2([1.2, 3.4])
  53. self.assertEqual(v.x, 1.2)
  54. self.assertEqual(v.y, 3.4)
  55. def testConstructionVector2(self):
  56. v = Vector2(Vector2(1.2, 3.4))
  57. self.assertEqual(v.x, 1.2)
  58. self.assertEqual(v.y, 3.4)
  59. def testAttributAccess(self):
  60. tmp = self.v1.x
  61. self.assertEqual(tmp, self.v1.x)
  62. self.assertEqual(tmp, self.v1[0])
  63. tmp = self.v1.y
  64. self.assertEqual(tmp, self.v1.y)
  65. self.assertEqual(tmp, self.v1[1])
  66. self.v1.x = 3.141
  67. self.assertEqual(self.v1.x, 3.141)
  68. self.v1.y = 3.141
  69. self.assertEqual(self.v1.y, 3.141)
  70. def assign_nonfloat():
  71. v = Vector2()
  72. v.x = "spam"
  73. self.assertRaises(TypeError, assign_nonfloat)
  74. def testSequence(self):
  75. v = Vector2(1.2, 3.4)
  76. Vector2()[:]
  77. self.assertEqual(len(v), 2)
  78. self.assertEqual(v[0], 1.2)
  79. self.assertEqual(v[1], 3.4)
  80. self.assertRaises(IndexError, lambda : v[2])
  81. self.assertEqual(v[-1], 3.4)
  82. self.assertEqual(v[-2], 1.2)
  83. self.assertRaises(IndexError, lambda : v[-3])
  84. self.assertEqual(v[:], [1.2, 3.4])
  85. self.assertEqual(v[1:], [3.4])
  86. self.assertEqual(v[:1], [1.2])
  87. self.assertEqual(list(v), [1.2, 3.4])
  88. self.assertEqual(tuple(v), (1.2, 3.4))
  89. v[0] = 5.6
  90. v[1] = 7.8
  91. self.assertEqual(v.x, 5.6)
  92. self.assertEqual(v.y, 7.8)
  93. v[:] = [9.1, 11.12]
  94. self.assertEqual(v.x, 9.1)
  95. self.assertEqual(v.y, 11.12)
  96. def overpopulate():
  97. v = Vector2()
  98. v[:] = [1, 2, 3]
  99. self.assertRaises(ValueError, overpopulate)
  100. def underpopulate():
  101. v = Vector2()
  102. v[:] = [1]
  103. self.assertRaises(ValueError, underpopulate)
  104. def assign_nonfloat():
  105. v = Vector2()
  106. v[0] = "spam"
  107. self.assertRaises(TypeError, assign_nonfloat)
  108. def testExtendedSlicing(self):
  109. # deletion
  110. def delSlice(vec, start=None, stop=None, step=None):
  111. if start is not None and stop is not None and step is not None:
  112. del vec[start:stop:step]
  113. elif start is not None and stop is None and step is not None:
  114. del vec[start::step]
  115. elif start is None and stop is None and step is not None:
  116. del vec[::step]
  117. v = Vector2(self.v1)
  118. self.assertRaises(TypeError, delSlice, v, None, None, 2)
  119. self.assertRaises(TypeError, delSlice, v, 1, None, 2)
  120. self.assertRaises(TypeError, delSlice, v, 1, 2, 1)
  121. # assignment
  122. v = Vector2(self.v1)
  123. v[::2] = [-1]
  124. self.assertEqual(v, [-1, self.v1.y])
  125. v = Vector2(self.v1)
  126. v[::-2] = [10]
  127. self.assertEqual(v, [self.v1.x, 10])
  128. v = Vector2(self.v1)
  129. v[::-1] = v
  130. self.assertEqual(v, [self.v1.y, self.v1.x])
  131. a = Vector2(self.v1)
  132. b = Vector2(self.v1)
  133. c = Vector2(self.v1)
  134. a[1:2] = [2.2]
  135. b[slice(1,2)] = [2.2]
  136. c[1:2:] = (2.2,)
  137. self.assertEqual(a, b)
  138. self.assertEqual(a, c)
  139. self.assertEqual(type(a), type(self.v1))
  140. self.assertEqual(type(b), type(self.v1))
  141. self.assertEqual(type(c), type(self.v1))
  142. def testAdd(self):
  143. v3 = self.v1 + self.v2
  144. self.assertTrue(isinstance(v3, type(self.v1)))
  145. self.assertEqual(v3.x, self.v1.x + self.v2.x)
  146. self.assertEqual(v3.y, self.v1.y + self.v2.y)
  147. v3 = self.v1 + self.t2
  148. self.assertTrue(isinstance(v3, type(self.v1)))
  149. self.assertEqual(v3.x, self.v1.x + self.t2[0])
  150. self.assertEqual(v3.y, self.v1.y + self.t2[1])
  151. v3 = self.v1 + self.l2
  152. self.assertTrue(isinstance(v3, type(self.v1)))
  153. self.assertEqual(v3.x, self.v1.x + self.l2[0])
  154. self.assertEqual(v3.y, self.v1.y + self.l2[1])
  155. v3 = self.t1 + self.v2
  156. self.assertTrue(isinstance(v3, type(self.v1)))
  157. self.assertEqual(v3.x, self.t1[0] + self.v2.x)
  158. self.assertEqual(v3.y, self.t1[1] + self.v2.y)
  159. v3 = self.l1 + self.v2
  160. self.assertTrue(isinstance(v3, type(self.v1)))
  161. self.assertEqual(v3.x, self.l1[0] + self.v2.x)
  162. self.assertEqual(v3.y, self.l1[1] + self.v2.y)
  163. def testSub(self):
  164. v3 = self.v1 - self.v2
  165. self.assertTrue(isinstance(v3, type(self.v1)))
  166. self.assertEqual(v3.x, self.v1.x - self.v2.x)
  167. self.assertEqual(v3.y, self.v1.y - self.v2.y)
  168. v3 = self.v1 - self.t2
  169. self.assertTrue(isinstance(v3, type(self.v1)))
  170. self.assertEqual(v3.x, self.v1.x - self.t2[0])
  171. self.assertEqual(v3.y, self.v1.y - self.t2[1])
  172. v3 = self.v1 - self.l2
  173. self.assertTrue(isinstance(v3, type(self.v1)))
  174. self.assertEqual(v3.x, self.v1.x - self.l2[0])
  175. self.assertEqual(v3.y, self.v1.y - self.l2[1])
  176. v3 = self.t1 - self.v2
  177. self.assertTrue(isinstance(v3, type(self.v1)))
  178. self.assertEqual(v3.x, self.t1[0] - self.v2.x)
  179. self.assertEqual(v3.y, self.t1[1] - self.v2.y)
  180. v3 = self.l1 - self.v2
  181. self.assertTrue(isinstance(v3, type(self.v1)))
  182. self.assertEqual(v3.x, self.l1[0] - self.v2.x)
  183. self.assertEqual(v3.y, self.l1[1] - self.v2.y)
  184. def testScalarMultiplication(self):
  185. v = self.s1 * self.v1
  186. self.assertTrue(isinstance(v, type(self.v1)))
  187. self.assertEqual(v.x, self.s1 * self.v1.x)
  188. self.assertEqual(v.y, self.s1 * self.v1.y)
  189. v = self.v1 * self.s2
  190. self.assertEqual(v.x, self.v1.x * self.s2)
  191. self.assertEqual(v.y, self.v1.y * self.s2)
  192. def testScalarDivision(self):
  193. v = self.v1 / self.s1
  194. self.assertTrue(isinstance(v, type(self.v1)))
  195. self.assertAlmostEqual(v.x, self.v1.x / self.s1)
  196. self.assertAlmostEqual(v.y, self.v1.y / self.s1)
  197. v = self.v1 // self.s2
  198. self.assertTrue(isinstance(v, type(self.v1)))
  199. self.assertEqual(v.x, self.v1.x // self.s2)
  200. self.assertEqual(v.y, self.v1.y // self.s2)
  201. def testBool(self):
  202. self.assertEqual(bool(self.zeroVec), False)
  203. self.assertEqual(bool(self.v1), True)
  204. self.assertTrue(not self.zeroVec)
  205. self.assertTrue(self.v1)
  206. def testUnary(self):
  207. v = +self.v1
  208. self.assertTrue(isinstance(v, type(self.v1)))
  209. self.assertEqual(v.x, self.v1.x)
  210. self.assertEqual(v.y, self.v1.y)
  211. self.assertNotEqual(id(v), id(self.v1))
  212. v = -self.v1
  213. self.assertTrue(isinstance(v, type(self.v1)))
  214. self.assertEqual(v.x, -self.v1.x)
  215. self.assertEqual(v.y, -self.v1.y)
  216. self.assertNotEqual(id(v), id(self.v1))
  217. def testCompare(self):
  218. int_vec = Vector2(3, -2)
  219. flt_vec = Vector2(3.0, -2.0)
  220. zero_vec = Vector2(0, 0)
  221. self.assertEqual(int_vec == flt_vec, True)
  222. self.assertEqual(int_vec != flt_vec, False)
  223. self.assertEqual(int_vec != zero_vec, True)
  224. self.assertEqual(flt_vec == zero_vec, False)
  225. self.assertEqual(int_vec == (3, -2), True)
  226. self.assertEqual(int_vec != (3, -2), False)
  227. self.assertEqual(int_vec != [0, 0], True)
  228. self.assertEqual(int_vec == [0, 0], False)
  229. self.assertEqual(int_vec != 5, True)
  230. self.assertEqual(int_vec == 5, False)
  231. self.assertEqual(int_vec != [3, -2, 0], True)
  232. self.assertEqual(int_vec == [3, -2, 0], False)
  233. def testStr(self):
  234. v = Vector2(1.2, 3.4)
  235. self.assertEqual(str(v), "[1.2, 3.4]")
  236. def testRepr(self):
  237. v = Vector2(1.2, 3.4)
  238. self.assertEqual(v.__repr__(), "<Vector2(1.2, 3.4)>")
  239. self.assertEqual(v, Vector2(v.__repr__()))
  240. def testIter(self):
  241. it = self.v1.__iter__()
  242. if PY3:
  243. next_ = it.__next__
  244. else:
  245. next_ = it.next
  246. self.assertEqual(next_(), self.v1[0])
  247. self.assertEqual(next_(), self.v1[1])
  248. self.assertRaises(StopIteration, lambda : next_())
  249. it1 = self.v1.__iter__()
  250. it2 = self.v1.__iter__()
  251. self.assertNotEqual(id(it1), id(it2))
  252. self.assertEqual(id(it1), id(it1.__iter__()))
  253. self.assertEqual(list(it1), list(it2));
  254. self.assertEqual(list(self.v1.__iter__()), self.l1)
  255. idx = 0
  256. for val in self.v1:
  257. self.assertEqual(val, self.v1[idx])
  258. idx += 1
  259. def test_rotate(self):
  260. v1 = Vector2(1, 0)
  261. v2 = v1.rotate(90)
  262. v3 = v1.rotate(90 + 360)
  263. self.assertEqual(v1.x, 1)
  264. self.assertEqual(v1.y, 0)
  265. self.assertEqual(v2.x, 0)
  266. self.assertEqual(v2.y, 1)
  267. self.assertEqual(v3.x, v2.x)
  268. self.assertEqual(v3.y, v2.y)
  269. v1 = Vector2(-1, -1)
  270. v2 = v1.rotate(-90)
  271. self.assertEqual(v2.x, -1)
  272. self.assertEqual(v2.y, 1)
  273. v2 = v1.rotate(360)
  274. self.assertEqual(v1.x, v2.x)
  275. self.assertEqual(v1.y, v2.y)
  276. v2 = v1.rotate(0)
  277. self.assertEqual(v1.x, v2.x)
  278. self.assertEqual(v1.y, v2.y)
  279. # issue 214
  280. self.assertEqual(Vector2(0, 1).rotate(359.99999999), Vector2(0, 1))
  281. def test_rotate_ip(self):
  282. v = Vector2(1, 0)
  283. self.assertEqual(v.rotate_ip(90), None)
  284. self.assertEqual(v.x, 0)
  285. self.assertEqual(v.y, 1)
  286. v = Vector2(-1, -1)
  287. v.rotate_ip(-90)
  288. self.assertEqual(v.x, -1)
  289. self.assertEqual(v.y, 1)
  290. def test_normalize(self):
  291. v = self.v1.normalize()
  292. # length is 1
  293. self.assertAlmostEqual(v.x * v.x + v.y * v.y, 1.)
  294. # v1 is unchanged
  295. self.assertEqual(self.v1.x, self.l1[0])
  296. self.assertEqual(self.v1.y, self.l1[1])
  297. # v2 is paralell to v1
  298. self.assertAlmostEqual(self.v1.x * v.y - self.v1.y * v.x, 0.)
  299. self.assertRaises(ValueError, lambda : self.zeroVec.normalize())
  300. def test_normalize_ip(self):
  301. v = +self.v1
  302. # v has length != 1 before normalizing
  303. self.assertNotEqual(v.x * v.x + v.y * v.y, 1.)
  304. # inplace operations should return None
  305. self.assertEqual(v.normalize_ip(), None)
  306. # length is 1
  307. self.assertAlmostEqual(v.x * v.x + v.y * v.y, 1.)
  308. # v2 is paralell to v1
  309. self.assertAlmostEqual(self.v1.x * v.y - self.v1.y * v.x, 0.)
  310. self.assertRaises(ValueError, lambda : self.zeroVec.normalize_ip())
  311. def test_is_normalized(self):
  312. self.assertEqual(self.v1.is_normalized(), False)
  313. v = self.v1.normalize()
  314. self.assertEqual(v.is_normalized(), True)
  315. self.assertEqual(self.e2.is_normalized(), True)
  316. self.assertEqual(self.zeroVec.is_normalized(), False)
  317. def test_cross(self):
  318. self.assertEqual(self.v1.cross(self.v2),
  319. self.v1.x * self.v2.y - self.v1.y * self.v2.x)
  320. self.assertEqual(self.v1.cross(self.l2),
  321. self.v1.x * self.l2[1] - self.v1.y * self.l2[0])
  322. self.assertEqual(self.v1.cross(self.t2),
  323. self.v1.x * self.t2[1] - self.v1.y * self.t2[0])
  324. self.assertEqual(self.v1.cross(self.v2), -self.v2.cross(self.v1))
  325. self.assertEqual(self.v1.cross(self.v1), 0)
  326. def test_dot(self):
  327. self.assertAlmostEqual(self.v1.dot(self.v2),
  328. self.v1.x * self.v2.x + self.v1.y * self.v2.y)
  329. self.assertAlmostEqual(self.v1.dot(self.l2),
  330. self.v1.x * self.l2[0] + self.v1.y * self.l2[1])
  331. self.assertAlmostEqual(self.v1.dot(self.t2),
  332. self.v1.x * self.t2[0] + self.v1.y * self.t2[1])
  333. self.assertEqual(self.v1.dot(self.v2), self.v2.dot(self.v1))
  334. self.assertEqual(self.v1.dot(self.v2), self.v1 * self.v2)
  335. def test_angle_to(self):
  336. self.assertEqual(self.v1.rotate(self.v1.angle_to(self.v2)).normalize(),
  337. self.v2.normalize())
  338. self.assertEqual(Vector2(1, 1).angle_to((-1, 1)), 90)
  339. self.assertEqual(Vector2(1, 0).angle_to((0, -1)), -90)
  340. self.assertEqual(Vector2(1, 0).angle_to((-1, 1)), 135)
  341. self.assertEqual(abs(Vector2(1, 0).angle_to((-1, 0))), 180)
  342. def test_scale_to_length(self):
  343. v = Vector2(1, 1)
  344. v.scale_to_length(2.5)
  345. self.assertEqual(v, Vector2(2.5, 2.5) / math.sqrt(2))
  346. self.assertRaises(ValueError, lambda : self.zeroVec.scale_to_length(1))
  347. self.assertEqual(v.scale_to_length(0), None)
  348. self.assertEqual(v, self.zeroVec)
  349. def test_length(self):
  350. self.assertEqual(Vector2(3, 4).length(), 5)
  351. self.assertEqual(Vector2(-3, 4).length(), 5)
  352. self.assertEqual(self.zeroVec.length(), 0)
  353. def test_length_squared(self):
  354. self.assertEqual(Vector2(3, 4).length_squared(), 25)
  355. self.assertEqual(Vector2(-3, 4).length_squared(), 25)
  356. self.assertEqual(self.zeroVec.length_squared(), 0)
  357. def test_reflect(self):
  358. v = Vector2(1, -1)
  359. n = Vector2(0, 1)
  360. self.assertEqual(v.reflect(n), Vector2(1, 1))
  361. self.assertEqual(v.reflect(3*n), v.reflect(n))
  362. self.assertEqual(v.reflect(-v), -v)
  363. self.assertRaises(ValueError, lambda : v.reflect(self.zeroVec))
  364. def test_reflect_ip(self):
  365. v1 = Vector2(1, -1)
  366. v2 = Vector2(v1)
  367. n = Vector2(0, 1)
  368. self.assertEqual(v2.reflect_ip(n), None)
  369. self.assertEqual(v2, Vector2(1, 1))
  370. v2 = Vector2(v1)
  371. v2.reflect_ip(3*n)
  372. self.assertEqual(v2, v1.reflect(n))
  373. v2 = Vector2(v1)
  374. v2.reflect_ip(-v1)
  375. self.assertEqual(v2, -v1)
  376. self.assertRaises(ValueError, lambda : v2.reflect_ip(Vector2()))
  377. def test_distance_to(self):
  378. diff = self.v1 - self.v2
  379. self.assertEqual(self.e1.distance_to(self.e2), math.sqrt(2))
  380. self.assertAlmostEqual(self.v1.distance_to(self.v2),
  381. math.sqrt(diff.x * diff.x + diff.y * diff.y))
  382. self.assertEqual(self.v1.distance_to(self.v1), 0)
  383. self.assertEqual(self.v1.distance_to(self.v2),
  384. self.v2.distance_to(self.v1))
  385. def test_distance_squared_to(self):
  386. diff = self.v1 - self.v2
  387. self.assertEqual(self.e1.distance_squared_to(self.e2), 2)
  388. self.assertAlmostEqual(self.v1.distance_squared_to(self.v2),
  389. diff.x * diff.x + diff.y * diff.y)
  390. self.assertEqual(self.v1.distance_squared_to(self.v1), 0)
  391. self.assertEqual(self.v1.distance_squared_to(self.v2),
  392. self.v2.distance_squared_to(self.v1))
  393. def test_update(self):
  394. v = Vector2(3, 4)
  395. v.update(0)
  396. self.assertEqual(v, Vector2((0, 0)))
  397. v.update(5, 1)
  398. self.assertEqual(v, Vector2(5, 1))
  399. v.update((4, 1))
  400. self.assertNotEqual(v, Vector2((5, 1)))
  401. def test_swizzle(self):
  402. self.assertTrue(hasattr(pygame.math, "enable_swizzling"))
  403. self.assertTrue(hasattr(pygame.math, "disable_swizzling"))
  404. # swizzling not disabled by default
  405. pygame.math.disable_swizzling()
  406. self.assertRaises(AttributeError, lambda : self.v1.yx)
  407. pygame.math.enable_swizzling()
  408. self.assertEqual(self.v1.yx, (self.v1.y, self.v1.x))
  409. self.assertEqual(self.v1.xxyyxy, (self.v1.x, self.v1.x, self.v1.y,
  410. self.v1.y, self.v1.x, self.v1.y))
  411. self.v1.xy = self.t2
  412. self.assertEqual(self.v1, self.t2)
  413. self.v1.yx = self.t2
  414. self.assertEqual(self.v1, (self.t2[1], self.t2[0]))
  415. self.assertEqual(type(self.v1), Vector2)
  416. def invalidSwizzleX():
  417. Vector2().xx = (1, 2)
  418. def invalidSwizzleY():
  419. Vector2().yy = (1, 2)
  420. self.assertRaises(AttributeError, invalidSwizzleX)
  421. self.assertRaises(AttributeError, invalidSwizzleY)
  422. def invalidAssignment():
  423. Vector2().xy = 3
  424. self.assertRaises(TypeError, invalidAssignment)
  425. def unicodeAttribute():
  426. getattr(Vector2(), "ä")
  427. self.assertRaises(AttributeError, unicodeAttribute)
  428. def test_swizzle_return_types(self):
  429. self.assertEqual(type(self.v1.x), float)
  430. self.assertEqual(type(self.v1.xy), Vector2)
  431. self.assertEqual(type(self.v1.xyx), Vector3)
  432. # but we don't have vector4 or above... so tuple.
  433. self.assertEqual(type(self.v1.xyxy), tuple)
  434. self.assertEqual(type(self.v1.xyxyx), tuple)
  435. def test_elementwise(self):
  436. # behaviour for "elementwise op scalar"
  437. self.assertEqual(self.v1.elementwise() + self.s1,
  438. (self.v1.x + self.s1, self.v1.y + self.s1))
  439. self.assertEqual(self.v1.elementwise() - self.s1,
  440. (self.v1.x - self.s1, self.v1.y - self.s1))
  441. self.assertEqual(self.v1.elementwise() * self.s2,
  442. (self.v1.x * self.s2, self.v1.y * self.s2))
  443. self.assertEqual(self.v1.elementwise() / self.s2,
  444. (self.v1.x / self.s2, self.v1.y / self.s2))
  445. self.assertEqual(self.v1.elementwise() // self.s1,
  446. (self.v1.x // self.s1, self.v1.y // self.s1))
  447. self.assertEqual(self.v1.elementwise() ** self.s1,
  448. (self.v1.x ** self.s1, self.v1.y ** self.s1))
  449. self.assertEqual(self.v1.elementwise() % self.s1,
  450. (self.v1.x % self.s1, self.v1.y % self.s1))
  451. self.assertEqual(self.v1.elementwise() > self.s1,
  452. self.v1.x > self.s1 and self.v1.y > self.s1)
  453. self.assertEqual(self.v1.elementwise() < self.s1,
  454. self.v1.x < self.s1 and self.v1.y < self.s1)
  455. self.assertEqual(self.v1.elementwise() == self.s1,
  456. self.v1.x == self.s1 and self.v1.y == self.s1)
  457. self.assertEqual(self.v1.elementwise() != self.s1,
  458. self.v1.x != self.s1 and self.v1.y != self.s1)
  459. self.assertEqual(self.v1.elementwise() >= self.s1,
  460. self.v1.x >= self.s1 and self.v1.y >= self.s1)
  461. self.assertEqual(self.v1.elementwise() <= self.s1,
  462. self.v1.x <= self.s1 and self.v1.y <= self.s1)
  463. self.assertEqual(self.v1.elementwise() != self.s1,
  464. self.v1.x != self.s1 and self.v1.y != self.s1)
  465. # behaviour for "scalar op elementwise"
  466. self.assertEqual(5 + self.v1.elementwise(), Vector2(5, 5) + self.v1)
  467. self.assertEqual(3.5 - self.v1.elementwise(), Vector2(3.5, 3.5) - self.v1)
  468. self.assertEqual(7.5 * self.v1.elementwise() , 7.5 * self.v1)
  469. self.assertEqual(-3.5 / self.v1.elementwise(), (-3.5 / self.v1.x, -3.5 / self.v1.y))
  470. self.assertEqual(-3.5 // self.v1.elementwise(), (-3.5 // self.v1.x, -3.5 // self.v1.y))
  471. self.assertEqual(-3.5 ** self.v1.elementwise(), (-3.5 ** self.v1.x, -3.5 ** self.v1.y))
  472. self.assertEqual(3 % self.v1.elementwise(), (3 % self.v1.x, 3 % self.v1.y))
  473. self.assertEqual(2 < self.v1.elementwise(), 2 < self.v1.x and 2 < self.v1.y)
  474. self.assertEqual(2 > self.v1.elementwise(), 2 > self.v1.x and 2 > self.v1.y)
  475. self.assertEqual(1 == self.v1.elementwise(), 1 == self.v1.x and 1 == self.v1.y)
  476. self.assertEqual(1 != self.v1.elementwise(), 1 != self.v1.x and 1 != self.v1.y)
  477. self.assertEqual(2 <= self.v1.elementwise(), 2 <= self.v1.x and 2 <= self.v1.y)
  478. self.assertEqual(-7 >= self.v1.elementwise(), -7 >= self.v1.x and -7 >= self.v1.y)
  479. self.assertEqual(-7 != self.v1.elementwise(), -7 != self.v1.x and -7 != self.v1.y)
  480. # behaviour for "elementwise op vector"
  481. self.assertEqual(type(self.v1.elementwise() * self.v2), type(self.v1))
  482. self.assertEqual(self.v1.elementwise() + self.v2, self.v1 + self.v2)
  483. self.assertEqual(self.v1.elementwise() + self.v2, self.v1 + self.v2)
  484. self.assertEqual(self.v1.elementwise() - self.v2, self.v1 - self.v2)
  485. self.assertEqual(self.v1.elementwise() * self.v2, (self.v1.x * self.v2.x, self.v1.y * self.v2.y))
  486. self.assertEqual(self.v1.elementwise() / self.v2, (self.v1.x / self.v2.x, self.v1.y / self.v2.y))
  487. self.assertEqual(self.v1.elementwise() // self.v2, (self.v1.x // self.v2.x, self.v1.y // self.v2.y))
  488. self.assertEqual(self.v1.elementwise() ** self.v2, (self.v1.x ** self.v2.x, self.v1.y ** self.v2.y))
  489. self.assertEqual(self.v1.elementwise() % self.v2, (self.v1.x % self.v2.x, self.v1.y % self.v2.y))
  490. self.assertEqual(self.v1.elementwise() > self.v2, self.v1.x > self.v2.x and self.v1.y > self.v2.y)
  491. self.assertEqual(self.v1.elementwise() < self.v2, self.v1.x < self.v2.x and self.v1.y < self.v2.y)
  492. self.assertEqual(self.v1.elementwise() >= self.v2, self.v1.x >= self.v2.x and self.v1.y >= self.v2.y)
  493. self.assertEqual(self.v1.elementwise() <= self.v2, self.v1.x <= self.v2.x and self.v1.y <= self.v2.y)
  494. self.assertEqual(self.v1.elementwise() == self.v2, self.v1.x == self.v2.x and self.v1.y == self.v2.y)
  495. self.assertEqual(self.v1.elementwise() != self.v2, self.v1.x != self.v2.x and self.v1.y != self.v2.y)
  496. # behaviour for "vector op elementwise"
  497. self.assertEqual(self.v2 + self.v1.elementwise(), self.v2 + self.v1)
  498. self.assertEqual(self.v2 - self.v1.elementwise(), self.v2 - self.v1)
  499. self.assertEqual(self.v2 * self.v1.elementwise(), (self.v2.x * self.v1.x, self.v2.y * self.v1.y))
  500. self.assertEqual(self.v2 / self.v1.elementwise(), (self.v2.x / self.v1.x, self.v2.y / self.v1.y))
  501. self.assertEqual(self.v2 // self.v1.elementwise(), (self.v2.x // self.v1.x, self.v2.y // self.v1.y))
  502. self.assertEqual(self.v2 ** self.v1.elementwise(), (self.v2.x ** self.v1.x, self.v2.y ** self.v1.y))
  503. self.assertEqual(self.v2 % self.v1.elementwise(), (self.v2.x % self.v1.x, self.v2.y % self.v1.y))
  504. self.assertEqual(self.v2 < self.v1.elementwise(), self.v2.x < self.v1.x and self.v2.y < self.v1.y)
  505. self.assertEqual(self.v2 > self.v1.elementwise(), self.v2.x > self.v1.x and self.v2.y > self.v1.y)
  506. self.assertEqual(self.v2 <= self.v1.elementwise(), self.v2.x <= self.v1.x and self.v2.y <= self.v1.y)
  507. self.assertEqual(self.v2 >= self.v1.elementwise(), self.v2.x >= self.v1.x and self.v2.y >= self.v1.y)
  508. self.assertEqual(self.v2 == self.v1.elementwise(), self.v2.x == self.v1.x and self.v2.y == self.v1.y)
  509. self.assertEqual(self.v2 != self.v1.elementwise(), self.v2.x != self.v1.x and self.v2.y != self.v1.y)
  510. # behaviour for "elementwise op elementwise"
  511. self.assertEqual(self.v2.elementwise() + self.v1.elementwise(), self.v2 + self.v1)
  512. self.assertEqual(self.v2.elementwise() - self.v1.elementwise(), self.v2 - self.v1)
  513. self.assertEqual(self.v2.elementwise() * self.v1.elementwise(), (self.v2.x * self.v1.x, self.v2.y * self.v1.y))
  514. self.assertEqual(self.v2.elementwise() / self.v1.elementwise(), (self.v2.x / self.v1.x, self.v2.y / self.v1.y))
  515. self.assertEqual(self.v2.elementwise() // self.v1.elementwise(), (self.v2.x // self.v1.x, self.v2.y // self.v1.y))
  516. self.assertEqual(self.v2.elementwise() ** self.v1.elementwise(), (self.v2.x ** self.v1.x, self.v2.y ** self.v1.y))
  517. self.assertEqual(self.v2.elementwise() % self.v1.elementwise(), (self.v2.x % self.v1.x, self.v2.y % self.v1.y))
  518. self.assertEqual(self.v2.elementwise() < self.v1.elementwise(), self.v2.x < self.v1.x and self.v2.y < self.v1.y)
  519. self.assertEqual(self.v2.elementwise() > self.v1.elementwise(), self.v2.x > self.v1.x and self.v2.y > self.v1.y)
  520. self.assertEqual(self.v2.elementwise() <= self.v1.elementwise(), self.v2.x <= self.v1.x and self.v2.y <= self.v1.y)
  521. self.assertEqual(self.v2.elementwise() >= self.v1.elementwise(), self.v2.x >= self.v1.x and self.v2.y >= self.v1.y)
  522. self.assertEqual(self.v2.elementwise() == self.v1.elementwise(), self.v2.x == self.v1.x and self.v2.y == self.v1.y)
  523. self.assertEqual(self.v2.elementwise() != self.v1.elementwise(), self.v2.x != self.v1.x and self.v2.y != self.v1.y)
  524. # other behaviour
  525. self.assertEqual(abs(self.v1.elementwise()), (abs(self.v1.x), abs(self.v1.y)))
  526. self.assertEqual(-self.v1.elementwise(), -self.v1)
  527. self.assertEqual(+self.v1.elementwise(), +self.v1)
  528. self.assertEqual(bool(self.v1.elementwise()), bool(self.v1))
  529. self.assertEqual(bool(Vector2().elementwise()), bool(Vector2()))
  530. self.assertEqual(self.zeroVec.elementwise() ** 0, (1, 1))
  531. self.assertRaises(ValueError, lambda : pow(Vector2(-1, 0).elementwise(), 1.2))
  532. self.assertRaises(ZeroDivisionError, lambda : self.zeroVec.elementwise() ** -1)
  533. def test_elementwise(self):
  534. v1 = self.v1
  535. v2 = self.v2
  536. s1 = self.s1
  537. s2 = self.s2
  538. # behaviour for "elementwise op scalar"
  539. self.assertEqual(v1.elementwise() + s1, (v1.x + s1, v1.y + s1))
  540. self.assertEqual(v1.elementwise() - s1, (v1.x - s1, v1.y - s1))
  541. self.assertEqual(v1.elementwise() * s2, (v1.x * s2, v1.y * s2))
  542. self.assertEqual(v1.elementwise() / s2, (v1.x / s2, v1.y / s2))
  543. self.assertEqual(v1.elementwise() // s1, (v1.x // s1, v1.y // s1))
  544. self.assertEqual(v1.elementwise() ** s1, (v1.x ** s1, v1.y ** s1))
  545. self.assertEqual(v1.elementwise() % s1, (v1.x % s1, v1.y % s1))
  546. self.assertEqual(v1.elementwise() > s1, v1.x > s1 and v1.y > s1)
  547. self.assertEqual(v1.elementwise() < s1, v1.x < s1 and v1.y < s1)
  548. self.assertEqual(v1.elementwise() == s1, v1.x == s1 and v1.y == s1)
  549. self.assertEqual(v1.elementwise() != s1, v1.x != s1 and v1.y != s1)
  550. self.assertEqual(v1.elementwise() >= s1, v1.x >= s1 and v1.y >= s1)
  551. self.assertEqual(v1.elementwise() <= s1, v1.x <= s1 and v1.y <= s1)
  552. self.assertEqual(v1.elementwise() != s1, v1.x != s1 and v1.y != s1)
  553. # behaviour for "scalar op elementwise"
  554. self.assertEqual(s1 + v1.elementwise(), (s1 + v1.x, s1 + v1.y))
  555. self.assertEqual(s1 - v1.elementwise(), (s1 - v1.x, s1 - v1.y))
  556. self.assertEqual(s1 * v1.elementwise(), (s1 * v1.x, s1 * v1.y))
  557. self.assertEqual(s1 / v1.elementwise(), (s1 / v1.x, s1 / v1.y))
  558. self.assertEqual(s1 // v1.elementwise(), (s1 // v1.x, s1 // v1.y))
  559. self.assertEqual(s1 ** v1.elementwise(), (s1 ** v1.x, s1 ** v1.y))
  560. self.assertEqual(s1 % v1.elementwise(), (s1 % v1.x, s1 % v1.y))
  561. self.assertEqual(s1 < v1.elementwise(), s1 < v1.x and s1 < v1.y)
  562. self.assertEqual(s1 > v1.elementwise(), s1 > v1.x and s1 > v1.y)
  563. self.assertEqual(s1 == v1.elementwise(), s1 == v1.x and s1 == v1.y)
  564. self.assertEqual(s1 != v1.elementwise(), s1 != v1.x and s1 != v1.y)
  565. self.assertEqual(s1 <= v1.elementwise(), s1 <= v1.x and s1 <= v1.y)
  566. self.assertEqual(s1 >= v1.elementwise(), s1 >= v1.x and s1 >= v1.y)
  567. self.assertEqual(s1 != v1.elementwise(), s1 != v1.x and s1 != v1.y)
  568. # behaviour for "elementwise op vector"
  569. self.assertEqual(type(v1.elementwise() * v2), type(v1))
  570. self.assertEqual(v1.elementwise() + v2, v1 + v2)
  571. self.assertEqual(v1.elementwise() - v2, v1 - v2)
  572. self.assertEqual(v1.elementwise() * v2, (v1.x * v2.x, v1.y * v2.y))
  573. self.assertEqual(v1.elementwise() / v2, (v1.x / v2.x, v1.y / v2.y))
  574. self.assertEqual(v1.elementwise() // v2, (v1.x // v2.x, v1.y // v2.y))
  575. self.assertEqual(v1.elementwise() ** v2, (v1.x ** v2.x, v1.y ** v2.y))
  576. self.assertEqual(v1.elementwise() % v2, (v1.x % v2.x, v1.y % v2.y))
  577. self.assertEqual(v1.elementwise() > v2, v1.x > v2.x and v1.y > v2.y)
  578. self.assertEqual(v1.elementwise() < v2, v1.x < v2.x and v1.y < v2.y)
  579. self.assertEqual(v1.elementwise() >= v2, v1.x >= v2.x and v1.y >= v2.y)
  580. self.assertEqual(v1.elementwise() <= v2, v1.x <= v2.x and v1.y <= v2.y)
  581. self.assertEqual(v1.elementwise() == v2, v1.x == v2.x and v1.y == v2.y)
  582. self.assertEqual(v1.elementwise() != v2, v1.x != v2.x and v1.y != v2.y)
  583. # behaviour for "vector op elementwise"
  584. self.assertEqual(v2 + v1.elementwise(), v2 + v1)
  585. self.assertEqual(v2 - v1.elementwise(), v2 - v1)
  586. self.assertEqual(v2 * v1.elementwise(), (v2.x * v1.x, v2.y * v1.y))
  587. self.assertEqual(v2 / v1.elementwise(), (v2.x / v1.x, v2.y / v1.y))
  588. self.assertEqual(v2 // v1.elementwise(), (v2.x // v1.x, v2.y // v1.y))
  589. self.assertEqual(v2 ** v1.elementwise(), (v2.x ** v1.x, v2.y ** v1.y))
  590. self.assertEqual(v2 % v1.elementwise(), (v2.x % v1.x, v2.y % v1.y))
  591. self.assertEqual(v2 < v1.elementwise(), v2.x < v1.x and v2.y < v1.y)
  592. self.assertEqual(v2 > v1.elementwise(), v2.x > v1.x and v2.y > v1.y)
  593. self.assertEqual(v2 <= v1.elementwise(), v2.x <= v1.x and v2.y <= v1.y)
  594. self.assertEqual(v2 >= v1.elementwise(), v2.x >= v1.x and v2.y >= v1.y)
  595. self.assertEqual(v2 == v1.elementwise(), v2.x == v1.x and v2.y == v1.y)
  596. self.assertEqual(v2 != v1.elementwise(), v2.x != v1.x and v2.y != v1.y)
  597. # behaviour for "elementwise op elementwise"
  598. self.assertEqual(v2.elementwise() + v1.elementwise(), v2 + v1)
  599. self.assertEqual(v2.elementwise() - v1.elementwise(), v2 - v1)
  600. self.assertEqual(v2.elementwise() * v1.elementwise(), (v2.x * v1.x, v2.y * v1.y))
  601. self.assertEqual(v2.elementwise() / v1.elementwise(), (v2.x / v1.x, v2.y / v1.y))
  602. self.assertEqual(v2.elementwise() // v1.elementwise(), (v2.x // v1.x, v2.y // v1.y))
  603. self.assertEqual(v2.elementwise() ** v1.elementwise(), (v2.x ** v1.x, v2.y ** v1.y))
  604. self.assertEqual(v2.elementwise() % v1.elementwise(), (v2.x % v1.x, v2.y % v1.y))
  605. self.assertEqual(v2.elementwise() < v1.elementwise(), v2.x < v1.x and v2.y < v1.y)
  606. self.assertEqual(v2.elementwise() > v1.elementwise(), v2.x > v1.x and v2.y > v1.y)
  607. self.assertEqual(v2.elementwise() <= v1.elementwise(), v2.x <= v1.x and v2.y <= v1.y)
  608. self.assertEqual(v2.elementwise() >= v1.elementwise(), v2.x >= v1.x and v2.y >= v1.y)
  609. self.assertEqual(v2.elementwise() == v1.elementwise(), v2.x == v1.x and v2.y == v1.y)
  610. self.assertEqual(v2.elementwise() != v1.elementwise(), v2.x != v1.x and v2.y != v1.y)
  611. # other behaviour
  612. self.assertEqual(abs(v1.elementwise()), (abs(v1.x), abs(v1.y)))
  613. self.assertEqual(-v1.elementwise(), -v1)
  614. self.assertEqual(+v1.elementwise(), +v1)
  615. self.assertEqual(bool(v1.elementwise()), bool(v1))
  616. self.assertEqual(bool(Vector2().elementwise()), bool(Vector2()))
  617. self.assertEqual(self.zeroVec.elementwise() ** 0, (1, 1))
  618. self.assertRaises(ValueError, lambda : pow(Vector2(-1, 0).elementwise(), 1.2))
  619. self.assertRaises(ZeroDivisionError, lambda : self.zeroVec.elementwise() ** -1)
  620. self.assertRaises(ZeroDivisionError, lambda : self.zeroVec.elementwise() ** -1)
  621. self.assertRaises(ZeroDivisionError, lambda : Vector2(1,1).elementwise() / 0)
  622. self.assertRaises(ZeroDivisionError, lambda : Vector2(1,1).elementwise() // 0)
  623. self.assertRaises(ZeroDivisionError, lambda : Vector2(1,1).elementwise() % 0)
  624. self.assertRaises(ZeroDivisionError, lambda : Vector2(1,1).elementwise() / self.zeroVec)
  625. self.assertRaises(ZeroDivisionError, lambda : Vector2(1,1).elementwise() // self.zeroVec)
  626. self.assertRaises(ZeroDivisionError, lambda : Vector2(1,1).elementwise() % self.zeroVec)
  627. self.assertRaises(ZeroDivisionError, lambda : 2 / self.zeroVec.elementwise())
  628. self.assertRaises(ZeroDivisionError, lambda : 2 // self.zeroVec.elementwise())
  629. self.assertRaises(ZeroDivisionError, lambda : 2 % self.zeroVec.elementwise())
  630. def test_slerp(self):
  631. self.assertRaises(ValueError, lambda : self.zeroVec.slerp(self.v1, .5))
  632. self.assertRaises(ValueError, lambda : self.v1.slerp(self.zeroVec, .5))
  633. self.assertRaises(ValueError,
  634. lambda : self.zeroVec.slerp(self.zeroVec, .5))
  635. v1 = Vector2(1, 0)
  636. v2 = Vector2(0, 1)
  637. steps = 10
  638. angle_step = v1.angle_to(v2) / steps
  639. for i, u in ((i, v1.slerp(v2, i/float(steps))) for i in range(steps+1)):
  640. self.assertAlmostEqual(u.length(), 1)
  641. self.assertAlmostEqual(v1.angle_to(u), i * angle_step)
  642. self.assertEqual(u, v2)
  643. v1 = Vector2(100, 0)
  644. v2 = Vector2(0, 10)
  645. radial_factor = v2.length() / v1.length()
  646. for i, u in ((i, v1.slerp(v2, -i/float(steps))) for i in range(steps+1)):
  647. self.assertAlmostEqual(u.length(), (v2.length() - v1.length()) * (float(i)/steps) + v1.length())
  648. self.assertEqual(u, v2)
  649. self.assertEqual(v1.slerp(v1, .5), v1)
  650. self.assertEqual(v2.slerp(v2, .5), v2)
  651. self.assertRaises(ValueError, lambda : v1.slerp(-v1, 0.5))
  652. def test_lerp(self):
  653. v1 = Vector2(0, 0)
  654. v2 = Vector2(10, 10)
  655. self.assertEqual(v1.lerp(v2, 0.5), (5, 5))
  656. self.assertRaises(ValueError, lambda : v1.lerp(v2, 2.5))
  657. v1 = Vector2(-10, -5)
  658. v2 = Vector2(10, 10)
  659. self.assertEqual(v1.lerp(v2, 0.5), (0, 2.5))
  660. def test_polar(self):
  661. v = Vector2()
  662. v.from_polar(self.v1.as_polar())
  663. self.assertEqual(self.v1, v)
  664. self.assertEqual(self.e1.as_polar(), (1, 0))
  665. self.assertEqual(self.e2.as_polar(), (1, 90))
  666. self.assertEqual((2 * self.e2).as_polar(), (2, 90))
  667. self.assertRaises(TypeError, lambda : v.from_polar((None, None)))
  668. self.assertRaises(TypeError, lambda : v.from_polar("ab"))
  669. self.assertRaises(TypeError, lambda : v.from_polar((None, 1)))
  670. self.assertRaises(TypeError, lambda : v.from_polar((1, 2, 3)))
  671. self.assertRaises(TypeError, lambda : v.from_polar((1,)))
  672. self.assertRaises(TypeError, lambda : v.from_polar(1, 2))
  673. v.from_polar((.5, 90))
  674. self.assertEqual(v, .5 * self.e2)
  675. v.from_polar((1, 0))
  676. self.assertEqual(v, self.e1)
  677. def test_subclass_operation(self):
  678. class Vector(pygame.math.Vector2):
  679. pass
  680. vec = Vector()
  681. vec_a = Vector(2, 0)
  682. vec_b = Vector(0, 1)
  683. vec_a + vec_b
  684. vec_a *= 2
  685. class Vector3TypeTest(unittest.TestCase):
  686. def setUp(self):
  687. self.zeroVec = Vector3()
  688. self.e1 = Vector3(1, 0, 0)
  689. self.e2 = Vector3(0, 1, 0)
  690. self.e3 = Vector3(0, 0, 1)
  691. self.t1 = (1.2, 3.4, 9.6)
  692. self.l1 = list(self.t1)
  693. self.v1 = Vector3(self.t1)
  694. self.t2 = (5.6, 7.8, 2.1)
  695. self.l2 = list(self.t2)
  696. self.v2 = Vector3(self.t2)
  697. self.s1 = 5.6
  698. self.s2 = 7.8
  699. def testConstructionDefault(self):
  700. v = Vector3()
  701. self.assertEqual(v.x, 0.)
  702. self.assertEqual(v.y, 0.)
  703. self.assertEqual(v.z, 0.)
  704. def testConstructionXYZ(self):
  705. v = Vector3(1.2, 3.4, 9.6)
  706. self.assertEqual(v.x, 1.2)
  707. self.assertEqual(v.y, 3.4)
  708. self.assertEqual(v.z, 9.6)
  709. def testConstructionTuple(self):
  710. v = Vector3((1.2, 3.4, 9.6))
  711. self.assertEqual(v.x, 1.2)
  712. self.assertEqual(v.y, 3.4)
  713. self.assertEqual(v.z, 9.6)
  714. def testConstructionList(self):
  715. v = Vector3([1.2, 3.4, -9.6])
  716. self.assertEqual(v.x, 1.2)
  717. self.assertEqual(v.y, 3.4)
  718. self.assertEqual(v.z, -9.6)
  719. def testConstructionVector3(self):
  720. v = Vector3(Vector3(1.2, 3.4, -9.6))
  721. self.assertEqual(v.x, 1.2)
  722. self.assertEqual(v.y, 3.4)
  723. self.assertEqual(v.z, -9.6)
  724. def testConstructionScalar(self):
  725. v = Vector3(1)
  726. self.assertEqual(v.x, 1.)
  727. self.assertEqual(v.y, 1.)
  728. self.assertEqual(v.z, 1.)
  729. def testConstructionScalarKeywords(self):
  730. v = Vector3(x=1)
  731. self.assertEqual(v.x, 1.)
  732. self.assertEqual(v.y, 1.)
  733. self.assertEqual(v.z, 1.)
  734. def testConstructionKeywords(self):
  735. v = Vector3(x=1, y=2, z=3)
  736. self.assertEqual(v.x, 1.)
  737. self.assertEqual(v.y, 2.)
  738. self.assertEqual(v.z, 3.)
  739. def testConstructionMissing(self):
  740. def assign_missing_value():
  741. v = Vector3(1, 2)
  742. self.assertRaises(ValueError, assign_missing_value)
  743. def assign_missing_value():
  744. v = Vector3(x=1, y=2)
  745. self.assertRaises(ValueError, assign_missing_value)
  746. def testAttributAccess(self):
  747. tmp = self.v1.x
  748. self.assertEqual(tmp, self.v1.x)
  749. self.assertEqual(tmp, self.v1[0])
  750. tmp = self.v1.y
  751. self.assertEqual(tmp, self.v1.y)
  752. self.assertEqual(tmp, self.v1[1])
  753. tmp = self.v1.z
  754. self.assertEqual(tmp, self.v1.z)
  755. self.assertEqual(tmp, self.v1[2])
  756. self.v1.x = 3.141
  757. self.assertEqual(self.v1.x, 3.141)
  758. self.v1.y = 3.141
  759. self.assertEqual(self.v1.y, 3.141)
  760. self.v1.z = 3.141
  761. self.assertEqual(self.v1.z, 3.141)
  762. def assign_nonfloat():
  763. v = Vector2()
  764. v.x = "spam"
  765. self.assertRaises(TypeError, assign_nonfloat)
  766. def testSequence(self):
  767. v = Vector3(1.2, 3.4, -9.6)
  768. self.assertEqual(len(v), 3)
  769. self.assertEqual(v[0], 1.2)
  770. self.assertEqual(v[1], 3.4)
  771. self.assertEqual(v[2], -9.6)
  772. self.assertRaises(IndexError, lambda : v[3])
  773. self.assertEqual(v[-1], -9.6)
  774. self.assertEqual(v[-2], 3.4)
  775. self.assertEqual(v[-3], 1.2)
  776. self.assertRaises(IndexError, lambda : v[-4])
  777. self.assertEqual(v[:], [1.2, 3.4, -9.6])
  778. self.assertEqual(v[1:], [3.4, -9.6])
  779. self.assertEqual(v[:1], [1.2])
  780. self.assertEqual(v[:-1], [1.2, 3.4])
  781. self.assertEqual(v[1:2], [3.4])
  782. self.assertEqual(list(v), [1.2, 3.4, -9.6])
  783. self.assertEqual(tuple(v), (1.2, 3.4, -9.6))
  784. v[0] = 5.6
  785. v[1] = 7.8
  786. v[2] = -2.1
  787. self.assertEqual(v.x, 5.6)
  788. self.assertEqual(v.y, 7.8)
  789. self.assertEqual(v.z, -2.1)
  790. v[:] = [9.1, 11.12, -13.41]
  791. self.assertEqual(v.x, 9.1)
  792. self.assertEqual(v.y, 11.12)
  793. self.assertEqual(v.z, -13.41)
  794. def overpopulate():
  795. v = Vector3()
  796. v[:] = [1, 2, 3, 4]
  797. self.assertRaises(ValueError, overpopulate)
  798. def underpopulate():
  799. v = Vector3()
  800. v[:] = [1]
  801. self.assertRaises(ValueError, underpopulate)
  802. def assign_nonfloat():
  803. v = Vector2()
  804. v[0] = "spam"
  805. self.assertRaises(TypeError, assign_nonfloat)
  806. def testExtendedSlicing(self):
  807. # deletion
  808. def delSlice(vec, start=None, stop=None, step=None):
  809. if start is not None and stop is not None and step is not None:
  810. del vec[start:stop:step]
  811. elif start is not None and stop is None and step is not None:
  812. del vec[start::step]
  813. elif start is None and stop is None and step is not None:
  814. del vec[::step]
  815. v = Vector3(self.v1)
  816. self.assertRaises(TypeError, delSlice, v, None, None, 2)
  817. self.assertRaises(TypeError, delSlice, v, 1, None, 2)
  818. self.assertRaises(TypeError, delSlice, v, 1, 2, 1)
  819. # assignment
  820. v = Vector3(self.v1)
  821. v[::2] = [-1.1, -2.2]
  822. self.assertEqual(v, [-1.1, self.v1.y, -2.2])
  823. v = Vector3(self.v1)
  824. v[::-2] = [10, 20]
  825. self.assertEqual(v, [20, self.v1.y, 10])
  826. v = Vector3(self.v1)
  827. v[::-1] = v
  828. self.assertEqual(v, [self.v1.z, self.v1.y, self.v1.x])
  829. a = Vector3(self.v1)
  830. b = Vector3(self.v1)
  831. c = Vector3(self.v1)
  832. a[1:2] = [2.2]
  833. b[slice(1,2)] = [2.2]
  834. c[1:2:] = (2.2,)
  835. self.assertEqual(a, b)
  836. self.assertEqual(a, c)
  837. self.assertEqual(type(a), type(self.v1))
  838. self.assertEqual(type(b), type(self.v1))
  839. self.assertEqual(type(c), type(self.v1))
  840. def testAdd(self):
  841. v3 = self.v1 + self.v2
  842. self.assertTrue(isinstance(v3, type(self.v1)))
  843. self.assertEqual(v3.x, self.v1.x + self.v2.x)
  844. self.assertEqual(v3.y, self.v1.y + self.v2.y)
  845. self.assertEqual(v3.z, self.v1.z + self.v2.z)
  846. v3 = self.v1 + self.t2
  847. self.assertTrue(isinstance(v3, type(self.v1)))
  848. self.assertEqual(v3.x, self.v1.x + self.t2[0])
  849. self.assertEqual(v3.y, self.v1.y + self.t2[1])
  850. self.assertEqual(v3.z, self.v1.z + self.t2[2])
  851. v3 = self.v1 + self.l2
  852. self.assertTrue(isinstance(v3, type(self.v1)))
  853. self.assertEqual(v3.x, self.v1.x + self.l2[0])
  854. self.assertEqual(v3.y, self.v1.y + self.l2[1])
  855. self.assertEqual(v3.z, self.v1.z + self.l2[2])
  856. v3 = self.t1 + self.v2
  857. self.assertTrue(isinstance(v3, type(self.v1)))
  858. self.assertEqual(v3.x, self.t1[0] + self.v2.x)
  859. self.assertEqual(v3.y, self.t1[1] + self.v2.y)
  860. self.assertEqual(v3.z, self.t1[2] + self.v2.z)
  861. v3 = self.l1 + self.v2
  862. self.assertTrue(isinstance(v3, type(self.v1)))
  863. self.assertEqual(v3.x, self.l1[0] + self.v2.x)
  864. self.assertEqual(v3.y, self.l1[1] + self.v2.y)
  865. self.assertEqual(v3.z, self.l1[2] + self.v2.z)
  866. def testSub(self):
  867. v3 = self.v1 - self.v2
  868. self.assertTrue(isinstance(v3, type(self.v1)))
  869. self.assertEqual(v3.x, self.v1.x - self.v2.x)
  870. self.assertEqual(v3.y, self.v1.y - self.v2.y)
  871. self.assertEqual(v3.z, self.v1.z - self.v2.z)
  872. v3 = self.v1 - self.t2
  873. self.assertTrue(isinstance(v3, type(self.v1)))
  874. self.assertEqual(v3.x, self.v1.x - self.t2[0])
  875. self.assertEqual(v3.y, self.v1.y - self.t2[1])
  876. self.assertEqual(v3.z, self.v1.z - self.t2[2])
  877. v3 = self.v1 - self.l2
  878. self.assertTrue(isinstance(v3, type(self.v1)))
  879. self.assertEqual(v3.x, self.v1.x - self.l2[0])
  880. self.assertEqual(v3.y, self.v1.y - self.l2[1])
  881. self.assertEqual(v3.z, self.v1.z - self.l2[2])
  882. v3 = self.t1 - self.v2
  883. self.assertTrue(isinstance(v3, type(self.v1)))
  884. self.assertEqual(v3.x, self.t1[0] - self.v2.x)
  885. self.assertEqual(v3.y, self.t1[1] - self.v2.y)
  886. self.assertEqual(v3.z, self.t1[2] - self.v2.z)
  887. v3 = self.l1 - self.v2
  888. self.assertTrue(isinstance(v3, type(self.v1)))
  889. self.assertEqual(v3.x, self.l1[0] - self.v2.x)
  890. self.assertEqual(v3.y, self.l1[1] - self.v2.y)
  891. self.assertEqual(v3.z, self.l1[2] - self.v2.z)
  892. def testScalarMultiplication(self):
  893. v = self.s1 * self.v1
  894. self.assertTrue(isinstance(v, type(self.v1)))
  895. self.assertEqual(v.x, self.s1 * self.v1.x)
  896. self.assertEqual(v.y, self.s1 * self.v1.y)
  897. self.assertEqual(v.z, self.s1 * self.v1.z)
  898. v = self.v1 * self.s2
  899. self.assertEqual(v.x, self.v1.x * self.s2)
  900. self.assertEqual(v.y, self.v1.y * self.s2)
  901. self.assertEqual(v.z, self.v1.z * self.s2)
  902. def testScalarDivision(self):
  903. v = self.v1 / self.s1
  904. self.assertTrue(isinstance(v, type(self.v1)))
  905. self.assertAlmostEqual(v.x, self.v1.x / self.s1)
  906. self.assertAlmostEqual(v.y, self.v1.y / self.s1)
  907. self.assertAlmostEqual(v.z, self.v1.z / self.s1)
  908. v = self.v1 // self.s2
  909. self.assertTrue(isinstance(v, type(self.v1)))
  910. self.assertEqual(v.x, self.v1.x // self.s2)
  911. self.assertEqual(v.y, self.v1.y // self.s2)
  912. self.assertEqual(v.z, self.v1.z // self.s2)
  913. def testBool(self):
  914. self.assertEqual(bool(self.zeroVec), False)
  915. self.assertEqual(bool(self.v1), True)
  916. self.assertTrue(not self.zeroVec)
  917. self.assertTrue(self.v1)
  918. def testUnary(self):
  919. v = +self.v1
  920. self.assertTrue(isinstance(v, type(self.v1)))
  921. self.assertEqual(v.x, self.v1.x)
  922. self.assertEqual(v.y, self.v1.y)
  923. self.assertEqual(v.z, self.v1.z)
  924. self.assertNotEqual(id(v), id(self.v1))
  925. v = -self.v1
  926. self.assertTrue(isinstance(v, type(self.v1)))
  927. self.assertEqual(v.x, -self.v1.x)
  928. self.assertEqual(v.y, -self.v1.y)
  929. self.assertEqual(v.z, -self.v1.z)
  930. self.assertNotEqual(id(v), id(self.v1))
  931. def testCompare(self):
  932. int_vec = Vector3(3, -2, 13)
  933. flt_vec = Vector3(3.0, -2.0, 13.)
  934. zero_vec = Vector3(0, 0, 0)
  935. self.assertEqual(int_vec == flt_vec, True)
  936. self.assertEqual(int_vec != flt_vec, False)
  937. self.assertEqual(int_vec != zero_vec, True)
  938. self.assertEqual(flt_vec == zero_vec, False)
  939. self.assertEqual(int_vec == (3, -2, 13), True)
  940. self.assertEqual(int_vec != (3, -2, 13), False)
  941. self.assertEqual(int_vec != [0, 0], True)
  942. self.assertEqual(int_vec == [0, 0], False)
  943. self.assertEqual(int_vec != 5, True)
  944. self.assertEqual(int_vec == 5, False)
  945. self.assertEqual(int_vec != [3, -2, 0, 1], True)
  946. self.assertEqual(int_vec == [3, -2, 0, 1], False)
  947. def testStr(self):
  948. v = Vector3(1.2, 3.4, 5.6)
  949. self.assertEqual(str(v), "[1.2, 3.4, 5.6]")
  950. def testRepr(self):
  951. v = Vector3(1.2, 3.4, -9.6)
  952. self.assertEqual(v.__repr__(), "<Vector3(1.2, 3.4, -9.6)>")
  953. self.assertEqual(v, Vector3(v.__repr__()))
  954. def testIter(self):
  955. it = self.v1.__iter__()
  956. if PY3:
  957. next_ = it.__next__
  958. else:
  959. next_ = it.next
  960. self.assertEqual(next_(), self.v1[0])
  961. self.assertEqual(next_(), self.v1[1])
  962. self.assertEqual(next_(), self.v1[2])
  963. self.assertRaises(StopIteration, lambda : next_())
  964. it1 = self.v1.__iter__()
  965. it2 = self.v1.__iter__()
  966. self.assertNotEqual(id(it1), id(it2))
  967. self.assertEqual(id(it1), id(it1.__iter__()))
  968. self.assertEqual(list(it1), list(it2));
  969. self.assertEqual(list(self.v1.__iter__()), self.l1)
  970. idx = 0
  971. for val in self.v1:
  972. self.assertEqual(val, self.v1[idx])
  973. idx += 1
  974. def test_rotate(self):
  975. v1 = Vector3(1, 0, 0)
  976. axis = Vector3(0, 1, 0)
  977. v2 = v1.rotate(90, axis)
  978. v3 = v1.rotate(90 + 360, axis)
  979. self.assertEqual(v1.x, 1)
  980. self.assertEqual(v1.y, 0)
  981. self.assertEqual(v1.z, 0)
  982. self.assertEqual(v2.x, 0)
  983. self.assertEqual(v2.y, 0)
  984. self.assertEqual(v2.z, -1)
  985. self.assertEqual(v3.x, v2.x)
  986. self.assertEqual(v3.y, v2.y)
  987. self.assertEqual(v3.z, v2.z)
  988. v1 = Vector3(-1, -1, -1)
  989. v2 = v1.rotate(-90, axis)
  990. self.assertEqual(v2.x, 1)
  991. self.assertEqual(v2.y, -1)
  992. self.assertEqual(v2.z, -1)
  993. v2 = v1.rotate(360, axis)
  994. self.assertEqual(v1.x, v2.x)
  995. self.assertEqual(v1.y, v2.y)
  996. self.assertEqual(v1.z, v2.z)
  997. v2 = v1.rotate(0, axis)
  998. self.assertEqual(v1.x, v2.x)
  999. self.assertEqual(v1.y, v2.y)
  1000. self.assertEqual(v1.z, v2.z)
  1001. # issue 214
  1002. self.assertEqual(Vector3(0, 1, 0).rotate(359.9999999, Vector3(0, 0, 1)),
  1003. Vector3(0, 1, 0))
  1004. def test_rotate_ip(self):
  1005. v = Vector3(1, 0, 0)
  1006. axis = Vector3(0, 1, 0)
  1007. self.assertEqual(v.rotate_ip(90, axis), None)
  1008. self.assertEqual(v.x, 0)
  1009. self.assertEqual(v.y, 0)
  1010. self.assertEqual(v.z, -1)
  1011. v = Vector3(-1, -1, 1)
  1012. v.rotate_ip(-90, axis)
  1013. self.assertEqual(v.x, -1)
  1014. self.assertEqual(v.y, -1)
  1015. self.assertEqual(v.z, -1)
  1016. def test_rotate_x(self):
  1017. v1 = Vector3(1, 0, 0)
  1018. v2 = v1.rotate_x(90)
  1019. v3 = v1.rotate_x(90 + 360)
  1020. self.assertEqual(v1.x, 1)
  1021. self.assertEqual(v1.y, 0)
  1022. self.assertEqual(v1.z, 0)
  1023. self.assertEqual(v2.x, 1)
  1024. self.assertEqual(v2.y, 0)
  1025. self.assertEqual(v2.z, 0)
  1026. self.assertEqual(v3.x, v2.x)
  1027. self.assertEqual(v3.y, v2.y)
  1028. self.assertEqual(v3.z, v2.z)
  1029. v1 = Vector3(-1, -1, -1)
  1030. v2 = v1.rotate_x(-90)
  1031. self.assertEqual(v2.x, -1)
  1032. self.assertAlmostEqual(v2.y, -1)
  1033. self.assertAlmostEqual(v2.z, 1)
  1034. v2 = v1.rotate_x(360)
  1035. self.assertAlmostEqual(v1.x, v2.x)
  1036. self.assertAlmostEqual(v1.y, v2.y)
  1037. self.assertAlmostEqual(v1.z, v2.z)
  1038. v2 = v1.rotate_x(0)
  1039. self.assertEqual(v1.x, v2.x)
  1040. self.assertAlmostEqual(v1.y, v2.y)
  1041. self.assertAlmostEqual(v1.z, v2.z)
  1042. def test_rotate_x_ip(self):
  1043. v = Vector3(1, 0, 0)
  1044. self.assertEqual(v.rotate_x_ip(90), None)
  1045. self.assertEqual(v.x, 1)
  1046. self.assertEqual(v.y, 0)
  1047. self.assertEqual(v.z, 0)
  1048. v = Vector3(-1, -1, 1)
  1049. v.rotate_x_ip(-90)
  1050. self.assertEqual(v.x, -1)
  1051. self.assertAlmostEqual(v.y, 1)
  1052. self.assertAlmostEqual(v.z, 1)
  1053. def test_rotate_y(self):
  1054. v1 = Vector3(1, 0, 0)
  1055. v2 = v1.rotate_y(90)
  1056. v3 = v1.rotate_y(90 + 360)
  1057. self.assertEqual(v1.x, 1)
  1058. self.assertEqual(v1.y, 0)
  1059. self.assertEqual(v1.z, 0)
  1060. self.assertAlmostEqual(v2.x, 0)
  1061. self.assertEqual(v2.y, 0)
  1062. self.assertAlmostEqual(v2.z, -1)
  1063. self.assertAlmostEqual(v3.x, v2.x)
  1064. self.assertEqual(v3.y, v2.y)
  1065. self.assertAlmostEqual(v3.z, v2.z)
  1066. v1 = Vector3(-1, -1, -1)
  1067. v2 = v1.rotate_y(-90)
  1068. self.assertAlmostEqual(v2.x, 1)
  1069. self.assertEqual(v2.y, -1)
  1070. self.assertAlmostEqual(v2.z, -1)
  1071. v2 = v1.rotate_y(360)
  1072. self.assertAlmostEqual(v1.x, v2.x)
  1073. self.assertEqual(v1.y, v2.y)
  1074. self.assertAlmostEqual(v1.z, v2.z)
  1075. v2 = v1.rotate_y(0)
  1076. self.assertEqual(v1.x, v2.x)
  1077. self.assertEqual(v1.y, v2.y)
  1078. self.assertEqual(v1.z, v2.z)
  1079. def test_rotate_y_ip(self):
  1080. v = Vector3(1, 0, 0)
  1081. self.assertEqual(v.rotate_y_ip(90), None)
  1082. self.assertAlmostEqual(v.x, 0)
  1083. self.assertEqual(v.y, 0)
  1084. self.assertAlmostEqual(v.z, -1)
  1085. v = Vector3(-1, -1, 1)
  1086. v.rotate_y_ip(-90)
  1087. self.assertAlmostEqual(v.x, -1)
  1088. self.assertEqual(v.y, -1)
  1089. self.assertAlmostEqual(v.z, -1)
  1090. def test_rotate_z(self):
  1091. v1 = Vector3(1, 0, 0)
  1092. v2 = v1.rotate_z(90)
  1093. v3 = v1.rotate_z(90 + 360)
  1094. self.assertEqual(v1.x, 1)
  1095. self.assertEqual(v1.y, 0)
  1096. self.assertEqual(v1.z, 0)
  1097. self.assertAlmostEqual(v2.x, 0)
  1098. self.assertAlmostEqual(v2.y, 1)
  1099. self.assertEqual(v2.z, 0)
  1100. self.assertAlmostEqual(v3.x, v2.x)
  1101. self.assertAlmostEqual(v3.y, v2.y)
  1102. self.assertEqual(v3.z, v2.z)
  1103. v1 = Vector3(-1, -1, -1)
  1104. v2 = v1.rotate_z(-90)
  1105. self.assertAlmostEqual(v2.x, -1)
  1106. self.assertAlmostEqual(v2.y, 1)
  1107. self.assertEqual(v2.z, -1)
  1108. v2 = v1.rotate_z(360)
  1109. self.assertAlmostEqual(v1.x, v2.x)
  1110. self.assertAlmostEqual(v1.y, v2.y)
  1111. self.assertEqual(v1.z, v2.z)
  1112. v2 = v1.rotate_z(0)
  1113. self.assertAlmostEqual(v1.x, v2.x)
  1114. self.assertAlmostEqual(v1.y, v2.y)
  1115. self.assertEqual(v1.z, v2.z)
  1116. def test_rotate_z_ip(self):
  1117. v = Vector3(1, 0, 0)
  1118. self.assertEqual(v.rotate_z_ip(90), None)
  1119. self.assertAlmostEqual(v.x, 0)
  1120. self.assertAlmostEqual(v.y, 1)
  1121. self.assertEqual(v.z, 0)
  1122. v = Vector3(-1, -1, 1)
  1123. v.rotate_z_ip(-90)
  1124. self.assertAlmostEqual(v.x, -1)
  1125. self.assertAlmostEqual(v.y, 1)
  1126. self.assertEqual(v.z, 1)
  1127. def test_normalize(self):
  1128. v = self.v1.normalize()
  1129. # length is 1
  1130. self.assertAlmostEqual(v.x * v.x + v.y * v.y + v.z * v.z, 1.)
  1131. # v1 is unchanged
  1132. self.assertEqual(self.v1.x, self.l1[0])
  1133. self.assertEqual(self.v1.y, self.l1[1])
  1134. self.assertEqual(self.v1.z, self.l1[2])
  1135. # v2 is paralell to v1 (tested via cross product)
  1136. cross = ((self.v1.y * v.z - self.v1.z * v.y) ** 2 +
  1137. (self.v1.z * v.x - self.v1.x * v.z) ** 2 +
  1138. (self.v1.x * v.y - self.v1.y * v.x) ** 2)
  1139. self.assertAlmostEqual(cross, 0.)
  1140. self.assertRaises(ValueError, lambda : self.zeroVec.normalize())
  1141. def test_normalize_ip(self):
  1142. v = +self.v1
  1143. # v has length != 1 before normalizing
  1144. self.assertNotEqual(v.x * v.x + v.y * v.y + v.z * v.z, 1.)
  1145. # inplace operations should return None
  1146. self.assertEqual(v.normalize_ip(), None)
  1147. # length is 1
  1148. self.assertAlmostEqual(v.x * v.x + v.y * v.y + v.z * v.z, 1.)
  1149. # v2 is paralell to v1 (tested via cross product)
  1150. cross = ((self.v1.y * v.z - self.v1.z * v.y) ** 2 +
  1151. (self.v1.z * v.x - self.v1.x * v.z) ** 2 +
  1152. (self.v1.x * v.y - self.v1.y * v.x) ** 2)
  1153. self.assertAlmostEqual(cross, 0.)
  1154. self.assertRaises(ValueError, lambda : self.zeroVec.normalize_ip())
  1155. def test_is_normalized(self):
  1156. self.assertEqual(self.v1.is_normalized(), False)
  1157. v = self.v1.normalize()
  1158. self.assertEqual(v.is_normalized(), True)
  1159. self.assertEqual(self.e2.is_normalized(), True)
  1160. self.assertEqual(self.zeroVec.is_normalized(), False)
  1161. def test_cross(self):
  1162. def cross(a, b):
  1163. return Vector3(a[1] * b[2] - a[2] * b[1],
  1164. a[2] * b[0] - a[0] * b[2],
  1165. a[0] * b[1] - a[1] * b[0])
  1166. self.assertEqual(self.v1.cross(self.v2), cross(self.v1, self.v2))
  1167. self.assertEqual(self.v1.cross(self.l2), cross(self.v1, self.l2))
  1168. self.assertEqual(self.v1.cross(self.t2), cross(self.v1, self.t2))
  1169. self.assertEqual(self.v1.cross(self.v2), -self.v2.cross(self.v1))
  1170. self.assertEqual(self.v1.cross(self.v1), self.zeroVec)
  1171. def test_dot(self):
  1172. self.assertAlmostEqual(self.v1.dot(self.v2),
  1173. self.v1.x * self.v2.x + self.v1.y * self.v2.y + self.v1.z * self.v2.z)
  1174. self.assertAlmostEqual(self.v1.dot(self.l2),
  1175. self.v1.x * self.l2[0] + self.v1.y * self.l2[1] + self.v1.z * self.l2[2])
  1176. self.assertAlmostEqual(self.v1.dot(self.t2),
  1177. self.v1.x * self.t2[0] + self.v1.y * self.t2[1] + self.v1.z * self.t2[2])
  1178. self.assertAlmostEqual(self.v1.dot(self.v2), self.v2.dot(self.v1))
  1179. self.assertAlmostEqual(self.v1.dot(self.v2), self.v1 * self.v2)
  1180. def test_angle_to(self):
  1181. self.assertEqual(Vector3(1, 1, 0).angle_to((-1, 1, 0)), 90)
  1182. self.assertEqual(Vector3(1, 0, 0).angle_to((0, 0, -1)), 90)
  1183. self.assertEqual(Vector3(1, 0, 0).angle_to((-1, 0, 1)), 135)
  1184. self.assertEqual(abs(Vector3(1, 0, 1).angle_to((-1, 0, -1))), 180)
  1185. # if we rotate v1 by the angle_to v2 around their cross product
  1186. # we should look in the same direction
  1187. self.assertEqual(self.v1.rotate(self.v1.angle_to(self.v2), self.v1.cross(self.v2)).normalize(),
  1188. self.v2.normalize())
  1189. def test_scale_to_length(self):
  1190. v = Vector3(1, 1, 1)
  1191. v.scale_to_length(2.5)
  1192. self.assertEqual(v, Vector3(2.5, 2.5, 2.5) / math.sqrt(3))
  1193. self.assertRaises(ValueError, lambda : self.zeroVec.scale_to_length(1))
  1194. self.assertEqual(v.scale_to_length(0), None)
  1195. self.assertEqual(v, self.zeroVec)
  1196. def test_length(self):
  1197. self.assertEqual(Vector3(3, 4, 5).length(), math.sqrt(3 * 3 + 4 * 4 + 5 * 5))
  1198. self.assertEqual(Vector3(-3, 4, 5).length(), math.sqrt(-3 * -3 + 4 * 4 + 5 * 5))
  1199. self.assertEqual(self.zeroVec.length(), 0)
  1200. def test_length_squared(self):
  1201. self.assertEqual(Vector3(3, 4, 5).length_squared(), 3 * 3 + 4 * 4 + 5 * 5)
  1202. self.assertEqual(Vector3(-3, 4, 5).length_squared(), -3 * -3 + 4 * 4 + 5 * 5)
  1203. self.assertEqual(self.zeroVec.length_squared(), 0)
  1204. def test_reflect(self):
  1205. v = Vector3(1, -1, 1)
  1206. n = Vector3(0, 1, 0)
  1207. self.assertEqual(v.reflect(n), Vector3(1, 1, 1))
  1208. self.assertEqual(v.reflect(3*n), v.reflect(n))
  1209. self.assertEqual(v.reflect(-v), -v)
  1210. self.assertRaises(ValueError, lambda : v.reflect(self.zeroVec))
  1211. def test_reflect_ip(self):
  1212. v1 = Vector3(1, -1, 1)
  1213. v2 = Vector3(v1)
  1214. n = Vector3(0, 1, 0)
  1215. self.assertEqual(v2.reflect_ip(n), None)
  1216. self.assertEqual(v2, Vector3(1, 1, 1))
  1217. v2 = Vector3(v1)
  1218. v2.reflect_ip(3*n)
  1219. self.assertEqual(v2, v1.reflect(n))
  1220. v2 = Vector3(v1)
  1221. v2.reflect_ip(-v1)
  1222. self.assertEqual(v2, -v1)
  1223. self.assertRaises(ValueError, lambda : v2.reflect_ip(self.zeroVec))
  1224. def test_distance_to(self):
  1225. diff = self.v1 - self.v2
  1226. self.assertEqual(self.e1.distance_to(self.e2), math.sqrt(2))
  1227. self.assertEqual(self.v1.distance_to(self.v2),
  1228. math.sqrt(diff.x * diff.x + diff.y * diff.y + diff.z * diff.z))
  1229. self.assertEqual(self.v1.distance_to(self.v1), 0)
  1230. self.assertEqual(self.v1.distance_to(self.v2),
  1231. self.v2.distance_to(self.v1))
  1232. def test_distance_squared_to(self):
  1233. diff = self.v1 - self.v2
  1234. self.assertEqual(self.e1.distance_squared_to(self.e2), 2)
  1235. self.assertAlmostEqual(self.v1.distance_squared_to(self.v2),
  1236. diff.x * diff.x + diff.y * diff.y + diff.z * diff.z)
  1237. self.assertEqual(self.v1.distance_squared_to(self.v1), 0)
  1238. self.assertEqual(self.v1.distance_squared_to(self.v2),
  1239. self.v2.distance_squared_to(self.v1))
  1240. def test_swizzle(self):
  1241. self.assertTrue(hasattr(pygame.math, "enable_swizzling"))
  1242. self.assertTrue(hasattr(pygame.math, "disable_swizzling"))
  1243. # swizzling enabled by default
  1244. pygame.math.disable_swizzling()
  1245. self.assertRaises(AttributeError, lambda : self.v1.yx)
  1246. pygame.math.enable_swizzling()
  1247. self.assertEqual(self.v1.yxz, (self.v1.y, self.v1.x, self.v1.z))
  1248. self.assertEqual(self.v1.xxyyzzxyz, (self.v1.x, self.v1.x, self.v1.y,
  1249. self.v1.y, self.v1.z, self.v1.z,
  1250. self.v1.x, self.v1.y, self.v1.z))
  1251. self.v1.xyz = self.t2
  1252. self.assertEqual(self.v1, self.t2)
  1253. self.v1.zxy = self.t2
  1254. self.assertEqual(self.v1, (self.t2[1], self.t2[2], self.t2[0]))
  1255. self.v1.yz = self.t2[:2]
  1256. self.assertEqual(self.v1, (self.t2[1], self.t2[0], self.t2[1]))
  1257. self.assertEqual(type(self.v1), Vector3)
  1258. @unittest.skipIf(IS_PYPY, "known pypy failure")
  1259. def test_invalid_swizzle(self):
  1260. def invalidSwizzleX():
  1261. Vector3().xx = (1, 2)
  1262. def invalidSwizzleY():
  1263. Vector3().yy = (1, 2)
  1264. def invalidSwizzleZ():
  1265. Vector3().zz = (1, 2)
  1266. def invalidSwizzleW():
  1267. Vector3().ww = (1, 2)
  1268. self.assertRaises(AttributeError, invalidSwizzleX)
  1269. self.assertRaises(AttributeError, invalidSwizzleY)
  1270. self.assertRaises(AttributeError, invalidSwizzleZ)
  1271. self.assertRaises(AttributeError, invalidSwizzleW)
  1272. def invalidAssignment():
  1273. Vector3().xy = 3
  1274. self.assertRaises(TypeError, invalidAssignment)
  1275. def test_swizzle_return_types(self):
  1276. self.assertEqual(type(self.v1.x), float)
  1277. self.assertEqual(type(self.v1.xy), Vector2)
  1278. self.assertEqual(type(self.v1.xyz), Vector3)
  1279. # but we don't have vector4 or above... so tuple.
  1280. self.assertEqual(type(self.v1.xyxy), tuple)
  1281. self.assertEqual(type(self.v1.xyxyx), tuple)
  1282. def test_dir_works(self):
  1283. # not every single one of the attributes...
  1284. attributes = set(['lerp', 'normalize', 'normalize_ip', 'reflect', 'slerp', 'x', 'y'])
  1285. # check if this selection of attributes are all there.
  1286. self.assertTrue(attributes.issubset(set(dir(self.v1))))
  1287. def test_elementwise(self):
  1288. # behaviour for "elementwise op scalar"
  1289. self.assertEqual(self.v1.elementwise() + self.s1,
  1290. (self.v1.x + self.s1, self.v1.y + self.s1, self.v1.z + self.s1))
  1291. self.assertEqual(self.v1.elementwise() - self.s1,
  1292. (self.v1.x - self.s1, self.v1.y - self.s1, self.v1.z - self.s1))
  1293. self.assertEqual(self.v1.elementwise() * self.s2,
  1294. (self.v1.x * self.s2, self.v1.y * self.s2, self.v1.z * self.s2))
  1295. self.assertEqual(self.v1.elementwise() / self.s2,
  1296. (self.v1.x / self.s2, self.v1.y / self.s2, self.v1.z / self.s2))
  1297. self.assertEqual(self.v1.elementwise() // self.s1,
  1298. (self.v1.x // self.s1, self.v1.y // self.s1, self.v1.z // self.s1))
  1299. self.assertEqual(self.v1.elementwise() ** self.s1,
  1300. (self.v1.x ** self.s1, self.v1.y ** self.s1, self.v1.z ** self.s1))
  1301. self.assertEqual(self.v1.elementwise() % self.s1,
  1302. (self.v1.x % self.s1, self.v1.y % self.s1, self.v1.z % self.s1))
  1303. self.assertEqual(self.v1.elementwise() > self.s1,
  1304. self.v1.x > self.s1 and self.v1.y > self.s1 and self.v1.z > self.s1)
  1305. self.assertEqual(self.v1.elementwise() < self.s1,
  1306. self.v1.x < self.s1 and self.v1.y < self.s1 and self.v1.z < self.s1)
  1307. self.assertEqual(self.v1.elementwise() == self.s1,
  1308. self.v1.x == self.s1 and self.v1.y == self.s1 and self.v1.z == self.s1)
  1309. self.assertEqual(self.v1.elementwise() != self.s1,
  1310. self.v1.x != self.s1 and self.v1.y != self.s1 and self.v1.z != self.s1)
  1311. self.assertEqual(self.v1.elementwise() >= self.s1,
  1312. self.v1.x >= self.s1 and self.v1.y >= self.s1 and self.v1.z >= self.s1)
  1313. self.assertEqual(self.v1.elementwise() <= self.s1,
  1314. self.v1.x <= self.s1 and self.v1.y <= self.s1 and self.v1.z <= self.s1)
  1315. # behaviour for "scalar op elementwise"
  1316. self.assertEqual(5 + self.v1.elementwise(), Vector3(5, 5, 5) + self.v1)
  1317. self.assertEqual(3.5 - self.v1.elementwise(), Vector3(3.5, 3.5, 3.5) - self.v1)
  1318. self.assertEqual(7.5 * self.v1.elementwise() , 7.5 * self.v1)
  1319. self.assertEqual(-3.5 / self.v1.elementwise(), (-3.5 / self.v1.x, -3.5 / self.v1.y, -3.5 / self.v1.z))
  1320. self.assertEqual(-3.5 // self.v1.elementwise(), (-3.5 // self.v1.x, -3.5 // self.v1.y, -3.5 // self.v1.z))
  1321. self.assertEqual(-3.5 ** self.v1.elementwise(), (-3.5 ** self.v1.x, -3.5 ** self.v1.y, -3.5 ** self.v1.z))
  1322. self.assertEqual(3 % self.v1.elementwise(), (3 % self.v1.x, 3 % self.v1.y, 3 % self.v1.z))
  1323. self.assertEqual(2 < self.v1.elementwise(), 2 < self.v1.x and 2 < self.v1.y and 2 < self.v1.z)
  1324. self.assertEqual(2 > self.v1.elementwise(), 2 > self.v1.x and 2 > self.v1.y and 2 > self.v1.z)
  1325. self.assertEqual(1 == self.v1.elementwise(), 1 == self.v1.x and 1 == self.v1.y and 1 == self.v1.z)
  1326. self.assertEqual(1 != self.v1.elementwise(), 1 != self.v1.x and 1 != self.v1.y and 1 != self.v1.z)
  1327. self.assertEqual(2 <= self.v1.elementwise(), 2 <= self.v1.x and 2 <= self.v1.y and 2 <= self.v1.z)
  1328. self.assertEqual(-7 >= self.v1.elementwise(), -7 >= self.v1.x and -7 >= self.v1.y and -7 >= self.v1.z)
  1329. self.assertEqual(-7 != self.v1.elementwise(), -7 != self.v1.x and -7 != self.v1.y and -7 != self.v1.z)
  1330. # behaviour for "elementwise op vector"
  1331. self.assertEqual(type(self.v1.elementwise() * self.v2), type(self.v1))
  1332. self.assertEqual(self.v1.elementwise() + self.v2, self.v1 + self.v2)
  1333. self.assertEqual(self.v1.elementwise() + self.v2, self.v1 + self.v2)
  1334. self.assertEqual(self.v1.elementwise() - self.v2, self.v1 - self.v2)
  1335. self.assertEqual(self.v1.elementwise() * self.v2, (self.v1.x * self.v2.x, self.v1.y * self.v2.y, self.v1.z * self.v2.z))
  1336. self.assertEqual(self.v1.elementwise() / self.v2, (self.v1.x / self.v2.x, self.v1.y / self.v2.y, self.v1.z / self.v2.z))
  1337. self.assertEqual(self.v1.elementwise() // self.v2, (self.v1.x // self.v2.x, self.v1.y // self.v2.y, self.v1.z // self.v2.z))
  1338. self.assertEqual(self.v1.elementwise() ** self.v2, (self.v1.x ** self.v2.x, self.v1.y ** self.v2.y, self.v1.z ** self.v2.z))
  1339. self.assertEqual(self.v1.elementwise() % self.v2, (self.v1.x % self.v2.x, self.v1.y % self.v2.y, self.v1.z % self.v2.z))
  1340. self.assertEqual(self.v1.elementwise() > self.v2, self.v1.x > self.v2.x and self.v1.y > self.v2.y and self.v1.z > self.v2.z)
  1341. self.assertEqual(self.v1.elementwise() < self.v2, self.v1.x < self.v2.x and self.v1.y < self.v2.y and self.v1.z < self.v2.z)
  1342. self.assertEqual(self.v1.elementwise() >= self.v2, self.v1.x >= self.v2.x and self.v1.y >= self.v2.y and self.v1.z >= self.v2.z)
  1343. self.assertEqual(self.v1.elementwise() <= self.v2, self.v1.x <= self.v2.x and self.v1.y <= self.v2.y and self.v1.z <= self.v2.z)
  1344. self.assertEqual(self.v1.elementwise() == self.v2, self.v1.x == self.v2.x and self.v1.y == self.v2.y and self.v1.z == self.v2.z)
  1345. self.assertEqual(self.v1.elementwise() != self.v2, self.v1.x != self.v2.x and self.v1.y != self.v2.y and self.v1.z != self.v2.z)
  1346. # behaviour for "vector op elementwise"
  1347. self.assertEqual(self.v2 + self.v1.elementwise(), self.v2 + self.v1)
  1348. self.assertEqual(self.v2 - self.v1.elementwise(), self.v2 - self.v1)
  1349. self.assertEqual(self.v2 * self.v1.elementwise(), (self.v2.x * self.v1.x, self.v2.y * self.v1.y, self.v2.z * self.v1.z))
  1350. self.assertEqual(self.v2 / self.v1.elementwise(), (self.v2.x / self.v1.x, self.v2.y / self.v1.y, self.v2.z / self.v1.z))
  1351. self.assertEqual(self.v2 // self.v1.elementwise(), (self.v2.x // self.v1.x, self.v2.y // self.v1.y, self.v2.z // self.v1.z))
  1352. self.assertEqual(self.v2 ** self.v1.elementwise(), (self.v2.x ** self.v1.x, self.v2.y ** self.v1.y, self.v2.z ** self.v1.z))
  1353. self.assertEqual(self.v2 % self.v1.elementwise(), (self.v2.x % self.v1.x, self.v2.y % self.v1.y, self.v2.z % self.v1.z))
  1354. self.assertEqual(self.v2 < self.v1.elementwise(), self.v2.x < self.v1.x and self.v2.y < self.v1.y and self.v2.z < self.v1.z)
  1355. self.assertEqual(self.v2 > self.v1.elementwise(), self.v2.x > self.v1.x and self.v2.y > self.v1.y and self.v2.z > self.v1.z)
  1356. self.assertEqual(self.v2 <= self.v1.elementwise(), self.v2.x <= self.v1.x and self.v2.y <= self.v1.y and self.v2.z <= self.v1.z)
  1357. self.assertEqual(self.v2 >= self.v1.elementwise(), self.v2.x >= self.v1.x and self.v2.y >= self.v1.y and self.v2.z >= self.v1.z)
  1358. self.assertEqual(self.v2 == self.v1.elementwise(), self.v2.x == self.v1.x and self.v2.y == self.v1.y and self.v2.z == self.v1.z)
  1359. self.assertEqual(self.v2 != self.v1.elementwise(), self.v2.x != self.v1.x and self.v2.y != self.v1.y and self.v2.z != self.v1.z)
  1360. # behaviour for "elementwise op elementwise"
  1361. self.assertEqual(self.v2.elementwise() + self.v1.elementwise(), self.v2 + self.v1)
  1362. self.assertEqual(self.v2.elementwise() - self.v1.elementwise(), self.v2 - self.v1)
  1363. self.assertEqual(self.v2.elementwise() * self.v1.elementwise(),
  1364. (self.v2.x * self.v1.x, self.v2.y * self.v1.y, self.v2.z * self.v1.z))
  1365. self.assertEqual(self.v2.elementwise() / self.v1.elementwise(),
  1366. (self.v2.x / self.v1.x, self.v2.y / self.v1.y, self.v2.z / self.v1.z))
  1367. self.assertEqual(self.v2.elementwise() // self.v1.elementwise(),
  1368. (self.v2.x // self.v1.x, self.v2.y // self.v1.y, self.v2.z // self.v1.z))
  1369. self.assertEqual(self.v2.elementwise() ** self.v1.elementwise(),
  1370. (self.v2.x ** self.v1.x, self.v2.y ** self.v1.y, self.v2.z ** self.v1.z))
  1371. self.assertEqual(self.v2.elementwise() % self.v1.elementwise(),
  1372. (self.v2.x % self.v1.x, self.v2.y % self.v1.y, self.v2.z % self.v1.z))
  1373. self.assertEqual(self.v2.elementwise() < self.v1.elementwise(),
  1374. self.v2.x < self.v1.x and self.v2.y < self.v1.y and self.v2.z < self.v1.z)
  1375. self.assertEqual(self.v2.elementwise() > self.v1.elementwise(),
  1376. self.v2.x > self.v1.x and self.v2.y > self.v1.y and self.v2.z > self.v1.z)
  1377. self.assertEqual(self.v2.elementwise() <= self.v1.elementwise(),
  1378. self.v2.x <= self.v1.x and self.v2.y <= self.v1.y and self.v2.z <= self.v1.z)
  1379. self.assertEqual(self.v2.elementwise() >= self.v1.elementwise(),
  1380. self.v2.x >= self.v1.x and self.v2.y >= self.v1.y and self.v2.z >= self.v1.z)
  1381. self.assertEqual(self.v2.elementwise() == self.v1.elementwise(),
  1382. self.v2.x == self.v1.x and self.v2.y == self.v1.y and self.v2.z == self.v1.z)
  1383. self.assertEqual(self.v2.elementwise() != self.v1.elementwise(),
  1384. self.v2.x != self.v1.x and self.v2.y != self.v1.y and self.v2.z != self.v1.z)
  1385. # other behaviour
  1386. self.assertEqual(abs(self.v1.elementwise()), (abs(self.v1.x), abs(self.v1.y), abs(self.v1.z)))
  1387. self.assertEqual(-self.v1.elementwise(), -self.v1)
  1388. self.assertEqual(+self.v1.elementwise(), +self.v1)
  1389. self.assertEqual(bool(self.v1.elementwise()), bool(self.v1))
  1390. self.assertEqual(bool(Vector3().elementwise()), bool(Vector3()))
  1391. self.assertEqual(self.zeroVec.elementwise() ** 0, (1, 1, 1))
  1392. self.assertRaises(ValueError, lambda : pow(Vector3(-1, 0, 0).elementwise(), 1.2))
  1393. self.assertRaises(ZeroDivisionError, lambda : self.zeroVec.elementwise() ** -1)
  1394. self.assertRaises(ZeroDivisionError, lambda : Vector3(1,1,1).elementwise() / 0)
  1395. self.assertRaises(ZeroDivisionError, lambda : Vector3(1,1,1).elementwise() // 0)
  1396. self.assertRaises(ZeroDivisionError, lambda : Vector3(1,1,1).elementwise() % 0)
  1397. self.assertRaises(ZeroDivisionError, lambda : Vector3(1,1,1).elementwise() / self.zeroVec)
  1398. self.assertRaises(ZeroDivisionError, lambda : Vector3(1,1,1).elementwise() // self.zeroVec)
  1399. self.assertRaises(ZeroDivisionError, lambda : Vector3(1,1,1).elementwise() % self.zeroVec)
  1400. self.assertRaises(ZeroDivisionError, lambda : 2 / self.zeroVec.elementwise())
  1401. self.assertRaises(ZeroDivisionError, lambda : 2 // self.zeroVec.elementwise())
  1402. self.assertRaises(ZeroDivisionError, lambda : 2 % self.zeroVec.elementwise())
  1403. def test_slerp(self):
  1404. self.assertRaises(ValueError, lambda : self.zeroVec.slerp(self.v1, .5))
  1405. self.assertRaises(ValueError, lambda : self.v1.slerp(self.zeroVec, .5))
  1406. self.assertRaises(ValueError,
  1407. lambda : self.zeroVec.slerp(self.zeroVec, .5))
  1408. steps = 10
  1409. angle_step = self.e1.angle_to(self.e2) / steps
  1410. for i, u in ((i, self.e1.slerp(self.e2, i/float(steps))) for i in range(steps+1)):
  1411. self.assertAlmostEqual(u.length(), 1)
  1412. self.assertAlmostEqual(self.e1.angle_to(u), i * angle_step)
  1413. self.assertEqual(u, self.e2)
  1414. v1 = Vector3(100, 0, 0)
  1415. v2 = Vector3(0, 10, 7)
  1416. radial_factor = v2.length() / v1.length()
  1417. for i, u in ((i, v1.slerp(v2, -i/float(steps))) for i in range(steps+1)):
  1418. self.assertAlmostEqual(u.length(), (v2.length() - v1.length()) * (float(i)/steps) + v1.length())
  1419. self.assertEqual(u, v2)
  1420. self.assertEqual(v1.slerp(v1, .5), v1)
  1421. self.assertEqual(v2.slerp(v2, .5), v2)
  1422. self.assertRaises(ValueError, lambda : v1.slerp(-v1, 0.5))
  1423. def test_lerp(self):
  1424. v1 = Vector3(0, 0, 0)
  1425. v2 = Vector3(10, 10, 10)
  1426. self.assertEqual(v1.lerp(v2, 0.5), (5, 5, 5))
  1427. self.assertRaises(ValueError, lambda : v1.lerp(v2, 2.5))
  1428. v1 = Vector3(-10, -5, -20)
  1429. v2 = Vector3(10, 10, -20)
  1430. self.assertEqual(v1.lerp(v2, 0.5), (0, 2.5, -20))
  1431. def test_spherical(self):
  1432. v = Vector3()
  1433. v.from_spherical(self.v1.as_spherical())
  1434. self.assertEqual(self.v1, v)
  1435. self.assertEqual(self.e1.as_spherical(), (1, 90, 0))
  1436. self.assertEqual(self.e2.as_spherical(), (1, 90, 90))
  1437. self.assertEqual(self.e3.as_spherical(), (1, 0, 0))
  1438. self.assertEqual((2 * self.e2).as_spherical(), (2, 90, 90))
  1439. self.assertRaises(TypeError, lambda : v.from_spherical((None, None, None)))
  1440. self.assertRaises(TypeError, lambda : v.from_spherical("abc"))
  1441. self.assertRaises(TypeError, lambda : v.from_spherical((None, 1, 2)))
  1442. self.assertRaises(TypeError, lambda : v.from_spherical((1, 2, 3, 4)))
  1443. self.assertRaises(TypeError, lambda : v.from_spherical((1, 2)))
  1444. self.assertRaises(TypeError, lambda : v.from_spherical(1, 2, 3))
  1445. v.from_spherical((.5, 90, 90))
  1446. self.assertEqual(v, .5 * self.e2)
  1447. def test_inplace_operators(self):
  1448. v = Vector3(1,1,1)
  1449. v *= 2
  1450. self.assertEqual(v, (2.0,2.0,2.0))
  1451. v = Vector3(4,4,4)
  1452. v /= 2
  1453. self.assertEqual(v, (2.0,2.0,2.0))
  1454. v = Vector3(3.0,3.0,3.0)
  1455. v -= (1,1,1)
  1456. self.assertEqual(v, (2.0,2.0,2.0))
  1457. v = Vector3(3.0,3.0,3.0)
  1458. v += (1,1,1)
  1459. self.assertEqual(v, (4.0,4.0,4.0))
  1460. def test_pickle(self):
  1461. import pickle
  1462. v2 = Vector2(1, 2)
  1463. v3 = Vector3(1, 2, 3)
  1464. self.assertEqual(pickle.loads(pickle.dumps(v2)), v2)
  1465. self.assertEqual(pickle.loads(pickle.dumps(v3)), v3)
  1466. def test_subclass_operation(self):
  1467. class Vector(pygame.math.Vector3):
  1468. pass
  1469. v = Vector(2.0, 2.0, 2.0)
  1470. v *= 2
  1471. self.assertEqual(v, (4.0, 4.0, 4.0))
  1472. if __name__ == '__main__':
  1473. unittest.main()