test_Task.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  1. from panda3d import core
  2. from direct.task import Task
  3. def test_TaskManager():
  4. tm = Task.TaskManager()
  5. tm.mgr = core.AsyncTaskManager("Test manager")
  6. tm.setClock(core.ClockObject())
  7. tm.setupTaskChain("default", tickClock = True)
  8. tm._startTrackingMemLeaks = lambda: None
  9. tm._stopTrackingMemLeaks = lambda: None
  10. tm._checkMemLeaks = lambda: None
  11. # check for memory leaks after every test
  12. tm._startTrackingMemLeaks()
  13. tm._checkMemLeaks()
  14. # run-once task
  15. l = []
  16. def _testDone(task, l=l):
  17. l.append(None)
  18. return task.done
  19. tm.add(_testDone, 'testDone')
  20. tm.step()
  21. assert len(l) == 1
  22. tm.step()
  23. assert len(l) == 1
  24. _testDone = None
  25. tm._checkMemLeaks()
  26. # remove by name
  27. def _testRemoveByName(task):
  28. return task.done
  29. tm.add(_testRemoveByName, 'testRemoveByName')
  30. assert tm.remove('testRemoveByName') == 1
  31. assert tm.remove('testRemoveByName') == 0
  32. _testRemoveByName = None
  33. tm._checkMemLeaks()
  34. # duplicate named tasks
  35. def _testDupNamedTasks(task):
  36. return task.done
  37. tm.add(_testDupNamedTasks, 'testDupNamedTasks')
  38. tm.add(_testDupNamedTasks, 'testDupNamedTasks')
  39. assert tm.remove('testRemoveByName') == 0
  40. _testDupNamedTasks = None
  41. tm._checkMemLeaks()
  42. # continued task
  43. l = []
  44. def _testCont(task, l = l):
  45. l.append(None)
  46. return task.cont
  47. tm.add(_testCont, 'testCont')
  48. tm.step()
  49. assert len(l) == 1
  50. tm.step()
  51. assert len(l) == 2
  52. tm.remove('testCont')
  53. _testCont = None
  54. tm._checkMemLeaks()
  55. # continue until done task
  56. l = []
  57. def _testContDone(task, l = l):
  58. l.append(None)
  59. if len(l) >= 2:
  60. return task.done
  61. else:
  62. return task.cont
  63. tm.add(_testContDone, 'testContDone')
  64. tm.step()
  65. assert len(l) == 1
  66. tm.step()
  67. assert len(l) == 2
  68. tm.step()
  69. assert len(l) == 2
  70. assert not tm.hasTaskNamed('testContDone')
  71. _testContDone = None
  72. tm._checkMemLeaks()
  73. # hasTaskNamed
  74. def _testHasTaskNamed(task):
  75. return task.done
  76. tm.add(_testHasTaskNamed, 'testHasTaskNamed')
  77. assert tm.hasTaskNamed('testHasTaskNamed')
  78. tm.step()
  79. assert not tm.hasTaskNamed('testHasTaskNamed')
  80. _testHasTaskNamed = None
  81. tm._checkMemLeaks()
  82. # task sort
  83. l = []
  84. def _testPri1(task, l = l):
  85. l.append(1)
  86. return task.cont
  87. def _testPri2(task, l = l):
  88. l.append(2)
  89. return task.cont
  90. tm.add(_testPri1, 'testPri1', sort = 1)
  91. tm.add(_testPri2, 'testPri2', sort = 2)
  92. tm.step()
  93. assert len(l) == 2
  94. assert l == [1, 2,]
  95. tm.step()
  96. assert len(l) == 4
  97. assert l == [1, 2, 1, 2,]
  98. tm.remove('testPri1')
  99. tm.remove('testPri2')
  100. _testPri1 = None
  101. _testPri2 = None
  102. tm._checkMemLeaks()
  103. # task extraArgs
  104. l = []
  105. def _testExtraArgs(arg1, arg2, l=l):
  106. l.extend([arg1, arg2,])
  107. return Task.done
  108. tm.add(_testExtraArgs, 'testExtraArgs', extraArgs=[4,5])
  109. tm.step()
  110. assert len(l) == 2
  111. assert l == [4, 5,]
  112. _testExtraArgs = None
  113. tm._checkMemLeaks()
  114. # task appendTask
  115. l = []
  116. def _testAppendTask(arg1, arg2, task, l=l):
  117. l.extend([arg1, arg2,])
  118. return task.done
  119. tm.add(_testAppendTask, '_testAppendTask', extraArgs=[4,5], appendTask=True)
  120. tm.step()
  121. assert len(l) == 2
  122. assert l == [4, 5,]
  123. _testAppendTask = None
  124. tm._checkMemLeaks()
  125. # task uponDeath
  126. l = []
  127. def _uponDeathFunc(task, l=l):
  128. l.append(task.name)
  129. def _testUponDeath(task):
  130. return Task.done
  131. tm.add(_testUponDeath, 'testUponDeath', uponDeath=_uponDeathFunc)
  132. tm.step()
  133. assert len(l) == 1
  134. assert l == ['testUponDeath']
  135. _testUponDeath = None
  136. _uponDeathFunc = None
  137. tm._checkMemLeaks()
  138. # task owner
  139. class _TaskOwner:
  140. def _addTask(self, task):
  141. self.addedTaskName = task.name
  142. def _clearTask(self, task):
  143. self.clearedTaskName = task.name
  144. to = _TaskOwner()
  145. l = []
  146. def _testOwner(task):
  147. return Task.done
  148. tm.add(_testOwner, 'testOwner', owner=to)
  149. tm.step()
  150. assert getattr(to, 'addedTaskName', None) == 'testOwner'
  151. assert getattr(to, 'clearedTaskName', None) == 'testOwner'
  152. _testOwner = None
  153. del to
  154. _TaskOwner = None
  155. tm._checkMemLeaks()
  156. doLaterTests = [0,]
  157. # doLater
  158. l = []
  159. def _testDoLater1(task, l=l):
  160. l.append(1)
  161. def _testDoLater2(task, l=l):
  162. l.append(2)
  163. def _monitorDoLater(task, tm=tm, l=l, doLaterTests=doLaterTests):
  164. if task.time > .03:
  165. assert l == [1, 2,]
  166. doLaterTests[0] -= 1
  167. return task.done
  168. return task.cont
  169. tm.doMethodLater(.01, _testDoLater1, 'testDoLater1')
  170. tm.doMethodLater(.02, _testDoLater2, 'testDoLater2')
  171. doLaterTests[0] += 1
  172. # make sure we run this task after the doLaters if they all occur on the same frame
  173. tm.add(_monitorDoLater, 'monitorDoLater', sort=10)
  174. _testDoLater1 = None
  175. _testDoLater2 = None
  176. _monitorDoLater = None
  177. # don't check until all the doLaters are finished
  178. #tm._checkMemLeaks()
  179. # doLater sort
  180. l = []
  181. def _testDoLaterPri1(task, l=l):
  182. l.append(1)
  183. def _testDoLaterPri2(task, l=l):
  184. l.append(2)
  185. def _monitorDoLaterPri(task, tm=tm, l=l, doLaterTests=doLaterTests):
  186. if task.time > .02:
  187. assert l == [1, 2,]
  188. doLaterTests[0] -= 1
  189. return task.done
  190. return task.cont
  191. tm.doMethodLater(.01, _testDoLaterPri1, 'testDoLaterPri1', sort=1)
  192. tm.doMethodLater(.01, _testDoLaterPri2, 'testDoLaterPri2', sort=2)
  193. doLaterTests[0] += 1
  194. # make sure we run this task after the doLaters if they all occur on the same frame
  195. tm.add(_monitorDoLaterPri, 'monitorDoLaterPri', sort=10)
  196. _testDoLaterPri1 = None
  197. _testDoLaterPri2 = None
  198. _monitorDoLaterPri = None
  199. # don't check until all the doLaters are finished
  200. #tm._checkMemLeaks()
  201. # doLater extraArgs
  202. l = []
  203. def _testDoLaterExtraArgs(arg1, l=l):
  204. l.append(arg1)
  205. def _monitorDoLaterExtraArgs(task, tm=tm, l=l, doLaterTests=doLaterTests):
  206. if task.time > .02:
  207. assert l == [3,]
  208. doLaterTests[0] -= 1
  209. return task.done
  210. return task.cont
  211. tm.doMethodLater(.01, _testDoLaterExtraArgs, 'testDoLaterExtraArgs', extraArgs=[3,])
  212. doLaterTests[0] += 1
  213. # make sure we run this task after the doLaters if they all occur on the same frame
  214. tm.add(_monitorDoLaterExtraArgs, 'monitorDoLaterExtraArgs', sort=10)
  215. _testDoLaterExtraArgs = None
  216. _monitorDoLaterExtraArgs = None
  217. # don't check until all the doLaters are finished
  218. #tm._checkMemLeaks()
  219. # doLater appendTask
  220. l = []
  221. def _testDoLaterAppendTask(arg1, task, l=l):
  222. assert task.name == 'testDoLaterAppendTask'
  223. l.append(arg1)
  224. def _monitorDoLaterAppendTask(task, tm=tm, l=l, doLaterTests=doLaterTests):
  225. if task.time > .02:
  226. assert l == [4,]
  227. doLaterTests[0] -= 1
  228. return task.done
  229. return task.cont
  230. tm.doMethodLater(.01, _testDoLaterAppendTask, 'testDoLaterAppendTask',
  231. extraArgs=[4,], appendTask=True)
  232. doLaterTests[0] += 1
  233. # make sure we run this task after the doLaters if they all occur on the same frame
  234. tm.add(_monitorDoLaterAppendTask, 'monitorDoLaterAppendTask', sort=10)
  235. _testDoLaterAppendTask = None
  236. _monitorDoLaterAppendTask = None
  237. # don't check until all the doLaters are finished
  238. #tm._checkMemLeaks()
  239. # doLater uponDeath
  240. l = []
  241. def _testUponDeathFunc(task, l=l):
  242. assert task.name == 'testDoLaterUponDeath'
  243. l.append(10)
  244. def _testDoLaterUponDeath(arg1, l=l):
  245. return Task.done
  246. def _monitorDoLaterUponDeath(task, tm=tm, l=l, doLaterTests=doLaterTests):
  247. if task.time > .02:
  248. assert l == [10,]
  249. doLaterTests[0] -= 1
  250. return task.done
  251. return task.cont
  252. tm.doMethodLater(.01, _testDoLaterUponDeath, 'testDoLaterUponDeath',
  253. uponDeath=_testUponDeathFunc)
  254. doLaterTests[0] += 1
  255. # make sure we run this task after the doLaters if they all occur on the same frame
  256. tm.add(_monitorDoLaterUponDeath, 'monitorDoLaterUponDeath', sort=10)
  257. _testUponDeathFunc = None
  258. _testDoLaterUponDeath = None
  259. _monitorDoLaterUponDeath = None
  260. # don't check until all the doLaters are finished
  261. #tm._checkMemLeaks()
  262. # doLater owner
  263. class _DoLaterOwner:
  264. def _addTask(self, task):
  265. self.addedTaskName = task.name
  266. def _clearTask(self, task):
  267. self.clearedTaskName = task.name
  268. doLaterOwner = _DoLaterOwner()
  269. l = []
  270. def _testDoLaterOwner(l=l):
  271. pass
  272. def _monitorDoLaterOwner(task, tm=tm, l=l, doLaterOwner=doLaterOwner,
  273. doLaterTests=doLaterTests):
  274. if task.time > .02:
  275. assert getattr(doLaterOwner, 'addedTaskName', None) == 'testDoLaterOwner'
  276. assert getattr(doLaterOwner, 'clearedTaskName', None) == 'testDoLaterOwner'
  277. doLaterTests[0] -= 1
  278. return task.done
  279. return task.cont
  280. tm.doMethodLater(.01, _testDoLaterOwner, 'testDoLaterOwner',
  281. owner=doLaterOwner)
  282. doLaterTests[0] += 1
  283. # make sure we run this task after the doLaters if they all occur on the same frame
  284. tm.add(_monitorDoLaterOwner, 'monitorDoLaterOwner', sort=10)
  285. _testDoLaterOwner = None
  286. _monitorDoLaterOwner = None
  287. del doLaterOwner
  288. _DoLaterOwner = None
  289. # don't check until all the doLaters are finished
  290. #tm._checkMemLeaks()
  291. # run the doLater tests
  292. while doLaterTests[0] > 0:
  293. tm.step()
  294. del doLaterTests
  295. tm._checkMemLeaks()
  296. # getTasks
  297. def _testGetTasks(task):
  298. return task.cont
  299. # No doLaterProcessor in the new world.
  300. assert len(tm.getTasks()) == 0
  301. tm.add(_testGetTasks, 'testGetTasks1')
  302. assert len(tm.getTasks()) == 1
  303. assert (tm.getTasks()[0].name == 'testGetTasks1' or
  304. tm.getTasks()[1].name == 'testGetTasks1')
  305. tm.add(_testGetTasks, 'testGetTasks2')
  306. tm.add(_testGetTasks, 'testGetTasks3')
  307. assert len(tm.getTasks()) == 3
  308. tm.remove('testGetTasks2')
  309. assert len(tm.getTasks()) == 2
  310. tm.remove('testGetTasks1')
  311. tm.remove('testGetTasks3')
  312. assert len(tm.getTasks()) == 0
  313. _testGetTasks = None
  314. tm._checkMemLeaks()
  315. # getDoLaters
  316. def _testGetDoLaters():
  317. pass
  318. assert len(tm.getDoLaters()) == 0
  319. tm.doMethodLater(.1, _testGetDoLaters, 'testDoLater1')
  320. assert len(tm.getDoLaters()) == 1
  321. assert tm.getDoLaters()[0].name == 'testDoLater1'
  322. tm.doMethodLater(.1, _testGetDoLaters, 'testDoLater2')
  323. tm.doMethodLater(.1, _testGetDoLaters, 'testDoLater3')
  324. assert len(tm.getDoLaters()) == 3
  325. tm.remove('testDoLater2')
  326. assert len(tm.getDoLaters()) == 2
  327. tm.remove('testDoLater1')
  328. tm.remove('testDoLater3')
  329. assert len(tm.getDoLaters()) == 0
  330. _testGetDoLaters = None
  331. tm._checkMemLeaks()
  332. # duplicate named doLaters removed via taskMgr.remove
  333. def _testDupNameDoLaters():
  334. pass
  335. # the doLaterProcessor is always running
  336. tm.doMethodLater(.1, _testDupNameDoLaters, 'testDupNameDoLater')
  337. tm.doMethodLater(.1, _testDupNameDoLaters, 'testDupNameDoLater')
  338. assert len(tm.getDoLaters()) == 2
  339. tm.remove('testDupNameDoLater')
  340. assert len(tm.getDoLaters()) == 0
  341. _testDupNameDoLaters = None
  342. tm._checkMemLeaks()
  343. # duplicate named doLaters removed via remove()
  344. def _testDupNameDoLatersRemove():
  345. pass
  346. # the doLaterProcessor is always running
  347. dl1 = tm.doMethodLater(.1, _testDupNameDoLatersRemove, 'testDupNameDoLaterRemove')
  348. dl2 = tm.doMethodLater(.1, _testDupNameDoLatersRemove, 'testDupNameDoLaterRemove')
  349. assert len(tm.getDoLaters()) == 2
  350. dl2.remove()
  351. assert len(tm.getDoLaters()) == 1
  352. dl1.remove()
  353. assert len(tm.getDoLaters()) == 0
  354. _testDupNameDoLatersRemove = None
  355. # nameDict etc. isn't cleared out right away with task.remove()
  356. tm._checkMemLeaks()
  357. # getTasksNamed
  358. def _testGetTasksNamed(task):
  359. return task.cont
  360. assert len(tm.getTasksNamed('testGetTasksNamed')) == 0
  361. tm.add(_testGetTasksNamed, 'testGetTasksNamed')
  362. assert len(tm.getTasksNamed('testGetTasksNamed')) == 1
  363. assert tm.getTasksNamed('testGetTasksNamed')[0].name == 'testGetTasksNamed'
  364. tm.add(_testGetTasksNamed, 'testGetTasksNamed')
  365. tm.add(_testGetTasksNamed, 'testGetTasksNamed')
  366. assert len(tm.getTasksNamed('testGetTasksNamed')) == 3
  367. tm.remove('testGetTasksNamed')
  368. assert len(tm.getTasksNamed('testGetTasksNamed')) == 0
  369. _testGetTasksNamed = None
  370. tm._checkMemLeaks()
  371. # removeTasksMatching
  372. def _testRemoveTasksMatching(task):
  373. return task.cont
  374. tm.add(_testRemoveTasksMatching, 'testRemoveTasksMatching')
  375. assert len(tm.getTasksNamed('testRemoveTasksMatching')) == 1
  376. tm.removeTasksMatching('testRemoveTasksMatching')
  377. assert len(tm.getTasksNamed('testRemoveTasksMatching')) == 0
  378. tm.add(_testRemoveTasksMatching, 'testRemoveTasksMatching1')
  379. tm.add(_testRemoveTasksMatching, 'testRemoveTasksMatching2')
  380. assert len(tm.getTasksNamed('testRemoveTasksMatching1')) == 1
  381. assert len(tm.getTasksNamed('testRemoveTasksMatching2')) == 1
  382. tm.removeTasksMatching('testRemoveTasksMatching*')
  383. assert len(tm.getTasksNamed('testRemoveTasksMatching1')) == 0
  384. assert len(tm.getTasksNamed('testRemoveTasksMatching2')) == 0
  385. tm.add(_testRemoveTasksMatching, 'testRemoveTasksMatching1a')
  386. tm.add(_testRemoveTasksMatching, 'testRemoveTasksMatching2a')
  387. assert len(tm.getTasksNamed('testRemoveTasksMatching1a')) == 1
  388. assert len(tm.getTasksNamed('testRemoveTasksMatching2a')) == 1
  389. tm.removeTasksMatching('testRemoveTasksMatching?a')
  390. assert len(tm.getTasksNamed('testRemoveTasksMatching1a')) == 0
  391. assert len(tm.getTasksNamed('testRemoveTasksMatching2a')) == 0
  392. _testRemoveTasksMatching = None
  393. tm._checkMemLeaks()
  394. # create Task object and add to mgr
  395. l = []
  396. def _testTaskObj(task, l=l):
  397. l.append(None)
  398. return task.cont
  399. t = Task.Task(_testTaskObj)
  400. tm.add(t, 'testTaskObj')
  401. tm.step()
  402. assert len(l) == 1
  403. tm.step()
  404. assert len(l) == 2
  405. tm.remove('testTaskObj')
  406. tm.step()
  407. assert len(l) == 2
  408. _testTaskObj = None
  409. tm._checkMemLeaks()
  410. # remove Task via task.remove()
  411. l = []
  412. def _testTaskObjRemove(task, l=l):
  413. l.append(None)
  414. return task.cont
  415. t = Task.Task(_testTaskObjRemove)
  416. tm.add(t, 'testTaskObjRemove')
  417. tm.step()
  418. assert len(l) == 1
  419. tm.step()
  420. assert len(l) == 2
  421. t.remove()
  422. tm.step()
  423. assert len(l) == 2
  424. del t
  425. _testTaskObjRemove = None
  426. tm._checkMemLeaks()
  427. # set/get Task sort
  428. l = []
  429. def _testTaskObjSort(arg, task, l=l):
  430. l.append(arg)
  431. return task.cont
  432. t1 = Task.Task(_testTaskObjSort)
  433. t2 = Task.Task(_testTaskObjSort)
  434. tm.add(t1, 'testTaskObjSort1', extraArgs=['a',], appendTask=True, sort=1)
  435. tm.add(t2, 'testTaskObjSort2', extraArgs=['b',], appendTask=True, sort=2)
  436. tm.step()
  437. assert len(l) == 2
  438. assert l == ['a', 'b']
  439. assert t1.getSort() == 1
  440. assert t2.getSort() == 2
  441. t1.setSort(3)
  442. assert t1.getSort() == 3
  443. tm.step()
  444. assert len(l) == 4
  445. assert l == ['a', 'b', 'b', 'a',]
  446. t1.remove()
  447. t2.remove()
  448. tm.step()
  449. assert len(l) == 4
  450. del t1
  451. del t2
  452. _testTaskObjSort = None
  453. tm._checkMemLeaks()
  454. del l
  455. tm.destroy()
  456. del tm