Skip to content

Commit 36fed33

Browse files
committed
Fix processCollision
1 parent 2306192 commit 36fed33

File tree

2 files changed

+97
-1
lines changed

2 files changed

+97
-1
lines changed

Munk2D

pymunk/tests/test_arbiter.py

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import functools
12
import unittest
23
from typing import Any
34

@@ -332,6 +333,101 @@ def pre_solve(arb: p.Arbiter, space: p.Space, data: Any) -> None:
332333
s.step(0.1)
333334
self.assertTrue(self.called)
334335

336+
def testProcessCollision(self) -> None:
337+
338+
def setup():
339+
s = p.Space()
340+
341+
b1 = p.Body(1, 30)
342+
c1 = p.Circle(b1, 10)
343+
b1.position = 5, 3
344+
c1.collision_type = 1
345+
c1.friction = 0.5
346+
347+
b2 = p.Body(body_type=p.Body.STATIC)
348+
c2 = p.Circle(b2, 10)
349+
c2.collision_type = 2
350+
c2.friction = 0.8
351+
352+
s.add(b1, c1, b2, c2)
353+
return s
354+
355+
def callback(
356+
name: str,
357+
arb: p.Arbiter,
358+
space: p.Space,
359+
data: dict[Any, Any],
360+
) -> None:
361+
# print("callback", name) # , arb.shapes)
362+
expected_name, expected_process_collision = h.data["expected"].pop(0)
363+
process_collision = h.data["process_values"].pop(0)
364+
correct_call = (
365+
expected_process_collision == arb.process_collision
366+
and expected_name == name
367+
)
368+
if not correct_call:
369+
print(
370+
" Unexpected call:",
371+
expected_name,
372+
name,
373+
expected_process_collision,
374+
arb.process_collision,
375+
)
376+
377+
h.data["result"].append(correct_call)
378+
arb.process_collision = process_collision
379+
# print(" arb.process_collision", process_collision)
380+
381+
# test matrix:
382+
# ("process_collision values to set in the callbacks", [callback name, process_collision value, callback name, ...])
383+
# 1: True, 0: False, _: not called.
384+
385+
test_matrix = [
386+
("111111", ["b", 1, "p", 1, "t", 1, "p", 1, "t", 1, "s", 1]),
387+
("111110", ["b", 1, "p", 1, "t", 1, "p", 1, "t", 1, "s", 1]),
388+
("111100", ["b", 1, "p", 1, "t", 1, "p", 1, "t", 1, "s", 0]),
389+
("11100_", ["b", 1, "p", 1, "t", 1, "p", 1, "s", 0]),
390+
("11000_", ["b", 1, "p", 1, "t", 1, "p", 0, "s", 0]),
391+
("1000__", ["b", 1, "p", 1, "p", 0, "s", 0]),
392+
("0000__", ["b", 1, "p", 0, "p", 0, "s", 0]),
393+
("011111", ["b", 1, "p", 0, "t", 1, "p", 1, "t", 1, "s", 1]),
394+
("00111_", ["b", 1, "p", 0, "p", 0, "t", 1, "s", 1]),
395+
("0001__", ["b", 1, "p", 0, "p", 0, "s", 0]),
396+
("0000__", ["b", 1, "p", 0, "p", 0, "s", 0]),
397+
("10100_", ["b", 1, "p", 1, "p", 0, "t", 1, "s", 0]),
398+
("010101", ["b", 1, "p", 0, "t", 1, "p", 0, "t", 1, "s", 0]),
399+
]
400+
# print()
401+
for process_values, expected_calls in test_matrix:
402+
process_values = [
403+
bit == "1" for bit in process_values if bit in "01"
404+
] # will crash if bit is not 0 or 1.
405+
406+
expected_calls.append(None)
407+
expected_calls = list(zip(expected_calls[::2], expected_calls[1::2]))
408+
# print("process_values, expected calls", process_values, expected_calls)
409+
410+
s = setup()
411+
h = s.add_collision_handler(1, 2)
412+
h.data["process_values"] = process_values
413+
h.data["expected"] = expected_calls
414+
h.data["result"] = []
415+
416+
h.begin = functools.partial(callback, "b")
417+
h.pre_solve = functools.partial(callback, "p")
418+
h.post_solve = functools.partial(callback, "t")
419+
h.separate = functools.partial(callback, "s")
420+
421+
s.step(0.1)
422+
s.step(0.1)
423+
next(iter(s.bodies)).position = 100, 100
424+
s.step(0.1)
425+
426+
# print(h.data)
427+
# print(all(h.data["result"]))
428+
self.assertTrue(all(h.data["result"]))
429+
# print("done")
430+
335431

336432
if __name__ == "__main__":
337433
print("testing pymunk version " + p.version)

0 commit comments

Comments
 (0)