(left, right)
| 550 | |
| 551 | |
| 552 | def _deep_equal(left, right): |
| 553 | if np is not None: |
| 554 | if isinstance(left, np.ndarray) or isinstance(right, np.ndarray): |
| 555 | if isinstance(left, np.ndarray) and isinstance(right, np.ndarray): |
| 556 | return np.array_equal(left, right) |
| 557 | if isinstance(left, np.ndarray) and isinstance(right, array.array): |
| 558 | return np.array_equal(left, np.array(right, dtype=left.dtype)) |
| 559 | if isinstance(right, np.ndarray) and isinstance(left, array.array): |
| 560 | return np.array_equal(right, np.array(left, dtype=right.dtype)) |
| 561 | if isinstance(left, array.array) and isinstance(right, array.array): |
| 562 | return left == right |
| 563 | if hasattr(left, "__dataclass_fields__") and hasattr(right, "__dataclass_fields__"): |
| 564 | if left.__class__ is not right.__class__: |
| 565 | return False |
| 566 | for field in left.__dataclass_fields__.keys(): |
| 567 | if not _deep_equal(getattr(left, field), getattr(right, field)): |
| 568 | return False |
| 569 | return True |
| 570 | if isinstance(left, list) and isinstance(right, list): |
| 571 | if len(left) != len(right): |
| 572 | return False |
| 573 | for l_item, r_item in zip(left, right): |
| 574 | if not _deep_equal(l_item, r_item): |
| 575 | return False |
| 576 | return True |
| 577 | if isinstance(left, tuple) and isinstance(right, tuple): |
| 578 | if len(left) != len(right): |
| 579 | return False |
| 580 | for l_item, r_item in zip(left, right): |
| 581 | if not _deep_equal(l_item, r_item): |
| 582 | return False |
| 583 | return True |
| 584 | if isinstance(left, dict) and isinstance(right, dict): |
| 585 | if left.keys() != right.keys(): |
| 586 | return False |
| 587 | for key in left.keys(): |
| 588 | if not _deep_equal(left[key], right[key]): |
| 589 | return False |
| 590 | return True |
| 591 | return left == right |
| 592 | |
| 593 | |
| 594 | def _assert_deep_equal(left, right, msg_prefix=""): |
no test coverage detected