test_constants_and_functions.py 3.83 KB
Newer Older
Dean Moldovan's avatar
Dean Moldovan committed
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import pytest


def test_constants():
    from pybind11_tests import some_constant

    assert some_constant == 14


def test_function_overloading(capture):
    from pybind11_tests import EMyEnumeration, test_function

    with capture:
        assert test_function() is False
        assert test_function(7) == 3.5
        assert test_function(EMyEnumeration.EFirstEntry) is None
        assert test_function(EMyEnumeration.ESecondEntry) is None
    assert capture == """
        test_function()
        test_function(7)
        test_function(enum=1)
        test_function(enum=2)
    """


def test_unscoped_enum():
    from pybind11_tests import EMyEnumeration, EFirstEntry

    assert str(EMyEnumeration.EFirstEntry) == "EMyEnumeration.EFirstEntry"
    assert str(EMyEnumeration.ESecondEntry) == "EMyEnumeration.ESecondEntry"
    assert str(EFirstEntry) == "EMyEnumeration.EFirstEntry"

    # no TypeError exception for unscoped enum ==/!= int comparisons
    y = EMyEnumeration.ESecondEntry
    assert y == 2
    assert y != 3

    assert int(EMyEnumeration.ESecondEntry) == 2
    assert str(EMyEnumeration(2)) == "EMyEnumeration.ESecondEntry"


def test_scoped_enum(capture):
    from pybind11_tests import ECMyEnum, test_ecenum

    with capture:
        test_ecenum(ECMyEnum.Three)
    assert capture == "test_ecenum(ECMyEnum::Three)"
    z = ECMyEnum.Two
    with capture:
        test_ecenum(z)
    assert capture == "test_ecenum(ECMyEnum::Two)"

    # expected TypeError exceptions for scoped enum ==/!= int comparisons
    with pytest.raises(TypeError):
        assert z == 2
    with pytest.raises(TypeError):
        assert z != 3


def test_implicit_conversion(capture):
    from pybind11_tests import ExampleWithEnum

    assert str(ExampleWithEnum.EMode.EFirstMode) == "EMode.EFirstMode"
    assert str(ExampleWithEnum.EFirstMode) == "EMode.EFirstMode"

    f = ExampleWithEnum.test_function
    first = ExampleWithEnum.EFirstMode
    second = ExampleWithEnum.ESecondMode

    with capture:
        f(first)
    assert capture == "ExampleWithEnum::test_function(enum=1)"

    with capture:
        assert f(first) == f(first)
        assert not f(first) != f(first)

        assert f(first) != f(second)
        assert not f(first) == f(second)

        assert f(first) == int(f(first))
        assert not f(first) != int(f(first))

        assert f(first) != int(f(second))
        assert not f(first) == int(f(second))
    assert capture == """
        ExampleWithEnum::test_function(enum=1)
        ExampleWithEnum::test_function(enum=1)
        ExampleWithEnum::test_function(enum=1)
        ExampleWithEnum::test_function(enum=1)
        ExampleWithEnum::test_function(enum=1)
        ExampleWithEnum::test_function(enum=2)
        ExampleWithEnum::test_function(enum=1)
        ExampleWithEnum::test_function(enum=2)
        ExampleWithEnum::test_function(enum=1)
        ExampleWithEnum::test_function(enum=1)
        ExampleWithEnum::test_function(enum=1)
        ExampleWithEnum::test_function(enum=1)
        ExampleWithEnum::test_function(enum=1)
        ExampleWithEnum::test_function(enum=2)
        ExampleWithEnum::test_function(enum=1)
        ExampleWithEnum::test_function(enum=2)
    """

    with capture:
        # noinspection PyDictCreation
        x = {f(first): 1, f(second): 2}
        x[f(first)] = 3
        x[f(second)] = 4
    assert capture == """
        ExampleWithEnum::test_function(enum=1)
        ExampleWithEnum::test_function(enum=2)
        ExampleWithEnum::test_function(enum=1)
        ExampleWithEnum::test_function(enum=2)
    """
    # Hashing test
    assert str(x) == "{EMode.EFirstMode: 3, EMode.ESecondMode: 4}"


def test_bytes(capture):
    from pybind11_tests import return_bytes, print_bytes

    with capture:
        print_bytes(return_bytes())
    assert capture == """
        bytes[0]=1
        bytes[1]=0
        bytes[2]=2
        bytes[3]=0
    """