File: test_pretty.py

package info (click to toggle)
python-hypothesis 6.138.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 15,272 kB
  • sloc: python: 62,853; ruby: 1,107; sh: 253; makefile: 41; javascript: 6
file content (106 lines) | stat: -rw-r--r-- 3,799 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# This file is part of Hypothesis, which may be found at
# https://github.com/HypothesisWorks/hypothesis/
#
# Copyright the Hypothesis Authors.
# Individual contributors are listed in AUTHORS.rst and the git log.
#
# This Source Code Form is subject to the terms of the Mozilla Public License,
# v. 2.0. If a copy of the MPL was not distributed with this file, You can
# obtain one at https://mozilla.org/MPL/2.0/.

from inspect import signature

import pytest

from hypothesis.errors import InvalidArgument
from hypothesis.extra import array_api
from hypothesis.extra.array_api import make_strategies_namespace

from tests.array_api.common import MIN_VER_FOR_COMPLEX


@pytest.mark.parametrize(
    "name",
    [
        "from_dtype",
        "arrays",
        "array_shapes",
        "scalar_dtypes",
        "boolean_dtypes",
        "numeric_dtypes",
        "integer_dtypes",
        "unsigned_integer_dtypes",
        "floating_dtypes",
        "real_dtypes",
        pytest.param(
            "complex_dtypes", marks=pytest.mark.xp_min_version(MIN_VER_FOR_COMPLEX)
        ),
        "valid_tuple_axes",
        "broadcastable_shapes",
        "mutually_broadcastable_shapes",
        "indices",
    ],
)
def test_namespaced_methods_meta(xp, xps, name):
    """Namespaced method objects have good meta attributes."""
    func = getattr(xps, name)
    assert func.__name__ == name
    assert func.__doc__ is not None
    # The (private) top-level strategy methods may expose a xp argument in their
    # function signatures. make_strategies_namespace() exists to wrap these
    # top-level methods by binding the passed xp argument, and so the namespace
    # it returns should not expose xp in any of its function signatures.
    assert "xp" not in signature(func).parameters


@pytest.mark.parametrize(
    "name, valid_args",
    [
        ("from_dtype", ["int8"]),
        ("arrays", ["int8", 5]),
        ("array_shapes", []),
        ("scalar_dtypes", []),
        ("boolean_dtypes", []),
        ("numeric_dtypes", []),
        ("integer_dtypes", []),
        ("unsigned_integer_dtypes", []),
        ("floating_dtypes", []),
        ("real_dtypes", []),
        pytest.param(
            "complex_dtypes", [], marks=pytest.mark.xp_min_version(MIN_VER_FOR_COMPLEX)
        ),
        ("valid_tuple_axes", [0]),
        ("broadcastable_shapes", [()]),
        ("mutually_broadcastable_shapes", [3]),
        ("indices", [(5,)]),
    ],
)
def test_namespaced_strategies_repr(xp, xps, name, valid_args):
    """Namespaced strategies have good repr."""
    func = getattr(xps, name)
    strat = func(*valid_args)
    assert repr(strat).startswith(name + "("), f"{name} not in strat repr {strat!r}"
    assert len(repr(strat)) < 100, "strat repr looks too long"
    assert xp.__name__ not in repr(strat), f"{xp.__name__} in strat repr"


@pytest.mark.filterwarnings("ignore::hypothesis.errors.HypothesisWarning")
def test_inferred_version_strategies_namespace_repr(xp):
    """Strategies namespace has good repr when api_version=None."""
    try:
        xps = make_strategies_namespace(xp)
    except InvalidArgument as e:
        pytest.skip(str(e))
    expected = f"make_strategies_namespace({xp.__name__})"
    assert repr(xps) == expected
    assert str(xps) == expected


@pytest.mark.filterwarnings("ignore::hypothesis.errors.HypothesisWarning")
def test_specified_version_strategies_namespace_repr(xp, monkeypatch):
    """Strategies namespace has good repr when api_version is specified."""
    monkeypatch.setattr(array_api, "_args_to_xps", {})  # ignore cached versions
    xps = make_strategies_namespace(xp, api_version="2021.12")
    expected = f"make_strategies_namespace({xp.__name__}, api_version='2021.12')"
    assert repr(xps) == expected
    assert str(xps) == expected