7
7
import pytest
8
8
9
9
from mpl_toolkits .axisartist .angle_helper import (
10
- FormatterDMS , select_step , select_step360 )
10
+ FormatterDMS , FormatterHMS , select_step , select_step24 , select_step360 )
11
11
12
12
13
- DMS_RE = re . compile (
13
+ _MS_RE = (
14
14
r'''\$ # Mathtext
15
15
(
16
16
# The sign sometimes appears on a 0 when a fraction is shown.
17
17
# Check later that there's only one.
18
18
(?P<degree_sign>-)?
19
19
(?P<degree>[0-9.]+) # Degrees value
20
- \^{\\circ } # Degree symbol
20
+ {degree } # Degree symbol (to be replaced by format.)
21
21
)?
22
22
(
23
23
(?(degree)\\,) # Separator if degrees are also visible.
24
24
(?P<minute_sign>-)?
25
25
(?P<minute>[0-9.]+) # Minutes value
26
- \^{\\prime } # Minute symbol
26
+ {minute } # Minute symbol (to be replaced by format.)
27
27
)?
28
28
(
29
29
(?(minute)\\,) # Separator if minutes are also visible.
30
30
(?P<second_sign>-)?
31
31
(?P<second>[0-9.]+) # Seconds value
32
- \^{\\prime\\prime } # Second symbol
32
+ {second } # Second symbol (to be replaced by format.)
33
33
)?
34
34
\$ # Mathtext
35
- ''' ,
36
- re .VERBOSE
35
+ '''
37
36
)
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 )
38
45
39
46
40
47
def dms2float (degrees , minutes = 0 , seconds = 0 ):
@@ -53,6 +60,18 @@ def test_select_step(args, kwargs, expected_levels, expected_factor):
53
60
assert factor == expected_factor
54
61
55
62
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
+
56
75
@pytest .mark .parametrize ('args, kwargs, expected_levels, expected_factor' , [
57
76
((dms2float (20 , 21.2 ), dms2float (21 , 33.3 ), 5 ), {},
58
77
np .arange (1215 , 1306 , 15 ), 60.0 ),
@@ -82,6 +101,10 @@ def test_select_step360(args, kwargs, expected_levels, expected_factor):
82
101
assert factor == expected_factor
83
102
84
103
104
+ @pytest .mark .parametrize ('Formatter, regex' ,
105
+ [(FormatterDMS , DMS_RE ),
106
+ (FormatterHMS , HMS_RE )],
107
+ ids = ['Degree/Minute/Second' , 'Hour/Minute/Second' ])
85
108
@pytest .mark .parametrize ('direction, factor, values' , [
86
109
("left" , 60 , [0 , - 30 , - 60 ]),
87
110
("left" , 600 , [12301 , 12302 , 12303 ]),
@@ -91,13 +114,13 @@ def test_select_step360(args, kwargs, expected_levels, expected_factor):
91
114
("left" , 1. , [45 , 46 , 47 ]),
92
115
("left" , 10. , [452 , 453 , 454 ]),
93
116
])
94
- def test_formatters (direction , factor , values ):
95
- fmt = FormatterDMS ()
117
+ def test_formatters (Formatter , regex , direction , factor , values ):
118
+ fmt = Formatter ()
96
119
result = fmt (direction , factor , values )
97
120
98
121
prev_degree = prev_minute = prev_second = None
99
122
for tick , value in zip (result , values ):
100
- m = DMS_RE .match (tick )
123
+ m = regex .match (tick )
101
124
assert m is not None , '"%s" is not an expected tick format.' % (tick , )
102
125
103
126
sign = sum (m .group (sign + '_sign' ) is not None
@@ -109,7 +132,12 @@ def test_formatters(direction, factor, values):
109
132
degree = float (m .group ('degree' ) or prev_degree or 0 )
110
133
minute = float (m .group ('minute' ) or prev_minute or 0 )
111
134
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 , \
113
141
'"%s" does not match expected tick value.' % (tick , )
114
142
115
143
prev_degree = degree
0 commit comments