Source code for pymunk.tests

"""
The Pymunk test suite.

The tests cover most of Pymunk and is quick to run. However, some parts
requires an additional dependency to tests, e.g. to test pygame the pygame
library must be installed.

Tests can be run both by running the module from a shell::

$> python -m pymunk.tests

But also by importing and running the run_tests method from a python prompt::

    > from pymunk.tests import run_tests
    > run_tests()

Some arguments are allowed to the tests. You can show them with the --help
flag::

    $> python pymunk.tests --help

It is possible to filter out tests with the filter parameter. Tests containing
the filter will be run, the others skipped. A special case is doctests, which
can be matched against the filter doctest::

$> python -m pymunk.tests -f testTransform
$> python -m pymynk.tests -f doctest

By default all tests will run except those with an additional dependency. To
run tests with dependencies, specify them with the -d parameter::

$> python -m pymunk.tests -d pygame

Note that the tests covers most/all of Pymunk, but does not test the
underlying Chipmunk library in a significant way except as a side effect of
testing Pymunk features.
"""

import doctest
import faulthandler
import logging
import os
import os.path
import platform
import sys
import unittest
from typing import Any, Iterator

from . import doctests


[docs] def run_tests(filter: str = "", with_dependencies: list[str] = []) -> bool: """Run the Pymunk test suite.""" faulthandler.enable() print("####################") print("RUNNING pymunk.tests") print("Python / platform:") print(sys.version) try: import cffi # type: ignore print( f"on {platform.system()} {platform.machine()} using cffi {cffi.__version__}" ) except: pass print() def list_of_tests_gen(s: Any) -> Iterator[Any]: for test in s: if unittest.suite._isnotsuite(test): # type: ignore yield test else: for t in list_of_tests_gen(test): yield t path = os.path.dirname(os.path.abspath(__file__)) suite = unittest.TestLoader().discover(path) doctests.load_tests(suite, with_dependencies) filtered_suite = unittest.TestSuite() if filter is not None: for test in list_of_tests_gen(suite): if ( isinstance(test, doctest.DocTestCase) and filter.startswith("doctest") or filter in str(test.id()) ): filtered_suite.addTest(test) else: filtered_suite = suite res = unittest.TextTestRunner(verbosity=2).run(filtered_suite) return res.wasSuccessful()