-
Notifications
You must be signed in to change notification settings - Fork 507
Expand file tree
/
Copy pathtest_20_quantity.py
More file actions
92 lines (64 loc) · 2.14 KB
/
test_20_quantity.py
File metadata and controls
92 lines (64 loc) · 2.14 KB
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
from __future__ import annotations
import itertools as it
import operator
from typing import Any
import pytest
import pint
UNITS = ("meter", "kilometer", "second", "minute", "angstrom")
ALL_VALUES = ("int", "float", "complex")
ALL_VALUES_Q = tuple(
f"{a}_{b}" for a, b in it.product(ALL_VALUES, ("meter", "kilometer"))
)
OP1 = (operator.neg, operator.truth)
OP2_CMP = (operator.eq,) # operator.lt)
OP2_MATH = (operator.add, operator.sub, operator.mul, operator.truediv)
@pytest.fixture
def setup(registry_tiny) -> tuple[pint.UnitRegistry, dict[str, Any]]:
data = {}
data["int"] = 1
data["float"] = 1.0
data["complex"] = complex(1, 2)
ureg = registry_tiny
for key in ALL_VALUES:
data[key + "_meter"] = data[key] * ureg.meter
data[key + "_kilometer"] = data[key] * ureg.kilometer
return ureg, data
@pytest.mark.parametrize("key", ALL_VALUES)
def test_build_by_mul(benchmark, setup, key):
ureg, data = setup
benchmark(operator.mul, data[key], ureg.meter)
@pytest.mark.parametrize("key", ALL_VALUES_Q)
@pytest.mark.parametrize("op", OP1)
def test_op1(benchmark, setup, key, op):
_, data = setup
benchmark(op, data[key])
@pytest.mark.parametrize("keys", tuple(it.product(ALL_VALUES_Q, ALL_VALUES_Q)))
@pytest.mark.parametrize("op", OP2_MATH + OP2_CMP)
def test_op2(benchmark, setup, keys, op):
_, data = setup
key1, key2 = keys
benchmark(op, data[key1], data[key2])
@pytest.mark.parametrize("key", ALL_VALUES_Q)
def test_wrapper(benchmark, setup, key):
ureg, data = setup
value, unit = key.split("_")
@ureg.wraps(None, (unit,))
def f(a):
pass
benchmark(f, data[key])
@pytest.mark.parametrize("key", ALL_VALUES_Q)
def test_wrapper_nonstrict(benchmark, setup, key):
ureg, data = setup
value, unit = key.split("_")
@ureg.wraps(None, (unit,), strict=False)
def f(a):
pass
benchmark(f, data[value])
@pytest.mark.parametrize("key", ALL_VALUES_Q)
def test_wrapper_ret(benchmark, setup, key):
ureg, data = setup
value, unit = key.split("_")
@ureg.wraps(unit, (unit,))
def f(a):
return a
benchmark(f, data[key])