|
| 1 | +import functools |
1 | 2 | import unittest |
2 | 3 | from typing import Any |
3 | 4 |
|
@@ -332,6 +333,101 @@ def pre_solve(arb: p.Arbiter, space: p.Space, data: Any) -> None: |
332 | 333 | s.step(0.1) |
333 | 334 | self.assertTrue(self.called) |
334 | 335 |
|
| 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 | + |
335 | 431 |
|
336 | 432 | if __name__ == "__main__": |
337 | 433 | print("testing pymunk version " + p.version) |
|
0 commit comments