Skip to content

Commit f467768

Browse files
committed
Also test FormatterHMS and select_step24.
1 parent 15fb901 commit f467768

File tree

1 file changed

+39
-11
lines changed

1 file changed

+39
-11
lines changed

lib/mpl_toolkits/tests/test_axisartist_angle_helper.py

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,34 +7,41 @@
77
import pytest
88

99
from mpl_toolkits.axisartist.angle_helper import (
10-
FormatterDMS, select_step, select_step360)
10+
FormatterDMS, FormatterHMS, select_step, select_step24, select_step360)
1111

1212

13-
DMS_RE = re.compile(
13+
_MS_RE = (
1414
r'''\$ # Mathtext
1515
(
1616
# The sign sometimes appears on a 0 when a fraction is shown.
1717
# Check later that there's only one.
1818
(?P<degree_sign>-)?
1919
(?P<degree>[0-9.]+) # Degrees value
20-
\^{\\circ} # Degree symbol
20+
{degree} # Degree symbol (to be replaced by format.)
2121
)?
2222
(
2323
(?(degree)\\,) # Separator if degrees are also visible.
2424
(?P<minute_sign>-)?
2525
(?P<minute>[0-9.]+) # Minutes value
26-
\^{\\prime} # Minute symbol
26+
{minute} # Minute symbol (to be replaced by format.)
2727
)?
2828
(
2929
(?(minute)\\,) # Separator if minutes are also visible.
3030
(?P<second_sign>-)?
3131
(?P<second>[0-9.]+) # Seconds value
32-
\^{\\prime\\prime} # Second symbol
32+
{second} # Second symbol (to be replaced by format.)
3333
)?
3434
\$ # Mathtext
35-
''',
36-
re.VERBOSE
35+
'''
3736
)
37+
DMS_RE = re.compile(_MS_RE.format(degree=re.escape(FormatterDMS.deg_mark),
38+
minute=re.escape(FormatterDMS.min_mark),
39+
second=re.escape(FormatterDMS.sec_mark)),
40+
re.VERBOSE)
41+
HMS_RE = re.compile(_MS_RE.format(degree=re.escape(FormatterHMS.deg_mark),
42+
minute=re.escape(FormatterHMS.min_mark),
43+
second=re.escape(FormatterHMS.sec_mark)),
44+
re.VERBOSE)
3845

3946

4047
def dms2float(degrees, minutes=0, seconds=0):
@@ -53,6 +60,18 @@ def test_select_step(args, kwargs, expected_levels, expected_factor):
5360
assert factor == expected_factor
5461

5562

63+
@pytest.mark.parametrize('args, kwargs, expected_levels, expected_factor', [
64+
((-180, 180, 10), {}, np.arange(-180, 181, 30), 1.0),
65+
((-12, 12, 10), {}, np.arange(-750, 751, 150), 60.0)
66+
])
67+
def test_select_step24(args, kwargs, expected_levels, expected_factor):
68+
levels, n, factor = select_step24(*args, **kwargs)
69+
70+
assert n == len(levels)
71+
np.testing.assert_array_equal(levels, expected_levels)
72+
assert factor == expected_factor
73+
74+
5675
@pytest.mark.parametrize('args, kwargs, expected_levels, expected_factor', [
5776
((dms2float(20, 21.2), dms2float(21, 33.3), 5), {},
5877
np.arange(1215, 1306, 15), 60.0),
@@ -82,6 +101,10 @@ def test_select_step360(args, kwargs, expected_levels, expected_factor):
82101
assert factor == expected_factor
83102

84103

104+
@pytest.mark.parametrize('Formatter, regex',
105+
[(FormatterDMS, DMS_RE),
106+
(FormatterHMS, HMS_RE)],
107+
ids=['Degree/Minute/Second', 'Hour/Minute/Second'])
85108
@pytest.mark.parametrize('direction, factor, values', [
86109
("left", 60, [0, -30, -60]),
87110
("left", 600, [12301, 12302, 12303]),
@@ -91,13 +114,13 @@ def test_select_step360(args, kwargs, expected_levels, expected_factor):
91114
("left", 1., [45, 46, 47]),
92115
("left", 10., [452, 453, 454]),
93116
])
94-
def test_formatters(direction, factor, values):
95-
fmt = FormatterDMS()
117+
def test_formatters(Formatter, regex, direction, factor, values):
118+
fmt = Formatter()
96119
result = fmt(direction, factor, values)
97120

98121
prev_degree = prev_minute = prev_second = None
99122
for tick, value in zip(result, values):
100-
m = DMS_RE.match(tick)
123+
m = regex.match(tick)
101124
assert m is not None, '"%s" is not an expected tick format.' % (tick, )
102125

103126
sign = sum(m.group(sign + '_sign') is not None
@@ -109,7 +132,12 @@ def test_formatters(direction, factor, values):
109132
degree = float(m.group('degree') or prev_degree or 0)
110133
minute = float(m.group('minute') or prev_minute or 0)
111134
second = float(m.group('second') or prev_second or 0)
112-
assert sign * dms2float(degree, minute, second) == value / factor, \
135+
if Formatter == FormatterHMS:
136+
# 360 degrees as plot range -> 24 hours as labelled range
137+
expected_value = pytest.approx((value // 15) / factor)
138+
else:
139+
expected_value = pytest.approx(value / factor)
140+
assert sign * dms2float(degree, minute, second) == expected_value, \
113141
'"%s" does not match expected tick value.' % (tick, )
114142

115143
prev_degree = degree

0 commit comments

Comments
 (0)